From 496c7e3f75a94bac7b61080ee4f77eb829eb3455 Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Tue, 21 Nov 2023 17:36:32 -0500 Subject: [PATCH] feat: add some plugin generation logic (#262) * feat: add some plugin generation logic * chore: add generate commands * style: apply PR suggestion Co-authored-by: Dennis Won * refactor: create plugin config concept * feat: add multi-owner-msca impl that leverages the plugin gen (#263) * feat: add multi-owner-msca impl that leverages the plugin gen * feat: proposal for msca builder pattern (#264) * feat: proposal for msca builder pattern * refactor: rework plugin gen to create read methods for the account --------- Co-authored-by: Dennis Won --- .github/workflows/on-pull-request.yml | 2 + package.json | 1 + packages/accounts/package.json | 6 + packages/accounts/plugindefs/index.ts | 1 + .../accounts/plugindefs/multi-owner/abi.ts | 1086 +++++++++++++++++ .../accounts/plugindefs/multi-owner/config.ts | 10 + packages/accounts/plugindefs/types.ts | 10 + packages/accounts/scripts/plugingen.ts | 151 +++ packages/accounts/src/index.ts | 20 +- packages/accounts/src/msca/abis/IPlugin.ts | 750 ++++++++++++ .../src/msca/abis/IStandardExecutor.ts | 37 +- .../src/msca/abis/MultiOwnerMSCAFactory.ts | 2 +- packages/accounts/src/msca/base.ts | 59 - packages/accounts/src/msca/builder.ts | 140 +++ .../accounts/src/msca/multi-owner-account.ts | 124 ++ .../accounts/src/msca/plugins/multi-owner.ts | 170 +++ packages/accounts/src/msca/plugins/types.ts | 6 + packages/accounts/wagmi.config.ts | 25 + packages/core/src/account/base.ts | 2 +- yarn.lock | 469 ++++++- 20 files changed, 2977 insertions(+), 94 deletions(-) create mode 100644 packages/accounts/plugindefs/index.ts create mode 100644 packages/accounts/plugindefs/multi-owner/abi.ts create mode 100644 packages/accounts/plugindefs/multi-owner/config.ts create mode 100644 packages/accounts/plugindefs/types.ts create mode 100644 packages/accounts/scripts/plugingen.ts create mode 100644 packages/accounts/src/msca/abis/IPlugin.ts delete mode 100644 packages/accounts/src/msca/base.ts create mode 100644 packages/accounts/src/msca/builder.ts create mode 100644 packages/accounts/src/msca/multi-owner-account.ts create mode 100644 packages/accounts/src/msca/plugins/multi-owner.ts create mode 100644 packages/accounts/src/msca/plugins/types.ts create mode 100644 packages/accounts/wagmi.config.ts diff --git a/.github/workflows/on-pull-request.yml b/.github/workflows/on-pull-request.yml index 1a55bc204a..32537f2c6a 100644 --- a/.github/workflows/on-pull-request.yml +++ b/.github/workflows/on-pull-request.yml @@ -35,6 +35,8 @@ jobs: build_and_lint_and_test: name: Lint and Build and Test runs-on: ubuntu-latest + env: + API_KEY: ${{ secrets.API_KEY }} steps: - uses: actions/checkout@v2 diff --git a/package.json b/package.json index 43c0af08fd..0f496292c2 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "site" ], "scripts": { + "generate": "lerna run generate && yarn lint:write", "build": "lerna run build --ignore=alchemy-daapp --ignore=aa-simple-dapp", "build:examples": "lerna run build", "clean": "lerna run clean", diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 5128b80e51..55dedfbcc3 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -29,6 +29,8 @@ "./package.json": "./package.json" }, "scripts": { + "generate": "npx wagmi generate", + "prebuild": "yarn generate", "build": "yarn clean && yarn build:cjs && yarn build:esm && yarn build:types", "build:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", "build:esm": "tsc --project tsconfig.build.json --module es2015 --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", @@ -41,6 +43,10 @@ "devDependencies": { "@alchemy/aa-alchemy": "^1.2.0", "@alchemy/aa-core": "^1.2.0", + "@wagmi/cli": "^1.5.2", + "change-case": "^5.1.2", + "dedent": "^1.5.1", + "dotenv": "^16.3.1", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" diff --git a/packages/accounts/plugindefs/index.ts b/packages/accounts/plugindefs/index.ts new file mode 100644 index 0000000000..d0e68c5547 --- /dev/null +++ b/packages/accounts/plugindefs/index.ts @@ -0,0 +1 @@ +export { MultiOwnerPluginGenConfig } from "./multi-owner/config.js"; diff --git a/packages/accounts/plugindefs/multi-owner/abi.ts b/packages/accounts/plugindefs/multi-owner/abi.ts new file mode 100644 index 0000000000..9ed7f985ff --- /dev/null +++ b/packages/accounts/plugindefs/multi-owner/abi.ts @@ -0,0 +1,1086 @@ +export const MultiOwnerPluginAbi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "AlreadyInitialized", + type: "error", + }, + { + inputs: [], + name: "EmptyOwnersNotAllowed", + type: "error", + }, + { + inputs: [], + name: "InvalidAction", + type: "error", + }, + { + inputs: [], + name: "InvalidShortString", + type: "error", + }, + { + inputs: [], + name: "NotAuthorized", + type: "error", + }, + { + inputs: [], + name: "NotContractCaller", + type: "error", + }, + { + inputs: [], + name: "NotImplemented", + type: "error", + }, + { + inputs: [], + name: "NotInitialized", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnerAlreadyExists", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnerDoesNotExist", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "str", + type: "string", + }, + ], + name: "StringTooLong", + type: "error", + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: false, + internalType: "address[]", + name: "addedOwners", + type: "address[]", + }, + { + indexed: false, + internalType: "address[]", + name: "removedOwners", + type: "address[]", + }, + ], + name: "OwnerUpdated", + type: "event", + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "address", + name: "verifyingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "message", + type: "bytes", + }, + ], + name: "encodeMessageData", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "message", + type: "bytes", + }, + ], + name: "getMessageHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "ownerToCheck", + type: "address", + }, + ], + name: "isOwner", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "address", + name: "ownerToCheck", + type: "address", + }, + ], + name: "isOwnerOf", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "digest", + type: "bytes32", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + name: "isValidSignature", + outputs: [ + { + internalType: "bytes4", + name: "", + type: "bytes4", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "pluginAppliedOn", + type: "address", + }, + { + components: [ + { + internalType: "uint8", + name: "preExecHookFunctionId", + type: "uint8", + }, + { + internalType: "bool", + name: "isPostHookUsed", + type: "bool", + }, + { + internalType: "uint8", + name: "postExecHookFunctionId", + type: "uint8", + }, + ], + internalType: "struct IPluginManager.InjectedHooksInfo", + name: "injectedHooksInfo", + type: "tuple", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "onHookApply", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "pluginAppliedOn", + type: "address", + }, + { + components: [ + { + internalType: "uint8", + name: "preExecHookFunctionId", + type: "uint8", + }, + { + internalType: "bool", + name: "isPostHookUsed", + type: "bool", + }, + { + internalType: "uint8", + name: "postExecHookFunctionId", + type: "uint8", + }, + ], + internalType: "struct IPluginManager.InjectedHooksInfo", + name: "injectedHooksInfo", + type: "tuple", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "onHookUnapply", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "onInstall", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + name: "onUninstall", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owners", + outputs: [ + { + internalType: "address[]", + name: "", + type: "address[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "ownersOf", + outputs: [ + { + internalType: "address[]", + name: "", + type: "address[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pluginManifest", + outputs: [ + { + components: [ + { + internalType: "bytes4[]", + name: "interfaceIds", + type: "bytes4[]", + }, + { + internalType: "bytes4[]", + name: "dependencyInterfaceIds", + type: "bytes4[]", + }, + { + internalType: "bytes4[]", + name: "executionFunctions", + type: "bytes4[]", + }, + { + internalType: "bytes4[]", + name: "permittedExecutionSelectors", + type: "bytes4[]", + }, + { + internalType: "bool", + name: "permitAnyExternalAddress", + type: "bool", + }, + { + internalType: "bool", + name: "canSpendNativeToken", + type: "bool", + }, + { + components: [ + { + internalType: "address", + name: "externalAddress", + type: "address", + }, + { + internalType: "bool", + name: "permitAnySelector", + type: "bool", + }, + { + internalType: "bytes4[]", + name: "selectors", + type: "bytes4[]", + }, + ], + internalType: "struct ManifestExternalCallPermission[]", + name: "permittedExternalCalls", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "userOpValidationFunctions", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "runtimeValidationFunctions", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "preUserOpValidationHooks", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "preRuntimeValidationHooks", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "preExecHook", + type: "tuple", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "postExecHook", + type: "tuple", + }, + ], + internalType: "struct ManifestExecutionHook[]", + name: "executionHooks", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "preExecHook", + type: "tuple", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "postExecHook", + type: "tuple", + }, + ], + internalType: "struct ManifestExecutionHook[]", + name: "permittedCallHooks", + type: "tuple[]", + }, + ], + internalType: "struct PluginManifest", + name: "", + type: "tuple", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "pluginMetadata", + outputs: [ + { + components: [ + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "string", + name: "author", + type: "string", + }, + { + components: [ + { + internalType: "bytes4", + name: "functionSelector", + type: "bytes4", + }, + { + internalType: "string", + name: "permissionDescription", + type: "string", + }, + ], + internalType: "struct SelectorPermission[]", + name: "permissionDescriptors", + type: "tuple[]", + }, + ], + internalType: "struct PluginMetadata", + name: "", + type: "tuple", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "bytes", + name: "preExecHookData", + type: "bytes", + }, + ], + name: "postExecutionHook", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "preExecutionHook", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "preRuntimeValidationHook", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + components: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + { + internalType: "uint256", + name: "callGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "verificationGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "preVerificationGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxFeePerGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxPriorityFeePerGas", + type: "uint256", + }, + { + internalType: "bytes", + name: "paymasterAndData", + type: "bytes", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + internalType: "struct UserOperation", + name: "userOp", + type: "tuple", + }, + { + internalType: "bytes32", + name: "userOpHash", + type: "bytes32", + }, + ], + name: "preUserOpValidationHook", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + name: "runtimeValidationFunction", + outputs: [], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "ownersToAdd", + type: "address[]", + }, + { + internalType: "address[]", + name: "ownersToRemove", + type: "address[]", + }, + ], + name: "updateOwners", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + components: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + { + internalType: "uint256", + name: "callGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "verificationGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "preVerificationGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxFeePerGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxPriorityFeePerGas", + type: "uint256", + }, + { + internalType: "bytes", + name: "paymasterAndData", + type: "bytes", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + internalType: "struct UserOperation", + name: "userOp", + type: "tuple", + }, + { + internalType: "bytes32", + name: "userOpHash", + type: "bytes32", + }, + ], + name: "userOpValidationFunction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; diff --git a/packages/accounts/plugindefs/multi-owner/config.ts b/packages/accounts/plugindefs/multi-owner/config.ts new file mode 100644 index 0000000000..8e5075fae4 --- /dev/null +++ b/packages/accounts/plugindefs/multi-owner/config.ts @@ -0,0 +1,10 @@ +import { sepolia } from "viem/chains"; +import type { PluginGenConfig } from "../types"; +import { MultiOwnerPluginAbi } from "./abi.js"; + +export const MultiOwnerPluginGenConfig: PluginGenConfig = { + name: "MultiOwnerPlugin", + abi: MultiOwnerPluginAbi, + address: "0x56bC629F342821FBe91C5273880792dFECBE7920", + chain: sepolia, +}; diff --git a/packages/accounts/plugindefs/types.ts b/packages/accounts/plugindefs/types.ts new file mode 100644 index 0000000000..78cd9c24c2 --- /dev/null +++ b/packages/accounts/plugindefs/types.ts @@ -0,0 +1,10 @@ +import type { Abi, Address, Chain } from "viem"; + +export type PluginGenConfig = { + abi: Abi; + address: Address; + chain: Chain; + name: string; + // TODO: need to make this configurable to run in CI without requiring this + rpcUrl?: string; +}; diff --git a/packages/accounts/scripts/plugingen.ts b/packages/accounts/scripts/plugingen.ts new file mode 100644 index 0000000000..c94a1f27fc --- /dev/null +++ b/packages/accounts/scripts/plugingen.ts @@ -0,0 +1,151 @@ +import { type Plugin } from "@wagmi/cli"; +import { pascalCase } from "change-case"; +import dedent from "dedent"; +import { + createPublicClient, + getAbiItem, + getContract, + http, + type AbiItem, + type Chain, +} from "viem"; +import { IPluginAbi } from "../src/msca/abis/IPlugin.js"; + +type RequiredBy = Required< + Pick +> & + Omit; + +export function plugingen({ + chain, + rpcUrl, +}: { + chain: Chain; + rpcUrl?: string; +}): RequiredBy { + return { + name: "ERC6900PluginGen: This file is auto-generated by plugingen", + run: async ({ contracts }) => { + if (contracts.length > 1) { + console.warn( + "[WARN] plugingen should be used with ArrayConfig in wagmi config" + ); + } + + // TODO: move this out of here and have the plugin accept the connection params for where + // to pull this data from + const httpUrl = + rpcUrl ?? `${chain.rpcUrls.alchemy.http[0]}/${process.env.API_KEY}`; + const client = createPublicClient({ + chain, + transport: http(httpUrl), + }); + + const content: string[] = []; + for (const contract of contracts) { + // This is done to clear out the ABI generated by wagmi + contract.content = ""; + + if (contract.address == null || typeof contract.address !== "string") { + throw new Error("contract must have an address and only one address"); + } + + const plugin = getContract({ + address: contract.address, + abi: IPluginAbi, + publicClient: client, + }); + + const { executionFunctions } = await plugin.read.pluginManifest(); + const { name, version } = await plugin.read.pluginMetadata(); + + const executionAbi = executionFunctions.map((f) => { + const item = getAbiItem({ + abi: contract.abi, + name: f, + }) as AbiItem; + + if (item.type !== "function") { + throw new Error( + "execution function not mapping to a function in the ABI", + { cause: JSON.stringify(item, null, 2) } + ); + } + + return item; + }); + + const executionAbiConst = `${contract.name}ExecutionFunctionAbi`; + + const encodeFunctions = executionAbi.map((n) => { + const methodContent = []; + const argsParamString = + n.inputs.length > 0 + ? `{ args }: GetFunctionArgs` + : ""; + const argsEncodeString = n.inputs.length > 0 ? "args," : ""; + const isViewFunction = n.stateMutability === "view"; + + methodContent.push(dedent` + encode${pascalCase(n.name)}Data: (${argsParamString}) => { + return encodeFunctionData({ + abi: ${executionAbiConst}, + functionName: "${n.name}", + ${argsEncodeString} + }); + } + `); + + if (isViewFunction) { + methodContent.push(dedent` + read${pascalCase(n.name)}: async (${argsParamString}) => { + return account.rpcProvider.readContract({ + address: await account.getAddress(), + abi: ${executionAbiConst}, + functionName: "${n.name}", + ${argsEncodeString} + }); + } + `); + } + + return methodContent.join(",\n\n"); + }); + + content.push(dedent` + const ${contract.name}_ = { + meta: { + name: "${name}", + version: "${version}", + }, + accountDecorators: (account: BaseSmartContractAccount) => ({ ${encodeFunctions.join( + ",\n\n" + )} }) + } + + export const ${contract.name}: Plugin> = ${contract.name}_; + `); + + // add the abi at the end so it's easier to read the actual plugin code output + content.push(dedent` + export const ${executionAbiConst} = ${JSON.stringify( + executionAbi + )} as const; + `); + } + + const imports = dedent` + import { type GetFunctionArgs, encodeFunctionData } from "viem"; + import type { Plugin } from "./types"; + import type { BaseSmartContractAccount } from "@alchemy/aa-core"; + `; + + return { + imports, + content: content.join("\n\n"), + }; + }, + }; +} diff --git a/packages/accounts/src/index.ts b/packages/accounts/src/index.ts index 41644816fc..8713f8c13a 100644 --- a/packages/accounts/src/index.ts +++ b/packages/accounts/src/index.ts @@ -22,5 +22,21 @@ export { LightSmartContractAccount } from "./light-account/account.js"; export { getDefaultLightAccountFactoryAddress } from "./light-account/utils.js"; // msca exports -export { BaseModularSmartContractAccount } from "./msca/base.js"; -export type { ModularSmartContractAccountParams } from "./msca/base.js"; +export { + MSCABuilder, + StandardExecutor, + type Executor, + type Factory, + type MSCA, + type SignerMethods, +} from "./msca/builder.js"; +export { + createMultiOwnerMSCA, + createMultiOwnerMSCABuilder, + createMultiOwnerMSCASchema, + type MultiOwnerMSCAParams, +} from "./msca/multi-owner-account.js"; +export { + MultiOwnerPlugin, + MultiOwnerPluginExecutionFunctionAbi, +} from "./msca/plugins/multi-owner.js"; diff --git a/packages/accounts/src/msca/abis/IPlugin.ts b/packages/accounts/src/msca/abis/IPlugin.ts new file mode 100644 index 0000000000..75a6ecd38b --- /dev/null +++ b/packages/accounts/src/msca/abis/IPlugin.ts @@ -0,0 +1,750 @@ +export const IPluginAbi = [ + { + inputs: [ + { + internalType: "address", + name: "pluginAppliedOn", + type: "address", + }, + { + components: [ + { + internalType: "uint8", + name: "preExecHookFunctionId", + type: "uint8", + }, + { + internalType: "bool", + name: "isPostHookUsed", + type: "bool", + }, + { + internalType: "uint8", + name: "postExecHookFunctionId", + type: "uint8", + }, + ], + internalType: "struct IPluginManager.InjectedHooksInfo", + name: "injectedHooksInfo", + type: "tuple", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "onHookApply", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "pluginAppliedOn", + type: "address", + }, + { + components: [ + { + internalType: "uint8", + name: "preExecHookFunctionId", + type: "uint8", + }, + { + internalType: "bool", + name: "isPostHookUsed", + type: "bool", + }, + { + internalType: "uint8", + name: "postExecHookFunctionId", + type: "uint8", + }, + ], + internalType: "struct IPluginManager.InjectedHooksInfo", + name: "injectedHooksInfo", + type: "tuple", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "onHookUnapply", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "onInstall", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "onUninstall", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "pluginManifest", + outputs: [ + { + components: [ + { + internalType: "bytes4[]", + name: "interfaceIds", + type: "bytes4[]", + }, + { + internalType: "bytes4[]", + name: "dependencyInterfaceIds", + type: "bytes4[]", + }, + { + internalType: "bytes4[]", + name: "executionFunctions", + type: "bytes4[]", + }, + { + internalType: "bytes4[]", + name: "permittedExecutionSelectors", + type: "bytes4[]", + }, + { + internalType: "bool", + name: "permitAnyExternalAddress", + type: "bool", + }, + { + internalType: "bool", + name: "canSpendNativeToken", + type: "bool", + }, + { + components: [ + { + internalType: "address", + name: "externalAddress", + type: "address", + }, + { + internalType: "bool", + name: "permitAnySelector", + type: "bool", + }, + { + internalType: "bytes4[]", + name: "selectors", + type: "bytes4[]", + }, + ], + internalType: "struct ManifestExternalCallPermission[]", + name: "permittedExternalCalls", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "userOpValidationFunctions", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "runtimeValidationFunctions", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "preUserOpValidationHooks", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "associatedFunction", + type: "tuple", + }, + ], + internalType: "struct ManifestAssociatedFunction[]", + name: "preRuntimeValidationHooks", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "preExecHook", + type: "tuple", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "postExecHook", + type: "tuple", + }, + ], + internalType: "struct ManifestExecutionHook[]", + name: "executionHooks", + type: "tuple[]", + }, + { + components: [ + { + internalType: "bytes4", + name: "executionSelector", + type: "bytes4", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "preExecHook", + type: "tuple", + }, + { + components: [ + { + internalType: "enum ManifestAssociatedFunctionType", + name: "functionType", + type: "uint8", + }, + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "uint256", + name: "dependencyIndex", + type: "uint256", + }, + ], + internalType: "struct ManifestFunction", + name: "postExecHook", + type: "tuple", + }, + ], + internalType: "struct ManifestExecutionHook[]", + name: "permittedCallHooks", + type: "tuple[]", + }, + ], + internalType: "struct PluginManifest", + name: "", + type: "tuple", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "pluginMetadata", + outputs: [ + { + components: [ + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "string", + name: "author", + type: "string", + }, + { + components: [ + { + internalType: "bytes4", + name: "functionSelector", + type: "bytes4", + }, + { + internalType: "string", + name: "permissionDescription", + type: "string", + }, + ], + internalType: "struct SelectorPermission[]", + name: "permissionDescriptors", + type: "tuple[]", + }, + ], + internalType: "struct PluginMetadata", + name: "", + type: "tuple", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "bytes", + name: "preExecHookData", + type: "bytes", + }, + ], + name: "postExecutionHook", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "preExecutionHook", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "preRuntimeValidationHook", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + components: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + { + internalType: "uint256", + name: "callGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "verificationGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "preVerificationGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxFeePerGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxPriorityFeePerGas", + type: "uint256", + }, + { + internalType: "bytes", + name: "paymasterAndData", + type: "bytes", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + internalType: "struct UserOperation", + name: "userOp", + type: "tuple", + }, + { + internalType: "bytes32", + name: "userOpHash", + type: "bytes32", + }, + ], + name: "preUserOpValidationHook", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "runtimeValidationFunction", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint8", + name: "functionId", + type: "uint8", + }, + { + components: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + { + internalType: "uint256", + name: "callGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "verificationGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "preVerificationGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxFeePerGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxPriorityFeePerGas", + type: "uint256", + }, + { + internalType: "bytes", + name: "paymasterAndData", + type: "bytes", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + internalType: "struct UserOperation", + name: "userOp", + type: "tuple", + }, + { + internalType: "bytes32", + name: "userOpHash", + type: "bytes32", + }, + ], + name: "userOpValidationFunction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; diff --git a/packages/accounts/src/msca/abis/IStandardExecutor.ts b/packages/accounts/src/msca/abis/IStandardExecutor.ts index c6c4165e3c..803000e9ab 100644 --- a/packages/accounts/src/msca/abis/IStandardExecutor.ts +++ b/packages/accounts/src/msca/abis/IStandardExecutor.ts @@ -2,26 +2,19 @@ export const IStandardExecutorAbi = [ { inputs: [ { - components: [ - { - internalType: "address", - name: "target", - type: "address", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - { - internalType: "bytes", - name: "data", - type: "bytes", - }, - ], - internalType: "struct Execution", - name: "execution", - type: "tuple", + internalType: "address", + name: "target", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", }, ], name: "execute", @@ -55,8 +48,8 @@ export const IStandardExecutorAbi = [ type: "bytes", }, ], - internalType: "struct Execution[]", - name: "executions", + internalType: "struct Call[]", + name: "calls", type: "tuple[]", }, ], diff --git a/packages/accounts/src/msca/abis/MultiOwnerMSCAFactory.ts b/packages/accounts/src/msca/abis/MultiOwnerMSCAFactory.ts index 8d0a047839..88252d9f86 100644 --- a/packages/accounts/src/msca/abis/MultiOwnerMSCAFactory.ts +++ b/packages/accounts/src/msca/abis/MultiOwnerMSCAFactory.ts @@ -18,7 +18,7 @@ export const MultiOwnerMSCAFactoryAbi = [ }, { internalType: "bytes32", - name: "manifestHash", + name: "multiOwnerPluginManifestHash", type: "bytes32", }, { diff --git a/packages/accounts/src/msca/base.ts b/packages/accounts/src/msca/base.ts deleted file mode 100644 index 48aae58bc1..0000000000 --- a/packages/accounts/src/msca/base.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - BaseSmartContractAccount, - SignerSchema, - createBaseSmartAccountParamsSchema, - type BatchUserOperationCallData, - type SupportedTransports, -} from "@alchemy/aa-core"; -import { - encodeFunctionData, - type Address, - type FallbackTransport, - type Hex, - type Transport, -} from "viem"; -import { z } from "zod"; -import { IStandardExecutorAbi } from "./abis/IStandardExecutor.js"; - -export const createModularSmartContractAccountSchema = < - TTransport extends SupportedTransports = Transport ->() => - createBaseSmartAccountParamsSchema().extend({ - owner: SignerSchema, - }); - -export type ModularSmartContractAccountParams = z.input< - ReturnType ->; - -export abstract class BaseModularSmartContractAccount< - TTransport extends Transport | FallbackTransport = Transport -> extends BaseSmartContractAccount { - async encodeExecute(target: Address, value: bigint, data: Hex): Promise { - return encodeFunctionData({ - abi: IStandardExecutorAbi, - functionName: "execute", - args: [ - { - target, - data, - value, - }, - ], - }); - } - - async encodeBatchExecute(txs: BatchUserOperationCallData): Promise { - return encodeFunctionData({ - abi: IStandardExecutorAbi, - functionName: "executeBatch", - args: [ - txs.map((tx) => ({ - target: tx.target, - data: tx.data, - value: tx.value ?? 0n, - })), - ], - }); - } -} diff --git a/packages/accounts/src/msca/builder.ts b/packages/accounts/src/msca/builder.ts new file mode 100644 index 0000000000..dc6e5188af --- /dev/null +++ b/packages/accounts/src/msca/builder.ts @@ -0,0 +1,140 @@ +import { + BaseSmartContractAccount, + type BaseSmartAccountParams, + type BatchUserOperationCallData, + type ISmartContractAccount, + type SignTypedDataParams, + type SupportedTransports, +} from "@alchemy/aa-core"; +import { + encodeFunctionData, + type Address, + type Hex, + type Transport, +} from "viem"; +import { z } from "zod"; +import { IStandardExecutorAbi } from "./abis/IStandardExecutor.js"; +import type { Plugin } from "./plugins/types"; + +export interface MSCA extends ISmartContractAccount { + extendWithPluginMethods: (plugin: Plugin) => this & D; +} + +export type Executor = ( + acct: A +) => Pick; + +export type SignerMethods = ( + acct: A +) => Pick< + ISmartContractAccount, + | "signMessage" + | "signTypedData" + | "signUserOperationHash" + | "getDummySignature" +>; + +export type Factory = (acct: A) => Promise; + +// TODO: this can be moved out into its own file +export const StandardExecutor: Executor = () => ({ + async encodeExecute( + target: Address, + value: bigint, + data: Hex + ): Promise<`0x${string}`> { + return encodeFunctionData({ + abi: IStandardExecutorAbi, + functionName: "execute", + args: [target, value, data], + }); + }, + + async encodeBatchExecute( + txs: BatchUserOperationCallData + ): Promise<`0x${string}`> { + return encodeFunctionData({ + abi: IStandardExecutorAbi, + functionName: "executeBatch", + args: [ + txs.map((tx) => ({ + target: tx.target, + data: tx.data, + value: tx.value ?? 0n, + })), + ], + }); + }, +}); + +const zCompleteBuilder = z.object({ + executor: z.custom(), + signer: z.custom(), + factory: z.custom(), +}); + +export class MSCABuilder { + executor?: Executor; + signer?: SignerMethods; + factory?: Factory; + + withExecutor(executor: Executor): this & { executor: Executor } { + return Object.assign(this, { executor }); + } + + withSigner(methods: SignerMethods): this & { signer: SignerMethods } { + return Object.assign(this, { signer: methods }); + } + + withFactory(initCode: Factory): this & { factory: Factory } { + return Object.assign(this, { factory: initCode }); + } + + build( + params: BaseSmartAccountParams + ): MSCA { + const builder = this; + const { signer, executor, factory } = zCompleteBuilder.parse(builder); + + return new (class extends BaseSmartContractAccount { + getDummySignature(): `0x${string}` { + return signer(this).getDummySignature(); + } + + encodeExecute( + target: string, + value: bigint, + data: string + ): Promise<`0x${string}`> { + return executor(this).encodeExecute(target, value, data); + } + + encodeBatchExecute( + txs: BatchUserOperationCallData + ): Promise<`0x${string}`> { + return executor(this).encodeBatchExecute(txs); + } + + signMessage(msg: string | Uint8Array): Promise<`0x${string}`> { + return signer(this).signMessage(msg); + } + + signTypedData(params: SignTypedDataParams): Promise<`0x${string}`> { + return signer(this).signTypedData(params); + } + + signUserOperationHash(uoHash: `0x${string}`): Promise<`0x${string}`> { + return signer(this).signUserOperationHash(uoHash); + } + + protected getAccountInitCode(): Promise<`0x${string}`> { + return factory(this); + } + + extendWithPluginMethods = (plugin: Plugin): this & D => { + const methods = plugin.accountDecorators(this); + return Object.assign(this, methods); + }; + })(params); + } +} diff --git a/packages/accounts/src/msca/multi-owner-account.ts b/packages/accounts/src/msca/multi-owner-account.ts new file mode 100644 index 0000000000..3b12d5f4a9 --- /dev/null +++ b/packages/accounts/src/msca/multi-owner-account.ts @@ -0,0 +1,124 @@ +import { + SignerSchema, + createBaseSmartAccountParamsSchema, + type SignTypedDataParams, + type SupportedTransports, +} from "@alchemy/aa-core"; +import { + concatHex, + encodeFunctionData, + hashMessage, + hashTypedData, + hexToBytes, + isBytes, + toBytes, + type FallbackTransport, + type Hash, + type Transport, +} from "viem"; +import { z } from "zod"; +import { MultiOwnerMSCAFactoryAbi } from "./abis/MultiOwnerMSCAFactory.js"; +import { MSCABuilder, StandardExecutor } from "./builder.js"; +import { MultiOwnerPlugin } from "./plugins/multi-owner.js"; + +export const createMultiOwnerMSCASchema = < + TTransport extends SupportedTransports = Transport +>() => + createBaseSmartAccountParamsSchema().extend({ + owner: SignerSchema, + index: z.bigint().optional().default(0n), + }); + +export type MultiOwnerMSCAParams = z.input< + ReturnType +>; + +export const createMultiOwnerMSCABuilder = < + TTransport extends Transport | FallbackTransport = Transport +>( + params_: MultiOwnerMSCAParams +) => { + const params = createMultiOwnerMSCASchema().parse(params_); + + const builder = new MSCABuilder() + .withFactory(async (acct) => { + const ownerAddress = await params.owner.getAddress(); + return concatHex([ + acct.getFactoryAddress(), + encodeFunctionData({ + abi: MultiOwnerMSCAFactoryAbi, + functionName: "createAccount", + // TODO: this needs to support creating accounts with multiple owners + args: [params.index, [ownerAddress]], + }), + ]); + }) + .withExecutor(StandardExecutor) + .withSigner((acct) => { + const signWith1271Wrapper = async (msg: Hash): Promise<`0x${string}`> => { + const multiOwnerAugmented = + acct.extendWithPluginMethods(MultiOwnerPlugin); + + const [, name, version, chainId, verifyingContract, salt] = + await multiOwnerAugmented.readEip712Domain(); + + return params.owner.signTypedData({ + domain: { + chainId: Number(chainId), + name, + salt, + verifyingContract, + version, + }, + types: { + ERC6900Message: [{ name: "message", type: "bytes" }], + }, + message: { + ERC6900Message: { + message: toBytes(msg), + }, + }, + primaryType: "ERC6900Message", + }); + }; + + return { + getDummySignature(): `0x${string}` { + return "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c"; + }, + + signUserOperationHash(uoHash: `0x${string}`): Promise<`0x${string}`> { + return params.owner.signMessage(hexToBytes(uoHash)); + }, + + signMessage(msg: string | Uint8Array): Promise<`0x${string}`> { + return signWith1271Wrapper( + hashMessage( + typeof msg === "string" && !isBytes(msg) + ? msg + : { + raw: msg, + } + ) + ); + }, + + signTypedData(params: SignTypedDataParams): Promise<`0x${string}`> { + return signWith1271Wrapper(hashTypedData(params)); + }, + }; + }); + + return builder; +}; + +export const createMultiOwnerMSCA = < + TTransport extends Transport | FallbackTransport = Transport +>( + params_: MultiOwnerMSCAParams +) => { + const params = createMultiOwnerMSCASchema().parse(params_); + const builder = createMultiOwnerMSCABuilder(params); + + return builder.build(params).extendWithPluginMethods(MultiOwnerPlugin); +}; diff --git a/packages/accounts/src/msca/plugins/multi-owner.ts b/packages/accounts/src/msca/plugins/multi-owner.ts new file mode 100644 index 0000000000..292ef2163a --- /dev/null +++ b/packages/accounts/src/msca/plugins/multi-owner.ts @@ -0,0 +1,170 @@ +import { type GetFunctionArgs, encodeFunctionData } from "viem"; +import type { Plugin } from "./types"; +import type { BaseSmartContractAccount } from "@alchemy/aa-core"; + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// ERC6900PluginGen: This file is auto-generated by plugingen +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +const MultiOwnerPlugin_ = { + meta: { + name: "Multi Owner Plugin", + version: "1.0.0", + }, + accountDecorators: (account: BaseSmartContractAccount) => ({ + encodeUpdateOwnersData: ({ + args, + }: GetFunctionArgs< + typeof MultiOwnerPluginExecutionFunctionAbi, + "updateOwners" + >) => { + return encodeFunctionData({ + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "updateOwners", + args, + }); + }, + + encodeOwnersData: () => { + return encodeFunctionData({ + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "owners", + }); + }, + + readOwners: async () => { + return account.rpcProvider.readContract({ + address: await account.getAddress(), + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "owners", + }); + }, + + encodeIsOwnerData: ({ + args, + }: GetFunctionArgs< + typeof MultiOwnerPluginExecutionFunctionAbi, + "isOwner" + >) => { + return encodeFunctionData({ + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "isOwner", + args, + }); + }, + + readIsOwner: async ({ + args, + }: GetFunctionArgs< + typeof MultiOwnerPluginExecutionFunctionAbi, + "isOwner" + >) => { + return account.rpcProvider.readContract({ + address: await account.getAddress(), + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "isOwner", + args, + }); + }, + + encodeEip712DomainData: () => { + return encodeFunctionData({ + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "eip712Domain", + }); + }, + + readEip712Domain: async () => { + return account.rpcProvider.readContract({ + address: await account.getAddress(), + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "eip712Domain", + }); + }, + + encodeIsValidSignatureData: ({ + args, + }: GetFunctionArgs< + typeof MultiOwnerPluginExecutionFunctionAbi, + "isValidSignature" + >) => { + return encodeFunctionData({ + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "isValidSignature", + args, + }); + }, + + readIsValidSignature: async ({ + args, + }: GetFunctionArgs< + typeof MultiOwnerPluginExecutionFunctionAbi, + "isValidSignature" + >) => { + return account.rpcProvider.readContract({ + address: await account.getAddress(), + abi: MultiOwnerPluginExecutionFunctionAbi, + functionName: "isValidSignature", + args, + }); + }, + }), +}; + +export const MultiOwnerPlugin: Plugin< + ReturnType<(typeof MultiOwnerPlugin_)["accountDecorators"]> +> = MultiOwnerPlugin_; + +export const MultiOwnerPluginExecutionFunctionAbi = [ + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "ownersToAdd", internalType: "address[]", type: "address[]" }, + { name: "ownersToRemove", internalType: "address[]", type: "address[]" }, + ], + name: "updateOwners", + outputs: [], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "owners", + outputs: [{ name: "", internalType: "address[]", type: "address[]" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [ + { name: "ownerToCheck", internalType: "address", type: "address" }, + ], + name: "isOwner", + outputs: [{ name: "", internalType: "bool", type: "bool" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "eip712Domain", + outputs: [ + { name: "fields", internalType: "bytes1", type: "bytes1" }, + { name: "name", internalType: "string", type: "string" }, + { name: "version", internalType: "string", type: "string" }, + { name: "chainId", internalType: "uint256", type: "uint256" }, + { name: "verifyingContract", internalType: "address", type: "address" }, + { name: "salt", internalType: "bytes32", type: "bytes32" }, + { name: "extensions", internalType: "uint256[]", type: "uint256[]" }, + ], + }, + { + stateMutability: "view", + type: "function", + inputs: [ + { name: "digest", internalType: "bytes32", type: "bytes32" }, + { name: "signature", internalType: "bytes", type: "bytes" }, + ], + name: "isValidSignature", + outputs: [{ name: "", internalType: "bytes4", type: "bytes4" }], + }, +] as const; diff --git a/packages/accounts/src/msca/plugins/types.ts b/packages/accounts/src/msca/plugins/types.ts new file mode 100644 index 0000000000..c48d636deb --- /dev/null +++ b/packages/accounts/src/msca/plugins/types.ts @@ -0,0 +1,6 @@ +import type { BaseSmartContractAccount } from "@alchemy/aa-core"; + +export interface Plugin { + meta: { name: string; version: string }; + accountDecorators: (a: BaseSmartContractAccount) => D; +} diff --git a/packages/accounts/wagmi.config.ts b/packages/accounts/wagmi.config.ts new file mode 100644 index 0000000000..832bcc8f20 --- /dev/null +++ b/packages/accounts/wagmi.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from "@wagmi/cli"; +import { kebabCase } from "change-case"; +import dotenv from "dotenv"; +import * as configs from "./plugindefs/index.js"; +import { plugingen } from "./scripts/plugingen.js"; +dotenv.config(); + +const pluginConfigs = Object.values(configs); +const pluginRegEx: RegExp = /[pP]lugin/g; + +export default defineConfig( + pluginConfigs.map((config) => ({ + out: `./src/msca/plugins/${kebabCase( + config.name.replaceAll(pluginRegEx, "") + )}.ts`, + contracts: [ + { + name: config.name, + abi: config.abi, + address: config.address, + }, + ], + plugins: [plugingen({ chain: config.chain, rpcUrl: config.rpcUrl })], + })) +); diff --git a/packages/core/src/account/base.ts b/packages/core/src/account/base.ts index b95cedc38a..3f09210c3d 100644 --- a/packages/core/src/account/base.ts +++ b/packages/core/src/account/base.ts @@ -48,7 +48,7 @@ export abstract class BaseSmartContractAccount< Chain >; protected entryPointAddress: Address; - protected rpcProvider: + readonly rpcProvider: | PublicErc4337Client | PublicErc4337Client; diff --git a/yarn.lock b/yarn.lock index b17e05c71c..81431eb8dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2399,111 +2399,221 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@esbuild/android-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" + integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== + "@esbuild/android-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== +"@esbuild/android-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" + integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== + "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== +"@esbuild/android-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" + integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== + "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== +"@esbuild/darwin-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" + integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== + "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== +"@esbuild/darwin-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" + integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== + "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== +"@esbuild/freebsd-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" + integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== + "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== +"@esbuild/freebsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" + integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== + "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== +"@esbuild/linux-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" + integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== + "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== +"@esbuild/linux-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" + integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== + "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== +"@esbuild/linux-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" + integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== + "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== +"@esbuild/linux-loong64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" + integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== + "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== +"@esbuild/linux-mips64el@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" + integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== + "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== +"@esbuild/linux-ppc64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" + integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== + "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== +"@esbuild/linux-riscv64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" + integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== + "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== +"@esbuild/linux-s390x@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" + integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== + "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== +"@esbuild/linux-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" + integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== + "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== +"@esbuild/netbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" + integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== + "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== +"@esbuild/openbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" + integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== + "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== +"@esbuild/sunos-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" + integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== + "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== +"@esbuild/win32-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" + integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== + "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== +"@esbuild/win32-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" + integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== + "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== +"@esbuild/win32-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" + integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== + "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" @@ -4654,6 +4764,34 @@ dependencies: vue-demi ">=0.14.6" +"@wagmi/cli@^1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@wagmi/cli/-/cli-1.5.2.tgz#11e767b8c5d1cfb5045b6ec63df6fa5001189bc4" + integrity sha512-UfLMYhW6mQBCjR8A5s01Chf9GpHzdpcuuBuzJ36QGXcMSJAxylz5ImVZWfCRV0ct1UruydjKVSW1QSI6azNxRQ== + dependencies: + abitype "0.8.7" + abort-controller "^3.0.0" + bundle-require "^3.1.2" + cac "^6.7.12" + change-case "^4.1.2" + chokidar "^3.5.3" + dedent "^0.7.0" + detect-package-manager "^2.0.1" + dotenv "^16.0.3" + dotenv-expand "^10.0.0" + esbuild "0.16.17" + execa "^6.1.0" + find-up "^6.3.0" + fs-extra "^10.1.0" + globby "^13.1.3" + node-fetch "^3.3.0" + ora "^6.1.2" + pathe "^1.0.0" + picocolors "^1.0.0" + prettier "^2.8.1" + viem "^1.0.0" + zod "^3.21.4" + "@wagmi/connectors@3.1.3": version "3.1.3" resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-3.1.3.tgz#112aad63a8042ce4a5a3dc4db9eaa4da0fbcf0fc" @@ -5681,6 +5819,15 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + blakejs@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" @@ -5830,6 +5977,13 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" +bundle-require@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-3.1.2.tgz#1374a7bdcb8b330a7ccc862ccbf7c137cc43ad27" + integrity sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA== + dependencies: + load-tsconfig "^0.2.0" + busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -5842,7 +5996,7 @@ byte-size@7.0.0: resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.0.tgz#36528cd1ca87d39bd9abd51f5715dc93b6ceb032" integrity sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ== -cac@^6.7.14: +cac@^6.7.12, cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== @@ -5903,6 +6057,14 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" @@ -5927,6 +6089,15 @@ caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.300015 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz#ba80d88dff9acbc0cd4b7535fc30e0191c5e2e2a" integrity sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ== +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + chai@^4.3.7: version "4.3.10" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" @@ -5948,7 +6119,7 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@5.3.0: +chalk@5.3.0, chalk@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -5970,6 +6141,29 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + +change-case@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.1.2.tgz#1a1feb43f88b7595c6e8db44b5a27b24fa8a9ebd" + integrity sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -6044,7 +6238,7 @@ cli-spinners@2.6.1: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-spinners@^2.5.0: +cli-spinners@^2.5.0, cli-spinners@^2.6.1: version "2.9.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== @@ -6269,6 +6463,15 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + conventional-changelog-angular@5.0.12: version "5.0.12" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" @@ -6648,6 +6851,11 @@ dedent@0.7.0, dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" @@ -6754,6 +6962,13 @@ detect-node-es@^1.1.0: resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== +detect-package-manager@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-package-manager/-/detect-package-manager-2.0.1.tgz#6b182e3ae5e1826752bfef1de9a7b828cffa50d8" + integrity sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A== + dependencies: + execa "^5.1.1" + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -6807,6 +7022,14 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + dot-prop@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" @@ -6821,7 +7044,12 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" -dotenv@^16.0.3: +dotenv-expand@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + +dotenv@^16.0.3, dotenv@^16.3.1: version "16.3.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== @@ -7075,6 +7303,34 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.1" ext "^1.1.2" +esbuild@0.16.17: + version "0.16.17" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" + integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== + optionalDependencies: + "@esbuild/android-arm" "0.16.17" + "@esbuild/android-arm64" "0.16.17" + "@esbuild/android-x64" "0.16.17" + "@esbuild/darwin-arm64" "0.16.17" + "@esbuild/darwin-x64" "0.16.17" + "@esbuild/freebsd-arm64" "0.16.17" + "@esbuild/freebsd-x64" "0.16.17" + "@esbuild/linux-arm" "0.16.17" + "@esbuild/linux-arm64" "0.16.17" + "@esbuild/linux-ia32" "0.16.17" + "@esbuild/linux-loong64" "0.16.17" + "@esbuild/linux-mips64el" "0.16.17" + "@esbuild/linux-ppc64" "0.16.17" + "@esbuild/linux-riscv64" "0.16.17" + "@esbuild/linux-s390x" "0.16.17" + "@esbuild/linux-x64" "0.16.17" + "@esbuild/netbsd-x64" "0.16.17" + "@esbuild/openbsd-x64" "0.16.17" + "@esbuild/sunos-x64" "0.16.17" + "@esbuild/win32-arm64" "0.16.17" + "@esbuild/win32-ia32" "0.16.17" + "@esbuild/win32-x64" "0.16.17" + esbuild@^0.18.10: version "0.18.20" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" @@ -7571,7 +7827,7 @@ execa@7.2.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -execa@^5.0.0: +execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -7586,6 +7842,21 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" + integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^3.0.1" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + execa@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" @@ -7775,6 +8046,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + flat-cache@^3.0.4: version "3.1.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" @@ -7880,6 +8159,15 @@ fs-extra@9.1.0, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^11.0.0, fs-extra@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" @@ -8230,6 +8518,17 @@ globby@11.1.0, globby@^11.0.1, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +globby@^13.1.3: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -8342,6 +8641,14 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + hey-listen@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" @@ -8435,6 +8742,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" + integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== + human-signals@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" @@ -8499,7 +8811,7 @@ ignore-walk@^6.0.0: dependencies: minimatch "^9.0.0" -ignore@^5.0.4, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -8767,6 +9079,11 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -8911,6 +9228,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-unicode-supported@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -9446,6 +9768,11 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +load-tsconfig@^0.2.0: + version "0.2.5" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + local-pkg@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" @@ -9480,6 +9807,13 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -9558,6 +9892,14 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-symbols@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== + dependencies: + chalk "^5.0.0" + is-unicode-supported "^1.1.0" + log-update@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" @@ -9583,6 +9925,13 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -10125,6 +10474,14 @@ next@^13.4.1: "@next/swc-win32-ia32-msvc" "13.5.6" "@next/swc-win32-x64-msvc" "13.5.6" +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -10154,7 +10511,7 @@ node-fetch@^2.6.12, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^3.3.1: +node-fetch@^3.3.0, node-fetch@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== @@ -10627,6 +10984,21 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +ora@^6.1.2: + version "6.3.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-6.3.1.tgz#a4e9e5c2cf5ee73c259e8b410273e706a2ad3ed6" + integrity sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ== + dependencies: + chalk "^5.0.0" + cli-cursor "^4.0.0" + cli-spinners "^2.6.1" + is-interactive "^2.0.0" + is-unicode-supported "^1.1.0" + log-symbols "^5.1.0" + stdin-discarder "^0.1.0" + strip-ansi "^7.0.1" + wcwidth "^1.0.1" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -10691,6 +11063,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map-series@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" @@ -10793,6 +11172,14 @@ pacote@^15.0.0, pacote@^15.0.8: ssri "^10.0.0" tar "^6.1.11" +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -10853,6 +11240,22 @@ parse5@^7.1.2: dependencies: entities "^4.4.0" +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -10863,6 +11266,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -10903,7 +11311,7 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.0, pathe@^1.1.1: +pathe@^1.0.0, pathe@^1.1.0, pathe@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== @@ -11078,7 +11486,7 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^2.8.8: +prettier@^2.8.1, prettier@^2.8.8: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -11878,6 +12286,15 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -11998,6 +12415,11 @@ slash@3.0.0, slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" @@ -12011,6 +12433,14 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + socks-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" @@ -12136,6 +12566,13 @@ std-env@^3.3.2: resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.4.3.tgz#326f11db518db751c83fd58574f449b7c3060910" integrity sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q== +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + stream-browserify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" @@ -12944,6 +13381,20 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"