From 2031f9bf94496ae848fb259de7c0d5c964273746 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 14:25:22 -0700 Subject: [PATCH 01/79] feat: entry point address as optional to SmartAccountProvider (#180) * feat: abstract out entry point contract address from SCA provider params * feat: make entry point address as an optional param to SCA provider class * feat: update docs for the new utils methods * Update site/packages/aa-core/utils/getDefaultEntryPointContract.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/utils/getDefaultSimpleAccountFactory.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * chore: nit error message update and refactoring --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../onboarding/OnboardingController.ts | 16 ++++++------ site/smart-accounts/signers/capsule.md | 1 - site/smart-accounts/signers/dynamic.md | 1 - site/smart-accounts/signers/turnkey.md | 1 - site/smart-accounts/signers/web3auth.md | 1 - yarn.lock | 25 +++++++++++++++++++ 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 2f88f9d0a5..9539d50199 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( diff --git a/site/smart-accounts/signers/capsule.md b/site/smart-accounts/signers/capsule.md index d81ee2e9f2..3737eda5f6 100644 --- a/site/smart-accounts/signers/capsule.md +++ b/site/smart-accounts/signers/capsule.md @@ -80,7 +80,6 @@ import { sepolia } from "viem/chains"; import { capsuleSigner } from "./capsule"; const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 4487871ac8..6a1a681fbc 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -91,7 +91,6 @@ import { sepolia } from "viem/chains"; import { dynamicSigner } from "./dynamic"; const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/turnkey.md b/site/smart-accounts/signers/turnkey.md index 6851fcf413..04d66eb00d 100644 --- a/site/smart-accounts/signers/turnkey.md +++ b/site/smart-accounts/signers/turnkey.md @@ -69,7 +69,6 @@ import { newTurnkeySigner } from "./turnkey"; async function main() { const owner = await newTurnkeySigner(); const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index d1469591da..9ba91a60b4 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -61,7 +61,6 @@ import { sepolia } from "viem/chains"; import { web3authSigner } from "./web3auth"; const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/yarn.lock b/yarn.lock index c765ba9f96..541b10fc1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,31 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== +"@alchemy/aa-accounts@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" + integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-alchemy@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" + integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-core@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" + integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== + dependencies: + abitype "^0.8.3" + eventemitter3 "^5.0.1" + viem "^1.16.2" + "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From 9d21fc92d837e670d02cbe523af8fbcdc4720a3c Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 22:58:13 -0700 Subject: [PATCH 02/79] feat: add sanity check on provider connect for clearer error message (#181) Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../surfaces/onboarding/OnboardingController.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 9539d50199..2f88f9d0a5 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( From 4e4040c479006a77f1d56e3f8a7dd80147f887e7 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Mon, 30 Oct 2023 11:10:05 -0400 Subject: [PATCH 03/79] feat: add zod runtime validation for base provider (#171) --- packages/accounts/src/light-account/__tests__/account.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/accounts/src/light-account/__tests__/account.test.ts b/packages/accounts/src/light-account/__tests__/account.test.ts index f385a69a6d..ea88ac085f 100644 --- a/packages/accounts/src/light-account/__tests__/account.test.ts +++ b/packages/accounts/src/light-account/__tests__/account.test.ts @@ -1,6 +1,7 @@ import { LocalAccountSigner, SmartAccountProvider, + type Address, type BatchUserOperationCallData, type SmartAccountSigner, } from "@alchemy/aa-core"; From ca38dcd66861516e40c900a13c043e6cbf03fb13 Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Thu, 26 Oct 2023 14:23:16 -0400 Subject: [PATCH 04/79] docs: update the magic docs to highlight signer creation is async (#170) * docs: update the magic docs to highlight signer creation is async * docs: update the magic docs to highlight signer creation is async --- site/smart-accounts/signers/magic.md | 1 - 1 file changed, 1 deletion(-) diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index 4d0927a8a7..ddf0b24dc2 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -61,7 +61,6 @@ import { sepolia } from "viem/chains"; import { createMagicSigner } from "./magic"; const chain = sepolia; - // NOTE: the below is async because it depends on creating a magic signer. You can choose to break that up how you want // eg. use a useEffect + useState to create the signer and then pass it down to the provider const provider = new AlchemyProvider({ From 1add3396a0372080b80d4bfdb5684fed62bd55a7 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 14:25:22 -0700 Subject: [PATCH 05/79] feat: entry point address as optional to SmartAccountProvider (#180) * feat: abstract out entry point contract address from SCA provider params * feat: make entry point address as an optional param to SCA provider class * feat: update docs for the new utils methods * Update site/packages/aa-core/utils/getDefaultEntryPointContract.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/utils/getDefaultSimpleAccountFactory.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * chore: nit error message update and refactoring --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../surfaces/onboarding/OnboardingController.ts | 16 ++++++++-------- .../src/light-account/__tests__/account.test.ts | 1 - site/smart-accounts/signers/capsule.md | 2 ++ site/smart-accounts/signers/dynamic.md | 2 ++ site/smart-accounts/signers/magic.md | 3 +++ site/smart-accounts/signers/turnkey.md | 2 ++ site/smart-accounts/signers/web3auth.md | 2 ++ 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 2f88f9d0a5..9539d50199 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( diff --git a/packages/accounts/src/light-account/__tests__/account.test.ts b/packages/accounts/src/light-account/__tests__/account.test.ts index ea88ac085f..f385a69a6d 100644 --- a/packages/accounts/src/light-account/__tests__/account.test.ts +++ b/packages/accounts/src/light-account/__tests__/account.test.ts @@ -1,7 +1,6 @@ import { LocalAccountSigner, SmartAccountProvider, - type Address, type BatchUserOperationCallData, type SmartAccountSigner, } from "@alchemy/aa-core"; diff --git a/site/smart-accounts/signers/capsule.md b/site/smart-accounts/signers/capsule.md index 3737eda5f6..8fdfce7141 100644 --- a/site/smart-accounts/signers/capsule.md +++ b/site/smart-accounts/signers/capsule.md @@ -80,6 +80,8 @@ import { sepolia } from "viem/chains"; import { capsuleSigner } from "./capsule"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointAddress(chain); +const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 6a1a681fbc..9ec3ccc7e8 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -91,6 +91,8 @@ import { sepolia } from "viem/chains"; import { dynamicSigner } from "./dynamic"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointAddress(chain); +const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index ddf0b24dc2..a7b7df20c0 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -61,6 +61,9 @@ import { sepolia } from "viem/chains"; import { createMagicSigner } from "./magic"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointContract(chain); +const factoryAddress = getDefaultLightAccountFactory(chain); + // NOTE: the below is async because it depends on creating a magic signer. You can choose to break that up how you want // eg. use a useEffect + useState to create the signer and then pass it down to the provider const provider = new AlchemyProvider({ diff --git a/site/smart-accounts/signers/turnkey.md b/site/smart-accounts/signers/turnkey.md index 04d66eb00d..d9a60bef4f 100644 --- a/site/smart-accounts/signers/turnkey.md +++ b/site/smart-accounts/signers/turnkey.md @@ -69,6 +69,8 @@ import { newTurnkeySigner } from "./turnkey"; async function main() { const owner = await newTurnkeySigner(); const chain = sepolia; + const entryPointAddress = getDefaultEntryPointAddress(chain); + const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index 9ba91a60b4..f7e360200d 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -61,6 +61,8 @@ import { sepolia } from "viem/chains"; import { web3authSigner } from "./web3auth"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointAddress(chain); +const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, From 93ebb4958b2b06362093e9de364677d9f2f67ce8 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 18:54:21 -0700 Subject: [PATCH 06/79] feat: make entry point contract as an optional param to SCA class (#182) --- site/smart-accounts/signers/capsule.md | 3 +-- site/smart-accounts/signers/dynamic.md | 3 +-- site/smart-accounts/signers/magic.md | 2 -- site/smart-accounts/signers/turnkey.md | 3 +-- site/smart-accounts/signers/web3auth.md | 3 +-- 5 files changed, 4 insertions(+), 10 deletions(-) diff --git a/site/smart-accounts/signers/capsule.md b/site/smart-accounts/signers/capsule.md index 8fdfce7141..d81ee2e9f2 100644 --- a/site/smart-accounts/signers/capsule.md +++ b/site/smart-accounts/signers/capsule.md @@ -80,8 +80,7 @@ import { sepolia } from "viem/chains"; import { capsuleSigner } from "./capsule"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointAddress(chain); -const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 9ec3ccc7e8..4487871ac8 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -91,8 +91,7 @@ import { sepolia } from "viem/chains"; import { dynamicSigner } from "./dynamic"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointAddress(chain); -const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index a7b7df20c0..4d0927a8a7 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -61,8 +61,6 @@ import { sepolia } from "viem/chains"; import { createMagicSigner } from "./magic"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointContract(chain); -const factoryAddress = getDefaultLightAccountFactory(chain); // NOTE: the below is async because it depends on creating a magic signer. You can choose to break that up how you want // eg. use a useEffect + useState to create the signer and then pass it down to the provider diff --git a/site/smart-accounts/signers/turnkey.md b/site/smart-accounts/signers/turnkey.md index d9a60bef4f..6851fcf413 100644 --- a/site/smart-accounts/signers/turnkey.md +++ b/site/smart-accounts/signers/turnkey.md @@ -69,8 +69,7 @@ import { newTurnkeySigner } from "./turnkey"; async function main() { const owner = await newTurnkeySigner(); const chain = sepolia; - const entryPointAddress = getDefaultEntryPointAddress(chain); - const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index f7e360200d..d1469591da 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -61,8 +61,7 @@ import { sepolia } from "viem/chains"; import { web3authSigner } from "./web3auth"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointAddress(chain); -const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, From f64559c969596fc71505d99777fb8b8cbb09b9b9 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 22:58:13 -0700 Subject: [PATCH 07/79] feat: add sanity check on provider connect for clearer error message (#181) Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../surfaces/onboarding/OnboardingController.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 9539d50199..2f88f9d0a5 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( From 9a81647208a1c0c22d939ce0fa5c2db2c1905bf0 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:19:03 -0400 Subject: [PATCH 08/79] feat: add zod runtime validation for base account (#186) * feat: add zod runtime validation for base account * feat: add zod runtime validation for base account * feat: add zod runtime validation for simple account * refactor: clean up base schemas * refactor: rebase * refactor: rename abitype import --- packages/core/src/account/__tests__/simple.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/src/account/__tests__/simple.test.ts b/packages/core/src/account/__tests__/simple.test.ts index ef6fddb404..9ae1429456 100644 --- a/packages/core/src/account/__tests__/simple.test.ts +++ b/packages/core/src/account/__tests__/simple.test.ts @@ -1,5 +1,9 @@ import type { Address } from "viem"; +<<<<<<< HEAD import { polygonMumbai, sepolia, type Chain } from "viem/chains"; +======= +import { polygonMumbai, type Chain } from "viem/chains"; +>>>>>>> 1c5e368 (feat: add zod runtime validation for base account (#186)) import { describe, it } from "vitest"; import { getDefaultSimpleAccountFactoryAddress } from "../../index.js"; import { SmartAccountProvider } from "../../provider/base.js"; From 2aa1f1cbef5837f617049eff2c28f4ac888754bf Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Thu, 2 Nov 2023 16:02:11 -0400 Subject: [PATCH 09/79] feat: add zod runtime validation for simple account (#189) --- packages/core/src/account/__tests__/simple.test.ts | 4 ---- packages/core/src/account/schema.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/core/src/account/__tests__/simple.test.ts b/packages/core/src/account/__tests__/simple.test.ts index 9ae1429456..ef6fddb404 100644 --- a/packages/core/src/account/__tests__/simple.test.ts +++ b/packages/core/src/account/__tests__/simple.test.ts @@ -1,9 +1,5 @@ import type { Address } from "viem"; -<<<<<<< HEAD import { polygonMumbai, sepolia, type Chain } from "viem/chains"; -======= -import { polygonMumbai, type Chain } from "viem/chains"; ->>>>>>> 1c5e368 (feat: add zod runtime validation for base account (#186)) import { describe, it } from "vitest"; import { getDefaultSimpleAccountFactoryAddress } from "../../index.js"; import { SmartAccountProvider } from "../../provider/base.js"; diff --git a/packages/core/src/account/schema.ts b/packages/core/src/account/schema.ts index 183a8b60e7..a0d452e2c1 100644 --- a/packages/core/src/account/schema.ts +++ b/packages/core/src/account/schema.ts @@ -35,3 +35,11 @@ export const SimpleSmartAccountParamsSchema = < owner: SignerSchema, index: z.bigint().optional(), }); + +export const SimpleSmartAccountParamsSchema = < + TTransport extends SupportedTransports = Transport +>() => + createBaseSmartAccountParamsSchema().extend({ + owner: SignerSchema, + index: z.bigint().optional(), + }); From de3a8cc9ae10c6bba4e087adf2b02567ed520877 Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Fri, 3 Nov 2023 15:19:20 -0400 Subject: [PATCH 10/79] feat: add support for overriding the initCode for an account (#197) --- packages/core/src/account/schema.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/core/src/account/schema.ts b/packages/core/src/account/schema.ts index a0d452e2c1..183a8b60e7 100644 --- a/packages/core/src/account/schema.ts +++ b/packages/core/src/account/schema.ts @@ -35,11 +35,3 @@ export const SimpleSmartAccountParamsSchema = < owner: SignerSchema, index: z.bigint().optional(), }); - -export const SimpleSmartAccountParamsSchema = < - TTransport extends SupportedTransports = Transport ->() => - createBaseSmartAccountParamsSchema().extend({ - owner: SignerSchema, - index: z.bigint().optional(), - }); From 4e71ee2d78cd4dbaaaf74fdb5ca1fd6e6faf2608 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Sun, 5 Nov 2023 19:30:50 -0500 Subject: [PATCH 11/79] chore: bump dev dependencies and versions in examples (#211) --- packages/accounts/package.json | 1 - yarn.lock | 25 ------------------------- 2 files changed, 26 deletions(-) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index aea1bb4dfe..cd4d2eab37 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -39,7 +39,6 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "@alchemy/aa-alchemy": "^1.0.0", "@alchemy/aa-core": "^0.2.0", "typescript": "^5.0.4", "typescript-template": "*", diff --git a/yarn.lock b/yarn.lock index 541b10fc1f..c765ba9f96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,31 +12,6 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== -"@alchemy/aa-accounts@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" - integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-alchemy@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" - integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-core@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" - integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== - dependencies: - abitype "^0.8.3" - eventemitter3 "^5.0.1" - viem "^1.16.2" - "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From a4be7392a4625e5b2f0a08c46f44a3524b0b7542 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Sun, 5 Nov 2023 17:31:48 -0800 Subject: [PATCH 12/79] feat: use alchemy provider, light account for e2e tests (#209) --- packages/accounts/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index cd4d2eab37..784dfac71b 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -40,6 +40,7 @@ }, "devDependencies": { "@alchemy/aa-core": "^0.2.0", + "@alchemy/aa-alchemy": "^0.2.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" From 808e27a5eff1f727b3b421d774854a6ce706c744 Mon Sep 17 00:00:00 2001 From: JP <36560907+0xfourzerofour@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:18:06 -0500 Subject: [PATCH 13/79] feat(arb-sepolia): add arb sepolia to defaults (#216) --- packages/core/src/utils/defaults.ts | 2 ++ yarn.lock | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/packages/core/src/utils/defaults.ts b/packages/core/src/utils/defaults.ts index 2fbcc6ebac..a6322a4e22 100644 --- a/packages/core/src/utils/defaults.ts +++ b/packages/core/src/utils/defaults.ts @@ -67,6 +67,8 @@ export const getDefaultSimpleAccountFactoryAddress = ( case optimismGoerli.id: case arbitrumGoerli.id: return "0x9406Cc6185a346906296840746125a0E44976454"; + case arbitrumSepolia.id: + return "0x8d4CCBaa194ED721AC3e231a1A3863966c2D7921"; } throw new Error( diff --git a/yarn.lock b/yarn.lock index c765ba9f96..541b10fc1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,31 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== +"@alchemy/aa-accounts@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" + integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-alchemy@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" + integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-core@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" + integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== + dependencies: + abitype "^0.8.3" + eventemitter3 "^5.0.1" + viem "^1.16.2" + "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From 1bb816a7f9106572745304ae8bd405d0aa9c6ab7 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 9 Nov 2023 10:34:18 -0800 Subject: [PATCH 14/79] feat: aa-sdk with native arb sepolia support (#231) --- packages/core/src/utils/defaults.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/utils/defaults.ts b/packages/core/src/utils/defaults.ts index a6322a4e22..2fbcc6ebac 100644 --- a/packages/core/src/utils/defaults.ts +++ b/packages/core/src/utils/defaults.ts @@ -67,8 +67,6 @@ export const getDefaultSimpleAccountFactoryAddress = ( case optimismGoerli.id: case arbitrumGoerli.id: return "0x9406Cc6185a346906296840746125a0E44976454"; - case arbitrumSepolia.id: - return "0x8d4CCBaa194ED721AC3e231a1A3863966c2D7921"; } throw new Error( From 07114ebd7370100cddf4ffacfc891121e05fa9b6 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Thu, 9 Nov 2023 15:50:48 -0500 Subject: [PATCH 15/79] feat!: extend SmartAccountSigner with authentication functionality (#227) --- .../e2e-tests/kernel-account.test.ts | 1 + yarn.lock | 25 ------------------- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts b/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts index 5a69fab63f..99ae9973ca 100644 --- a/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts +++ b/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts @@ -1,4 +1,5 @@ import { + AA_SDK_TESTS_SIGNER_TYPE, getDefaultEntryPointAddress, type BatchUserOperationCallData, type SmartAccountSigner, diff --git a/yarn.lock b/yarn.lock index 541b10fc1f..c765ba9f96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,31 +12,6 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== -"@alchemy/aa-accounts@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" - integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-alchemy@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" - integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-core@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" - integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== - dependencies: - abitype "^0.8.3" - eventemitter3 "^5.0.1" - viem "^1.16.2" - "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From 0b934544ede75727b0491bedb6be4985030e8cf6 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 9 Nov 2023 14:41:25 -0800 Subject: [PATCH 16/79] feat: remove AA_SDK_TESTS_SIGNER_TYPE constant exported from aa-core (#232) --- .../accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts b/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts index 99ae9973ca..5a69fab63f 100644 --- a/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts +++ b/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts @@ -1,5 +1,4 @@ import { - AA_SDK_TESTS_SIGNER_TYPE, getDefaultEntryPointAddress, type BatchUserOperationCallData, type SmartAccountSigner, From 41571df12335db72372a4302cda6046e147c9787 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 9 Nov 2023 18:34:01 -0800 Subject: [PATCH 17/79] chore(release): publish v1.0.0 [skip-ci] --- packages/accounts/CHANGELOG.md | 1 - packages/accounts/package.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/accounts/CHANGELOG.md b/packages/accounts/CHANGELOG.md index 9d28769934..542adac954 100644 --- a/packages/accounts/CHANGELOG.md +++ b/packages/accounts/CHANGELOG.md @@ -13,7 +13,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - entry point address as optional to SmartAccountProvider ([#180](https://github.com/alchemyplatform/aa-sdk/issues/180)) ([f5c378b](https://github.com/alchemyplatform/aa-sdk/commit/f5c378ba1cb04bdc1e41c3e6dd0eba1cb6ee7f2c)) - remove AA_SDK_TESTS_SIGNER_TYPE constant exported from aa-core ([#232](https://github.com/alchemyplatform/aa-sdk/issues/232)) ([883c489](https://github.com/alchemyplatform/aa-sdk/commit/883c489b077d587b6c5b50c44d92b2a00f10e5ac)) - use alchemy provider, light account for e2e tests ([#209](https://github.com/alchemyplatform/aa-sdk/issues/209)) ([124be68](https://github.com/alchemyplatform/aa-sdk/commit/124be68c5137a3511ec612e814265739e6909e75)) - - remove AA_SDK_TESTS_SIGNER_TYPE constant exported from aa-core ([#232](https://github.com/alchemyplatform/aa-sdk/issues/232)) ([5170a6b](https://github.com/alchemyplatform/aa-sdk/commit/5170a6b689c9834a9a2489f054b767e190fa38f7)) # 0.2.0 (2023-11-03) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 784dfac71b..aea1bb4dfe 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -39,8 +39,8 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { + "@alchemy/aa-alchemy": "^1.0.0", "@alchemy/aa-core": "^0.2.0", - "@alchemy/aa-alchemy": "^0.2.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" From 356241b5f167aece8452a357d93597bc29bcda06 Mon Sep 17 00:00:00 2001 From: Alchemy Bot Date: Fri, 10 Nov 2023 02:23:26 +0000 Subject: [PATCH 18/79] chore(release): publish v0.3.0 [skip-ci] --- packages/accounts/package.json | 8 ++++++++ packages/alchemy/package.json | 4 ++++ packages/ethers/package.json | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index aea1bb4dfe..9d24b03df4 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -1,6 +1,10 @@ { "name": "@alchemy/aa-accounts", +<<<<<<< HEAD "version": "1.0.0", +======= + "version": "0.3.0", +>>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "description": "A collection of ERC-4337 compliant smart contract account interfaces", "author": "Alchemy", "license": "MIT", @@ -59,7 +63,11 @@ "homepage": "https://github.com/alchemyplatform/aa-sdk#readme", "gitHead": "ee46e8bb857de3b631044fa70714ea706d9e317d", "dependencies": { +<<<<<<< HEAD "@alchemy/aa-core": "^1.0.0", +======= + "@alchemy/aa-core": "^0.3.0", +>>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "viem": "^1.16.2" } } diff --git a/packages/alchemy/package.json b/packages/alchemy/package.json index 631945ca98..9f76b59c41 100644 --- a/packages/alchemy/package.json +++ b/packages/alchemy/package.json @@ -1,6 +1,10 @@ { "name": "@alchemy/aa-alchemy", +<<<<<<< HEAD "version": "1.0.0", +======= + "version": "0.3.0", +>>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "description": "adapters for @alchemy/aa-core for interacting with alchemy services", "author": "Alchemy", "license": "MIT", diff --git a/packages/ethers/package.json b/packages/ethers/package.json index b2a2384e29..fa8a6c9dd3 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -49,7 +49,11 @@ "vitest": "^0.31.0" }, "dependencies": { +<<<<<<< HEAD "@alchemy/aa-core": "^1.0.0", +======= + "@alchemy/aa-core": "^0.3.0", +>>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/bytes": "^5.7.0", From c7829db1561f47a6d976d84310e578a6cf5cd0b2 Mon Sep 17 00:00:00 2001 From: moldy Date: Thu, 9 Nov 2023 21:36:43 -0500 Subject: [PATCH 19/79] feat!: publish breaking change BREAKING CHANGE: forcing breaking change From 1ba4f91c0977183c81721ceff8b10ad7f32cd231 Mon Sep 17 00:00:00 2001 From: moldy Date: Thu, 9 Nov 2023 21:38:54 -0500 Subject: [PATCH 20/79] chore(release): publish v1.0.0 [skip-ci] --- packages/accounts/package.json | 8 -------- packages/alchemy/package.json | 4 ---- packages/ethers/package.json | 4 ---- 3 files changed, 16 deletions(-) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 9d24b03df4..aea1bb4dfe 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -1,10 +1,6 @@ { "name": "@alchemy/aa-accounts", -<<<<<<< HEAD "version": "1.0.0", -======= - "version": "0.3.0", ->>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "description": "A collection of ERC-4337 compliant smart contract account interfaces", "author": "Alchemy", "license": "MIT", @@ -63,11 +59,7 @@ "homepage": "https://github.com/alchemyplatform/aa-sdk#readme", "gitHead": "ee46e8bb857de3b631044fa70714ea706d9e317d", "dependencies": { -<<<<<<< HEAD "@alchemy/aa-core": "^1.0.0", -======= - "@alchemy/aa-core": "^0.3.0", ->>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "viem": "^1.16.2" } } diff --git a/packages/alchemy/package.json b/packages/alchemy/package.json index 9f76b59c41..631945ca98 100644 --- a/packages/alchemy/package.json +++ b/packages/alchemy/package.json @@ -1,10 +1,6 @@ { "name": "@alchemy/aa-alchemy", -<<<<<<< HEAD "version": "1.0.0", -======= - "version": "0.3.0", ->>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "description": "adapters for @alchemy/aa-core for interacting with alchemy services", "author": "Alchemy", "license": "MIT", diff --git a/packages/ethers/package.json b/packages/ethers/package.json index fa8a6c9dd3..b2a2384e29 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -49,11 +49,7 @@ "vitest": "^0.31.0" }, "dependencies": { -<<<<<<< HEAD "@alchemy/aa-core": "^1.0.0", -======= - "@alchemy/aa-core": "^0.3.0", ->>>>>>> 34243f6 (chore(release): publish v0.3.0 [skip-ci]) "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/bytes": "^5.7.0", From e3d179193930ad6d8b54ff512d041de2921dcd4a Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 14:25:22 -0700 Subject: [PATCH 21/79] feat: entry point address as optional to SmartAccountProvider (#180) * feat: abstract out entry point contract address from SCA provider params * feat: make entry point address as an optional param to SCA provider class * feat: update docs for the new utils methods * Update site/packages/aa-core/utils/getDefaultEntryPointContract.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/utils/getDefaultSimpleAccountFactory.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * chore: nit error message update and refactoring --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../onboarding/OnboardingController.ts | 16 ++++++------ site/smart-accounts/signers/capsule.md | 1 - site/smart-accounts/signers/dynamic.md | 1 - site/smart-accounts/signers/turnkey.md | 1 - site/smart-accounts/signers/web3auth.md | 1 - yarn.lock | 25 +++++++++++++++++++ 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 2f88f9d0a5..9539d50199 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( diff --git a/site/smart-accounts/signers/capsule.md b/site/smart-accounts/signers/capsule.md index d81ee2e9f2..3737eda5f6 100644 --- a/site/smart-accounts/signers/capsule.md +++ b/site/smart-accounts/signers/capsule.md @@ -80,7 +80,6 @@ import { sepolia } from "viem/chains"; import { capsuleSigner } from "./capsule"; const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 4487871ac8..6a1a681fbc 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -91,7 +91,6 @@ import { sepolia } from "viem/chains"; import { dynamicSigner } from "./dynamic"; const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/turnkey.md b/site/smart-accounts/signers/turnkey.md index 6851fcf413..04d66eb00d 100644 --- a/site/smart-accounts/signers/turnkey.md +++ b/site/smart-accounts/signers/turnkey.md @@ -69,7 +69,6 @@ import { newTurnkeySigner } from "./turnkey"; async function main() { const owner = await newTurnkeySigner(); const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index d1469591da..9ba91a60b4 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -61,7 +61,6 @@ import { sepolia } from "viem/chains"; import { web3authSigner } from "./web3auth"; const chain = sepolia; - const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/yarn.lock b/yarn.lock index c765ba9f96..541b10fc1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,31 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== +"@alchemy/aa-accounts@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" + integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-alchemy@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" + integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-core@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" + integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== + dependencies: + abitype "^0.8.3" + eventemitter3 "^5.0.1" + viem "^1.16.2" + "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From 514feb2feccfb5eb74f9a4319ee792786c193a99 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 22:58:13 -0700 Subject: [PATCH 22/79] feat: add sanity check on provider connect for clearer error message (#181) Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../surfaces/onboarding/OnboardingController.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 9539d50199..2f88f9d0a5 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( From f4420b020a13185bf652a91fbe5544861e788d03 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Mon, 30 Oct 2023 11:10:05 -0400 Subject: [PATCH 23/79] feat: add zod runtime validation for base provider (#171) --- packages/accounts/src/light-account/__tests__/account.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/accounts/src/light-account/__tests__/account.test.ts b/packages/accounts/src/light-account/__tests__/account.test.ts index f385a69a6d..ea88ac085f 100644 --- a/packages/accounts/src/light-account/__tests__/account.test.ts +++ b/packages/accounts/src/light-account/__tests__/account.test.ts @@ -1,6 +1,7 @@ import { LocalAccountSigner, SmartAccountProvider, + type Address, type BatchUserOperationCallData, type SmartAccountSigner, } from "@alchemy/aa-core"; From d858a90220ded267fc574c96457952943747cb9e Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Thu, 26 Oct 2023 14:23:16 -0400 Subject: [PATCH 24/79] docs: update the magic docs to highlight signer creation is async (#170) * docs: update the magic docs to highlight signer creation is async * docs: update the magic docs to highlight signer creation is async --- site/smart-accounts/signers/magic.md | 1 - 1 file changed, 1 deletion(-) diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index 4d0927a8a7..ddf0b24dc2 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -61,7 +61,6 @@ import { sepolia } from "viem/chains"; import { createMagicSigner } from "./magic"; const chain = sepolia; - // NOTE: the below is async because it depends on creating a magic signer. You can choose to break that up how you want // eg. use a useEffect + useState to create the signer and then pass it down to the provider const provider = new AlchemyProvider({ From d9f79f6027be534f6a5a9fec3dd4c06df62e7fc1 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 14:25:22 -0700 Subject: [PATCH 25/79] feat: entry point address as optional to SmartAccountProvider (#180) * feat: abstract out entry point contract address from SCA provider params * feat: make entry point address as an optional param to SCA provider class * feat: update docs for the new utils methods * Update site/packages/aa-core/utils/getDefaultEntryPointContract.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/utils/getDefaultSimpleAccountFactory.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * chore: nit error message update and refactoring --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../surfaces/onboarding/OnboardingController.ts | 16 ++++++++-------- .../src/light-account/__tests__/account.test.ts | 1 - site/smart-accounts/signers/capsule.md | 2 ++ site/smart-accounts/signers/dynamic.md | 2 ++ site/smart-accounts/signers/magic.md | 3 +++ site/smart-accounts/signers/turnkey.md | 2 ++ site/smart-accounts/signers/web3auth.md | 2 ++ 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 2f88f9d0a5..9539d50199 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( diff --git a/packages/accounts/src/light-account/__tests__/account.test.ts b/packages/accounts/src/light-account/__tests__/account.test.ts index ea88ac085f..f385a69a6d 100644 --- a/packages/accounts/src/light-account/__tests__/account.test.ts +++ b/packages/accounts/src/light-account/__tests__/account.test.ts @@ -1,7 +1,6 @@ import { LocalAccountSigner, SmartAccountProvider, - type Address, type BatchUserOperationCallData, type SmartAccountSigner, } from "@alchemy/aa-core"; diff --git a/site/smart-accounts/signers/capsule.md b/site/smart-accounts/signers/capsule.md index 3737eda5f6..8fdfce7141 100644 --- a/site/smart-accounts/signers/capsule.md +++ b/site/smart-accounts/signers/capsule.md @@ -80,6 +80,8 @@ import { sepolia } from "viem/chains"; import { capsuleSigner } from "./capsule"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointAddress(chain); +const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 6a1a681fbc..9ec3ccc7e8 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -91,6 +91,8 @@ import { sepolia } from "viem/chains"; import { dynamicSigner } from "./dynamic"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointAddress(chain); +const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index ddf0b24dc2..a7b7df20c0 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -61,6 +61,9 @@ import { sepolia } from "viem/chains"; import { createMagicSigner } from "./magic"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointContract(chain); +const factoryAddress = getDefaultLightAccountFactory(chain); + // NOTE: the below is async because it depends on creating a magic signer. You can choose to break that up how you want // eg. use a useEffect + useState to create the signer and then pass it down to the provider const provider = new AlchemyProvider({ diff --git a/site/smart-accounts/signers/turnkey.md b/site/smart-accounts/signers/turnkey.md index 04d66eb00d..d9a60bef4f 100644 --- a/site/smart-accounts/signers/turnkey.md +++ b/site/smart-accounts/signers/turnkey.md @@ -69,6 +69,8 @@ import { newTurnkeySigner } from "./turnkey"; async function main() { const owner = await newTurnkeySigner(); const chain = sepolia; + const entryPointAddress = getDefaultEntryPointAddress(chain); + const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index 9ba91a60b4..f7e360200d 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -61,6 +61,8 @@ import { sepolia } from "viem/chains"; import { web3authSigner } from "./web3auth"; const chain = sepolia; +const entryPointAddress = getDefaultEntryPointAddress(chain); +const factoryAddress = getDefaultLightAccountFactoryAddress(chain); const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, From 129a3463d6a5a81eeed50139ac7e1aa5ffe5d20b Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 18:54:21 -0700 Subject: [PATCH 26/79] feat: make entry point contract as an optional param to SCA class (#182) --- site/smart-accounts/signers/capsule.md | 3 +-- site/smart-accounts/signers/dynamic.md | 3 +-- site/smart-accounts/signers/magic.md | 2 -- site/smart-accounts/signers/turnkey.md | 3 +-- site/smart-accounts/signers/web3auth.md | 3 +-- 5 files changed, 4 insertions(+), 10 deletions(-) diff --git a/site/smart-accounts/signers/capsule.md b/site/smart-accounts/signers/capsule.md index 8fdfce7141..d81ee2e9f2 100644 --- a/site/smart-accounts/signers/capsule.md +++ b/site/smart-accounts/signers/capsule.md @@ -80,8 +80,7 @@ import { sepolia } from "viem/chains"; import { capsuleSigner } from "./capsule"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointAddress(chain); -const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 9ec3ccc7e8..4487871ac8 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -91,8 +91,7 @@ import { sepolia } from "viem/chains"; import { dynamicSigner } from "./dynamic"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointAddress(chain); -const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index a7b7df20c0..4d0927a8a7 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -61,8 +61,6 @@ import { sepolia } from "viem/chains"; import { createMagicSigner } from "./magic"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointContract(chain); -const factoryAddress = getDefaultLightAccountFactory(chain); // NOTE: the below is async because it depends on creating a magic signer. You can choose to break that up how you want // eg. use a useEffect + useState to create the signer and then pass it down to the provider diff --git a/site/smart-accounts/signers/turnkey.md b/site/smart-accounts/signers/turnkey.md index d9a60bef4f..6851fcf413 100644 --- a/site/smart-accounts/signers/turnkey.md +++ b/site/smart-accounts/signers/turnkey.md @@ -69,8 +69,7 @@ import { newTurnkeySigner } from "./turnkey"; async function main() { const owner = await newTurnkeySigner(); const chain = sepolia; - const entryPointAddress = getDefaultEntryPointAddress(chain); - const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index f7e360200d..d1469591da 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -61,8 +61,7 @@ import { sepolia } from "viem/chains"; import { web3authSigner } from "./web3auth"; const chain = sepolia; -const entryPointAddress = getDefaultEntryPointAddress(chain); -const factoryAddress = getDefaultLightAccountFactoryAddress(chain); + const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, From 33798c2847e9515583224b0132fe460c7d367487 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 30 Oct 2023 22:58:13 -0700 Subject: [PATCH 27/79] feat: add sanity check on provider connect for clearer error message (#181) Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../surfaces/onboarding/OnboardingController.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts index 9539d50199..2f88f9d0a5 100644 --- a/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts +++ b/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts @@ -11,16 +11,16 @@ import { useAccount, useNetwork, type Chain } from "wagmi"; import { localSmartContractStore } from "~/clients/localStorage"; import { NFTContractABI } from "../../clients/nftContract"; import { - DAAppConfiguration, - daappConfigurations, + DAAppConfiguration, + daappConfigurations, } from "../../configs/clientConfigs"; import { - MIN_ONBOARDING_WALLET_BALANCE, - OnboardingContext, - OnboardingStep, - OnboardingStepIdentifier, - initialStep, - metaForStepIdentifier, + MIN_ONBOARDING_WALLET_BALANCE, + OnboardingContext, + OnboardingStep, + OnboardingStepIdentifier, + initialStep, + metaForStepIdentifier, } from "./OnboardingDataModels"; async function pollForLambdaForComplete( From 55c1c3eb72fdc63a39fa8a478c430ad6914ec4dd Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:19:03 -0400 Subject: [PATCH 28/79] feat: add zod runtime validation for base account (#186) * feat: add zod runtime validation for base account * feat: add zod runtime validation for base account * feat: add zod runtime validation for simple account * refactor: clean up base schemas * refactor: rebase * refactor: rename abitype import --- packages/core/src/account/__tests__/simple.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/src/account/__tests__/simple.test.ts b/packages/core/src/account/__tests__/simple.test.ts index ef6fddb404..9ae1429456 100644 --- a/packages/core/src/account/__tests__/simple.test.ts +++ b/packages/core/src/account/__tests__/simple.test.ts @@ -1,5 +1,9 @@ import type { Address } from "viem"; +<<<<<<< HEAD import { polygonMumbai, sepolia, type Chain } from "viem/chains"; +======= +import { polygonMumbai, type Chain } from "viem/chains"; +>>>>>>> 1c5e368 (feat: add zod runtime validation for base account (#186)) import { describe, it } from "vitest"; import { getDefaultSimpleAccountFactoryAddress } from "../../index.js"; import { SmartAccountProvider } from "../../provider/base.js"; From 82309c95beb901b5ab1ff9215686037ed78ab160 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Thu, 2 Nov 2023 16:02:11 -0400 Subject: [PATCH 29/79] feat: add zod runtime validation for simple account (#189) --- packages/core/src/account/__tests__/simple.test.ts | 4 ---- packages/core/src/account/schema.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/core/src/account/__tests__/simple.test.ts b/packages/core/src/account/__tests__/simple.test.ts index 9ae1429456..ef6fddb404 100644 --- a/packages/core/src/account/__tests__/simple.test.ts +++ b/packages/core/src/account/__tests__/simple.test.ts @@ -1,9 +1,5 @@ import type { Address } from "viem"; -<<<<<<< HEAD import { polygonMumbai, sepolia, type Chain } from "viem/chains"; -======= -import { polygonMumbai, type Chain } from "viem/chains"; ->>>>>>> 1c5e368 (feat: add zod runtime validation for base account (#186)) import { describe, it } from "vitest"; import { getDefaultSimpleAccountFactoryAddress } from "../../index.js"; import { SmartAccountProvider } from "../../provider/base.js"; diff --git a/packages/core/src/account/schema.ts b/packages/core/src/account/schema.ts index 183a8b60e7..a0d452e2c1 100644 --- a/packages/core/src/account/schema.ts +++ b/packages/core/src/account/schema.ts @@ -35,3 +35,11 @@ export const SimpleSmartAccountParamsSchema = < owner: SignerSchema, index: z.bigint().optional(), }); + +export const SimpleSmartAccountParamsSchema = < + TTransport extends SupportedTransports = Transport +>() => + createBaseSmartAccountParamsSchema().extend({ + owner: SignerSchema, + index: z.bigint().optional(), + }); From 0121aad31e69c1b992d4c682abd32522b48c619f Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Fri, 3 Nov 2023 15:19:20 -0400 Subject: [PATCH 30/79] feat: add support for overriding the initCode for an account (#197) --- packages/core/src/account/schema.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/core/src/account/schema.ts b/packages/core/src/account/schema.ts index a0d452e2c1..183a8b60e7 100644 --- a/packages/core/src/account/schema.ts +++ b/packages/core/src/account/schema.ts @@ -35,11 +35,3 @@ export const SimpleSmartAccountParamsSchema = < owner: SignerSchema, index: z.bigint().optional(), }); - -export const SimpleSmartAccountParamsSchema = < - TTransport extends SupportedTransports = Transport ->() => - createBaseSmartAccountParamsSchema().extend({ - owner: SignerSchema, - index: z.bigint().optional(), - }); From 565425778aac88ed69e611f776f9e21f58a40f4f Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Sun, 5 Nov 2023 19:30:50 -0500 Subject: [PATCH 31/79] chore: bump dev dependencies and versions in examples (#211) --- packages/accounts/package.json | 1 - yarn.lock | 25 ------------------------- 2 files changed, 26 deletions(-) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index aea1bb4dfe..cd4d2eab37 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -39,7 +39,6 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "@alchemy/aa-alchemy": "^1.0.0", "@alchemy/aa-core": "^0.2.0", "typescript": "^5.0.4", "typescript-template": "*", diff --git a/yarn.lock b/yarn.lock index 541b10fc1f..c765ba9f96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,31 +12,6 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== -"@alchemy/aa-accounts@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" - integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-alchemy@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" - integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-core@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" - integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== - dependencies: - abitype "^0.8.3" - eventemitter3 "^5.0.1" - viem "^1.16.2" - "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From 6e7d007dc72ce4990106d4e2ddd44f564fe79337 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Sun, 5 Nov 2023 17:31:48 -0800 Subject: [PATCH 32/79] feat: use alchemy provider, light account for e2e tests (#209) --- packages/accounts/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index cd4d2eab37..784dfac71b 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -40,6 +40,7 @@ }, "devDependencies": { "@alchemy/aa-core": "^0.2.0", + "@alchemy/aa-alchemy": "^0.2.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" From 12863a6f6ac8b727b055aa178231bea66642aa54 Mon Sep 17 00:00:00 2001 From: JP <36560907+0xfourzerofour@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:18:06 -0500 Subject: [PATCH 33/79] feat(arb-sepolia): add arb sepolia to defaults (#216) --- packages/core/src/utils/defaults.ts | 2 ++ yarn.lock | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/packages/core/src/utils/defaults.ts b/packages/core/src/utils/defaults.ts index 2fbcc6ebac..a6322a4e22 100644 --- a/packages/core/src/utils/defaults.ts +++ b/packages/core/src/utils/defaults.ts @@ -67,6 +67,8 @@ export const getDefaultSimpleAccountFactoryAddress = ( case optimismGoerli.id: case arbitrumGoerli.id: return "0x9406Cc6185a346906296840746125a0E44976454"; + case arbitrumSepolia.id: + return "0x8d4CCBaa194ED721AC3e231a1A3863966c2D7921"; } throw new Error( diff --git a/yarn.lock b/yarn.lock index c765ba9f96..541b10fc1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,31 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== +"@alchemy/aa-accounts@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" + integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-alchemy@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" + integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== + dependencies: + "@alchemy/aa-core" "^0.1.1" + viem "^1.16.2" + +"@alchemy/aa-core@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" + integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== + dependencies: + abitype "^0.8.3" + eventemitter3 "^5.0.1" + viem "^1.16.2" + "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From 2e22ae828625ec9a1139ff3f94d510ea9a0a915a Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Tue, 7 Nov 2023 13:04:06 -0800 Subject: [PATCH 34/79] chore: update tests to use aa-sdk-tests as signerType to avoid confusion in telemetry (#222) --- packages/core/src/index.ts | 2 +- packages/core/src/signer/types.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 530ffd8227..58a73e8501 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -15,8 +15,8 @@ export type { BaseSmartAccountParams } from "./account/types.js"; export { LocalAccountSigner } from "./signer/local-account.js"; export { SignerSchema } from "./signer/schema.js"; export type { - SmartAccountSigner, SmartAccountAuthenticator, + SmartAccountSigner, } from "./signer/types.js"; export { verifyEIP6492Signature, diff --git a/packages/core/src/signer/types.ts b/packages/core/src/signer/types.ts index d19a9d7e6e..d8032d8004 100644 --- a/packages/core/src/signer/types.ts +++ b/packages/core/src/signer/types.ts @@ -41,3 +41,5 @@ export interface SmartAccountSigner { signTypedData: (params: SignTypedDataParams) => Promise; } + +export const AA_SDK_TESTS_SIGNER_TYPE = "aa-sdk-tests"; From 737f9c456de24bf52511dbde2ca480fc7e91b1ca Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 9 Nov 2023 10:34:18 -0800 Subject: [PATCH 35/79] feat: aa-sdk with native arb sepolia support (#231) --- packages/core/src/utils/defaults.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/utils/defaults.ts b/packages/core/src/utils/defaults.ts index a6322a4e22..2fbcc6ebac 100644 --- a/packages/core/src/utils/defaults.ts +++ b/packages/core/src/utils/defaults.ts @@ -67,8 +67,6 @@ export const getDefaultSimpleAccountFactoryAddress = ( case optimismGoerli.id: case arbitrumGoerli.id: return "0x9406Cc6185a346906296840746125a0E44976454"; - case arbitrumSepolia.id: - return "0x8d4CCBaa194ED721AC3e231a1A3863966c2D7921"; } throw new Error( From 0b35ec24f9ff24bd5f29c533525e26f16ac14da6 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Thu, 9 Nov 2023 15:50:48 -0500 Subject: [PATCH 36/79] feat!: extend SmartAccountSigner with authentication functionality (#227) --- yarn.lock | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/yarn.lock b/yarn.lock index 541b10fc1f..c765ba9f96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,31 +12,6 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== -"@alchemy/aa-accounts@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-accounts/-/aa-accounts-0.1.1.tgz#7527e25fe2825eb91d80f6e4cb85d188606587a4" - integrity sha512-nHHnJuIHXGdvH5i+7DlTeSPa3RJtNLt4NpJP+G+T8G3QP/k6mxHNWFTybOhqxuCC798DACxKc4thOL2Lj8phgA== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-alchemy@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-alchemy/-/aa-alchemy-0.1.1.tgz#f7f989b2aaae127a49a61e1dde6d6f52d40d0018" - integrity sha512-rVQZNb1QmfQoxDyaXuinB0pfrKENLydwH57TWXJn4wFW+3c+iM6xM/tsfx6zxzA7HTwodcRw8//wMvdF+5KQmg== - dependencies: - "@alchemy/aa-core" "^0.1.1" - viem "^1.16.2" - -"@alchemy/aa-core@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-0.1.1.tgz#2c81e34c0ca939897004c68d80250f1b4b423ff2" - integrity sha512-vEfCx9MJMTCMpmB3cY+TcM65znP8zcMTaiYE7By3+krhd7ViflWdEILe5HGGzCALGqdr6pUaBI7n08eVoyo6KQ== - dependencies: - abitype "^0.8.3" - eventemitter3 "^5.0.1" - viem "^1.16.2" - "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" From 05d0c432d5b9c970f1f3bc159648777c542d6201 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 9 Nov 2023 14:41:25 -0800 Subject: [PATCH 37/79] feat: remove AA_SDK_TESTS_SIGNER_TYPE constant exported from aa-core (#232) --- packages/core/src/signer/types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/signer/types.ts b/packages/core/src/signer/types.ts index d8032d8004..d19a9d7e6e 100644 --- a/packages/core/src/signer/types.ts +++ b/packages/core/src/signer/types.ts @@ -41,5 +41,3 @@ export interface SmartAccountSigner { signTypedData: (params: SignTypedDataParams) => Promise; } - -export const AA_SDK_TESTS_SIGNER_TYPE = "aa-sdk-tests"; From 60a4baf2c24fee2d87004875bcaf2889010acb1d Mon Sep 17 00:00:00 2001 From: Alchemy Bot Date: Fri, 10 Nov 2023 02:23:26 +0000 Subject: [PATCH 38/79] chore(release): publish v0.3.0 [skip-ci] --- packages/accounts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 784dfac71b..841910c2a3 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -39,8 +39,8 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { + "@alchemy/aa-alchemy": "^0.3.0", "@alchemy/aa-core": "^0.2.0", - "@alchemy/aa-alchemy": "^0.2.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" From b8c367553f51a48dbd5bcf3ea72c8519c92ab59b Mon Sep 17 00:00:00 2001 From: moldy Date: Thu, 9 Nov 2023 21:36:43 -0500 Subject: [PATCH 39/79] feat!: publish breaking change BREAKING CHANGE: forcing breaking change From 2b1fed63993def71ba6b726abb19cdbe14106f7e Mon Sep 17 00:00:00 2001 From: moldy Date: Thu, 9 Nov 2023 21:38:54 -0500 Subject: [PATCH 40/79] chore(release): publish v1.0.0 [skip-ci] --- packages/accounts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 841910c2a3..aea1bb4dfe 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -39,7 +39,7 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "@alchemy/aa-alchemy": "^0.3.0", + "@alchemy/aa-alchemy": "^1.0.0", "@alchemy/aa-core": "^0.2.0", "typescript": "^5.0.4", "typescript-template": "*", From c7235fbb553b0945a1b2b77fc51413d97e6df1aa Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Fri, 10 Nov 2023 09:10:15 -0800 Subject: [PATCH 41/79] feat: paymasterAndData override to skip paymaster middleware (#236) --- packages/core/src/provider/base.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index f5ee105d55..a0702e2c9b 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -390,7 +390,9 @@ export class SmartAccountProvider< // run this before paymaster middleware async (struct) => ({ ...struct, ...overrides }), this.customMiddleware ?? noOpMiddleware, - this.paymasterDataMiddleware + overrides?.paymasterAndData + ? noOpMiddleware + : this.paymasterDataMiddleware )(uo); return resolveProperties(result); From f2f8ef2d0be2225c129e77a0574625fc12173699 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Sat, 11 Nov 2023 15:07:21 -0800 Subject: [PATCH 42/79] fix: fix e2e tests (#239) --- packages/accounts/package.json | 2 +- .../alchemy/e2e-tests/simple-account.test.ts | 18 ++++++++++++++++-- packages/alchemy/package.json | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index aea1bb4dfe..d6f3543b4a 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@alchemy/aa-alchemy": "^1.0.0", - "@alchemy/aa-core": "^0.2.0", + "@alchemy/aa-core": "^1.0.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" diff --git a/packages/alchemy/e2e-tests/simple-account.test.ts b/packages/alchemy/e2e-tests/simple-account.test.ts index b5174f154f..2e299c0fb7 100644 --- a/packages/alchemy/e2e-tests/simple-account.test.ts +++ b/packages/alchemy/e2e-tests/simple-account.test.ts @@ -4,7 +4,13 @@ import { type SmartAccountSigner, } from "@alchemy/aa-core"; import { Alchemy, Network } from "alchemy-sdk"; -import { toHex, type Address, type Chain, type Hash } from "viem"; +import { + toHex, + type Address, + type Chain, + type Hash, + type HDAccount, +} from "viem"; import { mnemonicToAccount } from "viem/accounts"; import { sepolia } from "viem/chains"; import { AlchemyProvider } from "../src/provider.js"; @@ -15,7 +21,7 @@ const network = Network.ETH_SEPOLIA; describe("Simple Account Tests", () => { const ownerAccount = mnemonicToAccount(OWNER_MNEMONIC); - const owner: SmartAccountSigner = { + const owner: SmartAccountSigner = { signMessage: async (msg) => ownerAccount.signMessage({ message: { raw: toHex(msg) }, @@ -23,6 +29,7 @@ describe("Simple Account Tests", () => { signTypedData: async () => "0xHash", getAddress: async () => ownerAccount.address, signerType: "aa-sdk-tests", + inner: ownerAccount, }; it("should successfully get counterfactual address", async () => { @@ -180,6 +187,10 @@ describe("Simple Account Tests", () => { "contractAddress": "0xdcf5d3e08c5007dececdb34808c49331bd82a247", "tokenBalance": "0x00000000000000000000000000000000000000000000000000000000000f423f", }, + { + "contractAddress": "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + "tokenBalance": "0x0000000000000000000000000000000000000000000000000000000000000000", + }, ] `); }, 50000); @@ -223,6 +234,9 @@ const givenConnectedProvider = ({ apiKey: API_KEY!, chain, feeOpts, + opts: { + txMaxRetries: 10, + }, }).connect( (provider) => new SimpleSmartContractAccount({ diff --git a/packages/alchemy/package.json b/packages/alchemy/package.json index 631945ca98..1e88159371 100644 --- a/packages/alchemy/package.json +++ b/packages/alchemy/package.json @@ -39,7 +39,7 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "@alchemy/aa-core": "^0.2.0", + "@alchemy/aa-core": "^1.0.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" From 0be7fb0002ce6a4d3ec0254fe9a6d109f61c5238 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 13 Nov 2023 08:38:25 -0800 Subject: [PATCH 43/79] feat: optional maxPriorityFeePerGasEstimateBuffer to provider config (#241) --- packages/core/src/provider/base.ts | 9 ++++++++- packages/core/src/provider/schema.ts | 16 +++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index a0702e2c9b..86fe77739f 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -75,6 +75,7 @@ export class SmartAccountProvider< private txRetryMulitplier: number; private minPriorityFeePerBid: bigint; + private maxPriorityFeePerGasEstimateBuffer: number; readonly account?: ISmartContractAccount; @@ -104,6 +105,9 @@ export class SmartAccountProvider< minPriorityFeePerBidDefaults.get(chain.id) ?? 100_000_000n; + this.maxPriorityFeePerGasEstimateBuffer = + opts?.maxPriorityFeePerGasEstimateBuffer ?? 33; + this.rpcClient = typeof rpcProvider === "string" ? createPublicErc4337Client({ @@ -475,7 +479,10 @@ export class SmartAccountProvider< // set maxPriorityFeePerGasBid to the max between 33% added priority fee estimate and // the min priority fee per gas set for the provider const maxPriorityFeePerGasBid = bigIntMax( - bigIntPercent(maxPriorityFeePerGas, 133n), + bigIntPercent( + maxPriorityFeePerGas, + BigInt(100 + this.maxPriorityFeePerGasEstimateBuffer) + ), this.minPriorityFeePerBid ); diff --git a/packages/core/src/provider/schema.ts b/packages/core/src/provider/schema.ts index 119ba3c620..5dfa7f7ec0 100644 --- a/packages/core/src/provider/schema.ts +++ b/packages/core/src/provider/schema.ts @@ -9,22 +9,28 @@ export const SmartAccountProviderOptsSchema = z.object({ /** * The maximum number of times to try fetching a transaction receipt before giving up (default: 5) */ - txMaxRetries: z.number().optional(), + txMaxRetries: z.number().min(0).optional(), /** * The interval in milliseconds to wait between retries while waiting for tx receipts (default: 2_000) */ - txRetryIntervalMs: z.number().optional(), + txRetryIntervalMs: z.number().min(0).optional(), /** * The mulitplier on interval length to wait between retries while waiting for tx receipts (default: 1.5) */ - txRetryMulitplier: z.number().optional(), + txRetryMulitplier: z.number().min(0).optional(), /** - * used when computing the fees for a user operation (default: 100_000_000n) + * Used when computing the fees for a user operation (default: 100_000_000n) */ - minPriorityFeePerBid: z.bigint().optional(), + minPriorityFeePerBid: z.bigint().min(0n).optional(), + + /** + * Percent value for maxPriorityFeePerGas estimate added buffer. maxPriorityFeePerGasBid is set to the max + * between the buffer "added" priority fee estimate and the minPriorityFeePerBid (default: 33) + */ + maxPriorityFeePerGasEstimateBuffer: z.number().min(0).optional(), }); export const createSmartAccountProviderConfigSchema = < From c77c6c3b77bd38d1095c74008a9d9503b5f6d06e Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 13 Nov 2023 10:42:38 -0800 Subject: [PATCH 44/79] docs: details about batching user operations (#237) * docs: details about batching user operations * Update site/guides/batching-transactions.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/guides/batching-transactions.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/guides/batching-transactions.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- site/guides/batching-transactions.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/site/guides/batching-transactions.md b/site/guides/batching-transactions.md index 42e220e4ed..b49c452052 100644 --- a/site/guides/batching-transactions.md +++ b/site/guides/batching-transactions.md @@ -20,16 +20,28 @@ head: # How to Submit Batch Transactions -One benefit of Smart Contract Accounts is that it's possible to batch transactions in one User Operation. Not all Smart Contract Accounts support batching. But, if the account you're using does, then implementations of `SmartAccountProvider` will allow you to make those calls. +One benefit of Smart Contract Accounts is that it's possible to batch transactions in one User Operation. Not all Smart Contract Accounts support batching. But, if the `ISmartContractAccount` implementation you're using has the [`encodeBatchExecute`](/packages/aa-core/accounts/optional/encodeBatchExecute.md) method, then implementations of `SmartAccountProvider` will allow you to make those calls. There are two ways you can batch transactions using `SmartAccountProvider`: 1. via `sendUserOperation` 2. via `sendTransactions` -## `sendUserOperation` +:::tip Note 1: `SimpleSmartContractAccount` and `LightSmartContractAccount` +Both `SimpleSmartContractAccount` and `LightSmartContractAccount` implement `encodeBatchExecute`, thus supports batching `UserOperations` out of the box. +::: + +:::tip Note 2: Transactions Batched as a Single User Operation +When you batch transactions, the transaction actions (`target`s and `calldata`s) are batched into a single `UserOperation`, where the sender is the account itself. +::: + +:::tip Note 3: Batched Transactions Ordering +The batched `UserOperation` gets executed by the account calling the `executeBatch` method on the [`SimpleAccount`](https://github.com/eth-infinitism/account-abstraction/blob/ver0.6.0/contracts/samples/SimpleAccount.sol) or [`LightAccount`](https://github.com/alchemyplatform/light-account/blob/v1.0.2/src/LightAccount.sol) smart contracts. `executeBatch` processes the input array of transactions data linearly, guaranteeing the execution order of those transactions to be **sequential**. +::: + +## Batching using [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation.md) -The `SmartAccountProvider` supports passing either a single `UserOperation` or an array of `UserOperation`s to `sendUserOperation`. If you pass an array, the provider will batch the transactions into a single User Operation and submit it to the network. Let's see an example: +The `SmartAccountProvider` supports passing either a single `UserOperation` or an array of `UserOperation`s to `sendUserOperation`. If you pass an array, the provider will batch the transactions into a single User Operation and submit it to the bundler. Let's see an example: ::: code-group @@ -53,7 +65,7 @@ const { hash } = await provider.sendUserOperation([ ::: -## `sendTransactions` +## Batching using [`sendTransactions`](/packages/aa-core/provider/sendTransactions.md) The `SmartAccountProvider` supports sending `UserOperation`s and waiting for them to be mined in a transaction via the `sendTransaction` and `sendTransactions` methods. The latter allows for batching in the same way `sendUserOperation`: From 5130e482921d1c1b17c2b60d6ac478ce5ee8607e Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 13 Nov 2023 10:48:01 -0800 Subject: [PATCH 45/79] docs: add readme to alchemy packages for npm (#240) * docs: add readme to alchemy packages for npm * Update site/snippets/ethers-provider.ts Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/snippets/ethers-signer.ts Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update packages/ethers/README.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update packages/ethers/README.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- packages/accounts/README.md | 12 ++++-- packages/alchemy/README.md | 51 ++++++++++++++++++++++++ packages/core/README.md | 57 ++++++++++++++++++++++++++ packages/ethers/README.md | 64 ++++++++++++++++++++++++++++++ site/packages/aa-accounts/index.md | 2 +- site/packages/aa-alchemy/index.md | 4 +- site/packages/aa-core/index.md | 4 +- site/packages/aa-ethers/index.md | 4 +- site/snippets/ethers-provider.ts | 1 + site/snippets/ethers-signer.ts | 1 + 10 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 packages/alchemy/README.md create mode 100644 packages/core/README.md create mode 100644 packages/ethers/README.md diff --git a/packages/accounts/README.md b/packages/accounts/README.md index daa130effe..dd7fa680dd 100644 --- a/packages/accounts/README.md +++ b/packages/accounts/README.md @@ -1,10 +1,10 @@ # `@alchemy/aa-accounts` -This package contains various implementations of the [`BaseSmartContractAccount`](../core/src/account/base.ts) class defined in `aa-core`. This repo is community maintained and we welcome contributions! +This package contains various implementations of the [`BaseSmartContractAccount`](https://accountkit.alchemy.com/packages/aa-core/accounts/introduction.html#basesmartcontractaccount) class defined in `aa-core`. This repo is community maintained and we welcome contributions! ## Getting started -If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the accounts. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the [README](../../README.md) to get started. +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the accounts. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the [Getting Started](https://accountkit.alchemy.com/packages/aa-accounts/) docs to get started. via `yarn` @@ -18,6 +18,12 @@ via `npm` npm i -s @alchemy/aa-accounts ``` +via `pnpm` + +```bash +pnpm i @alchemy/aa-accounts +``` + ## Contributing If you are looking to add a new account type, please follow the following structure. @@ -30,7 +36,7 @@ If you are looking to add a new account type, please follow the following struct export const MyContractAbi = [] as const; // the as const is important so we can get correct typing from viem ``` -4. If you need to extend the [`SmartAccountProvider`](../core/src/provider/base.ts) class, add a file called `provider.ts` and add your implementation for `SmartAccountProvider`. +4. If you need to extend the [`SmartAccountProvider`](https://accountkit.alchemy.com/packages/aa-core/provider/introduction.html) class, add a file called `provider.ts` and add your implementation for `SmartAccountProvider`. - Ideally, your `Account` impl should _just_ work with the base provider provided by `aa-core`. - If not, consider generalizing the use case and updating SmartAccountProvider diff --git a/packages/alchemy/README.md b/packages/alchemy/README.md new file mode 100644 index 0000000000..0213834c06 --- /dev/null +++ b/packages/alchemy/README.md @@ -0,0 +1,51 @@ +# `@alchemy/aa-alchemy` + +This package contains `AlchemyProvider`, an implementation of `SmartAccountProvider` class defined in `aa-core`. It also contains middleware for accessing the Alchemy Gas Manager (an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster) and for doing Fee Estimates according to the expectations of the Alchemy [Rundler](https://github.com/alchemyplatform/rundler/tree/main) (an ERC-4337 Bundler). You may also find the util methods helpful. This repo is community maintained and we welcome contributions! + +## Getting started + +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the `AlchemyProvider`. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](https://accountkit.alchemy.com/packages/aa-alchemy/) docs to get started. + +```bash [yarn] +yarn add @alchemy/aa-alchemy +``` + +```bash [npm] +npm i -s @alchemy/aa-alchemy +``` + +```bash [pnpm] +pnpm i @alchemy/aa-alchemy +``` + +## Usage + +You can create `AlchemyProvider` like so: + +```typescript +import { + LightSmartContractAccount, + getDefaultLightAccountFactoryAddress, +} from "@alchemy/aa-accounts"; +import { AlchemyProvider } from "@alchemy/aa-alchemy"; +import { LocalAccountSigner, type SmartAccountSigner } from "@alchemy/aa-core"; +import { sepolia } from "viem/chains"; + +const chain = sepolia; +const PRIVATE_KEY = "0xYourEOAPrivateKey"; +const eoaSigner: SmartAccountSigner = + LocalAccountSigner.privateKeyToAccountSigner(`0x${PRIVATE_KEY}`); + +export const provider = new AlchemyProvider({ + apiKey: "ALCHEMY_API_KEY", // replace with your alchemy api key of the Alchemy app associated with the Gas Manager, get yours at https://dashboard.alchemy.com/ + chain, +}).connect( + (rpcClient) => + new LightSmartContractAccount({ + chain, + owner: eoaSigner, + factoryAddress: getDefaultLightAccountFactoryAddress(chain), + rpcClient, + }) +); +``` diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 0000000000..4bc836d752 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,57 @@ +# `@alchemy/aa-core` + +This package contains the core interfaces and components for interacting with 4337 infrastructure. The primary interfaces that it exports are the `SmartAccountProvider` and `BaseSmartContractAccount`. + +The `SmartAccountProvider` is an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant Provider that wraps JSON RPC methods and some Wallet Methods (signing, sendTransaction, etc). With this Provider, you can submit User Operations to RPC providers, estimate gas, configure a Paymaster, send standard JSON RPC requests, and more. It is not opinionated about which RPC provider you are using and is configurable to work with any RPC provider. Because it implements EIP-1193, it can be used with any web3 library. + +The `BaseSmartContractAccount` interface defines how you would interact with your Smart Contract Account. Any class that extends `BaseSmartContractAccount` may also expose additional methods that allow its connecting `SmartAccountProvider` to provide ergonic utilities for building and submitting `User Operation`s. + +## Getting Started + +To get started, first install the package: + +```bash [yarn] +yarn add @alchemy/aa-core +``` + +```bash [npm] +npm i -s @alchemy/aa-core +``` + +```bash [pnpm] +pnpm i @alchemy/aa-core +``` + +## Usage + +You can create a provider like so: + +```typescript +import { + LightSmartContractAccount, + getDefaultLightAccountFactoryAddress, +} from "@alchemy/aa-accounts"; +import { + LocalAccountSigner, + SmartAccountProvider, + SmartAccountSigner, +} from "@alchemy/aa-core"; +import { polygonMumbai } from "viem/chains"; + +const chain = polygonMumbai; +const owner: SmartAccountSigner = + LocalAccountSigner.mnemonicToAccountSigner(YOUR_OWNER_MNEMONIC); + +export const provider = new SmartAccountProvider({ + rpcProvider: "https://polygon-mumbai.g.alchemy.com/v2/demo", + chain, +}).connect( + (rpcClient) => + new LightSmartContractAccount({ + chain, + factoryAddress: getDefaultLightAccountFactoryAddress(chain), + rpcClient, + owner, + }) +); +``` diff --git a/packages/ethers/README.md b/packages/ethers/README.md new file mode 100644 index 0000000000..938e66fdf4 --- /dev/null +++ b/packages/ethers/README.md @@ -0,0 +1,64 @@ +# `@alchemy/aa-ethers` + +This package contains `EthersProviderAdapter` and `AccountSigner`, respective extensions of the [`JsonRpcProvider`](https://docs.ethers.org/v5/api/providers/jsonrpc-provider/) and [`Signer`](https://docs.ethers.org/v5/api/signer/#Signer-getaddress) classes defined in [`ethers.js`](https://docs.ethers.org/v5/) external library. + +If you currently rely `ethers.js` for web3 development, you can use these `ethers.js`-compatible `JsonRpcProvider` and `Signer` to integrate Account Abstraction into your dApp. You may also find the [`util`](https://accountkit.alchemy.com/packages/aa-ethers/utils/introduction.html) methods helpful. + +This repo is community maintained and we welcome contributions! + +## Getting started + +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the `EthersProviderAdapter` and `AccountSigner`. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](https://accountkit.alchemy.com/packages/aa-ethers/) docs to get started. + +```bash [yarn] +yarn add @alchemy/aa-ethers +``` + +```bash [npm] +npm i -s @alchemy/aa-ethers +``` + +```bash [pnpm] +pnpm i @alchemy/aa-ethers +``` + +## Usage + +You can create a provider and connect it to a signer account like so: + +```typescript ethers-provider.ts +import { + LightSmartContractAccount, + getDefaultLightAccountFactoryAddress, +} from "@alchemy/aa-accounts"; +import { EthersProviderAdapter } from "@alchemy/aa-ethers"; +import { LocalAccountSigner, SmartAccountSigner } from "@alchemy/aa-core"; +import { Alchemy, Network } from "alchemy-sdk"; +import { polygonMumbai } from "viem/chains"; + +const chain = polygonMumbai; + +// 1. Create a provider using EthersProviderAdapter +const alchemy = new Alchemy({ + apiKey: process.env.API_KEY!, + network: Network.MATIC_MUMBAI, +}); +const ethersProvider = await alchemy.config.getProvider(); + +const provider = EthersProviderAdapter.fromEthersProvider(ethersProvider); + +const owner: SmartAccountSigner = LocalAccountSigner.mnemonicToAccountSigner( + process.env.YOUR_OWNER_MNEMONIC! +); + +// 2. Connect the provider to the smart account signer +export const signer = provider.connectToAccount( + (rpcClient) => + new LightSmartContractAccount({ + chain, + factoryAddress: getDefaultLightAccountFactoryAddress(chain), + rpcClient, + owner, + }) +); +``` diff --git a/site/packages/aa-accounts/index.md b/site/packages/aa-accounts/index.md index 8bfbd5d5e7..fbb5c0b7c8 100644 --- a/site/packages/aa-accounts/index.md +++ b/site/packages/aa-accounts/index.md @@ -32,7 +32,7 @@ yarn add @alchemy/aa-accounts ``` ```bash [npm] -npm i @alchemy/aa-accounts +npm i -s @alchemy/aa-accounts ``` ```bash [pnpm] diff --git a/site/packages/aa-alchemy/index.md b/site/packages/aa-alchemy/index.md index ea3ee4b1a9..9452a90fb0 100644 --- a/site/packages/aa-alchemy/index.md +++ b/site/packages/aa-alchemy/index.md @@ -19,7 +19,7 @@ next: # `@alchemy/aa-alchemy` -This package contains `AlchemyProvider`, an implementation of `SmartAccountProvider` class defined in `aa-core`. It also contains middleware for accessing the Alchemy Gas Manager (an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster) and for doing Fee Estimates according to the expectations of the Alchemy Rundler (an ERC-4337 Bundler). You may also find the util methods helpful. This repo is community maintained and we welcome contributions! +This package contains `AlchemyProvider`, an implementation of `SmartAccountProvider` class defined in `aa-core`. It also contains middleware for accessing the Alchemy Gas Manager (an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster) and for doing Fee Estimates according to the expectations of the Alchemy [Rundler](https://github.com/alchemyplatform/rundler/tree/main) (an ERC-4337 Bundler). You may also find the util methods helpful. This repo is community maintained and we welcome contributions! ## Getting started @@ -32,7 +32,7 @@ yarn add @alchemy/aa-alchemy ``` ```bash [npm] -npm i @alchemy/aa-alchemy +npm i -s @alchemy/aa-alchemy ``` ```bash [pnpm] diff --git a/site/packages/aa-core/index.md b/site/packages/aa-core/index.md index 04949f2a54..06841407d6 100644 --- a/site/packages/aa-core/index.md +++ b/site/packages/aa-core/index.md @@ -20,7 +20,7 @@ This package contains the core interfaces and components for interacting with 43 The `SmartAccountProvider` is an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant Provider that wraps JSON RPC methods and some Wallet Methods (signing, sendTransaction, etc). With this Provider, you can submit User Operations to RPC providers, estimate gas, configure a Paymaster, send standard JSON RPC requests, and more. It is not opinionated about which RPC provider you are using and is configurable to work with any RPC provider. Because it implements EIP-1193, it can be used with any web3 library. -The `BaseSmartContractAccount` interface defines how you would interact with your Smart Contract Account. Any class that extends `BaseSmartContractAccount` may also expose additional methods that allow its connecting `SmartAccountProvider` to provide ergonic utilities for building and submitting User Operations. +The `BaseSmartContractAccount` interface defines how you would interact with your Smart Contract Account. Any class that extends `BaseSmartContractAccount` may also expose additional methods that allow its connecting `SmartAccountProvider` to provide ergonic utilities for building and submitting `User Operation`s. ## Getting Started @@ -33,7 +33,7 @@ yarn add @alchemy/aa-core ``` ```bash [npm] -npm i @alchemy/aa-core +npm i -s @alchemy/aa-core ``` ```bash [pnpm] diff --git a/site/packages/aa-ethers/index.md b/site/packages/aa-ethers/index.md index 124483866f..1eab23022c 100644 --- a/site/packages/aa-ethers/index.md +++ b/site/packages/aa-ethers/index.md @@ -19,7 +19,7 @@ next: # `@alchemy/aa-ethers` -This package contains `EthersProviderAdapter` and `AccountSigner`, respective extensions of the `JsonRpcProvider` and `Signer` classes defined in `ethers.js` external library. +This package contains `EthersProviderAdapter` and `AccountSigner`, respective extensions of the [`JsonRpcProvider`](https://docs.ethers.org/v5/api/providers/jsonrpc-provider/) and [`Signer`](https://docs.ethers.org/v5/api/signer/#Signer-getaddress) classes defined in [`ethers.js`](https://docs.ethers.org/v5/) external library. If you currently rely `ethers.js` for web3 development, you can use these `ethers.js`-compatible `JsonRpcProvider` and `Signer` to integrate Account Abstraction into your dApp. You may also find the [`util`](./utils/introduction.md) methods helpful. @@ -36,7 +36,7 @@ yarn add @alchemy/aa-ethers ``` ```bash [npm] -npm i @alchemy/aa-ethers +npm i -s @alchemy/aa-ethers ``` ```bash [pnpm] diff --git a/site/snippets/ethers-provider.ts b/site/snippets/ethers-provider.ts index e7f7349703..fb61984080 100644 --- a/site/snippets/ethers-provider.ts +++ b/site/snippets/ethers-provider.ts @@ -1,6 +1,7 @@ import { EthersProviderAdapter } from "@alchemy/aa-ethers"; import { Alchemy, Network } from "alchemy-sdk"; +// 1. Create a provider using EthersProviderAdapter const alchemy = new Alchemy({ apiKey: process.env.API_KEY!, network: Network.MATIC_MUMBAI, diff --git a/site/snippets/ethers-signer.ts b/site/snippets/ethers-signer.ts index 385f0e5f77..06d770e192 100644 --- a/site/snippets/ethers-signer.ts +++ b/site/snippets/ethers-signer.ts @@ -12,6 +12,7 @@ const owner: SmartAccountSigner = LocalAccountSigner.mnemonicToAccountSigner( const chain = polygonMumbai; +// 2. Connect the provider to the smart account signer export const signer = provider.connectToAccount( (rpcClient) => new LightSmartContractAccount({ From 83e55a0c906365c38c90f2c07cf60f1e647975e9 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Mon, 13 Nov 2023 10:55:13 -0800 Subject: [PATCH 46/79] feat: support overrides for all user operation methods on smart accont provider (#238) * feat: support overrides for all user operation methods on smart account provider * Update site/packages/aa-core/provider/sendUserOperation.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/provider/sendTransactions.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/provider/sendTransaction.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/provider/buildUserOperation.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/provider/buildUserOperationFromTx.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/packages/aa-core/provider/dropAndReplaceUserOperation.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- .../alchemy/e2e-tests/simple-account.test.ts | 28 ++++++++++ packages/core/src/provider/base.ts | 52 ++++++++++++------- .../aa-core/provider/buildUserOperation.md | 4 ++ .../provider/buildUserOperationFromTx.md | 4 ++ .../provider/dropAndReplaceUserOperation.md | 4 ++ .../aa-core/provider/sendTransaction.md | 4 ++ .../aa-core/provider/sendTransactions.md | 4 ++ .../aa-core/provider/sendUserOperation.md | 4 ++ 8 files changed, 84 insertions(+), 20 deletions(-) diff --git a/packages/alchemy/e2e-tests/simple-account.test.ts b/packages/alchemy/e2e-tests/simple-account.test.ts index 2e299c0fb7..466918429f 100644 --- a/packages/alchemy/e2e-tests/simple-account.test.ts +++ b/packages/alchemy/e2e-tests/simple-account.test.ts @@ -99,6 +99,34 @@ describe("Simple Account Tests", () => { ).rejects.toThrow(); }, 50000); + it("should support overrides for buildUserOperation", async () => { + const signer = givenConnectedProvider({ + owner, + chain, + }).withAlchemyGasManager({ + policyId: PAYMASTER_POLICY_ID, + }); + + const overrides = { + maxFeePerGas: 100000000n, + maxPriorityFeePerGas: 100000000n, + paymasterAndData: "0x", + }; + const uoStruct = await signer.buildUserOperation( + { + target: await signer.getAddress(), + data: "0x", + }, + overrides + ); + + expect(uoStruct.maxFeePerGas).toEqual(overrides.maxFeePerGas); + expect(uoStruct.maxPriorityFeePerGas).toEqual( + overrides.maxPriorityFeePerGas + ); + expect(uoStruct.paymasterAndData).toEqual(overrides.paymasterAndData); + }, 50000); + it("should successfully use paymaster with fee opts", async () => { const signer = givenConnectedProvider({ owner, diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index 86fe77739f..a0cd18a74e 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -202,8 +202,11 @@ export class SmartAccountProvider< return this.account.signTypedDataWith6492(params); }; - sendTransaction = async (request: RpcTransactionRequest): Promise => { - const uoStruct = await this.buildUserOperationFromTx(request); + sendTransaction = async ( + request: RpcTransactionRequest, + overrides?: UserOperationOverrides + ): Promise => { + const uoStruct = await this.buildUserOperationFromTx(request, overrides); const { hash } = await this._sendUserOperation(uoStruct); @@ -211,19 +214,22 @@ export class SmartAccountProvider< }; buildUserOperationFromTx = async ( - request: RpcTransactionRequest + request: RpcTransactionRequest, + overrides?: UserOperationOverrides ): Promise => { if (!request.to) { throw new Error("transaction is missing to address"); } - const overrides: UserOperationOverrides = {}; - if (request.maxFeePerGas) { - overrides.maxFeePerGas = request.maxFeePerGas; + const _overrides: UserOperationOverrides = {}; + if (overrides?.maxFeePerGas || request.maxFeePerGas) { + _overrides.maxFeePerGas = overrides?.maxFeePerGas ?? request.maxFeePerGas; } - if (request.maxPriorityFeePerGas) { - overrides.maxPriorityFeePerGas = request.maxPriorityFeePerGas; + if (overrides?.maxPriorityFeePerGas || request.maxPriorityFeePerGas) { + _overrides.maxPriorityFeePerGas = + overrides?.maxPriorityFeePerGas ?? request.maxPriorityFeePerGas; } + _overrides.paymasterAndData = overrides?.paymasterAndData; return this.buildUserOperation( { @@ -231,11 +237,14 @@ export class SmartAccountProvider< data: request.data ?? "0x", value: request.value ? fromHex(request.value, "bigint") : 0n, }, - overrides + _overrides ); }; - sendTransactions = async (requests: RpcTransactionRequest[]) => { + sendTransactions = async ( + requests: RpcTransactionRequest[], + overrides?: UserOperationOverrides + ) => { const batch = requests.map((request) => { if (!request.to) { throw new Error( @@ -261,16 +270,17 @@ export class SmartAccountProvider< .filter((x) => x.maxPriorityFeePerGas != null) .map((x) => fromHex(x.maxPriorityFeePerGas!, "bigint")) ); - const overrides: UserOperationOverrides = {}; - if (maxFeePerGas != null) { - overrides.maxFeePerGas = maxFeePerGas; + const _overrides: UserOperationOverrides = {}; + if (overrides?.maxFeePerGas || maxFeePerGas != null) { + _overrides.maxFeePerGas = overrides?.maxFeePerGas ?? maxFeePerGas; } - if (maxPriorityFeePerGas != null) { - overrides.maxPriorityFeePerGas = maxPriorityFeePerGas; + if (overrides?.maxPriorityFeePerGas || maxPriorityFeePerGas != null) { + _overrides.maxPriorityFeePerGas = + overrides?.maxPriorityFeePerGas ?? maxPriorityFeePerGas; } - const { hash } = await this.sendUserOperation(batch, overrides); + const { hash } = await this.sendUserOperation(batch, _overrides); return await this.waitForUserOperationTransaction(hash as Hash); }; @@ -353,7 +363,8 @@ export class SmartAccountProvider< }; dropAndReplaceUserOperation = async ( - uoToDrop: UserOperationRequest + uoToDrop: UserOperationRequest, + overrides?: UserOperationOverrides ): Promise => { const uoToSubmit = { initCode: uoToDrop.initCode, @@ -366,9 +377,9 @@ export class SmartAccountProvider< // Run once to get the fee estimates // This can happen at any part of the middleware stack, so we want to run it all const { maxFeePerGas, maxPriorityFeePerGas } = - await this._runMiddlewareStack(uoToSubmit); + await this._runMiddlewareStack(uoToSubmit, overrides); - const overrides: UserOperationOverrides = { + const _overrides: UserOperationOverrides = { maxFeePerGas: bigIntMax( BigInt(maxFeePerGas ?? 0n), bigIntPercent(uoToDrop.maxFeePerGas, 110n) @@ -377,9 +388,10 @@ export class SmartAccountProvider< BigInt(maxPriorityFeePerGas ?? 0n), bigIntPercent(uoToDrop.maxPriorityFeePerGas, 110n) ), + paymasterAndData: uoToDrop.paymasterAndData, }; - const uoToSend = await this._runMiddlewareStack(uoToSubmit, overrides); + const uoToSend = await this._runMiddlewareStack(uoToSubmit, _overrides); return this._sendUserOperation(uoToSend); }; diff --git a/site/packages/aa-core/provider/buildUserOperation.md b/site/packages/aa-core/provider/buildUserOperation.md index a9426c206f..29f4443e42 100644 --- a/site/packages/aa-core/provider/buildUserOperation.md +++ b/site/packages/aa-core/provider/buildUserOperation.md @@ -74,3 +74,7 @@ A Promise containing the _unsigned_ UserOperation struct resulting from the midd - `target: Address` - the target of the call (equivalent to `to` in a transaction) - `data: Hex` - can be either `0x` or a call data string - `value?: bigint` - optionally, set the value in wei you want to send to the target + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/buildUserOperationFromTx.md b/site/packages/aa-core/provider/buildUserOperationFromTx.md index a65472b695..9d14bc18a4 100644 --- a/site/packages/aa-core/provider/buildUserOperationFromTx.md +++ b/site/packages/aa-core/provider/buildUserOperationFromTx.md @@ -59,3 +59,7 @@ A Promise containing the _unsigned_ UserOperation struct converted from the inpu ### `tx: RpcTransactionRequest` The `RpcTransactionRequest` object representing a traditional ethereum transaction + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/dropAndReplaceUserOperation.md b/site/packages/aa-core/provider/dropAndReplaceUserOperation.md index 0029062a0c..907d7b0c1f 100644 --- a/site/packages/aa-core/provider/dropAndReplaceUserOperation.md +++ b/site/packages/aa-core/provider/dropAndReplaceUserOperation.md @@ -50,3 +50,7 @@ A Promise containing the hash of the user operation and the request that was sen ### `UserOperationRequest` A previously submitted UserOperation. + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/sendTransaction.md b/site/packages/aa-core/provider/sendTransaction.md index 9a31e2c237..f85dbd67c2 100644 --- a/site/packages/aa-core/provider/sendTransaction.md +++ b/site/packages/aa-core/provider/sendTransaction.md @@ -53,3 +53,7 @@ A Promise containing the transaction hash ### `request: RpcTransactionRequest` The `RpcTransactionRequest` object representing a traditional ethereum transaction + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/sendTransactions.md b/site/packages/aa-core/provider/sendTransactions.md index 10e8d893fd..4ad5c4d566 100644 --- a/site/packages/aa-core/provider/sendTransactions.md +++ b/site/packages/aa-core/provider/sendTransactions.md @@ -74,3 +74,7 @@ A Promise containing the transaction hash ### `request: RpcTransactionRequest[]` An `RpcTransactionRequest` array representing a traditional ethereum transaction + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/sendUserOperation.md b/site/packages/aa-core/provider/sendUserOperation.md index bed9d948f0..0a8c6e13b5 100644 --- a/site/packages/aa-core/provider/sendUserOperation.md +++ b/site/packages/aa-core/provider/sendUserOperation.md @@ -70,3 +70,7 @@ A Promise containing the hash of the user operation and the request that was sen - `target: Address` - the target of the call (equivalent to `to` in a transaction) - `data: Hex` - can be either `0x` or a call data string - `value?: bigint` - optionally, set the value in wei you want to send to the target + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request From 81406f60a489fa2b2a72fe023165eef79b6e5702 Mon Sep 17 00:00:00 2001 From: Alex <36385732+alex-miao@users.noreply.github.com> Date: Tue, 14 Nov 2023 12:13:27 -0800 Subject: [PATCH 47/79] feat: add base sepolia and opt sepolia (#249) --- packages/accounts/src/light-account/utils.ts | 4 ++++ packages/alchemy/src/chains.ts | 6 +++++- packages/core/src/utils/defaults.ts | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/accounts/src/light-account/utils.ts b/packages/accounts/src/light-account/utils.ts index 6814c13f8b..804b26ac3b 100644 --- a/packages/accounts/src/light-account/utils.ts +++ b/packages/accounts/src/light-account/utils.ts @@ -5,10 +5,12 @@ import { arbitrumSepolia, base, baseGoerli, + baseSepolia, goerli, mainnet, optimism, optimismGoerli, + optimismSepolia, polygon, polygonMumbai, sepolia, @@ -30,11 +32,13 @@ export const getDefaultLightAccountFactoryAddress = (chain: Chain): Address => { case polygonMumbai.id: case optimism.id: case optimismGoerli.id: + case optimismSepolia.id: case arbitrum.id: case arbitrumGoerli.id: case arbitrumSepolia.id: case base.id: case baseGoerli.id: + case baseSepolia.id: return "0x00000055C0b4fA41dde26A74435ff03692292FBD"; } throw new Error( diff --git a/packages/alchemy/src/chains.ts b/packages/alchemy/src/chains.ts index 3da115c560..a88dd6c736 100644 --- a/packages/alchemy/src/chains.ts +++ b/packages/alchemy/src/chains.ts @@ -2,16 +2,18 @@ import type { Chain } from "viem"; import { arbitrum, arbitrumGoerli, + arbitrumSepolia, goerli, mainnet, optimism, optimismGoerli, + optimismSepolia, polygon, polygonMumbai, sepolia, base, baseGoerli, - arbitrumSepolia, + baseSepolia, } from "viem/chains"; export const SupportedChains = new Map([ @@ -25,6 +27,8 @@ export const SupportedChains = new Map([ [arbitrum.id, arbitrum], [optimism.id, optimism], [optimismGoerli.id, optimismGoerli], + [optimismSepolia.id, optimismSepolia], [base.id, base], [baseGoerli.id, baseGoerli], + [baseSepolia.id, baseSepolia], ]); diff --git a/packages/core/src/utils/defaults.ts b/packages/core/src/utils/defaults.ts index 2fbcc6ebac..8b490f0e2e 100644 --- a/packages/core/src/utils/defaults.ts +++ b/packages/core/src/utils/defaults.ts @@ -5,10 +5,12 @@ import { arbitrumSepolia, base, baseGoerli, + baseSepolia, goerli, mainnet, optimism, optimismGoerli, + optimismSepolia, polygon, polygonMumbai, sepolia, @@ -30,11 +32,13 @@ export const getDefaultEntryPointAddress = (chain: Chain): Address => { case polygonMumbai.id: case optimism.id: case optimismGoerli.id: + case optimismSepolia.id: case arbitrum.id: case arbitrumGoerli.id: case arbitrumSepolia.id: case base.id: case baseGoerli.id: + case baseSepolia.id: return "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; } throw new Error( @@ -56,9 +60,11 @@ export const getDefaultSimpleAccountFactoryAddress = ( case mainnet.id: case polygon.id: case optimism.id: + case optimismSepolia.id: case arbitrum.id: case base.id: case baseGoerli.id: + case baseSepolia.id: case arbitrumSepolia.id: return "0x15Ba39375ee2Ab563E8873C8390be6f2E2F50232"; case sepolia.id: From 188ccd1fac1937fabe6e776da1e6c7da43e7da5e Mon Sep 17 00:00:00 2001 From: avasisht23 Date: Tue, 14 Nov 2023 16:10:05 -0500 Subject: [PATCH 48/79] chore: rebase --- yarn.lock | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index c765ba9f96..2bb3cc7dce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11870,11 +11870,6 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" -sitka@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sitka/-/sitka-1.1.1.tgz#3f93ccc84160e9c7a233d7afb3ec00630f92423c" - integrity sha512-GjvAdRLNH1eJZoTGtB2dHg1CGqZ3qoeBNbF5oWZL7tlWxMZ1WGnsPpJDmrcc302NA46qRUQZMXk0hiXW6HV+qA== - slash@3.0.0, slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -12676,13 +12671,6 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript-template@*: - version "1.0.7" - resolved "https://registry.yarnpkg.com/typescript-template/-/typescript-template-1.0.7.tgz#04d68ca33483bcbd89d5ed7ea2a3e3e1d2f6fb6c" - integrity sha512-h/RPRYJdzXoAKo6YDvh6v9Vr3JVcOb+DoXI4owCQttcHKEqevz67mWyIn2zXe7uDlo8VJEtzuk/QfRGB+Q6b8A== - dependencies: - sitka "^1.1.1" - "typescript@^3 || ^4": version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" From d44321896c3bb8d47748d4d7454424bad4546618 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:18:41 -0500 Subject: [PATCH 49/79] test: update test naming conventions (#242) --- examples/alchemy-daapp/README.md | 2 +- .../kernel-zerodev/__tests__/account.test.ts | 6 +- .../src/kernel-zerodev/e2e-tests/constants.ts | 2 +- .../e2e-tests/kernel-account.test.ts | 10 +- .../light-account/__tests__/account.test.ts | 17 +- .../src/light-account/e2e-tests/constants.ts | 2 - .../e2e-tests/light-account.test.ts | 73 ++++--- .../alchemy/e2e-tests/simple-account.test.ts | 93 ++++---- .../__snapshots__/provider.test.ts.snap | 198 +----------------- .../alchemy/src/__tests__/provider.test.ts | 22 +- packages/core/e2e-tests/constants.ts | 2 +- .../core/e2e-tests/simple-account.test.ts | 28 +-- .../core/src/account/__tests__/simple.test.ts | 10 +- .../ethers/e2e-tests/simple-account.test.ts | 18 +- .../src/__tests__/provider-adapter.test.ts | 4 +- 15 files changed, 156 insertions(+), 331 deletions(-) diff --git a/examples/alchemy-daapp/README.md b/examples/alchemy-daapp/README.md index 11837666f3..a33caa6f90 100644 --- a/examples/alchemy-daapp/README.md +++ b/examples/alchemy-daapp/README.md @@ -41,7 +41,7 @@ export const serverConfigs: Record = { ``` ### **🗒️ Notes:** for `nftContractAddress` and `lightAccountFactoryAddress` - There are already contract addresses deployed for them across [various chains here](https://github.com/alchemyplatform/aa-sdk/blob/main/examples/alchemy-daapp/src/configs/clientConfigs.ts). -- We used Alchemy's [lightAccountFactory here]. todo(ajay): post the repo when live +- We used Alchemy's [lightAccountFactory here](https://github.com/alchemyplatform/light-account). - Finally, the contracts sibling package has the copy of the [NFT contract](https://github.com/alchemyplatform/aa-sdk/tree/main/examples/contracts/DAAppNFT/src) along instructions on [how to deploy it](https://github.com/alchemyplatform/aa-sdk/blob/main/examples/contracts/README.md). 4. Update the serverConfigs.ts file with your alchemy API keys: diff --git a/packages/accounts/src/kernel-zerodev/__tests__/account.test.ts b/packages/accounts/src/kernel-zerodev/__tests__/account.test.ts index 8871d115ae..20d98d5e24 100644 --- a/packages/accounts/src/kernel-zerodev/__tests__/account.test.ts +++ b/packages/accounts/src/kernel-zerodev/__tests__/account.test.ts @@ -10,13 +10,15 @@ import { KernelAccountProvider } from "../provider.js"; import { KernelBaseValidator, ValidatorMode } from "../validator/base.js"; import { MockSigner } from "./mocks/mock-signer.js"; +const chain = polygonMumbai; + describe("Kernel Account Tests", () => { //any wallet should work const config = { privateKey: generatePrivateKey(), mockWallet: "0x48D4d3536cDe7A257087206870c6B6E76e3D4ff4", - chain: polygonMumbai, - rpcProvider: `${polygonMumbai.rpcUrls.alchemy.http[0]}/demo`, + chain, + rpcProvider: `${chain.rpcUrls.alchemy.http[0]}/demo`, validatorAddress: "0x180D6465F921C7E0DEA0040107D342c87455fFF5" as Address, accountFactoryAddress: "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39" as Address, diff --git a/packages/accounts/src/kernel-zerodev/e2e-tests/constants.ts b/packages/accounts/src/kernel-zerodev/e2e-tests/constants.ts index 56c414a6f4..847376c195 100644 --- a/packages/accounts/src/kernel-zerodev/e2e-tests/constants.ts +++ b/packages/accounts/src/kernel-zerodev/e2e-tests/constants.ts @@ -1,2 +1,2 @@ -export const MUMBAI_RPC_URL = process.env.MUMBAI_RPC_URL; +export const API_KEY = process.env.API_KEY; export const OWNER_MNEMONIC = process.env.OWNER_MNEMONIC!; diff --git a/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts b/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts index 5a69fab63f..9c3c6cd365 100644 --- a/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts +++ b/packages/accounts/src/kernel-zerodev/e2e-tests/kernel-account.test.ts @@ -21,18 +21,20 @@ import { import { KernelAccountProvider } from "../provider.js"; import type { KernelUserOperationCallData } from "../types.js"; import { KernelBaseValidator, ValidatorMode } from "../validator/base.js"; -import { MUMBAI_RPC_URL, OWNER_MNEMONIC } from "./constants.js"; +import { API_KEY, OWNER_MNEMONIC } from "./constants.js"; import { MockSigner } from "./mocks/mock-signer.js"; +const chain = polygonMumbai; + describe("Kernel Account Tests", () => { //any wallet should work const config = { - chain: polygonMumbai, - rpcProvider: MUMBAI_RPC_URL!, + chain, + rpcProvider: `${chain.rpcUrls.alchemy.http[0]}/${API_KEY}`!, validatorAddress: "0x180D6465F921C7E0DEA0040107D342c87455fFF5" as Address, accountFactoryAddress: "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39" as Address, - entryPointAddress: getDefaultEntryPointAddress(polygonMumbai), + entryPointAddress: getDefaultEntryPointAddress(chain), }; const ownerAccount = mnemonicToAccount(OWNER_MNEMONIC); diff --git a/packages/accounts/src/light-account/__tests__/account.test.ts b/packages/accounts/src/light-account/__tests__/account.test.ts index f385a69a6d..2abd187774 100644 --- a/packages/accounts/src/light-account/__tests__/account.test.ts +++ b/packages/accounts/src/light-account/__tests__/account.test.ts @@ -9,17 +9,18 @@ import { describe, it } from "vitest"; import { LightSmartContractAccount } from "../account.js"; import { getDefaultLightAccountFactoryAddress } from "../utils.js"; +const chain = polygonMumbai; + describe("Light Account Tests", () => { const dummyMnemonic = "test test test test test test test test test test test test"; const owner: SmartAccountSigner = LocalAccountSigner.mnemonicToAccountSigner(dummyMnemonic); - const chain = polygonMumbai; it("should correctly sign the message", async () => { - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); expect( - await signer.signMessage( + await provider.signMessage( "0xa70d0af2ebb03a44dcd0714a8724f622e3ab876d0aa312f0ee04823285d6fb1b" ) ).toBe( @@ -28,9 +29,9 @@ describe("Light Account Tests", () => { }); it("should correctly sign typed data", async () => { - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); expect( - await signer.signTypedData({ + await provider.signTypedData({ types: { Request: [{ name: "hello", type: "string" }], }, @@ -55,7 +56,7 @@ describe("Light Account Tests", () => { }); it("should correctly encode batch transaction data", async () => { - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); const data = [ { target: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", @@ -67,7 +68,9 @@ describe("Light Account Tests", () => { }, ] satisfies BatchUserOperationCallData; - expect(await signer.account.encodeBatchExecute(data)).toMatchInlineSnapshot( + expect( + await provider.account.encodeBatchExecute(data) + ).toMatchInlineSnapshot( '"0x18dfb3c7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004deadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cafebabe00000000000000000000000000000000000000000000000000000000"' ); }); diff --git a/packages/accounts/src/light-account/e2e-tests/constants.ts b/packages/accounts/src/light-account/e2e-tests/constants.ts index 3dbe726551..00353e9799 100644 --- a/packages/accounts/src/light-account/e2e-tests/constants.ts +++ b/packages/accounts/src/light-account/e2e-tests/constants.ts @@ -1,7 +1,5 @@ export const API_KEY = process.env.API_KEY!; export const PAYMASTER_POLICY_ID = process.env.PAYMASTER_POLICY_ID!; - export const UNDEPLOYED_OWNER_MNEMONIC = process.env.UNDEPLOYED_OWNER_MNEMONIC!; export const LIGHT_ACCOUNT_OWNER_MNEMONIC = process.env.LIGHT_ACCOUNT_OWNER_MNEMONIC!; -// todo(ajay): replace with OWNER_MNEMONIC when light account factory address when live (accidentally moved owner account to a different mnemonic during testing) diff --git a/packages/accounts/src/light-account/e2e-tests/light-account.test.ts b/packages/accounts/src/light-account/e2e-tests/light-account.test.ts index 5ebc6b7b54..62833a8af5 100644 --- a/packages/accounts/src/light-account/e2e-tests/light-account.test.ts +++ b/packages/accounts/src/light-account/e2e-tests/light-account.test.ts @@ -30,14 +30,14 @@ describe("Light Account Tests", () => { ); it("should successfully get counterfactual address", async () => { - const signer = givenConnectedProvider({ owner, chain }); - expect(await signer.getAddress()).toMatchInlineSnapshot( - '"0xbd96C2c76dE02A75fe2909730422e05ce18f484e"' + const provider = givenConnectedProvider({ owner, chain }); + expect(await provider.getAddress()).toMatchInlineSnapshot( + '"0x1a3a89cd46f124EF40848966c2D7074a575dbC27"' ); }); it("should sign typed data successfully", async () => { - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); const typedData = { types: { Request: [{ name: "hello", type: "string" }], @@ -47,20 +47,20 @@ describe("Light Account Tests", () => { hello: "world", }, }; - expect(await signer.signTypedData(typedData)).toBe( + expect(await provider.signTypedData(typedData)).toBe( await owner.signTypedData(typedData) ); }); it("should sign message successfully", async () => { - const signer = givenConnectedProvider({ owner, chain }); - expect(await signer.signMessage("test")).toBe( + const provider = givenConnectedProvider({ owner, chain }); + expect(await provider.signMessage("test")).toBe( await owner.signMessage("test") ); }); it("should sign typed data with 6492 successfully for undeployed account", async () => { - const undeployedSigner = givenConnectedProvider({ + const undeployedProvider = givenConnectedProvider({ owner: undeployedOwner, chain, }); @@ -74,21 +74,21 @@ describe("Light Account Tests", () => { }, }; expect( - await undeployedSigner.signTypedDataWith6492(typedData) + await undeployedProvider.signTypedDataWith6492(typedData) ).toMatchInlineSnapshot( - '"0x000000000000000000000000000000893a26168158fbeadd9335be5bc96592e2000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000445fbfb9cf000000000000000000000000ef9d7530d16df66481adf291dc9a12b44c7f7df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041591a9422219a5f2bc87ee24a82a6d5ef9674bf7408a2a289984de258466d148e75efb65b487ffbfcb061b268b1b667d8d7d4eac2c3d9d2d0a52d49c891be567c1c000000000000000000000000000000000000000000000000000000000000006492649264926492649264926492649264926492649264926492649264926492"' + '"0x00000000000000000000000000000055c0b4fa41dde26a74435ff03692292fbd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000445fbfb9cf000000000000000000000000ef9d7530d16df66481adf291dc9a12b44c7f7df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041591a9422219a5f2bc87ee24a82a6d5ef9674bf7408a2a289984de258466d148e75efb65b487ffbfcb061b268b1b667d8d7d4eac2c3d9d2d0a52d49c891be567c1c000000000000000000000000000000000000000000000000000000000000006492649264926492649264926492649264926492649264926492649264926492"' ); }); it("should sign message with 6492 successfully for undeployed account", async () => { - const undeployedSigner = givenConnectedProvider({ + const undeployedProvider = givenConnectedProvider({ owner: undeployedOwner, chain, }); expect( - await undeployedSigner.signMessageWith6492("test") + await undeployedProvider.signMessageWith6492("test") ).toMatchInlineSnapshot( - '"0x000000000000000000000000000000893a26168158fbeadd9335be5bc96592e2000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000445fbfb9cf000000000000000000000000ef9d7530d16df66481adf291dc9a12b44c7f7df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041be34ecce63c5248d5cda407e7da319be3c861e6e2c5d30c9630cd35dcb55e56205c482503552883923f79e751ea3671cbb84d65b18af33cd3034aeb7d529da9a1b000000000000000000000000000000000000000000000000000000000000006492649264926492649264926492649264926492649264926492649264926492"' + '"0x00000000000000000000000000000055c0b4fa41dde26a74435ff03692292fbd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000445fbfb9cf000000000000000000000000ef9d7530d16df66481adf291dc9a12b44c7f7df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041be34ecce63c5248d5cda407e7da319be3c861e6e2c5d30c9630cd35dcb55e56205c482503552883923f79e751ea3671cbb84d65b18af33cd3034aeb7d529da9a1b000000000000000000000000000000000000000000000000000000000000006492649264926492649264926492649264926492649264926492649264926492"' ); }); @@ -97,22 +97,28 @@ describe("Light Account Tests", () => { * For current balance, @see: https://sepolia.etherscan.io/address/0x7eDdc16B15259E5541aCfdebC46929873839B872 */ it("should execute successfully", async () => { - const signer = givenConnectedProvider({ owner, chain }); - const result = await signer.sendUserOperation({ - target: await signer.getAddress(), + const provider = givenConnectedProvider({ owner, chain }); + const result = await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); - const txnHash = signer.waitForUserOperationTransaction(result.hash as Hash); + const txnHash = provider.waitForUserOperationTransaction( + result.hash as Hash + ); await expect(txnHash).resolves.not.toThrowError(); }, 50000); it("should fail to execute if account address is not deployed and not correct", async () => { const accountAddress = "0xc33AbD9621834CA7c6Fc9f9CC3c47b9c17B03f9F"; - const newSigner = givenConnectedProvider({ owner, chain, accountAddress }); + const newProvider = givenConnectedProvider({ + owner, + chain, + accountAddress, + }); - const result = newSigner.sendUserOperation({ - target: await newSigner.getAddress(), + const result = newProvider.sendUserOperation({ + target: await newProvider.getAddress(), data: "0x", }); @@ -131,17 +137,17 @@ describe("Light Account Tests", () => { }); it("should get owner successfully", async () => { - const signer = givenConnectedProvider({ owner, chain }); - expect(await signer.account.getOwnerAddress()).toMatchInlineSnapshot( + const provider = givenConnectedProvider({ owner, chain }); + expect(await provider.account.getOwnerAddress()).toMatchInlineSnapshot( '"0x65eaA2AfDF6c97295bA44C458abb00FebFB3a5FA"' ); - expect(await signer.account.getOwnerAddress()).toBe( + expect(await provider.account.getOwnerAddress()).toBe( await owner.getAddress() ); }); it("should transfer ownership successfully", async () => { - const signer = givenConnectedProvider({ + const provider = givenConnectedProvider({ owner, chain, feeOpts: { @@ -154,15 +160,18 @@ describe("Light Account Tests", () => { const throwawayOwner = LocalAccountSigner.privateKeyToAccountSigner( generatePrivateKey() ); - const provider = givenConnectedProvider({ owner: throwawayOwner, chain }); + const throwawayProvider = givenConnectedProvider({ + owner: throwawayOwner, + chain, + }); // fund the throwaway address - const fundThrowawayResult = await signer.sendUserOperation({ - target: await provider.getAddress(), + const fundThrowawayResult = await provider.sendUserOperation({ + target: await throwawayProvider.getAddress(), data: "0x", value: 10000000000000n, }); - const fundThrowawayTxnHash = signer.waitForUserOperationTransaction( + const fundThrowawayTxnHash = provider.waitForUserOperationTransaction( fundThrowawayResult.hash ); await expect(fundThrowawayTxnHash).resolves.not.toThrowError(); @@ -172,16 +181,16 @@ describe("Light Account Tests", () => { generatePrivateKey() ); const result = await LightSmartContractAccount.transferOwnership( - provider, + throwawayProvider, newThrowawayOwner ); - const txnHash = provider.waitForUserOperationTransaction(result); + const txnHash = throwawayProvider.waitForUserOperationTransaction(result); await expect(txnHash).resolves.not.toThrowError(); - expect(await provider.account.getOwnerAddress()).not.toBe( + expect(await throwawayProvider.account.getOwnerAddress()).not.toBe( await throwawayOwner.getAddress() ); - expect(await provider.account.getOwnerAddress()).toBe( + expect(await throwawayProvider.account.getOwnerAddress()).toBe( await newThrowawayOwner.getAddress() ); }, 100000); diff --git a/packages/alchemy/e2e-tests/simple-account.test.ts b/packages/alchemy/e2e-tests/simple-account.test.ts index 466918429f..97e72d61b7 100644 --- a/packages/alchemy/e2e-tests/simple-account.test.ts +++ b/packages/alchemy/e2e-tests/simple-account.test.ts @@ -8,8 +8,8 @@ import { toHex, type Address, type Chain, - type Hash, type HDAccount, + type Hash, } from "viem"; import { mnemonicToAccount } from "viem/accounts"; import { sepolia } from "viem/chains"; @@ -33,29 +33,31 @@ describe("Simple Account Tests", () => { }; it("should successfully get counterfactual address", async () => { - const signer = givenConnectedProvider({ owner, chain }); - expect(await signer.getAddress()).toMatchInlineSnapshot( + const provider = givenConnectedProvider({ owner, chain }); + expect(await provider.getAddress()).toMatchInlineSnapshot( `"0xb856DBD4fA1A79a46D426f537455e7d3E79ab7c4"` ); }); it("should execute successfully", async () => { - const signer = givenConnectedProvider({ owner, chain }); - const result = await signer.sendUserOperation({ - target: await signer.getAddress(), + const provider = givenConnectedProvider({ owner, chain }); + const result = await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); - const txnHash = signer.waitForUserOperationTransaction(result.hash as Hash); + const txnHash = provider.waitForUserOperationTransaction( + result.hash as Hash + ); await expect(txnHash).resolves.not.toThrowError(); }, 50000); it("should fail to execute if account address is not deployed and not correct", async () => { const accountAddress = "0xc33AbD9621834CA7c6Fc9f9CC3c47b9c17B03f9F"; - const signer = givenConnectedProvider({ owner, chain, accountAddress }); + const provider = givenConnectedProvider({ owner, chain, accountAddress }); - const result = signer.sendUserOperation({ - target: await signer.getAddress(), + const result = provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); @@ -63,24 +65,26 @@ describe("Simple Account Tests", () => { }); it("should successfully execute with alchemy paymaster info", async () => { - const signer = givenConnectedProvider({ + const provider = givenConnectedProvider({ owner, chain, }).withAlchemyGasManager({ policyId: PAYMASTER_POLICY_ID, }); - const result = await signer.sendUserOperation({ - target: await signer.getAddress(), + const result = await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); - const txnHash = signer.waitForUserOperationTransaction(result.hash as Hash); + const txnHash = provider.waitForUserOperationTransaction( + result.hash as Hash + ); await expect(txnHash).resolves.not.toThrowError(); }, 50000); it("should successfully override fees in alchemy paymaster", async () => { - const signer = givenConnectedProvider({ owner, chain }) + const provider = givenConnectedProvider({ owner, chain }) .withAlchemyGasManager({ policyId: PAYMASTER_POLICY_ID, }) @@ -92,8 +96,8 @@ describe("Simple Account Tests", () => { // this should fail since we set super low fees await expect( async () => - await signer.sendUserOperation({ - target: await signer.getAddress(), + await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }) ).rejects.toThrow(); @@ -128,7 +132,7 @@ describe("Simple Account Tests", () => { }, 50000); it("should successfully use paymaster with fee opts", async () => { - const signer = givenConnectedProvider({ + const provider = givenConnectedProvider({ owner, chain, feeOpts: { @@ -138,50 +142,56 @@ describe("Simple Account Tests", () => { }, }); - const result = await signer.sendUserOperation({ - target: await signer.getAddress(), + const result = await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); - const txnHash = signer.waitForUserOperationTransaction(result.hash as Hash); + const txnHash = provider.waitForUserOperationTransaction( + result.hash as Hash + ); await expect(txnHash).resolves.not.toThrowError(); }, 50000); it("should execute successfully via drop and replace", async () => { - const signer = givenConnectedProvider({ + const provider = givenConnectedProvider({ owner, chain, }); - const result = await signer.sendUserOperation({ - target: await signer.getAddress(), + const result = await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); - const replacedResult = await signer.dropAndReplaceUserOperation( + const replacedResult = await provider.dropAndReplaceUserOperation( result.request ); - const txnHash = signer.waitForUserOperationTransaction(replacedResult.hash); + const txnHash = provider.waitForUserOperationTransaction( + replacedResult.hash + ); await expect(txnHash).resolves.not.toThrowError(); }, 50000); it("should execute successfully via drop and replace when using paymaster", async () => { - const signer = givenConnectedProvider({ + const provider = givenConnectedProvider({ owner, chain, }).withAlchemyGasManager({ policyId: PAYMASTER_POLICY_ID, }); - const result = await signer.sendUserOperation({ - target: await signer.getAddress(), + const result = await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); - const replacedResult = await signer.dropAndReplaceUserOperation( + const replacedResult = await provider.dropAndReplaceUserOperation( result.request ); - const txnHash = signer.waitForUserOperationTransaction(replacedResult.hash); + const txnHash = provider.waitForUserOperationTransaction( + replacedResult.hash + ); await expect(txnHash).resolves.not.toThrowError(); }, 50000); @@ -201,26 +211,7 @@ describe("Simple Account Tests", () => { const address = await provider.getAddress(); const balances = await provider.core.getTokenBalances(address); - expect(balances.tokenBalances).toMatchInlineSnapshot(` - [ - { - "contractAddress": "0x489c5cb7fd158b0a9e7975076d758268a756c025", - "tokenBalance": "0x000000000000000000000000000000000000000000000000000000000065b9aa", - }, - { - "contractAddress": "0x54fa517f05e11ffa87f4b22ae87d91cec0c2d7e1", - "tokenBalance": "0x000000000000000000000000000000000000000000000000000000000065b9aa", - }, - { - "contractAddress": "0xdcf5d3e08c5007dececdb34808c49331bd82a247", - "tokenBalance": "0x00000000000000000000000000000000000000000000000000000000000f423f", - }, - { - "contractAddress": "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", - "tokenBalance": "0x0000000000000000000000000000000000000000000000000000000000000000", - }, - ] - `); + expect(balances.tokenBalances.length).toMatchInlineSnapshot(`4`); }, 50000); it("should get owned nfts for the smart account", async () => { diff --git a/packages/alchemy/src/__tests__/__snapshots__/provider.test.ts.snap b/packages/alchemy/src/__tests__/__snapshots__/provider.test.ts.snap index 92d282eaa6..df915faca7 100644 --- a/packages/alchemy/src/__tests__/__snapshots__/provider.test.ts.snap +++ b/packages/alchemy/src/__tests__/__snapshots__/provider.test.ts.snap @@ -95,190 +95,6 @@ exports[`Alchemy Provider Tests > should correctly do runtime validation when co ]" `; -exports[`Alchemy Provider Tests > should correctly do runtime validation when multiple inputs are invalid 1`] = ` -"[ - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"string\\", - \\"received\\": \\"number\\", - \\"path\\": [ - \\"entryPointAddress\\" - ], - \\"message\\": \\"Expected string, received number\\" - }, - { - \\"code\\": \\"invalid_union\\", - \\"unionErrors\\": [ - { - \\"issues\\": [ - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"never\\", - \\"received\\": \\"number\\", - \\"path\\": [ - \\"rpcUrl\\" - ], - \\"message\\": \\"Expected never, received number\\" - }, - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"string\\", - \\"received\\": \\"undefined\\", - \\"path\\": [ - \\"apiKey\\" - ], - \\"message\\": \\"Required\\" - } - ], - \\"name\\": \\"ZodError\\" - }, - { - \\"issues\\": [ - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"never\\", - \\"received\\": \\"number\\", - \\"path\\": [ - \\"rpcUrl\\" - ], - \\"message\\": \\"Expected never, received number\\" - }, - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"string\\", - \\"received\\": \\"undefined\\", - \\"path\\": [ - \\"jwt\\" - ], - \\"message\\": \\"Required\\" - } - ], - \\"name\\": \\"ZodError\\" - }, - { - \\"issues\\": [ - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"string\\", - \\"received\\": \\"number\\", - \\"path\\": [ - \\"rpcUrl\\" - ], - \\"message\\": \\"Expected string, received number\\" - } - ], - \\"name\\": \\"ZodError\\" - }, - { - \\"issues\\": [ - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"string\\", - \\"received\\": \\"number\\", - \\"path\\": [ - \\"rpcUrl\\" - ], - \\"message\\": \\"Expected string, received number\\" - }, - { - \\"code\\": \\"invalid_type\\", - \\"expected\\": \\"string\\", - \\"received\\": \\"undefined\\", - \\"path\\": [ - \\"jwt\\" - ], - \\"message\\": \\"Required\\" - } - ], - \\"name\\": \\"ZodError\\" - } - ], - \\"path\\": [], - \\"message\\": \\"Invalid input\\" - } -]" -`; - -exports[`Alchemy Provider Tests > should have called propety 1`] = ` -Alchemy { - "config": AlchemyConfig { - "apiKey": "test", - "authToken": undefined, - "batchRequests": false, - "maxRetries": 5, - "network": "eth-sepolia", - "requestTimeout": 0, - "url": undefined, - }, - "core": CoreNamespace { - "config": AlchemyConfig { - "apiKey": "test", - "authToken": undefined, - "batchRequests": false, - "maxRetries": 5, - "network": "eth-sepolia", - "requestTimeout": 0, - "url": undefined, - }, - }, - "debug": DebugNamespace { - "config": AlchemyConfig { - "apiKey": "test", - "authToken": undefined, - "batchRequests": false, - "maxRetries": 5, - "network": "eth-sepolia", - "requestTimeout": 0, - "url": undefined, - }, - }, - "nft": NftNamespace { - "config": AlchemyConfig { - "apiKey": "test", - "authToken": undefined, - "batchRequests": false, - "maxRetries": 5, - "network": "eth-sepolia", - "requestTimeout": 0, - "url": undefined, - }, - }, - "notify": NotifyNamespace { - "config": AlchemyConfig { - "apiKey": "test", - "authToken": undefined, - "batchRequests": false, - "maxRetries": 5, - "network": "eth-sepolia", - "requestTimeout": 0, - "url": undefined, - }, - }, - "transact": TransactNamespace { - "config": AlchemyConfig { - "apiKey": "test", - "authToken": undefined, - "batchRequests": false, - "maxRetries": 5, - "network": "eth-sepolia", - "requestTimeout": 0, - "url": undefined, - }, - }, - "ws": WebSocketNamespace { - "config": AlchemyConfig { - "apiKey": "test", - "authToken": undefined, - "batchRequests": false, - "maxRetries": 5, - "network": "eth-sepolia", - "requestTimeout": 0, - "url": undefined, - }, - }, -} -`; - exports[`Alchemy Provider Tests > should have enhanced api properties extended from the Alchemy SDK 1`] = ` Alchemy { "config": AlchemyConfig { @@ -286,7 +102,7 @@ Alchemy { "authToken": undefined, "batchRequests": false, "maxRetries": 5, - "network": "eth-sepolia", + "network": "polygon-mumbai", "requestTimeout": 0, "url": undefined, }, @@ -296,7 +112,7 @@ Alchemy { "authToken": undefined, "batchRequests": false, "maxRetries": 5, - "network": "eth-sepolia", + "network": "polygon-mumbai", "requestTimeout": 0, "url": undefined, }, @@ -307,7 +123,7 @@ Alchemy { "authToken": undefined, "batchRequests": false, "maxRetries": 5, - "network": "eth-sepolia", + "network": "polygon-mumbai", "requestTimeout": 0, "url": undefined, }, @@ -318,7 +134,7 @@ Alchemy { "authToken": undefined, "batchRequests": false, "maxRetries": 5, - "network": "eth-sepolia", + "network": "polygon-mumbai", "requestTimeout": 0, "url": undefined, }, @@ -329,7 +145,7 @@ Alchemy { "authToken": undefined, "batchRequests": false, "maxRetries": 5, - "network": "eth-sepolia", + "network": "polygon-mumbai", "requestTimeout": 0, "url": undefined, }, @@ -340,7 +156,7 @@ Alchemy { "authToken": undefined, "batchRequests": false, "maxRetries": 5, - "network": "eth-sepolia", + "network": "polygon-mumbai", "requestTimeout": 0, "url": undefined, }, @@ -351,7 +167,7 @@ Alchemy { "authToken": undefined, "batchRequests": false, "maxRetries": 5, - "network": "eth-sepolia", + "network": "polygon-mumbai", "requestTimeout": 0, "url": undefined, }, diff --git a/packages/alchemy/src/__tests__/provider.test.ts b/packages/alchemy/src/__tests__/provider.test.ts index b0250d1a5d..f37e1a79fe 100644 --- a/packages/alchemy/src/__tests__/provider.test.ts +++ b/packages/alchemy/src/__tests__/provider.test.ts @@ -8,7 +8,7 @@ import { import { Alchemy, Network } from "alchemy-sdk"; import { toHex, type Address, type Chain, type HDAccount } from "viem"; import { mnemonicToAccount } from "viem/accounts"; -import { polygonMumbai, sepolia } from "viem/chains"; +import { polygonMumbai } from "viem/chains"; import { AlchemyProvider } from "../provider.js"; describe("Alchemy Provider Tests", () => { @@ -40,10 +40,10 @@ describe("Alchemy Provider Tests", () => { }); it("should correctly sign the message", async () => { - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); expect( // TODO: expose sign message on the provider too - await signer.account.signMessage( + await provider.account.signMessage( "0xa70d0af2ebb03a44dcd0714a8724f622e3ab876d0aa312f0ee04823285d6fb1b" ) ).toBe( @@ -52,8 +52,8 @@ describe("Alchemy Provider Tests", () => { }); it("should correctly encode batch transaction data", async () => { - const signer = givenConnectedProvider({ owner, chain }); - const account = signer.account; + const provider = givenConnectedProvider({ owner, chain }); + const account = provider.account; const data = [ { target: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", @@ -74,9 +74,9 @@ describe("Alchemy Provider Tests", () => { expect( () => new AlchemyProvider({ - rpcUrl: "https://eth-mainnet.g.alchemy.com/v2/test", + rpcUrl: `${chain.rpcUrls.alchemy.http[0]}/test`, entryPointAddress: 1 as unknown as Address, - chain: polygonMumbai, + chain, }) ).toThrowErrorMatchingInlineSnapshot(` "[ @@ -99,7 +99,7 @@ describe("Alchemy Provider Tests", () => { new AlchemyProvider({ rpcUrl: 1 as unknown as string, entryPointAddress: getDefaultEntryPointAddress(chain), - chain: polygonMumbai, + chain, }) ).toThrowErrorMatchingSnapshot(); }); @@ -107,12 +107,12 @@ describe("Alchemy Provider Tests", () => { it("should have enhanced api properties extended from the Alchemy SDK", async () => { const provider = new AlchemyProvider({ apiKey: "test", - chain: sepolia, + chain, }); const spy = vi.spyOn(provider, "withAlchemyEnhancedApis"); const alchemy = new Alchemy({ - network: Network.ETH_SEPOLIA, + network: Network.MATIC_MUMBAI, apiKey: "test", }); provider.withAlchemyEnhancedApis(alchemy); @@ -145,7 +145,7 @@ const givenConnectedProvider = ({ "0x1234567890123456789012345678901234567890" as Address; return new AlchemyProvider({ - rpcUrl: "https://eth-mainnet.g.alchemy.com/v2", + rpcUrl: chain.rpcUrls.alchemy.http[0], jwt: "test", chain, }).connect((provider) => { diff --git a/packages/core/e2e-tests/constants.ts b/packages/core/e2e-tests/constants.ts index 7445f04766..59661e3288 100644 --- a/packages/core/e2e-tests/constants.ts +++ b/packages/core/e2e-tests/constants.ts @@ -1,2 +1,2 @@ -export const MUMBAI_RPC_URL = process.env.MUMBAI_RPC_URL!; +export const API_KEY = process.env.API_KEY!; export const OWNER_MNEMONIC = process.env.OWNER_MNEMONIC!; diff --git a/packages/core/e2e-tests/simple-account.test.ts b/packages/core/e2e-tests/simple-account.test.ts index 9f6b9812ba..302d521599 100644 --- a/packages/core/e2e-tests/simple-account.test.ts +++ b/packages/core/e2e-tests/simple-account.test.ts @@ -8,7 +8,7 @@ import { } from "../src/index.js"; import { SmartAccountProvider } from "../src/provider/base.js"; import { LocalAccountSigner } from "../src/signer/local-account.js"; -import { MUMBAI_RPC_URL, OWNER_MNEMONIC } from "./constants.js"; +import { API_KEY, OWNER_MNEMONIC } from "./constants.js"; const chain = polygonMumbai; @@ -17,29 +17,31 @@ describe("Simple Account Tests", () => { LocalAccountSigner.mnemonicToAccountSigner(OWNER_MNEMONIC); it("should successfully get counterfactual address", async () => { - const signer = givenConnectedProvider({ owner, chain }); - expect(await signer.getAddress()).toMatchInlineSnapshot( + const provider = givenConnectedProvider({ owner, chain }); + expect(await provider.getAddress()).toMatchInlineSnapshot( `"0xb856DBD4fA1A79a46D426f537455e7d3E79ab7c4"` ); }); it("should execute successfully", async () => { - const signer = givenConnectedProvider({ owner, chain }); - const result = await signer.sendUserOperation({ - target: await signer.getAddress(), + const provider = givenConnectedProvider({ owner, chain }); + const result = await provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); - const txnHash = signer.waitForUserOperationTransaction(result.hash as Hash); + const txnHash = provider.waitForUserOperationTransaction( + result.hash as Hash + ); await expect(txnHash).resolves.not.toThrowError(); }, 60000); it("should fail to execute if account address is not deployed and not correct", async () => { const accountAddress = "0xc33AbD9621834CA7c6Fc9f9CC3c47b9c17B03f9F"; - const signer = givenConnectedProvider({ owner, chain, accountAddress }); + const provider = givenConnectedProvider({ owner, chain, accountAddress }); - const result = signer.sendUserOperation({ - target: await signer.getAddress(), + const result = provider.sendUserOperation({ + target: await provider.getAddress(), data: "0x", }); @@ -50,9 +52,9 @@ describe("Simple Account Tests", () => { const owner = LocalAccountSigner.privateKeyToAccountSigner( generatePrivateKey() ); - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); - const address = signer.getAddress(); + const address = provider.getAddress(); await expect(address).resolves.not.toThrowError(); expect(isAddress(await address)).toBe(true); }); @@ -68,7 +70,7 @@ const givenConnectedProvider = ({ accountAddress?: Address; }) => { const provider = new SmartAccountProvider({ - rpcProvider: MUMBAI_RPC_URL, + rpcProvider: `${chain.rpcUrls.alchemy.http[0]}/${API_KEY}`, chain, }); const feeDataGetter = async () => ({ diff --git a/packages/core/src/account/__tests__/simple.test.ts b/packages/core/src/account/__tests__/simple.test.ts index ef6fddb404..04607c4306 100644 --- a/packages/core/src/account/__tests__/simple.test.ts +++ b/packages/core/src/account/__tests__/simple.test.ts @@ -17,9 +17,9 @@ describe("Account Simple Tests", () => { const chain = polygonMumbai; it("should correctly sign the message", async () => { - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); expect( - await signer.signMessage( + await provider.signMessage( "0xa70d0af2ebb03a44dcd0714a8724f622e3ab876d0aa312f0ee04823285d6fb1b" ) ).toBe( @@ -28,7 +28,7 @@ describe("Account Simple Tests", () => { }); it("should correctly encode batch transaction data", async () => { - const signer = givenConnectedProvider({ owner, chain }); + const provider = givenConnectedProvider({ owner, chain }); const data = [ { target: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", @@ -40,7 +40,9 @@ describe("Account Simple Tests", () => { }, ] satisfies BatchUserOperationCallData; - expect(await signer.account.encodeBatchExecute(data)).toMatchInlineSnapshot( + expect( + await provider.account.encodeBatchExecute(data) + ).toMatchInlineSnapshot( '"0x18dfb3c7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000deadbeefdeadbeefdeadbeefdeadbeefdeadbeef0000000000000000000000008ba1f109551bd432803012645ac136ddd64dba720000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004deadbeef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cafebabe00000000000000000000000000000000000000000000000000000000"' ); }); diff --git a/packages/ethers/e2e-tests/simple-account.test.ts b/packages/ethers/e2e-tests/simple-account.test.ts index cc1636c9f0..3623213cfe 100644 --- a/packages/ethers/e2e-tests/simple-account.test.ts +++ b/packages/ethers/e2e-tests/simple-account.test.ts @@ -23,19 +23,19 @@ describe("Simple Account Tests", async () => { const owner = Wallet.fromMnemonic(OWNER_MNEMONIC); it("should successfully get counterfactual address", async () => { - const signer = givenConnectedProvider({ alchemyProvider, owner }); - expect(await signer.getAddress()).toMatchInlineSnapshot( + const provider = givenConnectedProvider({ alchemyProvider, owner }); + expect(await provider.getAddress()).toMatchInlineSnapshot( `"0xb856DBD4fA1A79a46D426f537455e7d3E79ab7c4"` ); }); it("should execute successfully", async () => { - const signer = givenConnectedProvider({ alchemyProvider, owner }); - const result = await signer.sendUserOperation({ - target: (await signer.getAddress()) as `0x${string}`, + const provider = givenConnectedProvider({ alchemyProvider, owner }); + const result = await provider.sendUserOperation({ + target: (await provider.getAddress()) as `0x${string}`, data: "0x", }); - const txnHash = signer.waitForUserOperationTransaction( + const txnHash = provider.waitForUserOperationTransaction( result.hash as `0x${string}` ); @@ -44,14 +44,14 @@ describe("Simple Account Tests", async () => { it("should fail to execute if account address is not deployed and not correct", async () => { const accountAddress = "0xc33AbD9621834CA7c6Fc9f9CC3c47b9c17B03f9F"; - const signer = givenConnectedProvider({ + const provider = givenConnectedProvider({ alchemyProvider, owner, accountAddress, }); - const result = signer.sendUserOperation({ - target: (await signer.getAddress()) as `0x${string}`, + const result = provider.sendUserOperation({ + target: (await provider.getAddress()) as `0x${string}`, data: "0x", }); diff --git a/packages/ethers/src/__tests__/provider-adapter.test.ts b/packages/ethers/src/__tests__/provider-adapter.test.ts index dd067d6b47..c022dd7f74 100644 --- a/packages/ethers/src/__tests__/provider-adapter.test.ts +++ b/packages/ethers/src/__tests__/provider-adapter.test.ts @@ -22,9 +22,9 @@ describe("Simple Account Tests", async () => { const alchemyProvider = await alchemy.config.getProvider(); it("should correctly sign the message", async () => { - const signer = givenConnectedProvider({ alchemyProvider, owner }); + const provider = givenConnectedProvider({ alchemyProvider, owner }); expect( - await signer.signMessage( + await provider.signMessage( "0xa70d0af2ebb03a44dcd0714a8724f622e3ab876d0aa312f0ee04823285d6fb1b" ) ).toBe( From 0110d092e170456d61e28ddbc59f363b23f9b63d Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Tue, 14 Nov 2023 23:38:01 -0500 Subject: [PATCH 50/79] chore: add links to examples (#252) --- examples/README.md | 4 ++++ site/demos.md | 3 +++ 2 files changed, 7 insertions(+) diff --git a/examples/README.md b/examples/README.md index ed57b4ad41..30573a3d6e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -4,6 +4,10 @@ This dapp provides an example of how to use Alchemy's Account Kit to build a dApp that mints a token to a Light Account SCA using Alchemy's Gas Manager to provide a gas-less minting experience +[Try it out!](https://aa-simple-dapp.vercel.app/) + +[View on Github!](https://github.com/alchemyplatform/aa-sdk/tree/development/examples/aa-simple-dapp) + [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/alchemyplatform/aa-sdk/tree/main/examples/aa-simple-dapp?file=README.md) ## alchemy-dAApp diff --git a/site/demos.md b/site/demos.md index c81f44b6ce..d9e48d62aa 100644 --- a/site/demos.md +++ b/site/demos.md @@ -21,6 +21,9 @@ next: This demo shows how to mint an ERC-20 token to a Light Account using Alchemy's Gas Manager to provide a gas-less minting experience. [Try it out!](https://aa-simple-dapp.vercel.app/) + +[View on Github!](https://github.com/alchemyplatform/aa-sdk/tree/development/examples/aa-simple-dapp) + [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/alchemyplatform/aa-sdk/tree/main/examples/aa-simple-dapp?file=README.md) ## Gasless NFT Minting Demo From e669a1f9c41b63a8ea9a1f31bc6f5d3922b32444 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:21:36 -0500 Subject: [PATCH 51/79] docs: add enhanced api how-to doc (#218) --- packages/alchemy/src/provider.ts | 2 +- site/.vitepress/config.ts | 18 ++++++ site/guides/enhanced-apis/nft.md | 59 +++++++++++++++++++ site/guides/enhanced-apis/token.md | 59 +++++++++++++++++++ .../provider/withAlchemyEnhancedApis.md | 52 ++++++++++++++++ site/snippets/enhanced-apis-example/nft.ts | 18 ++++++ site/snippets/enhanced-apis-example/token.ts | 18 ++++++ 7 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 site/guides/enhanced-apis/nft.md create mode 100644 site/guides/enhanced-apis/token.md create mode 100644 site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md create mode 100644 site/snippets/enhanced-apis-example/nft.ts create mode 100644 site/snippets/enhanced-apis-example/token.ts diff --git a/packages/alchemy/src/provider.ts b/packages/alchemy/src/provider.ts index b5ec9c93a8..701ab9da1e 100644 --- a/packages/alchemy/src/provider.ts +++ b/packages/alchemy/src/provider.ts @@ -128,7 +128,7 @@ export class AlchemyProvider extends SmartAccountProvider { * The Alchemy SDK client must be configured with the same API key and network as the AlchemyProvider. * This method validates such at runtime. * - * Additionally, since the Alchemy SDK client does not support JWT authentication, AlchemyProviders initialized with JWTs cannot use this method. + * Additionally, since the Alchemy SDK client does not yet support JWT authentication, AlchemyProviders initialized with JWTs cannot use this method. * They must be initialized with an API key or RPC URL. * There is an open issue on the Alchemy SDK repo to add JWT support in the meantime. * @see: https://github.com/alchemyplatform/alchemy-sdk-js/issues/386 diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index ae55519a01..dbfac784db 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -126,6 +126,20 @@ export default defineConfig({ text: "How to Transfer Ownership of a Smart Account", link: "/transferring-ownership", }, + { + text: "Smart Account Data", + base: "/guides/enhanced-apis", + items: [ + { + text: "How to Fetch a Smart Account's NFTs", + link: "/nft", + }, + { + text: "How to Fetch a Smart Account's ERC-20 Tokens", + link: "/token", + }, + ], + }, ], }, { @@ -479,6 +493,10 @@ export default defineConfig({ text: "withAlchemyGasManager", link: "/withAlchemyGasManager", }, + { + text: "withAlchemyEnhancedApis", + link: "/withAlchemyEnhancedApis", + }, ], }, { diff --git a/site/guides/enhanced-apis/nft.md b/site/guides/enhanced-apis/nft.md new file mode 100644 index 0000000000..4c7a92af43 --- /dev/null +++ b/site/guides/enhanced-apis/nft.md @@ -0,0 +1,59 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: How to Fetch a Smart Account's NFTs + - - meta + - name: description + content: Follow this guide to fetch a Smart Account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - property: og:description + content: Follow this guide to fetch a Smart Account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - name: twitter:title + content: How to Get a Smart Account's NFTs + - - meta + - name: twitter:description + content: Follow this guide to fetch a Smart Account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. +--- + +# How to Fetch a Smart Account's NFTs + +Alchemy provides several [Enhanced APIs](https://www.alchemy.com/enhanced-apis), which are especially useful for querying information about the smart accounts you create using Account Kit, such as the account's owned NFTs using the [NFT API](https://www.alchemy.com/nft-api). + +For the purposes of our example, we'll use the NFT API to query our smart account's data by extending the Alchemy Provider [with Enhanced APIs](/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md). + +## 1. Install the [`alchemy-sdk`](https://github.com/alchemyplatform/alchemy-sdk-js) + +Alchemy has developed a Typescript SDK to make development with the Enhanced APIs simple. The SDK includes ways to leverage Alchemy's Simulation API, Token API, Transact API, NFT API, Webhooks and Websockets, and more across Alchemy's supported chains. Take a look at the code [here](https://github.com/alchemyplatform/alchemy-sdk-js). + +We will use the Alchemy SDK Client to extend our Alchemy Provider using the provider's [`withAlchemyEnhancedApis`](/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md) method. That way, our provider will have direct access to the Enhanced APIs. + +To use the Alchemy SDK in our project directory, we'll need to install the required package: + +::: code-group + +```bash [npm] +npm i alchemy-sdk +``` + +```bash [yarn] +yarn add alchemy-sdk +``` + +::: + +## 2. Extend the Alchemy Provider with Enhanced APIs + +Then, all we need to do is create an `alchemy` client from the Alchemy SDK, create an `AlchemyProvider` from Account Kit, and then extend the provider with functionality from the SDK client using `withAlchemyEnhancedApis`. We can get the smart account's address from the `AlchemyProvider` in order to fetch the smart account's NFT in just 1 line of code! + +<<< @/snippets/enhanced-apis-example/nft.ts + +:::tip Note +Note that we must configure the Alchemy SDK client to have the same API Key and blockchain network as Alchemy Provider it is extending via `withAlchemyEnhancedApis`. This method explicitly checks this requirement and will throw an error at runtime if not satisfied. + +Additionally, since the Alchemy SDK client does not yet support JWT authentication, an `AlchemyProvider` initialized with JWTs cannot use this method. We must be initialize the provider with an API key or RPC URL. +::: + +That's it! There are so many more Enhanced APIs the the Alchemy SDK exposes, and can be useful for development with Account Abstraction. Try it out [here](https://github.com/alchemyplatform/alchemy-sdk-js), and check out [How to fetch a Smart Account's ERC-20 Tokens](/guides/enhanced-apis/token) for another example. diff --git a/site/guides/enhanced-apis/token.md b/site/guides/enhanced-apis/token.md new file mode 100644 index 0000000000..5d47ec1972 --- /dev/null +++ b/site/guides/enhanced-apis/token.md @@ -0,0 +1,59 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: How to Fetch a Smart Account's ERC-20 Tokens + - - meta + - name: description + content: Follow this guide to fetch a Smart Account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - property: og:description + content: Follow this guide to fetch a Smart Account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - name: twitter:title + content: How to Fetch a Smart Account's ERC-20 Tokens + - - meta + - name: twitter:description + content: Follow this guide to fetch a Smart Account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. +--- + +# How to Fetch a Smart Account's ERC-20 Tokens + +Alchemy provides several [Enhanced APIs](https://www.alchemy.com/enhanced-apis), which are especially useful for querying information about the smart accounts you create using Account Kit, such as the account's ERC-20 Token balances using the [Token API](https://www.alchemy.com/token-api). + +For the purposes of our example, we'll use the Token API to query our smart account's data by extending the Alchemy Provider [with Enhanced APIs](/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md). + +## 1. Install the [`alchemy-sdk`](https://github.com/alchemyplatform/alchemy-sdk-js) + +Alchemy has developed a Typescript SDK to make development with the Enhanced APIs simple. The SDK includes ways to leverage Alchemy's Simulation API, Token API, Transact API, NFT API, Webhooks and Websockets, and more across Alchemy's supported chains. Take a look at the code [here](https://github.com/alchemyplatform/alchemy-sdk-js). + +We will use the Alchemy SDK Client to extend our Alchemy Provider using the provider's [`withAlchemyEnhancedApis`](/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md) method. That way, our provider will have direct access to the Enhanced APIs. + +To use the Alchemy SDK in our project directory, we'll need to install the required package: + +::: code-group + +```bash [npm] +npm i alchemy-sdk +``` + +```bash [yarn] +yarn add alchemy-sdk +``` + +::: + +## 2. Extend the Alchemy Provider with Enhanced APIs + +Then, all we need to do is create an `alchemy` client from the Alchemy SDK, create an `AlchemyProvider` from Account Kit, and then extend the provider with functionality from the SDK client using `withAlchemyEnhancedApis`. We can get the smart account's address from the `AlchemyProvider` in order to fetch the smart account's ERC-20 Tokens in just 1 line of code! + +<<< @/snippets/enhanced-apis-example/token.ts + +:::tip Note +Note that we must configure the Alchemy SDK client to have the same API Key and blockchain network as Alchemy Provider it is extending via `withAlchemyEnhancedApis`. This method explicitly checks this requirement and will throw an error at runtime if not satisfied. + +Additionally, since the Alchemy SDK client does not yet support JWT authentication, an `AlchemyProvider` initialized with JWTs cannot use this method. We must be initialize the provider with an API key or RPC URL. +::: + +That's it! There are so many more Enhanced APIs the the Alchemy SDK exposes, and can be useful for development with Account Abstraction. Try it out [here](https://github.com/alchemyplatform/alchemy-sdk-js), and check out [How to fetch a Smart Account's NFTs](/guides/enhanced-apis/nft) for another example. diff --git a/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md b/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md new file mode 100644 index 0000000000..d59af0d788 --- /dev/null +++ b/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md @@ -0,0 +1,52 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: AlchemyProvider • withAlchemyEnhancedApis + - - meta + - name: description + content: Overview of the withAlchemyEnhancedApis method on Alchemy Provider in aa-alchemy + - - meta + - property: og:description + content: Overview of the withAlchemyEnhancedApis method on Alchemy Provider in aa-alchemy +--- + +# withAlchemyEnhancedApis + +`withAlchemyEnhancedApis` is a method on `AlchemyProvider` that you can optionally call to create a new provider instance with added methods that access the Alchemy [Enhanced APIs](https://www.alchemy.com/enhanced-apis) via the [Alchemy SDK](https://github.com/alchemyplatform/alchemy-sdk-js). + +:::tip Note +This method requires a peer dependency on the [`alchemy-sdk`](https://github.com/alchemyplatform/alchemy-sdk-js) package, as the input to this method is an Alchemy SDK client. + +The Alchemy SDK client must be configured with the same API key and network as the AlchemyProvider. This method validates such at runtime. + +Additionally, since the Alchemy SDK client does not yet support JWT authentication, an `AlchemyProvider` initialized with JWTs cannot use this method. They must be initialized with an API key or RPC URL. +::: + +## Usage + +::: code-group + +```ts [example.ts] +import { provider } from "./provider"; +// [!code focus:99] + +const alchemy = new Alchemy(); + +// use Alchemy Enhanced APIs +const providerWithEnhancedApis = provider.withAlchemyEnhancedApis(alchemy); +``` + +<<< @/snippets/provider.ts +::: + +## Returns + +### `AlchemyProvider` + +A new instance of an `AlchemyProvider` with the same attributes as the input, now with methods for accessing the Alchemy Enhanced APIs to more efficiently query blockchain data. + +## Parameters + +### `alchemy: Alchemy` -- an initialized Alchemy SDK client diff --git a/site/snippets/enhanced-apis-example/nft.ts b/site/snippets/enhanced-apis-example/nft.ts new file mode 100644 index 0000000000..b6fcf68df4 --- /dev/null +++ b/site/snippets/enhanced-apis-example/nft.ts @@ -0,0 +1,18 @@ +import { AlchemyProvider } from "@alchemy/aa-alchemy"; +import { Alchemy, Network } from "alchemy-sdk"; +import { sepolia } from "viem/chains"; + +const alchemy = new Alchemy({ + network: Network.ETH_SEPOLIA, + apiKey: "YOUR_API_KEY", +}); + +const provider = new AlchemyProvider({ + chain: sepolia, + apiKey: "YOUR_API_KEY", +}).withAlchemyEnhancedApis(alchemy); + +const address = await provider.getAddress(); + +// get all NFTs owned by the smart account +export const nfts = provider.nft.getNftsForOwner(address); diff --git a/site/snippets/enhanced-apis-example/token.ts b/site/snippets/enhanced-apis-example/token.ts new file mode 100644 index 0000000000..068639453d --- /dev/null +++ b/site/snippets/enhanced-apis-example/token.ts @@ -0,0 +1,18 @@ +import { AlchemyProvider } from "@alchemy/aa-alchemy"; +import { Alchemy, Network } from "alchemy-sdk"; +import { sepolia } from "viem/chains"; + +const alchemy = new Alchemy({ + network: Network.ETH_SEPOLIA, + apiKey: "YOUR_API_KEY", +}); + +const provider = new AlchemyProvider({ + chain: sepolia, + apiKey: "YOUR_API_KEY", +}).withAlchemyEnhancedApis(alchemy); + +const address = await provider.getAddress(); + +// get all tokens owned by the smart account +export const tokenBalances = provider.core.getTokenBalances(address); From 7985b8f28b0992a6dd740e707a9809645615cfca Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Wed, 15 Nov 2023 11:02:07 -0800 Subject: [PATCH 52/79] docs: guides on how to handle userop not eligible for sponsorship (#225) * docs: guides on how to handle userop not elligible for sponsorship * Update packages/core/src/provider/types.ts Co-authored-by: Michael Moldoveanu * Update site/guides/sponsoring-gas/gas-sponsorship-eligibility.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/guides/sponsoring-gas/gas-sponsorship-eligibility.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update site/guides/sponsoring-gas/gas-sponsorship-eligibility.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --------- Co-authored-by: Michael Moldoveanu Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- packages/core/src/provider/base.ts | 13 ++ packages/core/src/provider/types.ts | 55 +++++++- site/.vitepress/config.ts | 18 ++- .../gas-sponsorship-eligibility.md | 118 ++++++++++++++++++ .../{ => sponsoring-gas}/sponsoring-gas.md | 0 site/introduction.md | 2 +- .../checkGasSponsorshipEligibility.md | 64 ++++++++++ site/smart-accounts/overview.md | 2 +- site/why-account-kit.md | 4 +- 9 files changed, 264 insertions(+), 12 deletions(-) create mode 100644 site/guides/sponsoring-gas/gas-sponsorship-eligibility.md rename site/guides/{ => sponsoring-gas}/sponsoring-gas.md (100%) create mode 100644 site/packages/aa-core/provider/checkGasSponsorshipEligibility.md diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index a0cd18a74e..0fda18f030 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -395,6 +395,19 @@ export class SmartAccountProvider< return this._sendUserOperation(uoToSend); }; + checkGasSponsorshipEligibility = async ( + data: UserOperationCallData | BatchUserOperationCallData, + overrides?: UserOperationOverrides + ): Promise => { + return this.buildUserOperation(data, overrides) + .then( + (userOperationStruct: UserOperationStruct) => + userOperationStruct.paymasterAndData !== "0x" && + userOperationStruct.paymasterAndData !== null + ) + .catch(() => false); + }; + private _runMiddlewareStack = async ( uo: Deferrable, overrides?: UserOperationOverrides diff --git a/packages/core/src/provider/types.ts b/packages/core/src/provider/types.ts index 22cd8038cd..1ed87c1f41 100644 --- a/packages/core/src/provider/types.ts +++ b/packages/core/src/provider/types.ts @@ -19,6 +19,7 @@ import type { import type { BatchUserOperationCallData, UserOperationCallData, + UserOperationOverrides, UserOperationReceipt, UserOperationRequest, UserOperationResponse, @@ -117,41 +118,61 @@ export interface ISmartAccountProvider< * 5. customMiddleware -- allows you to override any of the results returned by previous middlewares * * @param data - either {@link UserOperationCallData} or {@link BatchUserOperationCallData} + * @param overrides - optional {@link UserOperationOverrides} * @returns - {@link SendUserOperationResult} containing the hash and request */ sendUserOperation: ( - data: UserOperationCallData | BatchUserOperationCallData + data: UserOperationCallData | BatchUserOperationCallData, + overrides?: UserOperationOverrides ) => Promise; /** * Attempts to drop and replace an existing user operation by increasing fees * * @param data - an existing user operation request returned by `sendUserOperation` + * @param overrides - optional {@link UserOperationOverrides} * @returns - {@link SendUserOperationResult} containing the hash and request */ dropAndReplaceUserOperation: ( - data: UserOperationRequest + data: UserOperationRequest, + overrides?: UserOperationOverrides ) => Promise; /** * Allows you to get the unsigned UserOperation struct with all of the middleware run on it * * @param data - either {@link UserOperationCallData} or {@link BatchUserOperationCallData} + * @param overrides - optional {@link UserOperationOverrides} * @returns - {@link UserOperationStruct} resulting from the middleware pipeline */ buildUserOperation: ( - data: UserOperationCallData | BatchUserOperationCallData + data: UserOperationCallData | BatchUserOperationCallData, + overrides?: UserOperationOverrides ) => Promise; + /** + * Allows you to check whether the UserOperation to be sent is eligible for gas sponsorship or not. + * + * @param data - either {@link UserOperationCallData} or {@link BatchUserOperationCallData} + * @param overrides - optional {@link UserOperationOverrides} + * @returns - {@link UserOperationStruct} resulting from the middleware pipeline + */ + checkGasSponsorshipEligibility: ( + data: UserOperationCallData | BatchUserOperationCallData, + overrides?: UserOperationOverrides + ) => Promise; + /** * Allows you to get the unsigned UserOperation struct with all of the middleware run on it * converted from a traditional ethereum transaction * * @param data - {@link RpcTransactionRequest} the tx to convert to a UserOperation + * @param overrides - optional {@link UserOperationOverrides} * @returns - {@link UserOperationStruct} resulting from the middleware pipeline */ buildUserOperationFromTx: ( - tx: RpcTransactionRequest + tx: RpcTransactionRequest, + overrides?: UserOperationOverrides ) => Promise; /** @@ -185,9 +206,13 @@ export interface ISmartAccountProvider< * to mine, it's recommended to user {@link sendUserOperation} instead. * * @param request - a {@link RpcTransactionRequest} object representing a traditional ethereum transaction + * @param overrides - optional {@link UserOperationOverrides}\ * @returns the transaction hash */ - sendTransaction: (request: RpcTransactionRequest) => Promise; + sendTransaction: ( + request: RpcTransactionRequest, + overrides?: UserOperationOverrides + ) => Promise; /** * This takes a set of ethereum transactions and converts them into one UserOperation, sends the UserOperation, and waits @@ -197,9 +222,13 @@ export interface ISmartAccountProvider< * NOTE: the account you're sending the transactions to MUST support batch transactions. * * @param request - a {@link RpcTransactionRequest} Array representing a traditional ethereum transaction + * @param overrides - optional {@link UserOperationOverrides}\ * @returns the transaction hash */ - sendTransactions: (request: RpcTransactionRequest[]) => Promise; + sendTransactions: ( + request: RpcTransactionRequest[], + overrides?: UserOperationOverrides + ) => Promise; /** * EIP-1193 compliant request method @@ -247,6 +276,20 @@ export interface ISmartAccountProvider< */ getAddress: () => Promise
; + /** + * @returns the EntryPoint contract address being used for the provider. + * + * If the provider is connected with a `SmartContractAccount`, the EntryPoint contract of the connected account + * is used for the provider. + * + * If not connected, it fallbacks to the default entry point contract for the chain, unless the optional parameter + * `entryPointAddress` was given during the initialization as an override. + * + * Refer to https://docs.alchemy.com/reference/eth-supportedentrypoints for all the supported entrypoints + * when using Alchemy as your RPC provider. + */ + getEntryPointAddress: () => Address; + /** * @returns boolean flag indicating if the account is connected */ diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index dbfac784db..b8dcd40ba1 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -118,8 +118,18 @@ export default defineConfig({ link: "/send-user-operation", }, { - text: "How to Sponsor Gas for a User Operation", - link: "/sponsoring-gas", + text: "Gas Sponsorship", + base: "/guides/sponsoring-gas", + items: [ + { + text: "How to Sponsor Gas for User Operations", + link: "/sponsoring-gas", + }, + { + text: "How to Handle User Operations that are Not Eligible for Gas Sponsorship", + link: "/gas-sponsorship-eligibility", + }, + ], }, { text: "How to Batch Transactions", link: "/batching-transactions" }, { @@ -172,6 +182,10 @@ export default defineConfig({ text: "buildUserOperation", link: "/buildUserOperation", }, + { + text: "checkGasSponsorshipEligibility", + link: "/checkGasSponsorshipEligibility", + }, { text: "buildUserOperationFromTx", link: "/buildUserOperationFromTx", diff --git a/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md new file mode 100644 index 0000000000..847c370d2a --- /dev/null +++ b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md @@ -0,0 +1,118 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: How to Handle User Operations that are Not Eligible for Gas Sponsorship + - - meta + - name: description + content: Follow this guide to handle User Operations that are not eligible for gas sponsorship. Account Kit is a vertically integrated stack for building apps that support ERC-4337. + - - meta + - property: og:description + content: Follow this guide to handle User Operations that are not eligible for gas sponsorship. Account Kit is a vertically integrated stack for building apps that support ERC-4337. + - - meta + - name: twitter:title + content: How to Handle User Operations that are Not Eligible for Gas Sponsorship + - - meta + - name: twitter:description + content: Follow this guide to handle User Operations that are not eligible for gas sponsorship. Account Kit is a vertically integrated stack for building apps that support ERC-4337. +--- + +# How to Handle User Operations that are Not Eligible for Gas Sponsorship + +As mentioned from the previous guide on [How to Sponsor Gas for a User Operation](./sponsoring-gas.md), with Account Kit can sponsor gas fees for transactions via the [Alchemy Gas Manager](https://docs.alchemy.com/docs/gas-manager-services). + +But what happens when the user operation you are sending fails to satisfy the criteria set in the gas manager policy? How do you check if the user operation is eligible for gas sponsorship before sending the user operation? + +If you do send the user operation that is not eligible for the gas sponsorship under your Gas Manager policy, [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation.md) or [`sendTransaction`](/packages/aa-core/provider/sendTransaction.md) will fail due to the error thrown during the [`PaymasterMiddleware`](/packages/aa-core/provider/withPaymasterMiddleware.md) failure. You can follow the guide below to check for gas sponsorship eligibility in advance. + +## 1. How to Check if a User Operation is Eligible for Gas Sponsorship + +First, you can follow the same instructions from the previous guide on [How to Sponsor Gas for a User Operation](./sponsoring-gas.md) to set up your `SmartAccountProvider` and link your gas policy. + +::: code-group + +```ts [setup-alchemy-provider.ts] +import { provider } from "./provider.ts"; + +// Find your Gas Manager policy id at: // [!code focus:10] +//dashboard.alchemy.com/gas-manager/policy/create +const GAS_MANAGER_POLICY_ID = "YourGasManagerPolicyId"; + +// Link the provider with the Gas Manager. This ensures user operations +// sent with this provider get sponsorship from the Gas Manager. +provider.withAlchemyGasManager({ + policyId: GAS_MANAGER_POLICY_ID, +}); +``` + +<<< @/snippets/provider.ts + +::: + +Then, before you call `sendUserOperation` on the provider, you can use [`checkGasSponsorshipEligibility`](/packages/aa-core/provider/checkGasSponsorshipEligibility.md) to verify the eligibility of the connected account for gas sponsorship concerning the upcoming `UserOperation` that is intended to be sent. + +Internally, this method invokes [`buildUserOperation`](/packages/aa-core/provider/buildUserOperation.md), which navigates through the middleware pipeline, including the `PaymasterMiddleware`. Its purpose is to construct the `UserOperation` struct meant for transmission to the bundler. Following the construction of the `UserOperation` struct, this function verifies if the resulting structure contains a non-empty `paymasterAndData` field. + +You can utilize this method before sending the user operation to confirm its eligibility for gas sponsorship. Depending on the outcome, it allows you to tailor the user experience accordingly, based on eligibility. + +```ts [check-gas-sponsorship-eligibility.ts] +const elligibility = await provider.checkGasSponsorshipEligibility({ + target: "0xTargetAddress", + data: "0xCallData", + value: 0n, // value in bigint or leave undefined +}); + +console.log( + `User Operation is ${ + eligible ? "eligible" : "ineligible" + } for gas sponsorship` +); +``` + +## 2. How to Bypass the Paymaster Middleware For User Operations Not Eligible for Gas Sponsorship + +If you attempt to execute the `sendUserOperation` method for user operations ineligible for gas sponsorship through the configured provider with the gas manager policy, an error will be thrown. This error would prevent users from sending the user operation. In such cases, the desired user experience involves allowing these users, despite the lack of gas sponsorship eligibility, to still send the user operation by reverting to the default behavior of paying gas fees from the user's account balance. For instance, your application could inform users about their gas sponsorship eligibility status, surface the eligibility of the user operation, and provide users with the choice to unblock themselves by sending the user operation without gas sponsorship. + +This section of the guide elucidates how you can circumvent the `PaymasterMiddleware`, enabling the sending of user operations without gas sponsorship. This functionality permits the sending of user operations where users pay the gas fee themselves via their smart account. + +When employing various methods on `SmartAccountProvider` to send user operations (e.g., [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation.md) or [`sendTransaction`](/packages/aa-core/provider/sendTransaction.md)), apart from the `UserOperationCallData` or `BatchUserOperationCallData`, you have the option to include an additional parameter named `overrides`. This parameter allows the specification of override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData`. To bypass the `PaymasterMiddleware`, you can specifically set the `paymasterAndData` override. For example, assigning an empty hex string (`0x`) to the `paymasterAndData` field in the overrides would result in the user operation being sent without the paymaster covering the gas fee, but rather paid from the user's own smart account. + +```ts [bypass-paymaster-middleware.ts] +// If gas sponsorship ineligible, baypass paymaster middleware by passing in the paymasterAndData override + +// Empty paymasterAndData indicates that there will be no paymaster involved +// and the user will be paying for the gas fee even when `withAlchemyGasManager` is configured on the provider + +const elligibility = await provider.checkGasSponsorshipEligibility({ + target: "0xTargetAddress", + data: "0xCallData", + value: 0n, // value in bigint or leave undefined +}); + +// if `elligibility` === false, inform users about their ineligibility, +// either notifying or asking for consent to proceed with gas fee being paid from their account balance + +// To proceed with bypassing the paymster middleware +const overrides = { paymasterAndData: "0x" }; + +const userOperationResult = await provider.sendUserOperation( + { + target: "0xTargetAddress", + data: "0xCallData", + }, + overrides: elligibility ? undefined : overrides // for ineligible user operations, set the paymasterAndData override +); + +const txHash = await provider.waitForUserOperationTransaction({ + hash: userOperationResult.hash, +}); +``` + +That's it! By using the above methods, you can provide the desired user experience for your users depending on their eligibility for gas sponsorship. + +1. Check for the gas sponsorship eligibility prior to sending the user operation and inform users about their gas sponsorship eligibility status. +2. Provide users with the choice to unblock themselves by sending the user operation without gas sponsorship. +3. Still send the user operation by reverting to the default behavior of paying gas fees from the user's account balance by bypassing the paymster middleware for the ineligible user operations. + +AccountKit provides much flexibility for you to design optimal user experiences to handle different cases of gas sponsonship eligibility accordingly. diff --git a/site/guides/sponsoring-gas.md b/site/guides/sponsoring-gas/sponsoring-gas.md similarity index 100% rename from site/guides/sponsoring-gas.md rename to site/guides/sponsoring-gas/sponsoring-gas.md diff --git a/site/introduction.md b/site/introduction.md index 7cbcf3d22c..f7eaa0a381 100644 --- a/site/introduction.md +++ b/site/introduction.md @@ -72,7 +72,7 @@ To get started with a signer, read the doc: [How to Choose a Signer](/smart-acco The Gas Manager is a programmable API to sponsor gas for UserOps. You can create programmable gas policies to specify exactly which transactions should be sponsored, set strict spending limits per wallet or globally, and allowlist/blocklist particular wallet addresses. This expressive programmability is available through a REST API and an intuitive dashboard interface. -To learn how to sponsor gas with the Gas Manager API, see the [Sponsoring Gas](/guides/sponsoring-gas) tutorial. +To learn how to sponsor gas with the Gas Manager API, see the [Sponsoring Gas](/guides/sponsoring-gas/sponsoring-gas) tutorial. ### Bundler API diff --git a/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md b/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md new file mode 100644 index 0000000000..42fdcb7f56 --- /dev/null +++ b/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md @@ -0,0 +1,64 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: checkGasSponsorshipEligibility + - - meta + - name: description + content: Overview of the checkGasSponsorshipEligibility method on ISmartAccountProvider + - - meta + - property: og:description + content: Overview of the checkGasSponsorshipEligibility method on ISmartAccountProvider +--- + +# checkGasSponsorshipEligibility + +This function verifies the eligibility of the connected account for gas sponsorship concerning the upcoming `UserOperation` that is intended to be sent. + +Internally, this method invokes [`buildUserOperation`](./buildUserOperation.md), which navigates through the middleware pipeline, including the `PaymasterMiddleware`. Its purpose is to construct the `UserOperation` struct meant for transmission to the bundler. Following the construction of the `UserOperation` struct, this function verifies if the resulting structure contains a non-empty `paymasterAndData` field. + +You can utilize this method before sending the user operation to confirm its eligibility for gas sponsorship. Depending on the outcome, it allows you to tailor the user experience accordingly, based on eligibility. + +For a deeper understanding of how to employ this method to provide varied user experiences contingent on gas sponsorship eligibility, please refer to the guide [How to Handle User Operations Not Eligibile for Gas Sponsorship](/guides/sponsoring-gas/gas-sponsorship-eligibility.md). + +## Usage + +::: code-group + +```ts [example.ts] +import { provider } from "./provider"; +// [!code focus:99] +const eligible = await provider.checkGasSponsorshipEligibility({ + data: "0xCalldata", + target: "0xTarget", + value: 0n, +}); + +console.log( + `User Operation is ${ + eligible ? "eligible" : "ineligible" + } for gas sponsorship.` +); +``` + +<<< @/snippets/provider.ts +::: + +## Returns + +### `Promise` + +A Promise containing the boolean value indicating whether the `UserOperation` to be sent is eligible for gas sponsorship or not. + +## Parameters + +### `UserOperationCallData | UserOperationCallData[]` + +- `target: Address` - the target of the call (equivalent to `to` in a transaction) +- `data: Hex` - can be either `0x` or a call data string +- `value?: bigint` - optionally, set the value in wei you want to send to the target + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request diff --git a/site/smart-accounts/overview.md b/site/smart-accounts/overview.md index 1f7baab430..58d05940da 100644 --- a/site/smart-accounts/overview.md +++ b/site/smart-accounts/overview.md @@ -55,7 +55,7 @@ At this point you should be able to integrate smart accounts in your application ## 4. Sponsoring Gas -Being able to sponsor gas for your users is one of the most powerful features enabled by smart accounts and can help you build a seamless user experience. We'll cover this in detail with code examples in the [Sponsoring Gas](/guides/sponsoring-gas) section. +Being able to sponsor gas for your users is one of the most powerful features enabled by smart accounts and can help you build a seamless user experience. We'll cover this in detail with code examples in the [Sponsoring Gas](/guides/sponsoring-gas/sponsoring-gas) section. ## 5. Batching Transactions diff --git a/site/why-account-kit.md b/site/why-account-kit.md index dfa95b0bb5..791c77c9d3 100644 --- a/site/why-account-kit.md +++ b/site/why-account-kit.md @@ -75,9 +75,9 @@ Account Kit removes the greatest barrier to entry of all: gas fees. Many newcomers give up on web3 before submitting their first transaction. It's daunting to buy crypto for the first time, especially before trying the app! Gas fees -- even cheap ones on L2 -- discourage newcomers from trying your app. -With Account Kit you can remove this barrier by [sponsoring gas fees](/guides/sponsoring-gas) for transactions — especially the first one! Get the user to your app’s magic moment as quickly, and help them fall in love with your product before asking them to deposit money. +With Account Kit you can remove this barrier by [sponsoring gas fees](/guides/sponsoring-gas/sponsoring-gas) for transactions — especially the first one! Get the user to your app’s magic moment as quickly, and help them fall in love with your product before asking them to deposit money. -The [Gas Manager API](https://dashboard.alchemy.com/gas-manager) included in Account Kit is a powerful tool to [sponsor gas](/guides/sponsoring-gas). Sponsorship rules are programmable, giving you precise control over spending limits, allowlisted/blocklisted wallet addresses, and more through a REST API or an intuitive management dashboard. +The [Gas Manager API](https://dashboard.alchemy.com/gas-manager) included in Account Kit is a powerful tool to [sponsor gas](/guides/sponsoring-gas/sponsoring-gas). Sponsorship rules are programmable, giving you precise control over spending limits, allowlisted/blocklisted wallet addresses, and more through a REST API or an intuitive management dashboard. In the future, Account Kit will support paying gas in stablecoins like USDC and other ERC20s. If you’re interested those features, [contact us](mailto:account-abstraction@alchemy.com) to chat. From 2582cdc066646123a20f032b925c4a95d2ee5937 Mon Sep 17 00:00:00 2001 From: Aaron Hayslip Date: Thu, 16 Nov 2023 12:57:30 -0600 Subject: [PATCH 53/79] Fix spelling error (#260) --- .../aa-accounts/utils/getDefaultLightAccountFactoryAddress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/packages/aa-accounts/utils/getDefaultLightAccountFactoryAddress.md b/site/packages/aa-accounts/utils/getDefaultLightAccountFactoryAddress.md index 62df4dde45..84151eb764 100644 --- a/site/packages/aa-accounts/utils/getDefaultLightAccountFactoryAddress.md +++ b/site/packages/aa-accounts/utils/getDefaultLightAccountFactoryAddress.md @@ -14,7 +14,7 @@ head: # getDefaultLightAccountFactoryAddress -Utility method that returns the default Light Account Factory contrafct address for a given chain +Utility method that returns the default Light Account Factory contract address for a given chain ## Usage From 5a854b20545ce505d36f9a3249cb41653493615e Mon Sep 17 00:00:00 2001 From: Aaron Hayslip Date: Thu, 16 Nov 2023 13:01:39 -0600 Subject: [PATCH 54/79] Fixed grammar mistake (#261) --- site/smart-accounts/accounts/light-account.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/smart-accounts/accounts/light-account.md b/site/smart-accounts/accounts/light-account.md index 8ed2636968..31707a32eb 100644 --- a/site/smart-accounts/accounts/light-account.md +++ b/site/smart-accounts/accounts/light-account.md @@ -24,7 +24,7 @@ head: ## Overview -Light Account is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) smart account. We started with the Ethereum Foundation’s canonical [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) and added key improvements. It's fully production-ready with a security [audit](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf), gas optimizations, and [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) signature support. Additionally, Light Account support ownership transfer to ensure you and your user don't get locked into a particular signer. +Light Account is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) smart account. We started with the Ethereum Foundation’s canonical [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) and added key improvements. It's fully production-ready with a security [audit](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf), gas optimizations, and [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) signature support. Additionally, Light Account supports ownership transfer to ensure you and your user don't get locked into a particular signer. ## Why Light Account From fb80a4750451dd964aa52ac785ca5729180cf8b9 Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Thu, 16 Nov 2023 16:01:33 -0500 Subject: [PATCH 55/79] feat: add a sign user operation hash method to allow for difference between 1271 and UO signing (#258) --- packages/core/src/account/base.ts | 11 +++++++++++ packages/core/src/account/types.ts | 9 +++++++++ packages/core/src/provider/base.ts | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/core/src/account/base.ts b/packages/core/src/account/base.ts index cfcc511d45..b95cedc38a 100644 --- a/packages/core/src/account/base.ts +++ b/packages/core/src/account/base.ts @@ -150,6 +150,17 @@ export abstract class BaseSmartContractAccount< // #region optional-methods + /** + * If your account handles 1271 signatures of personal_sign differently + * than it does UserOperations, you can implement two different approaches to signing + * + * @param uoHash -- The hash of the UserOperation to sign + * @returns the signature of the UserOperation + */ + async signUserOperationHash(uoHash: Hash): Promise { + return this.signMessage(uoHash); + } + /** * If your contract supports signing and verifying typed data, * you should implement this method. diff --git a/packages/core/src/account/types.ts b/packages/core/src/account/types.ts index 61a73e9911..cc5bed7b6e 100644 --- a/packages/core/src/account/types.ts +++ b/packages/core/src/account/types.ts @@ -56,6 +56,15 @@ export interface ISmartContractAccount { */ getNonce(): Promise; + /** + * If your account handles 1271 signatures of personal_sign differently + * than it does UserOperations, you can implement two different approaches to signing + * + * @param uoHash -- The hash of the UserOperation to sign + * @returns the signature of the UserOperation + */ + signUserOperationHash(uoHash: Hash): Promise; + /** * Returns a signed and prefixed message. * diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index 0fda18f030..4af5d9a984 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -444,7 +444,7 @@ export class SmartAccountProvider< ); } - request.signature = (await this.account.signMessage( + request.signature = (await this.account.signUserOperationHash( getUserOperationHash( request, this.getEntryPointAddress(), From 1b674368edc0f7fbe41ffdd0e60778c30ee368e9 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Thu, 16 Nov 2023 21:59:10 -0500 Subject: [PATCH 56/79] feat: add useroperation simulation (#250) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request Checklist - [x] Did you add new tests and confirm existing tests pass? (`yarn test`) - [x] Did you update relevant docs? (docs are found in the `site` folder, see guidleines below) - [x] Do your commits follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? - [x] Does your PR title also follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? - [x] If you have a breaking change, is it [correctly reflected in your commit message](https://www.conventionalcommits.org/en/v1.0.0/#examples? (e.g. `feat!: breaking change`) - [x] Did you run lint (`yarn lint:check`) and fix any issues? (`yarn lint:fix`) - [x] Is the base branch you're merging into `development` and not `main`? --- ## PR-Codex overview This PR focuses on adding the ability to simulate user operation asset changes in the Alchemy provider. ### Detailed summary - Added `SimulateUserOperationAssetChangesRequest` and `SimulateUserOperationAssetChangesResponse` types. - Added `alchemy_simulateUserOperationAssetChanges` method to the provider. - Added `withAlchemyUserOpSimulation` middleware function. - Updated tests. > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` --- .../alchemy/e2e-tests/simple-account.test.ts | 53 +++++++++++++++++++ packages/alchemy/src/middleware/client.ts | 9 ++++ .../alchemy/src/middleware/simulate-uo.ts | 30 +++++++++++ .../alchemy/src/middleware/types/index.ts | 1 + .../src/middleware/types/simulate-uo/enums.ts | 16 ++++++ .../src/middleware/types/simulate-uo/index.ts | 18 +++++++ .../types/simulate-uo/interfaces.ts | 21 ++++++++ packages/alchemy/src/provider.ts | 29 ++++++++++ packages/core/src/provider/base.ts | 32 +++++++++-- 9 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 packages/alchemy/src/middleware/simulate-uo.ts create mode 100644 packages/alchemy/src/middleware/types/index.ts create mode 100644 packages/alchemy/src/middleware/types/simulate-uo/enums.ts create mode 100644 packages/alchemy/src/middleware/types/simulate-uo/index.ts create mode 100644 packages/alchemy/src/middleware/types/simulate-uo/interfaces.ts diff --git a/packages/alchemy/e2e-tests/simple-account.test.ts b/packages/alchemy/e2e-tests/simple-account.test.ts index 97e72d61b7..cabe5af917 100644 --- a/packages/alchemy/e2e-tests/simple-account.test.ts +++ b/packages/alchemy/e2e-tests/simple-account.test.ts @@ -232,6 +232,59 @@ describe("Simple Account Tests", () => { const nfts = await provider.nft.getNftsForOwner(address); expect(nfts.ownedNfts).toMatchInlineSnapshot("[]"); }, 50000); + + it("should correctly simulate asset changes for the user operation", async () => { + const provider = givenConnectedProvider({ + owner, + chain, + }); + + const simulatedAssetChanges = + await provider.simulateUserOperationAssetChanges({ + target: provider.getEntryPointAddress(), + data: "0x", + value: 1n, + }); + + expect(simulatedAssetChanges).toMatchInlineSnapshot(` + { + "changes": [ + { + "amount": "0.000000000000000001", + "assetType": "NATIVE", + "changeType": "TRANSFER", + "contractAddress": null, + "decimals": 18, + "from": "0xb856dbd4fa1a79a46d426f537455e7d3e79ab7c4", + "logo": "https://static.alchemyapi.io/images/network-assets/eth.png", + "name": "Ethereum", + "rawAmount": "1", + "symbol": "ETH", + "to": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "tokenId": null, + }, + ], + "error": null, + } + `); + }, 50000); + + it("should simulate as part of middleware stack when added to provider", async () => { + const provider = givenConnectedProvider({ + owner, + chain, + }).withAlchemyUserOpSimulation(); + + const spy = vi.spyOn(provider, "simulateUOMiddleware"); + + await provider.buildUserOperation({ + target: provider.getEntryPointAddress(), + data: "0x", + value: 1n, + }); + + expect(spy).toHaveBeenCalledOnce(); + }, 50000); }); const givenConnectedProvider = ({ diff --git a/packages/alchemy/src/middleware/client.ts b/packages/alchemy/src/middleware/client.ts index e9ce86af6f..b8665c9d76 100644 --- a/packages/alchemy/src/middleware/client.ts +++ b/packages/alchemy/src/middleware/client.ts @@ -3,6 +3,10 @@ import { type UserOperationRequest, } from "@alchemy/aa-core"; import type { Address, Hex } from "viem"; +import type { + SimulateUserOperationAssetChangesRequest, + SimulateUserOperationAssetChangesResponse, +} from "./types/index.js"; export type ClientWithAlchemyMethods = PublicErc4337Client & { request: PublicErc4337Client["request"] & @@ -41,6 +45,11 @@ export type ClientWithAlchemyMethods = PublicErc4337Client & { maxPriorityFeePerGas: Hex; }>; + request(args: { + method: "alchemy_simulateUserOperationAssetChanges"; + params: SimulateUserOperationAssetChangesRequest; + }): Promise; + request(args: { method: "rundler_maxPriorityFeePerGas"; params: []; diff --git a/packages/alchemy/src/middleware/simulate-uo.ts b/packages/alchemy/src/middleware/simulate-uo.ts new file mode 100644 index 0000000000..0f50a64a7a --- /dev/null +++ b/packages/alchemy/src/middleware/simulate-uo.ts @@ -0,0 +1,30 @@ +import { + deepHexlify, + resolveProperties, + type UserOperationStruct, +} from "@alchemy/aa-core"; +import type { AlchemyProvider } from "../provider.js"; +import type { ClientWithAlchemyMethods } from "./client.js"; + +export const withAlchemyUserOpSimulation =

( + provider: P +): P => { + provider.withSimulateUOMiddleware(async (uoStruct) => { + const uoSimResult = await ( + provider.rpcClient as ClientWithAlchemyMethods + ).request({ + method: "alchemy_simulateUserOperationAssetChanges", + params: [ + deepHexlify(await resolveProperties(uoStruct)) as UserOperationStruct, + provider.getEntryPointAddress(), + ], + }); + + if (uoSimResult.error) { + throw new Error(uoSimResult.error.message); + } + + return uoStruct; + }); + return provider; +}; diff --git a/packages/alchemy/src/middleware/types/index.ts b/packages/alchemy/src/middleware/types/index.ts new file mode 100644 index 0000000000..e48eef16ea --- /dev/null +++ b/packages/alchemy/src/middleware/types/index.ts @@ -0,0 +1 @@ +export type * from "./simulate-uo/index.js"; diff --git a/packages/alchemy/src/middleware/types/simulate-uo/enums.ts b/packages/alchemy/src/middleware/types/simulate-uo/enums.ts new file mode 100644 index 0000000000..1811e0cc07 --- /dev/null +++ b/packages/alchemy/src/middleware/types/simulate-uo/enums.ts @@ -0,0 +1,16 @@ +export enum SimulateAssetType { + NATIVE = "NATIVE", + ERC20 = "ERC20", + ERC721 = "ERC721", + ERC1155 = "ERC1155", + /** + * Special contracts that don't follow ERC 721/1155. Currently limited to + * CryptoKitties and CryptoPunks. + */ + SPECIAL_NFT = "SPECIAL_NFT", +} + +export enum SimulateChangeType { + APPROVE = "APPROVE", + TRANSFER = "TRANSFER", +} diff --git a/packages/alchemy/src/middleware/types/simulate-uo/index.ts b/packages/alchemy/src/middleware/types/simulate-uo/index.ts new file mode 100644 index 0000000000..9fe9dca33f --- /dev/null +++ b/packages/alchemy/src/middleware/types/simulate-uo/index.ts @@ -0,0 +1,18 @@ +import type { UserOperationStruct } from "@alchemy/aa-core"; +import type { Address, Hash } from "viem"; +import type { + SimulateAssetChange, + SimulateAssetChangesError, +} from "./interfaces.js"; + +export type SimulateUserOperationAssetChangesRequest = [ + UserOperationStruct, + entryPoint: Address, + blockNumber?: Hash +]; + +export type SimulateUserOperationAssetChangesResponse = { + changes: SimulateAssetChange[]; + gasUsed?: string; + error?: SimulateAssetChangesError; +}; diff --git a/packages/alchemy/src/middleware/types/simulate-uo/interfaces.ts b/packages/alchemy/src/middleware/types/simulate-uo/interfaces.ts new file mode 100644 index 0000000000..a375b093b5 --- /dev/null +++ b/packages/alchemy/src/middleware/types/simulate-uo/interfaces.ts @@ -0,0 +1,21 @@ +import type { Address } from "viem"; +import type { SimulateAssetType, SimulateChangeType } from "./enums.js"; + +export interface SimulateAssetChangesError extends Record { + message: string; +} + +export interface SimulateAssetChange { + assetType: SimulateAssetType; + changeType: SimulateChangeType; + from: Address; + to: Address; + rawAmount?: string; + amount?: string; + contactAddress: Address; + tokenId?: string; + decimals: number; + symbol: string; + name?: string; + logo?: string; +} diff --git a/packages/alchemy/src/provider.ts b/packages/alchemy/src/provider.ts index 701ab9da1e..3ae383f83e 100644 --- a/packages/alchemy/src/provider.ts +++ b/packages/alchemy/src/provider.ts @@ -4,6 +4,9 @@ import { deepHexlify, resolveProperties, type AccountMiddlewareFn, + type BatchUserOperationCallData, + type UserOperationCallData, + type UserOperationOverrides, } from "@alchemy/aa-core"; import { Alchemy } from "alchemy-sdk"; import { type HttpTransport } from "viem"; @@ -14,11 +17,13 @@ import { optimismGoerli, } from "viem/chains"; import { SupportedChains } from "./chains.js"; +import type { ClientWithAlchemyMethods } from "./middleware/client.js"; import { withAlchemyGasFeeEstimator } from "./middleware/gas-fees.js"; import { withAlchemyGasManager, type AlchemyGasManagerConfig, } from "./middleware/gas-manager.js"; +import { withAlchemyUserOpSimulation } from "./middleware/simulate-uo.js"; import { AlchemyProviderConfigSchema, AlchemySdkClientSchema, @@ -105,6 +110,20 @@ export class AlchemyProvider extends SmartAccountProvider { }; }; + simulateUserOperationAssetChanges = async ( + data: UserOperationCallData | BatchUserOperationCallData, + overrides?: UserOperationOverrides + ) => { + const uoStruct = deepHexlify( + await this.buildUserOperation(data, overrides) + ); + + return (this.rpcClient as ClientWithAlchemyMethods).request({ + method: "alchemy_simulateUserOperationAssetChanges", + params: [uoStruct, this.getEntryPointAddress()], + }); + }; + /** * This methods adds the Alchemy Gas Manager middleware to the provider. * @@ -121,6 +140,16 @@ export class AlchemyProvider extends SmartAccountProvider { return withAlchemyGasManager(this, config, !this.feeOptsSet); } + withAlchemyUserOpSimulation(): this { + if (!this.isConnected()) { + throw new Error( + "AlchemyProvider: account is not set, did you call `connect` first?" + ); + } + + return withAlchemyUserOpSimulation(this); + } + /** * This methods adds Alchemy Enhanced APIs to the provider, via a peer dependency on `alchemy-sdk`. * @see: https://github.com/alchemyplatform/alchemy-sdk-js diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index 4af5d9a984..445e9ebcfe 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -241,7 +241,7 @@ export class SmartAccountProvider< ); }; - sendTransactions = async ( + buildUserOperationFromTxs = ( requests: RpcTransactionRequest[], overrides?: UserOperationOverrides ) => { @@ -280,6 +280,21 @@ export class SmartAccountProvider< overrides?.maxPriorityFeePerGas ?? maxPriorityFeePerGas; } + return { + batch, + overrides, + }; + }; + + sendTransactions = async ( + requests: RpcTransactionRequest[], + overrides?: UserOperationOverrides + ) => { + const { batch, overrides: _overrides } = this.buildUserOperationFromTxs( + requests, + overrides + ); + const { hash } = await this.sendUserOperation(batch, _overrides); return await this.waitForUserOperationTransaction(hash as Hash); @@ -418,10 +433,11 @@ export class SmartAccountProvider< this.gasEstimator, // run this before paymaster middleware async (struct) => ({ ...struct, ...overrides }), - this.customMiddleware ?? noOpMiddleware, + this.customMiddleware, overrides?.paymasterAndData ? noOpMiddleware - : this.paymasterDataMiddleware + : this.paymasterDataMiddleware, + this.simulateUOMiddleware )(uo); return resolveProperties(result); @@ -522,7 +538,9 @@ export class SmartAccountProvider< return struct; }; - readonly customMiddleware?: AccountMiddlewareFn | undefined = undefined; + readonly customMiddleware: AccountMiddlewareFn = noOpMiddleware; + + readonly simulateUOMiddleware: AccountMiddlewareFn = noOpMiddleware; withPaymasterMiddleware = (overrides: { dummyPaymasterDataMiddleware?: PaymasterAndDataMiddleware; @@ -565,6 +583,12 @@ export class SmartAccountProvider< return this; }; + withSimulateUOMiddleware = (override: AccountMiddlewareFn): this => { + defineReadOnly(this, "simulateUOMiddleware", override); + + return this; + }; + connect = ( fn: ( provider: From d08e774cd75ae26f18fd0ad349081e912108861e Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Thu, 16 Nov 2023 22:02:34 -0500 Subject: [PATCH 57/79] docs: add uo sim docs (#254) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request Checklist - [ ] Did you add new tests and confirm existing tests pass? (`yarn test`) - [ ] Did you update relevant docs? (docs are found in the `site` folder, see guidleines below) - [ ] Do your commits follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? - [ ] Does your PR title also follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? - [ ] If you have a breaking change, is it [correctly reflected in your commit message](https://www.conventionalcommits.org/en/v1.0.0/#examples? (e.g. `feat!: breaking change`) - [ ] Did you run lint (`yarn lint:check`) and fix any issues? (`yarn lint:fix`) - [ ] Is the base branch you're merging into `development` and not `main`? --- ## PR-Codex overview ### Detailed summary - Added a new method `withAlchemyUserOpSimulation()` to the `AlchemyProvider` class that adds the Alchemy UserOperation Simulation middleware. - Added a new middleware method `withAlchemyUserOpSimulation()` to the `aa-alchemy` package for simulating asset changes resulting from user operation. - Added documentation for `withAlchemyUserOpSimulation()` method in the `aa-alchemy` package. - Added documentation for `simulateUserOperationAssetChanges()` method in the `aa-alchemy` package. - Added documentation for `withUOSimulationMiddleware()` method in the `aa-core` package. - Added a new guide on how to simulate a User Operation using Alchemy's Account Kit. > The following files were skipped due to too many changes: `site/guides/sim-user-operation.md` > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` --- packages/alchemy/src/provider.ts | 5 ++ site/.vitepress/config.ts | 20 +++++ site/guides/sim-user-operation.md | 55 ++++++++++++++ .../middleware/withAlchemyUserOpSimulation.md | 44 +++++++++++ .../simulateUserOperationAssetChanges.md | 75 +++++++++++++++++++ .../provider/withAlchemyGasManager.md | 2 +- .../provider/withAlchemyUserOpSimulation.md | 40 ++++++++++ .../provider/withUOSimulationMiddleware.md | 67 +++++++++++++++++ site/snippets/sim-uo-example/sim-method.ts | 20 +++++ .../snippets/sim-uo-example/sim-middleware.ts | 15 ++++ 10 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 site/guides/sim-user-operation.md create mode 100644 site/packages/aa-alchemy/middleware/withAlchemyUserOpSimulation.md create mode 100644 site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md create mode 100644 site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md create mode 100644 site/packages/aa-core/provider/withUOSimulationMiddleware.md create mode 100644 site/snippets/sim-uo-example/sim-method.ts create mode 100644 site/snippets/sim-uo-example/sim-middleware.ts diff --git a/packages/alchemy/src/provider.ts b/packages/alchemy/src/provider.ts index 3ae383f83e..1a2441331e 100644 --- a/packages/alchemy/src/provider.ts +++ b/packages/alchemy/src/provider.ts @@ -140,6 +140,11 @@ export class AlchemyProvider extends SmartAccountProvider { return withAlchemyGasManager(this, config, !this.feeOptsSet); } + /** + * This methods adds the Alchemy UserOperation Simulation middleware to the provider. + * + * @returns {AlchemyProvider} - a new AlchemyProvider with the UserOperation Simulation middleware + */ withAlchemyUserOpSimulation(): this { if (!this.isConnected()) { throw new Error( diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index b8dcd40ba1..731a655323 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -136,6 +136,10 @@ export default defineConfig({ text: "How to Transfer Ownership of a Smart Account", link: "/transferring-ownership", }, + { + text: "How to Simulate a User Operation", + link: "/sim-user-operation", + }, { text: "Smart Account Data", base: "/guides/enhanced-apis", @@ -258,6 +262,10 @@ export default defineConfig({ text: "withCustomMiddleware", link: "/withCustomMiddleware", }, + { + text: "withUOSimulationMiddleware", + link: "/withUOSimulationMiddleware", + }, { text: "connect", link: "/connect", @@ -503,10 +511,18 @@ export default defineConfig({ link: "/constructor", }, { text: "gasEstimator", link: "/gasEstimator" }, + { + text: "simulateUserOperationAssetChanges", + link: "/simulateUserOperationAssetChanges", + }, { text: "withAlchemyGasManager", link: "/withAlchemyGasManager", }, + { + text: "withAlchemyUserOpSimulation", + link: "/withAlchemyUserOpSimulation", + }, { text: "withAlchemyEnhancedApis", link: "/withAlchemyEnhancedApis", @@ -530,6 +546,10 @@ export default defineConfig({ text: "withAlchemyGasManager", link: "/withAlchemyGasManager", }, + { + text: "withAlchemyUserOpSimulation", + link: "/withAlchemyUserOpSimulation", + }, ], }, { diff --git a/site/guides/sim-user-operation.md b/site/guides/sim-user-operation.md new file mode 100644 index 0000000000..0bdad1d64f --- /dev/null +++ b/site/guides/sim-user-operation.md @@ -0,0 +1,55 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: How to Simulate a User Operation + - - meta + - name: description + content: Follow this guide to simulate a User Operation with Alchemy's Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - property: og:description + content: Follow this guide to simulate a User Operation with Alchemy's Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - name: twitter:title + content: How to Simulate a User Operation + - - meta + - name: twitter:description + content: Follow this guide to simulate a User Operation with Alchemy's Account Kit, a vertically integrated stack for building apps that support ERC-4337. +prev: + text: Smart Accounts + link: /smart-accounts/overview +--- + +# How to Simulate a User Operation + +This guide will show you how to simulate a `UserOperation` with Account Kit by adding support for `UserOperation` simulation on an `AlchemyProvider` and sending a User Operation from that provider only if simulation passes. By the end of this guide, you'll have a basic understanding of how to safely send `UserOperation`s with the `aa-sdk`. + +There are two ways that Account Kit supports `UserOperation` simulation on an `AlchemyProvider`: + +1. using the [`withAlchemyUserOpSimulation`](/packages/aa-alchemy/provider/withAlchemyUserOpSimulation) middleware +2. using the [`simulateUserOperationAssetChanges`](/packages/aa-alchemy/provider/simulateUserOperationAssetChanges) method + +## 1. Using [`withAlchemyUserOpSimulation`](/packages/aa-alchemy/provider/withAlchemyUserOpSimulation) + +To simulate User Operations, we must connect the `provider` with the middleware to simulate `UserOperations` before sending them. This can be done in a single line code, as show below! + +Then, whenever you call a method on the provider which generates the `UserOperation` to send (e.g. [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation), [`sendTransaction`](/packages/aa-core/provider/sendTransaction), [`sendTransactions`](/packages/aa-core/provider/sendTransactions), [`buildUserOperation`](/packages/aa-core/provider/buildUserOperation), or [`buildUserOperationFromTx`](/packages/aa-core/provider/buildUserOperationFromTx)), the provider will also simulate which assets change as a result of the `UserOperation`, and if simulation fails, the provider will not send the `UserOperation` unnecessarily! + +::: code-group + +<<< @/snippets/sim-uo-example/sim-middleware.ts +<<< @/snippets/provider.ts + +::: + +## 2. Using [`simulateUserOperationAssetChanges`](/packages/aa-alchemy/provider/simulateUserOperationAssetChanges) + +You can also selectively simulate `UserOperation`s by calling the [`simulateUserOperationAssetChanges`](/packages/aa-alchemy/provider/simulateUserOperationAssetChanges) method before sending a `UserOperation`. You'd be responsible for catching any errors like how it's done below, but this is a nice alternative to always running simulation. + +::: code-group + +<<< @/snippets/sim-uo-example/sim-method.ts +<<< @/snippets/provider.ts + +::: diff --git a/site/packages/aa-alchemy/middleware/withAlchemyUserOpSimulation.md b/site/packages/aa-alchemy/middleware/withAlchemyUserOpSimulation.md new file mode 100644 index 0000000000..b0228fd135 --- /dev/null +++ b/site/packages/aa-alchemy/middleware/withAlchemyUserOpSimulation.md @@ -0,0 +1,44 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Middleware • withAlchemyUserOpSimulation + - - meta + - name: description + content: Overview of the withAlchemyUserOpSimulation method in aa-alchemy + - - meta + - property: og:description + content: Overview of the withAlchemyUserOpSimulation method in aa-alchemy +next: + text: Utils +--- + +# withAlchemyUserOpSimulation + +`withAlchemyUserOpSimulation` is a middleware method you can use to easily leverage the [`alchemy_simulateUserOperationAssetChanges`](https://docs.alchemy.com/reference/alchemy-simulateuseroperationassetchanges) API to simulate asset changes resulting from user operation. Having this as part of your middleware stack will ensure `UserOperations` that fail simulation do not get sent unnecessarily. + +## Usage + +::: code-group + +```ts [example.ts] +import { provider } from "./provider"; +import { withAlchemyUserOpSimulation } from "@alchemy/aa-alchemy"; + +// use Alchemy UserOperation Simulation API to simulate asset changes resulting from user operation +const providerWithUserOpSimulation = withAlchemyUserOpSimulation(provider); +``` + +<<< @/snippets/provider.ts +::: + +## Returns + +### `AlchemyProvider` + +A new instance of an `AlchemyProvider` with the same attributes as the input, now with middleware for accessing the Alchemy `UserOperation` Simulation API to simulate asset changes resulting from UserOperations. + +## Parameters + +### `provider: AlchemyProvider` -- an `AlchemyProvider` instance diff --git a/site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md b/site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md new file mode 100644 index 0000000000..12b2f29bbb --- /dev/null +++ b/site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md @@ -0,0 +1,75 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: AlchemyProvider • simulateUserOperationAssetChanges + - - meta + - name: description + content: Overview of the simulateUserOperationAssetChanges method on Alchemy Provider in aa-alchemy + - - meta + - property: og:description + content: Overview of the simulateUserOperationAssetChanges method on Alchemy Provider in aa-alchemy +--- + +# simulateUserOperationAssetChanges + +`simulateUserOperationAssetChanges` is a method you can use to easily leverage the [`alchemy_simulateUserOperationAssetChanges`](https://docs.alchemy.com/reference/alchemy-simulateuseroperationassetchanges) API to simulate asset changes resulting from user operation. + +## Usage + +::: code-group + +```ts [example.ts] +import { provider } from "./provider"; +// [!code focus:99] + +const uoStruct: UserOperationCallData = { + target: "0xTARGET_ADDRESS", + data: "0xDATA", + value: 1n, +}; + +const uoSimResult = await provider.simulateUserOperationAssetChanges(uoStruct); + +if (uoSimResult.error) { + console.error(uoSimResult.error.message); +} + +const uo = await provider.sendUserOperation(uoStruct); +``` + +<<< @/snippets/provider.ts +::: + +## Returns + +### `Promise` + +- `changes: SimulateAssetChange[]` + - `assetType: SimulateAssetType (NATIVE, ERC20, ERC721, ERC1155, orSPECIAL_NFT)` + - `changeType: SimulateChangeType (APPROVE or TRANSFER)` + - `from: Address` + - `to: Address` + - `rawAmount?: string` + - `amount?: string` + - `contactAddress: Address` + - `tokenId?: string` + - `decimals: number` + - `symbol: string` + - `name?: string` + - `logo?: string` +- `error: SimulateAssetChangesError` + - `message: string` + +## Parameters + +### `UserOperationCallData | UserOperationCallData[]` + +- `target: Address` - the target of the call (equivalent to `to` in a transaction) +- `data: Hex` - can be either `0x` or a call data string +- `value?: bigint` - optionally, set the value in wei you want to send to the target + +### `overrides?: UserOperationOverrides` + +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-alchemy/provider/withAlchemyGasManager.md b/site/packages/aa-alchemy/provider/withAlchemyGasManager.md index d47c7fbaf8..d63c06e747 100644 --- a/site/packages/aa-alchemy/provider/withAlchemyGasManager.md +++ b/site/packages/aa-alchemy/provider/withAlchemyGasManager.md @@ -16,7 +16,7 @@ next: # withAlchemyGasManager -`withAlchemyGasManager` is a method on `AlchemyProvider` that you can optionally call to create a new provider instance with added middleware leveraging the Alchemy Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster). Under the hood, this will call the [`withAlchemyGasManager`](/packages/aa-alchemy/middleware/withAlchemyGasManager.ts). +`withAlchemyGasManager` is a method on `AlchemyProvider` that you can optionally call to create a new provider instance with added middleware leveraging the Alchemy Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster). Under the hood, this will call the [`withAlchemyGasManager`](/packages/aa-alchemy/middleware/withAlchemyGasManager) middleware. ## Usage diff --git a/site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md b/site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md new file mode 100644 index 0000000000..1deb4d208f --- /dev/null +++ b/site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md @@ -0,0 +1,40 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: AlchemyProvider • withAlchemyUserOpSimulation + - - meta + - name: description + content: Overview of the withAlchemyUserOpSimulation method on Alchemy Provider in aa-alchemy + - - meta + - property: og:description + content: Overview of the withAlchemyUserOpSimulation method on Alchemy Provider in aa-alchemy +next: + text: Middleware +--- + +# withAlchemyUserOpSimulation + +`withAlchemyUserOpSimulation` is a method on `AlchemyProvider` that you can optionally call to create a new provider instance with added middleware leveraging the Alchemy `UserOperation` Simulation API. Under the hood, this will call the [`withAlchemyUserOpSimulation`](/packages/aa-alchemy/middleware/withAlchemyUserOpSimulation) middleware to simulate asset changes resulting from user operation. + +## Usage + +::: code-group + +```ts [example.ts] +import { provider } from "./provider"; +// [!code focus:99] + +// use Alchemy UserOperation Simulation API to simulate simulate asset changes resulting from user operation before sending +const providerWithGasManager = provider.withAlchemyUserOpSimulation(); +``` + +<<< @/snippets/provider.ts +::: + +## Returns + +### `AlchemyProvider` + +A new instance of an `AlchemyProvider` with the same attributes as the input, now with middleware for accessing the Alchemy `UserOperation` Simulation API to simulate asset changes resulting from user operation. diff --git a/site/packages/aa-core/provider/withUOSimulationMiddleware.md b/site/packages/aa-core/provider/withUOSimulationMiddleware.md new file mode 100644 index 0000000000..7f0f2fc848 --- /dev/null +++ b/site/packages/aa-core/provider/withUOSimulationMiddleware.md @@ -0,0 +1,67 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: ISmartAccountProvider • withUOSimulationMiddleware + - - meta + - name: description + content: Overview of the withUOSimulationMiddleware method and accessing the simulateUOMiddleware readonly field on ISmartAccountProvider + - - meta + - property: og:description + content: Overview of the withUOSimulationMiddleware method and accessing the simulateUOMiddleware readonly field on ISmartAccountProvider +--- + +# withUOSimulationMiddleware + +Adds a function to the end of the middleware call stack to simulate the constructed `UserOperation`. It can be used to override or add additional functionality, but the typical use case would be to simulate the `uoStruct` and throwing an error if the method for simulation fails, or just pass-through the chained `uoStruct` if simulation passes. + +## Usage + +::: code-group + +```ts [example.ts] +import { provider } from "./provider"; + +// Define the simulation middleware override function // [!code focus:99] +const SimulateUOMiddlewareOverrideFunction = async (uoStruct) => { + try { + const uoSimResult = await someMethodSimulatingTheUserOperation(); + } catch (e) { + throw new Error(e); + } + + return uoStruct; +}; + +// Add the custom middleware +provider.withUOSimulationMiddleware(SimulateUOMiddlewareOverrideFunction); + +// function to call buildUserOperation which will simulate the user operation +const resultingUO = await provider.buildUserOperation(userOpData); +``` + +<<< @/snippets/provider.ts +::: + +## Returns + +### `ISmartAccountProvider` + +An updated instance of the provider, which now uses the simulation middleware. + +## Parameters + +### `override: AccountMiddlewareFn` + +The User Operation (UO) transform function that will run as the simulation middleware. + +## `simulateUOMiddleware` + +The `simulateUOMiddleware` is a readonly field that represents the final middleware step in the stack. It allows overriding any of the results returned by previous middlewares, but the typical use case would be to simulate the `uoStruct` and throwing an error if the method for simulation fails, and just pass-through the chained `uoStruct` if simulation passes. + +You can access the current `simulateUOMiddleware` configuration for the provider via: + +```ts +const currentMiddleware = provider.simulateUOMiddleware; +``` diff --git a/site/snippets/sim-uo-example/sim-method.ts b/site/snippets/sim-uo-example/sim-method.ts new file mode 100644 index 0000000000..9e43bc7567 --- /dev/null +++ b/site/snippets/sim-uo-example/sim-method.ts @@ -0,0 +1,20 @@ +import { UserOperationCallData } from "@alchemy/aa-core"; +import { provider } from "../provider.js"; + +const uoStruct: UserOperationCallData = { + target: "0xTARGET_ADDRESS", + data: "0xDATA", + value: 1n, +}; + +const uoSimResult = await provider.simulateUserOperationAssetChanges(uoStruct); + +if (uoSimResult.error) { + console.error(uoSimResult.error.message); +} + +const uo = await provider.sendUserOperation(uoStruct); + +const txHash = await provider.waitForUserOperationTransaction(uo.hash); + +console.log(txHash); diff --git a/site/snippets/sim-uo-example/sim-middleware.ts b/site/snippets/sim-uo-example/sim-middleware.ts new file mode 100644 index 0000000000..579ddb799d --- /dev/null +++ b/site/snippets/sim-uo-example/sim-middleware.ts @@ -0,0 +1,15 @@ +import { provider } from "../provider.js"; + +const providerWithSimulation = provider.withAlchemyUserOpSimulation(); + +const uo = await providerWithSimulation.sendUserOperation({ + target: "0xTARGET_ADDRESS", + data: "0xDATA", + value: 1n, +}); + +const txHash = await providerWithSimulation.waitForUserOperationTransaction( + uo.hash +); + +console.log(txHash); From 013c108375380502e557ade15fbbbfea5dead7e6 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Thu, 16 Nov 2023 22:05:29 -0500 Subject: [PATCH 58/79] chore: clean up site markdown layout (#255) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request Checklist - [x] Did you add new tests and confirm existing tests pass? (`yarn test`) - [x] Did you update relevant docs? (docs are found in the `site` folder, see guidleines below) - [x] Do your commits follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? - [x] Does your PR title also follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? - [x] If you have a breaking change, is it [correctly reflected in your commit message](https://www.conventionalcommits.org/en/v1.0.0/#examples? (e.g. `feat!: breaking change`) - [x] Did you run lint (`yarn lint:check`) and fix any issues? (`yarn lint:fix`) - [x] Is the base branch you're merging into `development` and not `main`? --- ## PR-Codex overview ### Detailed summary - Updated URLs in various files to reflect changes in the site structure - Replaced occurrences of "/getting-started" with "/overview/getting-started" - Updated links and references to the "Getting Started" page - Updated links and references to the "Packages Overview" page - Updated links and references to the "Why Account Kit" page - Updated links and references to the "Introduction" page > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` --- README.md | 2 +- site/.vitepress/config.ts | 3 ++- site/guides/sponsoring-gas/sponsoring-gas.md | 2 +- site/index.md | 8 ++++---- site/{ => overview}/demos.md | 0 site/{ => overview}/getting-started.md | 2 +- site/{ => overview}/introduction.md | 6 +++--- site/{ => overview}/package-overview.md | 0 site/{ => overview}/why-account-kit.md | 2 +- site/packages/aa-accounts/index.md | 2 +- site/packages/aa-alchemy/index.md | 2 +- site/packages/aa-ethers/index.md | 2 +- 12 files changed, 16 insertions(+), 15 deletions(-) rename site/{ => overview}/demos.md (100%) rename site/{ => overview}/getting-started.md (96%) rename site/{ => overview}/introduction.md (92%) rename site/{ => overview}/package-overview.md (100%) rename site/{ => overview}/why-account-kit.md (99%) diff --git a/README.md b/README.md index 456628a09f..48887e7671 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The `aa-sdk` is modular at every layer of the stack and can be easily extended t yarn add @alchemy/aa-accounts @alchemy/aa-core ``` -### [Light Account Example](https://accountkit.alchemy.com/getting-started#a-simple-light-account-example) +### [Light Account Example](https://accountkit.alchemy.com/overview/getting-started#a-simple-light-account-example) ## Docs diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index 731a655323..f24b9f6164 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -10,7 +10,7 @@ export default defineConfig({ logo: "/kit-logo.svg", // https://vitepress.dev/reference/default-theme-config nav: [ - { text: "Docs", link: "/getting-started" }, + { text: "Docs", link: "/overview/getting-started" }, { text: "Examples", link: "https://github.com/alchemyplatform/aa-sdk/tree/main/examples", @@ -42,6 +42,7 @@ export default defineConfig({ sidebar: [ { text: "Overview", + base: "/overview", items: [ { text: "Why Account Kit", link: "/why-account-kit" }, { text: "Introduction", link: "/introduction" }, diff --git a/site/guides/sponsoring-gas/sponsoring-gas.md b/site/guides/sponsoring-gas/sponsoring-gas.md index eb22b60e28..c7956b29ec 100644 --- a/site/guides/sponsoring-gas/sponsoring-gas.md +++ b/site/guides/sponsoring-gas/sponsoring-gas.md @@ -24,7 +24,7 @@ Gas fees are a significant barrier to entry for new user of your app. With Accou ## How to Sponsor Gas -After [installing `aa-sdk`](/getting-started#install-the-packages) in your project, follow these steps to sponsor gas. +After [installing `aa-sdk`](/overview/getting-started#install-the-packages) in your project, follow these steps to sponsor gas. ### 1. Set Up the Provider diff --git a/site/index.md b/site/index.md index 557003a6e0..cc22001d68 100644 --- a/site/index.md +++ b/site/index.md @@ -55,14 +55,14 @@ titleTemplate: :title Documentation Account Kit is a vertically integrated stack for building apps that support ERC-4337: smart accounts, signer integrations, sponsoring gas, bundlers, and an SDK.

- +
diff --git a/site/demos.md b/site/overview/demos.md similarity index 100% rename from site/demos.md rename to site/overview/demos.md diff --git a/site/getting-started.md b/site/overview/getting-started.md similarity index 96% rename from site/getting-started.md rename to site/overview/getting-started.md index 642135fd6a..237ee6a140 100644 --- a/site/getting-started.md +++ b/site/overview/getting-started.md @@ -60,7 +60,7 @@ Remember to: ## Dive Deeper -In this guide we initialized `provider` with the `aa-alchemy` package however we could have done the same with the other packages of Account Kit as well. To learn more about the different packages and their use cases, check out the ["Packages Overview"](/package-overview) page. +In this guide we initialized `provider` with the `aa-alchemy` package however we could have done the same with the other packages of Account Kit as well. To learn more about the different packages and their use cases, check out the ["Packages Overview"](/overview/package-overview) page. ## Next Steps diff --git a/site/introduction.md b/site/overview/introduction.md similarity index 92% rename from site/introduction.md rename to site/overview/introduction.md index f7eaa0a381..8ff96a95e1 100644 --- a/site/introduction.md +++ b/site/overview/introduction.md @@ -20,7 +20,7 @@ head: # What is Account Kit? -**Account Kit** is a framework to embed smart accounts in your web3 app, unlocking [powerful features](/getting-started) like email/social login, gas sponsorship, batched transactions, and more. The `aa-sdk` makes it easy to integrate and deploy smart accounts, send user operations, and sponsor gas with just a few lines of code. +**Account Kit** is a framework to embed smart accounts in your web3 app, unlocking [powerful features](/overview/getting-started) like email/social login, gas sponsorship, batched transactions, and more. The `aa-sdk` makes it easy to integrate and deploy smart accounts, send user operations, and sponsor gas with just a few lines of code. ## What is included in the Account Kit stack? @@ -44,7 +44,7 @@ The SDK also implements an EIP-1193 provider interface to easily plug into any p The `aa-sdk` is modular at every layer of the stack and can be easily extended to fit your custom needs. You can plug in any [smart account](/smart-accounts/accounts/using-your-own) implementation, [Signer](/smart-accounts/signers/choosing-a-signer), gas manager API, RPC provider. -Get started with `aa-sdk` in our [Getting Started guide](/getting-started) or checkout the [open source repo](https://github.com/alchemyplatform/aa-sdk). +Get started with `aa-sdk` in our [Getting Started guide](/overview/getting-started) or checkout the [open source repo](https://github.com/alchemyplatform/aa-sdk). ### LightAccount @@ -84,4 +84,4 @@ Check out the open source code in our affectionately named [Rundler github repo] ## Start building with Account Kit -Account Kit was designed from the ground up to make account abstraction easy. It’s built on top of industry-leading infrastructure that powers applications at massive scale from Opensea to Shopify. Start integrating Account Kit today in the [Getting Started guide](/getting-started). +Account Kit was designed from the ground up to make account abstraction easy. It’s built on top of industry-leading infrastructure that powers applications at massive scale from Opensea to Shopify. Start integrating Account Kit today in the [Getting Started guide](/overview/getting-started). diff --git a/site/package-overview.md b/site/overview/package-overview.md similarity index 100% rename from site/package-overview.md rename to site/overview/package-overview.md diff --git a/site/why-account-kit.md b/site/overview/why-account-kit.md similarity index 99% rename from site/why-account-kit.md rename to site/overview/why-account-kit.md index 791c77c9d3..189f84a26a 100644 --- a/site/why-account-kit.md +++ b/site/overview/why-account-kit.md @@ -107,4 +107,4 @@ We built Account Kit from the ground up to be reliable, scalable, and developer- We have years of experience as the leading web3 developer platform powering customers from Opensea to Shopify, and brought all that expertise to bear in Account Kit. -Get started with Account Kit on the next page: [Getting Started](/getting-started). +Get started with Account Kit on the next page: [Getting Started](/overview/getting-started). diff --git a/site/packages/aa-accounts/index.md b/site/packages/aa-accounts/index.md index fbb5c0b7c8..26170f3a7d 100644 --- a/site/packages/aa-accounts/index.md +++ b/site/packages/aa-accounts/index.md @@ -23,7 +23,7 @@ This package contains various implementations of the `BaseSmartContractAccount` ## Getting started -If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the accounts. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](/getting-started) docs to get started. +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the accounts. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](/overview/getting-started) docs to get started. ::: code-group diff --git a/site/packages/aa-alchemy/index.md b/site/packages/aa-alchemy/index.md index 9452a90fb0..863d84a776 100644 --- a/site/packages/aa-alchemy/index.md +++ b/site/packages/aa-alchemy/index.md @@ -23,7 +23,7 @@ This package contains `AlchemyProvider`, an implementation of `SmartAccountProvi ## Getting started -If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the `AlchemyProvider`. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](/getting-started) docs to get started. +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the `AlchemyProvider`. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](/overview/getting-started) docs to get started. ::: code-group diff --git a/site/packages/aa-ethers/index.md b/site/packages/aa-ethers/index.md index 1eab23022c..e889b8ceab 100644 --- a/site/packages/aa-ethers/index.md +++ b/site/packages/aa-ethers/index.md @@ -27,7 +27,7 @@ This repo is community maintained and we welcome contributions! ## Getting started -If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the `EthersProviderAdapter` and `AccountSigner`. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](/getting-started) docs to get started. +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the `EthersProviderAdapter` and `AccountSigner`. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](/overview/getting-started) docs to get started. ::: code-group From db8a64fef4198e24826614d20775c48b7a8d5878 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Fri, 17 Nov 2023 02:00:34 -0500 Subject: [PATCH 59/79] docs: re-write getting started doc (#256) --- .../src/middleware/types/simulate-uo/index.ts | 1 - site/overview/getting-started.md | 160 ++++++++++++++++-- site/public/images/alchemy-dashboard.png | Bin 0 -> 258798 bytes site/public/images/alchemy-faucet.png | Bin 0 -> 1062411 bytes site/snippets/getting-started/provider.ts | 34 ++++ .../getting-started/send-user-operation.ts | 51 ++++++ site/snippets/light-account.ts | 45 ++--- site/snippets/provider.ts | 14 +- site/snippets/web3auth.ts | 4 + 9 files changed, 262 insertions(+), 47 deletions(-) create mode 100644 site/public/images/alchemy-dashboard.png create mode 100644 site/public/images/alchemy-faucet.png create mode 100644 site/snippets/getting-started/provider.ts create mode 100644 site/snippets/getting-started/send-user-operation.ts diff --git a/packages/alchemy/src/middleware/types/simulate-uo/index.ts b/packages/alchemy/src/middleware/types/simulate-uo/index.ts index 9fe9dca33f..59c91314cb 100644 --- a/packages/alchemy/src/middleware/types/simulate-uo/index.ts +++ b/packages/alchemy/src/middleware/types/simulate-uo/index.ts @@ -13,6 +13,5 @@ export type SimulateUserOperationAssetChangesRequest = [ export type SimulateUserOperationAssetChangesResponse = { changes: SimulateAssetChange[]; - gasUsed?: string; error?: SimulateAssetChangesError; }; diff --git a/site/overview/getting-started.md b/site/overview/getting-started.md index 237ee6a140..bbf17b4912 100644 --- a/site/overview/getting-started.md +++ b/site/overview/getting-started.md @@ -20,48 +20,172 @@ head: # Getting Started -This guide will help you get started with Account Kit by setting up your environment, creating a Light Account (a type of smart account implementation), and sending a User Operation from it. By the end of this guide, you'll have a basic understanding of how to use the SDK and where to look for more advanced use cases. +This guide will help you get started with Account Kit by setting up your environment, creating a smart account, and sending a `UserOperation` on its behalf. By the end of this guide, you'll have a basic understanding of how to use the SDK and where to look for more advanced use cases. -## Install the Packages +## 1. Install the Packages -In your project directory, you'll need to install the required packages: +In your project directory, you'll need to run the following to install the required packages: ::: code-group ```bash [npm] +npm init -y +npm install -save-dev typescript npm install @alchemy/aa-alchemy @alchemy/aa-accounts @alchemy/aa-core viem ``` ```bash [yarn] +yarn init -y +yarn add -D typescript yarn add @alchemy/aa-alchemy @alchemy/aa-accounts @alchemy/aa-core viem ``` -Note that we're installing [viem](https://viem.sh/) as well. Viem contains helpful abstractions and modules that may come in handy when using Account Kit. Additionally, many Account Kit modules leverage viem themselves. +::: tip Note + +We're installing [viem](https://viem.sh/) as well. Viem contains helpful abstractions and modules that will come in handy when using Account Kit. Additionally, many Account Kit modules use `viem` themselves. ::: -## A Simple Light Account Example +Make sure your new `package.json` file and `tsconfig.json` files look like the following. Note that we added `"type": module` in `package.json` for this example: -Using the SDK, we'll deploy a Light Account and send a User Operation from it. The Light Account will be owned by an Externally Owned Account (EOA). Here's a demonstration: +::: code-group -<<< @/snippets/light-account.ts +```json [package.json] +{ + "name": "account-kit-test", + "version": "1.0.0", + "description": "An Example Using Account Kit", + "main": "index.ts", + "type": "module", + "license": "ISC", + "devDependencies": { + "typescript": "^5.2.2" + }, + "dependencies": { + "@alchemy/aa-accounts": "^1.1.0", + "@alchemy/aa-alchemy": "^1.1.0", + "@alchemy/aa-core": "^1.1.0", + "viem": "^1.19.3" + } +} +``` -This initializes a `provider` for your smart account which is then used to send user operations from it. It also logs the address of the deployed smart account. +```json [tsconfig.json] +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "node", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + } +} +``` -::: tip Note -Remember to: +::: + +You'll also want to make sure your `Node` version is _18.10.0_ using your version manager: + +::: code-group + +```bash [nvm] +nvm install 18.10.0 +nvm use 18.10.0 +``` + +```bash [asdf] +asdf install nodejs 18.10.0 +asdf global nodejs 18.10.0 +asdf reshim nodejs +``` -1. Replace `"0xYourEOAPrivateKey"` with your actual EOA private key. -2. Set `"ALCHEMY_API_KEY"` with your unique Alchemy API key. -3. Fund your smart account address with some SepoliaETH in order for the user operation to go through. This address is logged to the console when you run the script. -4. Adjust the `target` and `data` fields in the `sendUserOperation` function to match your requirements. +Lastly, create a file called `index.ts` in the project to write the code you'll see below! ::: -## Dive Deeper +## 2. Get Your Alchemy API Key + +To read or write any data to a blockchain, you'll need an Alchemy API Key and RPC URL. Go to the [Alchemy Dashboard](https://dashboard.alchemy.com) and access your credentials from the button shown below. + +Account Kit Overview + +## 2. Query Your Smart Account Address + +Using the SDK in the following example, we'll use the Account Kit to generate the address of your smart account from which to eventually send a `UserOperation`. + +<<< @/snippets/getting-started/provider.ts + +Copy the above into `index.ts`. To run the script, do: + +```bash +npx tsx index.ts +``` + +You'll get a response like this on your terminal: + +``` +Smart Account Address: 0xYOUR_SMART_ACCOUNT_ADDRESS +``` + +## 3. Fund Your Smart Account + +To deploy the smart account and send `UserOperation`s on its behalf, you'll need to add native token to your smart account. + +At scale, you might consider using our Gas Manager to [sponsor UserOperations](/guides/sponsoring-gas/sponsoring-gas) for smart accounts. But for the purpose of this example, and because we're using a testnet, let's fund the account using the [Alchemy Faucet](https://sepoliafaucet.com). Make sure to log in with Alchemy to receive your testnet tokens. + +Account Kit Overview + +## 4. Send a User Operation Using Account Kit + +Finally, let's deploy the newly funded smart account and send a `UserOperation` on its behalf. + +<<< @/snippets/getting-started/send-user-operation.ts + +Copy the above to replace what's in `index.ts`. To run the full example script above, do: + +```bash +npx tsx index.ts +``` + +And that's it! You should see the following on your terminal: + +``` +Smart Account Address: 0xYOUR_SMART_ACCOUNT_ADDRESS +UserOperation Hash: 0xYOUR_UO_HASH +Transaction Hash: 0xYOUR_TXN_HASH +``` + +:::tip Note +The `UserOperation` Hash is what our [Bundler](https://github.com/alchemyplatform/rundler) returns once it submits the `UserOperation` to the Blockchain on behalf of your smart account. + +To know when the `UserOperation` is mined on a blockchain in order query information about it, you'll want to use the `Transaction Hash`. +::: + +:::tip Handling Errors +When running the above script, you might see the following errors: + +1. "precheck failed: maxFeePerGas is XXX but must be at least XXX, which is based on the current block base fee" +2. "Failed to find transaction for User Operation" + +These are due to increase network activity at that time, and are fleeting issues. Running the script again will resolve them naturally. +::: + +Since this "Getting Started" example is a simple script, you'll need to consider how Account Kit can work in various applications. Check out our [Demos](/overview/demos) to see how. + +## 5. Dive Deeper + +In this guide, we initialized an `AlchemyProvider` with the `aa-alchemy` package to send a `UserOperation`. However, you can do a lot more with Account Kit and its many packages. + +1. To learn more about the different packages and their use cases, check out the ["Packages Overview"](/overview/package-overview) page. + +2. To learn about the end-to-end process of integrating smart accounts in your applications, check out the section on [Smart Accounts](/smart-accounts/overview). + +3. To learn about the `owner` field on your smart account, check out the section on [Choosing a Signer](/smart-accounts/signers/choosing-a-signer) to own the smart account. -In this guide we initialized `provider` with the `aa-alchemy` package however we could have done the same with the other packages of Account Kit as well. To learn more about the different packages and their use cases, check out the ["Packages Overview"](/overview/package-overview) page. +4. To learn more about different User Operations you can send with different `target` and `data` fields in the `sendUserOperation` function above, look at our [How to Send a User Operation](/guides/send-user-operation) guide for an example using NFT mints. -## Next Steps +5. To explore more ways to use Account Kit, check out the many step-by-step guides, such as [How to Sponsor Gas for a User Operation](/guides/sponsoring-gas/sponsoring-gas) or [How to Fetch Smart Account Data](/guides/enhanced-apis/nft). -To learn about the end-to-end process of integrating smart accounts in your applications check out the section on [smart accounts overview](/smart-accounts/overview.html) +6. To see Account Kit in action, check out our [Demos](/overview/demos). diff --git a/site/public/images/alchemy-dashboard.png b/site/public/images/alchemy-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..88a24ce719d2b93be32078f0ddaabc1a59987dcf GIT binary patch literal 258798 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�%F&#dHua~4dvi!fOeA5%l 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

Dmq(C_Dzj3J&FIMjR0quJaFMGIQ))I64O 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

%p!!)2dEoaY#OT`!NqXJG%PRKQQTAQ9NkXkp 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≈UI!~Ha-Trapa~nYz&Fxcm#9upF6jC$zj_g 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 literal 0 HcmV?d00001 diff --git a/site/public/images/alchemy-faucet.png b/site/public/images/alchemy-faucet.png new file mode 100644 index 0000000000000000000000000000000000000000..f8c1ba38dd449968c83c4ea8e02336113d0da245 GIT binary patch literal 1062411 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�v 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

hsShK% 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≪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ƺFe&@nyZg)abA1>SUG#L`q?i&lEK_6Pq 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

VB;*dGBne_QAi*Ve}K)d9KEv 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%0A*;*^24kBocb^&y_;%^)qp5R8Vk0f+&PY_XQ? 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

emx8v7YkN8Ec&(Ay=a=O> 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

dtF)?% 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 + new LightSmartContractAccount({ + rpcClient, + owner, + chain, + factoryAddress: getDefaultLightAccountFactoryAddress(chain), + }) +); + +(async () => { + // Fund your account address with ETH to send for the user operations + // (e.g. Get Sepolia ETH at https://sepoliafaucet.com) + console.log("Smart Account Address: ", await provider.getAddress()); // Log the smart account address +})(); diff --git a/site/snippets/getting-started/send-user-operation.ts b/site/snippets/getting-started/send-user-operation.ts new file mode 100644 index 0000000000..838dec49fa --- /dev/null +++ b/site/snippets/getting-started/send-user-operation.ts @@ -0,0 +1,51 @@ +import { + LightSmartContractAccount, + getDefaultLightAccountFactoryAddress, +} from "@alchemy/aa-accounts"; +import { AlchemyProvider } from "@alchemy/aa-alchemy"; +import { Address, LocalAccountSigner, type Hex } from "@alchemy/aa-core"; +import { polygonMumbai } from "viem/chains"; + +const chain = polygonMumbai; + +// The private key of your EOA that will be the owner of Light Account +const PRIVATE_KEY = "0xYourEOAPrivateKey" as Hex; +const owner = LocalAccountSigner.privateKeyToAccountSigner(PRIVATE_KEY); + +// Create a provider to send user operations from your smart account +const provider = new AlchemyProvider({ + // get your Alchemy API key at https://dashboard.alchemy.com + apiKey: "ALCHEMY_API_KEY", + chain, +}).connect( + (rpcClient) => + new LightSmartContractAccount({ + rpcClient, + owner, + chain, + factoryAddress: getDefaultLightAccountFactoryAddress(chain), + }) +); + +// [!code focus:22] +(async () => { + // Fund your account address with ETH to send for the user operations + // (e.g. Get Sepolia ETH at https://sepoliafaucet.com) + console.log("Smart Account Address: ", await provider.getAddress()); // Log the smart account address + + const vitalikAddress = + "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" as Address; + // Send a user operation from your smart account to Vitalik that does nothing + const { hash: uoHash } = await provider.sendUserOperation({ + target: vitalikAddress, // The desired target contract address + data: "0x", // The desired call data + value: 0n, // (Optional) value to send the target contract address + }); + + console.log("UserOperation Hash: ", uoHash); // Log the user operation hash + + // Wait for the user operation to be mined + const txHash = await provider.waitForUserOperationTransaction(uoHash); + + console.log("Transaction Hash: ", txHash); // Log the transaction hash +})(); diff --git a/site/snippets/light-account.ts b/site/snippets/light-account.ts index b1d4bb6c25..d69986fa07 100644 --- a/site/snippets/light-account.ts +++ b/site/snippets/light-account.ts @@ -1,43 +1,46 @@ -// importing required dependencies import { LightSmartContractAccount, getDefaultLightAccountFactoryAddress, } from "@alchemy/aa-accounts"; import { AlchemyProvider } from "@alchemy/aa-alchemy"; -import { LocalAccountSigner, type SmartAccountSigner } from "@alchemy/aa-core"; +import { LocalAccountSigner, type Hex } from "@alchemy/aa-core"; import { sepolia } from "viem/chains"; const chain = sepolia; -const PRIVATE_KEY = "0xYourEOAPrivateKey"; // Replace with the private key of your EOA that will be the owner of Light Account -const eoaSigner: SmartAccountSigner = - LocalAccountSigner.privateKeyToAccountSigner(PRIVATE_KEY); // Create a signer for your EOA +// The private key of your EOA that will be the owner of Light Account +const PRIVATE_KEY = "0xYourEOAPrivateKey" as Hex; +const owner = LocalAccountSigner.privateKeyToAccountSigner(PRIVATE_KEY); -// Default address for Light Account on Sepolia, you can replace it with your own. -const factoryAddress = getDefaultLightAccountFactoryAddress(chain); - -// Create a provider with your EOA as the smart account owner, this provider is used to send user operations from your smart account and interact with the blockchain +// Create a provider to send user operations from your smart account const provider = new AlchemyProvider({ - apiKey: "ALCHEMY_API_KEY", // Replace with your Alchemy API key, you can get one at https://dashboard.alchemy.com/ + // get your Alchemy API key at https://dashboard.alchemy.com + apiKey: "ALCHEMY_API_KEY", chain, }).connect( (rpcClient) => new LightSmartContractAccount({ - chain, - owner: eoaSigner, - factoryAddress, rpcClient, + owner, + chain, + factoryAddress: getDefaultLightAccountFactoryAddress(chain), }) ); -// Logging the smart account address -- please fund this address with some SepoliaETH in order for the user operations to be executed successfully -provider.getAddress().then((address: string) => console.log(address)); +// Fund your account address with ETH to send for the user operations +// (e.g. Get Sepolia ETH at https://sepoliafaucet.com) +console.log(await provider.getAddress()); // Log the smart account address -// Send a user operation from your smart contract account -const { hash } = await provider.sendUserOperation({ - target: "0xTargetAddress", // Replace with the desired target address - data: "0xCallData", // Replace with the desired call data - value: 0n, // value: bigint or undefined +// Send a user operation from your smart account +const { hash: uoHash } = await provider.sendUserOperation({ + target: "0xTargetAddress", // The desired target contract address + data: "0xCallData", // The desired call data + value: 0n, // (Optional) value to send the target contract address }); -console.log(hash); // Log the user operation hash +console.log(uoHash); // Log the user operation hash + +// Wait for the user operation to be mined +const txHash = await provider.waitForUserOperationTransaction(uoHash); + +console.log(txHash); // Log the transaction hash diff --git a/site/snippets/provider.ts b/site/snippets/provider.ts index 3e79a57318..0259382116 100644 --- a/site/snippets/provider.ts +++ b/site/snippets/provider.ts @@ -3,23 +3,23 @@ import { getDefaultLightAccountFactoryAddress, } from "@alchemy/aa-accounts"; import { AlchemyProvider } from "@alchemy/aa-alchemy"; -import { LocalAccountSigner, type SmartAccountSigner } from "@alchemy/aa-core"; +import { LocalAccountSigner, type Hex } from "@alchemy/aa-core"; import { sepolia } from "viem/chains"; const chain = sepolia; -const PRIVATE_KEY = "0xYourEOAPrivateKey"; -const eoaSigner: SmartAccountSigner = - LocalAccountSigner.privateKeyToAccountSigner(`0x${PRIVATE_KEY}`); +const PRIVATE_KEY = "0xYourEOAPrivateKey" as Hex; +const owner = LocalAccountSigner.privateKeyToAccountSigner(PRIVATE_KEY); export const provider = new AlchemyProvider({ - apiKey: "ALCHEMY_API_KEY", // replace with your alchemy api key of the Alchemy app associated with the Gas Manager, get yours at https://dashboard.alchemy.com/ + // get your Alchemy API key at https://dashboard.alchemy.com + apiKey: "ALCHEMY_API_KEY", chain, }).connect( (rpcClient) => new LightSmartContractAccount({ + rpcClient, + owner, chain, - owner: eoaSigner, factoryAddress: getDefaultLightAccountFactoryAddress(chain), - rpcClient, }) ); diff --git a/site/snippets/web3auth.ts b/site/snippets/web3auth.ts index c5070bb94a..007208c272 100644 --- a/site/snippets/web3auth.ts +++ b/site/snippets/web3auth.ts @@ -11,6 +11,10 @@ await web3auth.initModal(); await web3auth.connect(); +if (web3auth.provider == null) { + throw new Error("web3auth provider is available"); +} + // a viem wallet client that wraps web3auth for utility methods // NOTE: this isn't necessary since you can just use the `web3auth.rpcProvider` // directly, but this makes things much easier From d76db68f3fcf3a60ea702a4e89ec884e04db1d0b Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Fri, 17 Nov 2023 11:53:59 -0500 Subject: [PATCH 60/79] docs: dynamic.xyz guide updates (#266) Co-authored-by: Matthew Foyle --- site/smart-accounts/signers/dynamic.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 4487871ac8..679b1dec20 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -24,18 +24,18 @@ head: ### Install the sdk -By default, the latest version of the Dynamic SDK ships with Viem. If you need to use Ethers, please refer to [this guide](https://docs.dynamic.xyz/quickstart) (make sure to choose v19 in the docs version toggle on the top left). +By default, the latest version of the Dynamic SDK ships with Viem. If you need to use Ethers, please refer to [this guide](https://docs.dynamic.xyz/react-sdk/viem-ethers#using-ethers) -In this example, we are installing only the Ethereum connectors in order to keep bundle size light. If you need any others, you can [find the references here](https://docs.dynamic.xyz/quickstart#choosing-the-right-packages) (make sure to choose v19 in the docs version toggle on the top left). +In this example, we are installing only the Ethereum connectors in order to keep bundle size light. If you need any others, you can [find the references here](https://docs.dynamic.xyz/react-sdk/components/dynamiccontextprovider#walletconnectors) ::: code-group ```bash [npm] -npm i -s @dynamic-labs/sdk-react-core@alpha @dynamic-labs/ethereum-all +npm i -s @dynamic-labs/sdk-react-core @dynamic-labs/ethereum ``` ```bash [yarn] -yarn add @dynamic-labs/sdk-react-core@alpha @dynamic-labs/ethereum-all +yarn add @dynamic-labs/sdk-react-core @dynamic-labs/ethereum ``` ::: @@ -46,7 +46,7 @@ In order to use Dynamic, you should wrap your app with `DynamicContextProvider` ```jsx import { DynamicContextProvider } from "@dynamic-labs/sdk-react-core"; -import { EthereumWalletConnectors } from "@dynamic-labs/ethereum-all"; +import { EthereumWalletConnectors } from "@dynamic-labs/ethereum"; import Home from "./Home"; // Found in your Dynamic dashboard (https://app.dynamic.xyz/dashboard/developer) @@ -57,7 +57,7 @@ const App = () => {

From 37accee5840085d509b91ff4a2c53081d2945019 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:56:09 -0500 Subject: [PATCH 61/79] feat: make alchemy-sdk an optional dependency on aa-alchemy (#265) --- packages/alchemy/package.json | 4 ++-- packages/alchemy/src/provider.ts | 2 +- packages/ethers/package.json | 2 +- site/overview/getting-started.md | 22 ++----------------- .../provider/withAlchemyEnhancedApis.md | 2 +- yarn.lock | 8 +++---- 6 files changed, 11 insertions(+), 29 deletions(-) diff --git a/packages/alchemy/package.json b/packages/alchemy/package.json index 2ce551b6e4..16eddf886e 100644 --- a/packages/alchemy/package.json +++ b/packages/alchemy/package.json @@ -61,7 +61,7 @@ }, "homepage": "https://github.com/alchemyplatform/aa-sdk#readme", "gitHead": "ee46e8bb857de3b631044fa70714ea706d9e317d", - "peerDependencies": { - "alchemy-sdk": "^2.10.1" + "optionalDependencies": { + "alchemy-sdk": "^3.0.0" } } diff --git a/packages/alchemy/src/provider.ts b/packages/alchemy/src/provider.ts index 1a2441331e..810cda4e65 100644 --- a/packages/alchemy/src/provider.ts +++ b/packages/alchemy/src/provider.ts @@ -156,7 +156,7 @@ export class AlchemyProvider extends SmartAccountProvider { } /** - * This methods adds Alchemy Enhanced APIs to the provider, via a peer dependency on `alchemy-sdk`. + * This methods adds Alchemy Enhanced APIs to the provider, via an optional dependency on `alchemy-sdk`. * @see: https://github.com/alchemyplatform/alchemy-sdk-js * * The Alchemy SDK client must be configured with the same API key and network as the AlchemyProvider. diff --git a/packages/ethers/package.json b/packages/ethers/package.json index 694678c4fb..bcf7f5997c 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -42,7 +42,7 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "alchemy-sdk": "^2.8.3", + "alchemy-sdk": "^3.0.0", "dotenv": "^16.0.3", "typescript": "^5.0.4", "typescript-template": "*", diff --git a/site/overview/getting-started.md b/site/overview/getting-started.md index bbf17b4912..22fd3c7230 100644 --- a/site/overview/getting-started.md +++ b/site/overview/getting-started.md @@ -29,7 +29,7 @@ In your project directory, you'll need to run the following to install the requi ::: code-group ```bash [npm] -npm init -y +npm init es6 -y npm install -save-dev typescript npm install @alchemy/aa-alchemy @alchemy/aa-accounts @alchemy/aa-core viem ``` @@ -46,9 +46,7 @@ We're installing [viem](https://viem.sh/) as well. Viem contains helpful abstrac ::: -Make sure your new `package.json` file and `tsconfig.json` files look like the following. Note that we added `"type": module` in `package.json` for this example: - -::: code-group +Make sure your new `package.json` file looks something like the following. Note that we have `"type": module` in `package.json` for this example: ```json [package.json] { @@ -70,22 +68,6 @@ Make sure your new `package.json` file and `tsconfig.json` files look like the f } ``` -```json [tsconfig.json] -{ - "compilerOptions": { - "target": "ES2022", - "module": "ES2022", - "moduleResolution": "node", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true - } -} -``` - -::: - You'll also want to make sure your `Node` version is _18.10.0_ using your version manager: ::: code-group diff --git a/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md b/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md index d59af0d788..d24327542c 100644 --- a/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md +++ b/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md @@ -17,7 +17,7 @@ head: `withAlchemyEnhancedApis` is a method on `AlchemyProvider` that you can optionally call to create a new provider instance with added methods that access the Alchemy [Enhanced APIs](https://www.alchemy.com/enhanced-apis) via the [Alchemy SDK](https://github.com/alchemyplatform/alchemy-sdk-js). :::tip Note -This method requires a peer dependency on the [`alchemy-sdk`](https://github.com/alchemyplatform/alchemy-sdk-js) package, as the input to this method is an Alchemy SDK client. +This method requires an optional dependency on the [`alchemy-sdk`](https://github.com/alchemyplatform/alchemy-sdk-js) package, as the input to this method is an Alchemy SDK client. The Alchemy SDK client must be configured with the same API key and network as the AlchemyProvider. This method validates such at runtime. diff --git a/yarn.lock b/yarn.lock index 2bb3cc7dce..7104ad07ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5185,10 +5185,10 @@ ajv@^8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -alchemy-sdk@^2.8.3: - version "2.10.1" - resolved "https://registry.yarnpkg.com/alchemy-sdk/-/alchemy-sdk-2.10.1.tgz#806bd7a1dca34d0af58ed7d7da03e6d533ad1334" - integrity sha512-zV6rBS2K0H3ickE28N7YiPvKPP9EQV+ZAiv9Zi3+aSzhcm0D1bkK+OS/+Tc7mU6EflSpZcDNC1fsLWlRqJOX4Q== +alchemy-sdk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/alchemy-sdk/-/alchemy-sdk-3.0.0.tgz#20ecb1dce4a8881d126e7062b96109c26e4ab186" + integrity sha512-mTvL9+ly55dz2h+/qElLNy2KM6yJY15bAHr7HCCaYquIYpdBHd1kKSosFBUKRGpWECngFoq+ZF+78hmEPMrZkw== dependencies: "@ethersproject/abi" "^5.7.0" "@ethersproject/abstract-provider" "^5.7.0" From 03f6e60fe96de853f3caf5d84520ffc30b51361d Mon Sep 17 00:00:00 2001 From: Alchemy Bot Date: Fri, 17 Nov 2023 21:08:02 +0000 Subject: [PATCH 62/79] chore(release): publish v1.2.0 [skip-ci] --- CHANGELOG.md | 6 ++++++ lerna.json | 2 +- packages/accounts/CHANGELOG.md | 6 ++++++ packages/accounts/package.json | 8 ++++---- packages/alchemy/CHANGELOG.md | 6 ++++++ packages/alchemy/package.json | 4 ++-- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/core/src/version.ts | 2 +- packages/ethers/CHANGELOG.md | 6 ++++++ packages/ethers/package.json | 4 ++-- 11 files changed, 41 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e39c068c5d..3a14f56cfc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# 1.2.0 (2023-11-17) + +### Features + +- make alchemy-sdk an optional dependency on aa-alchemy ([#265](https://github.com/alchemyplatform/aa-sdk/issues/265)) ([a0088b3](https://github.com/alchemyplatform/aa-sdk/commit/a0088b3ecce191ece21f4082a73c4fcae0e2286c)) + # 1.1.0 (2023-11-14) ### Features diff --git a/lerna.json b/lerna.json index c911066ca6..21d0b2a051 100644 --- a/lerna.json +++ b/lerna.json @@ -1,7 +1,7 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useWorkspaces": true, - "version": "1.1.0", + "version": "1.2.0", "useNx": true, "npmClient": "yarn", "conventionalCommits": true, diff --git a/packages/accounts/CHANGELOG.md b/packages/accounts/CHANGELOG.md index 276c66154f..f06f8436db 100644 --- a/packages/accounts/CHANGELOG.md +++ b/packages/accounts/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# 1.2.0 (2023-11-17) + +### Features + +- make alchemy-sdk an optional dependency on aa-alchemy ([#265](https://github.com/alchemyplatform/aa-sdk/issues/265)) ([a0088b3](https://github.com/alchemyplatform/aa-sdk/commit/a0088b3ecce191ece21f4082a73c4fcae0e2286c)) + # 1.1.0 (2023-11-14) ### Features diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 2a29591821..5128b80e51 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -1,6 +1,6 @@ { "name": "@alchemy/aa-accounts", - "version": "1.1.0", + "version": "1.2.0", "description": "A collection of ERC-4337 compliant smart contract account interfaces", "author": "Alchemy", "license": "MIT", @@ -39,8 +39,8 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "@alchemy/aa-alchemy": "^1.1.0", - "@alchemy/aa-core": "^1.1.0", + "@alchemy/aa-alchemy": "^1.2.0", + "@alchemy/aa-core": "^1.2.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" @@ -59,7 +59,7 @@ "homepage": "https://github.com/alchemyplatform/aa-sdk#readme", "gitHead": "ee46e8bb857de3b631044fa70714ea706d9e317d", "dependencies": { - "@alchemy/aa-core": "^1.1.0", + "@alchemy/aa-core": "^1.2.0", "viem": "^1.16.2" } } diff --git a/packages/alchemy/CHANGELOG.md b/packages/alchemy/CHANGELOG.md index f7d85c2d91..d5060c7735 100644 --- a/packages/alchemy/CHANGELOG.md +++ b/packages/alchemy/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# 1.2.0 (2023-11-17) + +### Features + +- make alchemy-sdk an optional dependency on aa-alchemy ([#265](https://github.com/alchemyplatform/aa-sdk/issues/265)) ([a0088b3](https://github.com/alchemyplatform/aa-sdk/commit/a0088b3ecce191ece21f4082a73c4fcae0e2286c)) + # 1.1.0 (2023-11-14) ### Features diff --git a/packages/alchemy/package.json b/packages/alchemy/package.json index 16eddf886e..750aa7f576 100644 --- a/packages/alchemy/package.json +++ b/packages/alchemy/package.json @@ -1,6 +1,6 @@ { "name": "@alchemy/aa-alchemy", - "version": "1.1.0", + "version": "1.2.0", "description": "adapters for @alchemy/aa-core for interacting with alchemy services", "author": "Alchemy", "license": "MIT", @@ -45,7 +45,7 @@ "vitest": "^0.31.0" }, "dependencies": { - "@alchemy/aa-core": "^1.1.0", + "@alchemy/aa-core": "^1.2.0", "viem": "^1.16.2" }, "publishConfig": { diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 2719571787..de57982c90 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# 1.2.0 (2023-11-17) + +### Features + +- make alchemy-sdk an optional dependency on aa-alchemy ([#265](https://github.com/alchemyplatform/aa-sdk/issues/265)) ([a0088b3](https://github.com/alchemyplatform/aa-sdk/commit/a0088b3ecce191ece21f4082a73c4fcae0e2286c)) + # 1.1.0 (2023-11-14) ### Features diff --git a/packages/core/package.json b/packages/core/package.json index c6dce70d28..20d0821784 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@alchemy/aa-core", "license": "MIT", - "version": "1.1.0", + "version": "1.2.0", "description": "viem based SDK that enables interactions with ERC-4337 Smart Accounts. ABIs are based off the definitions generated in @account-abstraction/contracts", "author": "Alchemy", "type": "module", diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index f7710fa8d9..07b586f2df 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -1,3 +1,3 @@ // This file is autogenerated by inject-version.ts. Any changes will be // overwritten on commit! -export const VERSION = "1.1.0"; +export const VERSION = "1.2.0"; diff --git a/packages/ethers/CHANGELOG.md b/packages/ethers/CHANGELOG.md index d646d2834d..ede75de66e 100644 --- a/packages/ethers/CHANGELOG.md +++ b/packages/ethers/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# 1.2.0 (2023-11-17) + +### Features + +- make alchemy-sdk an optional dependency on aa-alchemy ([#265](https://github.com/alchemyplatform/aa-sdk/issues/265)) ([a0088b3](https://github.com/alchemyplatform/aa-sdk/commit/a0088b3ecce191ece21f4082a73c4fcae0e2286c)) + # 1.1.0 (2023-11-14) ### Features diff --git a/packages/ethers/package.json b/packages/ethers/package.json index bcf7f5997c..5b0376dce2 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -1,7 +1,7 @@ { "name": "@alchemy/aa-ethers", "license": "MIT", - "version": "1.1.0", + "version": "1.2.0", "description": "Ethers.js wrapper for @alchemy/aa-core", "author": "Alchemy", "type": "module", @@ -49,7 +49,7 @@ "vitest": "^0.31.0" }, "dependencies": { - "@alchemy/aa-core": "^1.1.0", + "@alchemy/aa-core": "^1.2.0", "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/bytes": "^5.7.0", From 389d12aa8a5f0a8c0f34cf3231b8daf3b6a01e11 Mon Sep 17 00:00:00 2001 From: Alchemy Bot Date: Fri, 17 Nov 2023 21:08:02 +0000 Subject: [PATCH 63/79] chore(release): publish v1.2.0 [skip-ci] --- packages/accounts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 5128b80e51..74bbfbc683 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@alchemy/aa-alchemy": "^1.2.0", - "@alchemy/aa-core": "^1.2.0", + "@alchemy/aa-core": "^1.0.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" From 19e5738c74cbcef894f0179fdc3a3c143e812bb5 Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Wed, 22 Nov 2023 12:35:07 -0500 Subject: [PATCH 64/79] feat: allow passing raw call data to sendUserOperation (#272) --- packages/accounts/src/kernel-zerodev/types.ts | 8 ++++++-- packages/core/src/provider/base.ts | 2 ++ packages/core/src/types.ts | 20 ++++++++++--------- site/guides/send-user-operation.md | 2 +- .../aa-core/provider/sendUserOperation.md | 4 +++- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/packages/accounts/src/kernel-zerodev/types.ts b/packages/accounts/src/kernel-zerodev/types.ts index f5050caf64..359cdf9e8d 100644 --- a/packages/accounts/src/kernel-zerodev/types.ts +++ b/packages/accounts/src/kernel-zerodev/types.ts @@ -1,7 +1,11 @@ import type { UserOperationCallData } from "@alchemy/aa-core"; +import type { Hex } from "viem"; -export interface KernelUserOperationCallData extends UserOperationCallData { +export type KernelUserOperationCallData = Exclude< + UserOperationCallData, + Hex +> & { delegateCall?: boolean; -} +}; export type KernelBatchUserOperationCallData = KernelUserOperationCallData[]; diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index 445e9ebcfe..aa8b11abf5 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -354,6 +354,8 @@ export class SmartAccountProvider< nonce: this.account.getNonce(), callData: Array.isArray(data) ? this.account.encodeBatchExecute(data) + : typeof data === "string" + ? data : this.account.encodeExecute( data.target, data.value ?? 0n, diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 55220ba004..8babbe411a 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -8,16 +8,18 @@ export type PromiseOrValue = T | Promise; export type BigNumberish = string | bigint | number; export type BytesLike = Uint8Array | string; -export interface UserOperationCallData { - /* the target of the call */ - target: Address; - /* the data passed to the target */ - data: Hex; - /* the amount of native token to send to the target (default: 0) */ - value?: bigint; -} +export type UserOperationCallData = + | { + /* the target of the call */ + target: Address; + /* the data passed to the target */ + data: Hex; + /* the amount of native token to send to the target (default: 0) */ + value?: bigint; + } + | Hex; -export type BatchUserOperationCallData = UserOperationCallData[]; +export type BatchUserOperationCallData = Exclude[]; export type UserOperationOverrides = Partial< Pick< diff --git a/site/guides/send-user-operation.md b/site/guides/send-user-operation.md index 852f5cecad..785e77fdf8 100644 --- a/site/guides/send-user-operation.md +++ b/site/guides/send-user-operation.md @@ -53,7 +53,7 @@ Some other helpful viem methods include: [encodeFunctionData](https://viem.sh/do ## 4. Send The User Operation -Now we'll use the connected provider to send a user operation. We'll use the [sendUserOperation](/packages/aa-core/provider/waitForUserOperationTransaction.md) method on the provider. +Now we'll use the connected provider to send a user operation. We'll use the [sendUserOperation](/packages/aa-core/provider/sendUserOperation.md) method on the provider. You can either send ETH to the smart account to pay for User Operation's gas, or you can connect your provider to an Alchemy Gas Manager using the [withAlchemyGasManager](/packages/aa-alchemy/provider/withAlchemyGasManager.md) method to sponsor the UO's gas. We'll use the latter approach below. You can go to the [Alchemy Dashboard](https://dashboard.alchemy.com/gas-manager) to get a Gas Manager policy ID. diff --git a/site/packages/aa-core/provider/sendUserOperation.md b/site/packages/aa-core/provider/sendUserOperation.md index 0a8c6e13b5..de3e1b2c1a 100644 --- a/site/packages/aa-core/provider/sendUserOperation.md +++ b/site/packages/aa-core/provider/sendUserOperation.md @@ -65,7 +65,9 @@ A Promise containing the hash of the user operation and the request that was sen ## Parameters -### `UserOperationCallData | UserOperationCallData[]` +### `UserOperationCallData | UserOperationCallData[] | Hex` + +`UserOperationCallData` is an object with the following properties: - `target: Address` - the target of the call (equivalent to `to` in a transaction) - `data: Hex` - can be either `0x` or a call data string From efdfc62398afe6a86fc1d2de890cab99e0acc767 Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Wed, 22 Nov 2023 17:37:52 -0500 Subject: [PATCH 65/79] fix: preserve the connected account when using alchemy middlewares (#273) --- packages/alchemy/src/middleware/gas-fees.ts | 6 +++--- packages/alchemy/src/middleware/gas-manager.ts | 18 +++++++++--------- packages/alchemy/src/provider.ts | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/alchemy/src/middleware/gas-fees.ts b/packages/alchemy/src/middleware/gas-fees.ts index 7add85bde6..9047d832cc 100644 --- a/packages/alchemy/src/middleware/gas-fees.ts +++ b/packages/alchemy/src/middleware/gas-fees.ts @@ -1,11 +1,11 @@ import type { AlchemyProvider } from "../provider.js"; import type { ClientWithAlchemyMethods } from "./client.js"; -export const withAlchemyGasFeeEstimator = ( - provider: AlchemyProvider, +export const withAlchemyGasFeeEstimator =

( + provider: P, baseFeeBufferPercent: bigint, maxPriorityFeeBufferPercent: bigint -): AlchemyProvider => { +): P => { provider.withFeeDataGetter(async () => { const block = await provider.rpcClient.getBlock({ blockTag: "latest" }); const baseFeePerGas = block.baseFeePerGas; diff --git a/packages/alchemy/src/middleware/gas-manager.ts b/packages/alchemy/src/middleware/gas-manager.ts index 1da182c4af..413df2f5a5 100644 --- a/packages/alchemy/src/middleware/gas-manager.ts +++ b/packages/alchemy/src/middleware/gas-manager.ts @@ -24,11 +24,11 @@ export interface AlchemyGasManagerConfig { * @param estimateGas - if true, this will use `alchemy_requestGasAndPaymasterAndData` else will use `alchemy_requestPaymasterAndData` * @returns the provider augmented to use the alchemy gas manager */ -export const withAlchemyGasManager = ( - provider: AlchemyProvider, +export const withAlchemyGasManager =

( + provider: P, config: AlchemyGasManagerConfig, estimateGas: boolean = true -): AlchemyProvider => { +): P => { return estimateGas ? provider // no-op gas estimator @@ -58,10 +58,10 @@ export const withAlchemyGasManager = ( * @param config - the alchemy gas manager configuration * @returns middleware overrides for paymaster middlewares */ -const withAlchemyPaymasterAndDataMiddleware = ( - provider: AlchemyProvider, +const withAlchemyPaymasterAndDataMiddleware =

( + provider: P, config: AlchemyGasManagerConfig -): Parameters["0"] => ({ +): Parameters["0"] => ({ dummyPaymasterDataMiddleware: async (_struct) => { switch (provider.rpcClient.chain.id) { case 1: @@ -103,10 +103,10 @@ const withAlchemyPaymasterAndDataMiddleware = ( * @param config - the alchemy gas manager configuration * @returns middleware overrides for paymaster middlewares */ -const withAlchemyGasAndPaymasterAndDataMiddleware = ( - provider: AlchemyProvider, +const withAlchemyGasAndPaymasterAndDataMiddleware =

( + provider: P, config: AlchemyGasManagerConfig -): Parameters["0"] => ({ +): Parameters["0"] => ({ paymasterDataMiddleware: async (struct) => { const userOperation: UserOperationRequest = deepHexlify( await resolveProperties(struct) diff --git a/packages/alchemy/src/provider.ts b/packages/alchemy/src/provider.ts index 810cda4e65..544a9f1951 100644 --- a/packages/alchemy/src/provider.ts +++ b/packages/alchemy/src/provider.ts @@ -130,7 +130,7 @@ export class AlchemyProvider extends SmartAccountProvider { * @param config - the Alchemy Gas Manager configuration * @returns {AlchemyProvider} - a new AlchemyProvider with the Gas Manager middleware */ - withAlchemyGasManager(config: AlchemyGasManagerConfig): AlchemyProvider { + withAlchemyGasManager(config: AlchemyGasManagerConfig): this { if (!this.isConnected()) { throw new Error( "AlchemyProvider: account is not set, did you call `connect` first?" From ed5b40baeca50ea514e93da696d1f3e465b18302 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:42:48 -0500 Subject: [PATCH 66/79] feat: add aa-signers package (#228) --- .github/workflows/deploy-site.yml | 2 +- .github/workflows/on-pull-request.yml | 4 +- .github/workflows/publish-package.yml | 2 +- README.md | 2 +- package.json | 4 +- packages/signers/CHANGELOG.md | 215 +++++++++++++++++ packages/signers/README.md | 34 +++ packages/signers/package.json | 64 +++++ packages/signers/src/__tests__/signer.test.ts | 5 + packages/signers/src/index.ts | 0 packages/signers/tsconfig.build.json | 8 + packages/signers/tsconfig.json | 3 + packages/signers/vitest.config.e2e.ts | 12 + packages/signers/vitest.config.ts | 12 + site/.vitepress/config.ts | 12 + site/overview/getting-started.md | 10 +- site/overview/package-overview.md | 20 +- site/packages/aa-ethers/index.md | 4 +- site/packages/aa-signers/contributing.md | 27 +++ site/packages/aa-signers/index.md | 42 ++++ yarn.lock | 218 +++++++++++++++++- 21 files changed, 673 insertions(+), 27 deletions(-) create mode 100644 packages/signers/CHANGELOG.md create mode 100644 packages/signers/README.md create mode 100644 packages/signers/package.json create mode 100644 packages/signers/src/__tests__/signer.test.ts create mode 100644 packages/signers/src/index.ts create mode 100644 packages/signers/tsconfig.build.json create mode 100644 packages/signers/tsconfig.json create mode 100644 packages/signers/vitest.config.e2e.ts create mode 100644 packages/signers/vitest.config.ts create mode 100644 site/packages/aa-signers/contributing.md create mode 100644 site/packages/aa-signers/index.md diff --git a/.github/workflows/deploy-site.yml b/.github/workflows/deploy-site.yml index 3b4d3c5e35..28d57869eb 100644 --- a/.github/workflows/deploy-site.yml +++ b/.github/workflows/deploy-site.yml @@ -36,7 +36,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: "18.10" + node-version: "18.16" cache: yarn - name: Setup Pages diff --git a/.github/workflows/on-pull-request.yml b/.github/workflows/on-pull-request.yml index 5576f6699a..1a55bc204a 100644 --- a/.github/workflows/on-pull-request.yml +++ b/.github/workflows/on-pull-request.yml @@ -23,7 +23,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: "18.10" + node-version: "18.16" cache: "yarn" - name: Install dependencies @@ -41,7 +41,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: "18.10" + node-version: "18.16" cache: "yarn" - name: Install dependencies diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml index a270b8d34c..a19695474e 100644 --- a/.github/workflows/publish-package.yml +++ b/.github/workflows/publish-package.yml @@ -41,7 +41,7 @@ jobs: - name: Set Node.js 16.x uses: actions/setup-node@v3 with: - node-version: "18.10" + node-version: "18.16" cache: "yarn" - name: Set Github User Details diff --git a/README.md b/README.md index 48887e7671..96a94dad7c 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ The `aa-sdk` is part of Alchemy's Account Kit. For more information, check out t 1. clone the repo 2. run `yarn` 3. verify tests pass - - be sure to use the node version specified in package.json, currently 18.10 + - be sure to use the node version specified in package.json, currently 18.16 - run `node -v` - run `yarn build` - run `yarn test` diff --git a/package.json b/package.json index eaa82b9df7..43c0af08fd 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "private": true, "engines": { - "node": "18.10" + "node": "18.16" }, "workspaces": [ "packages/*", @@ -16,7 +16,7 @@ "build:examples": "lerna run build", "clean": "lerna run clean", "test": "lerna run test:run", - "test:e2e": "lerna run test:run-e2e --concurrency=1", + "test:e2e": "lerna run test:run-e2e --concurrency=1 --ignore=@alchemy/aa-signers", "lint:write": "eslint . --fix && prettier --write --ignore-unknown .", "lint:check": "eslint . && prettier --check .", "prepare": "husky install", diff --git a/packages/signers/CHANGELOG.md b/packages/signers/CHANGELOG.md new file mode 100644 index 0000000000..d5060c7735 --- /dev/null +++ b/packages/signers/CHANGELOG.md @@ -0,0 +1,215 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 1.2.0 (2023-11-17) + +### Features + +- make alchemy-sdk an optional dependency on aa-alchemy ([#265](https://github.com/alchemyplatform/aa-sdk/issues/265)) ([a0088b3](https://github.com/alchemyplatform/aa-sdk/commit/a0088b3ecce191ece21f4082a73c4fcae0e2286c)) + +# 1.1.0 (2023-11-14) + +### Features + +- merge development into main for new minor release ([#251](https://github.com/alchemyplatform/aa-sdk/issues/251)) ([ab098ee](https://github.com/alchemyplatform/aa-sdk/commit/ab098ee9ec35e4b1b3c788046168874fb51e4783)) + +# [1.0.0](https://github.com/alchemyplatform/aa-sdk/compare/v0.2.0...v1.0.0) (2023-11-10) + +### Features + +- remove AA_SDK_TESTS_SIGNER_TYPE constant exported from aa-core ([#232](https://github.com/alchemyplatform/aa-sdk/issues/232)) ([883c489](https://github.com/alchemyplatform/aa-sdk/commit/883c489b077d587b6c5b50c44d92b2a00f10e5ac)) +- support enhanced apis in alchemy provider ([#221](https://github.com/alchemyplatform/aa-sdk/issues/221)) ([83ea17f](https://github.com/alchemyplatform/aa-sdk/commit/83ea17f9c69123d9282871b6f3bb02ff64750625)) +- use alchemy provider, light account for e2e tests ([#209](https://github.com/alchemyplatform/aa-sdk/issues/209)) ([124be68](https://github.com/alchemyplatform/aa-sdk/commit/124be68c5137a3511ec612e814265739e6909e75)) + +# 0.2.0 (2023-11-03) + +### Features + +- merge development into main for new version release ([#207](https://github.com/alchemyplatform/aa-sdk/issues/207)) ([f06fd2a](https://github.com/alchemyplatform/aa-sdk/commit/f06fd2adf5e4aaf90214435d32f9d566d8502099)) + +## 0.1.1 (2023-10-20) + +### Bug Fixes + +- bad deploy script again ([2da8de2](https://github.com/alchemyplatform/aa-sdk/commit/2da8de2f4feb4c82fd454050e66f6203b61bcc2c)) + +# [0.1.0](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.32...v0.1.0) (2023-10-10) + +### Features + +- merge in all of the staged changes to the aa-sdk ([#120](https://github.com/alchemyplatform/aa-sdk/issues/120)) ([7a9effa](https://github.com/alchemyplatform/aa-sdk/commit/7a9effaa07c03a6a50c9cf856b5935e735adae3a)), closes [#1](https://github.com/alchemyplatform/aa-sdk/issues/1) [#2](https://github.com/alchemyplatform/aa-sdk/issues/2) [#3](https://github.com/alchemyplatform/aa-sdk/issues/3) [#7](https://github.com/alchemyplatform/aa-sdk/issues/7) [#8](https://github.com/alchemyplatform/aa-sdk/issues/8) [#9](https://github.com/alchemyplatform/aa-sdk/issues/9) + +# 0.1.0-alpha.32 (2023-09-18) + +### Bug Fixes + +- `baseGoerli` chainId in `chains.ts` ([#104](https://github.com/alchemyplatform/aa-sdk/issues/104)) ([2dda5dd](https://github.com/alchemyplatform/aa-sdk/commit/2dda5dd729124338ddf529c11bbf24afaea05dd4)) + +# 0.1.0-alpha.31 (2023-09-13) + +### Bug Fixes + +- remove all references to `SimpleSmartAccountOwner` ([#101](https://github.com/alchemyplatform/aa-sdk/issues/101)) ([a8f101d](https://github.com/alchemyplatform/aa-sdk/commit/a8f101dff7fbbd10598467ddaaa1c3c55f707e6d)) + +# 0.1.0-alpha.30 (2023-09-11) + +### Features + +- add base support to alchemy provider ([#100](https://github.com/alchemyplatform/aa-sdk/issues/100)) ([a5dc65c](https://github.com/alchemyplatform/aa-sdk/commit/a5dc65c4208614b935943ebdd8eececf3de03d29)) + +# 0.1.0-alpha.29 (2023-08-29) + +### Bug Fixes + +- **core:** add missing `null` return type of `eth_getUserOperation*` ([#93](https://github.com/alchemyplatform/aa-sdk/issues/93)) ([cba9a0c](https://github.com/alchemyplatform/aa-sdk/commit/cba9a0c79807612b37c9d8c300b494312c9bd752)) + +# 0.1.0-alpha.28 (2023-08-25) + +### Bug Fixes + +- pass overrides from tx to user op ([#88](https://github.com/alchemyplatform/aa-sdk/issues/88)) ([985cb99](https://github.com/alchemyplatform/aa-sdk/commit/985cb997691f5b251337ea0fbe6bd23e6b3fb455)) + +# 0.1.0-alpha.27 (2023-08-24) + +**Note:** Version bump only for package @alchemy/aa-alchemy + +# 0.1.0-alpha.26 (2023-08-23) + +### Features + +- add utils for getting the intermediary UO struct ([#86](https://github.com/alchemyplatform/aa-sdk/issues/86)) ([0e1a701](https://github.com/alchemyplatform/aa-sdk/commit/0e1a70174c0eeff2eedce4379914cad75f0629b2)) + +# 0.1.0-alpha.25 (2023-08-17) + +### Features + +- add jwt support for Alchemy providers ([#81](https://github.com/alchemyplatform/aa-sdk/issues/81)) ([af85aa4](https://github.com/alchemyplatform/aa-sdk/commit/af85aa41441825ca6545e850cbc7e834879cf236)) + +# 0.1.0-alpha.24 (2023-08-16) + +### Features + +- add utils for verifying 6492 sigs and ensip-11 utils ([#80](https://github.com/alchemyplatform/aa-sdk/issues/80)) ([52231b6](https://github.com/alchemyplatform/aa-sdk/commit/52231b6b4a521ee0713c4d3d3126ac4e5d66f14c)) + +# 0.1.0-alpha.23 (2023-08-14) + +### Features + +- **alchemy:** modify fee defaults ([0a0a65c](https://github.com/alchemyplatform/aa-sdk/commit/0a0a65c03a6991a1c57473ae9e65c4b727d937e2)) + +# 0.1.0-alpha.22 (2023-08-11) + +**Note:** Version bump only for package @alchemy/aa-alchemy + +# 0.1.0-alpha.21 (2023-08-08) + +### Features + +- allow overriding alchemy provider rpc url ([#70](https://github.com/alchemyplatform/aa-sdk/issues/70)) ([6b7c4b9](https://github.com/alchemyplatform/aa-sdk/commit/6b7c4b911b97dfcd1cfb00b2892548644fbe2fc6)) + +# 0.1.0-alpha.20 (2023-08-05) + +### Features + +- add signTypedData to providers ([#66](https://github.com/alchemyplatform/aa-sdk/issues/66)) ([e0a99f6](https://github.com/alchemyplatform/aa-sdk/commit/e0a99f694a6ed6e88b15d6cc73f99e74fd985667)) + +# 0.1.0-alpha.19 (2023-08-03) + +### Features + +- add event emitter to the provider so that we can listen to connected events in dapps ([#65](https://github.com/alchemyplatform/aa-sdk/issues/65)) ([35ee990](https://github.com/alchemyplatform/aa-sdk/commit/35ee990afa1c8be7c4685631af6654ac51b094cd)) + +# 0.1.0-alpha.18 (2023-07-28) + +**Note:** Version bump only for package @alchemy/aa-alchemy + +# 0.1.0-alpha.17 (2023-07-19) + +### Features + +- add support for fetch options when creating public clients ([#59](https://github.com/alchemyplatform/aa-sdk/issues/59)) ([5028e7b](https://github.com/alchemyplatform/aa-sdk/commit/5028e7b21a208ad8f88e81d455c2c8e24d57d953)) + +# 0.1.0-alpha.16 (2023-07-06) + +### Bug Fixes + +- always import with file extension ([#48](https://github.com/alchemyplatform/aa-sdk/issues/48)) ([4776d74](https://github.com/alchemyplatform/aa-sdk/commit/4776d7476f8cb622416c8846afa9bc17d16b97a6)) + +# 0.1.0-alpha.15 (2023-07-05) + +### Features + +- kernel batch transactions and gas estimation fixes ([#39](https://github.com/alchemyplatform/aa-sdk/issues/39)) ([f2a3d3d](https://github.com/alchemyplatform/aa-sdk/commit/f2a3d3d093ddbe1b564c0242c28b67487554f1ba)) + +# 0.1.0-alpha.14 (2023-06-29) + +### Bug Fixes + +- npm 404 error ([f34f581](https://github.com/alchemyplatform/aa-sdk/commit/f34f581a0399a2e30f33161d8b4cc1d778122b1f)) + +# 0.1.0-alpha.13 (2023-06-29) + +### Bug Fixes + +- add github user details to publish script ([2b812d3](https://github.com/alchemyplatform/aa-sdk/commit/2b812d34c041e11ba7d4c11a72c26da8f8e7af21)) + +# [0.1.0-alpha.12](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.11...v0.1.0-alpha.12) (2023-06-27) + +### Bug Fixes + +- set opt/arb goerli base fee percentage to 0 ([#37](https://github.com/alchemyplatform/aa-sdk/issues/37)) ([db750f0](https://github.com/alchemyplatform/aa-sdk/commit/db750f09bc88cc7fd3a1d8e3ea0ff874ac656a7c)) + +# [0.1.0-alpha.11](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.10...v0.1.0-alpha.11) (2023-06-26) + +**Note:** Version bump only for package @alchemy/aa-alchemy + +# [0.1.0-alpha.10](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.8...v0.1.0-alpha.10) (2023-06-26) + +### Bug Fixes + +- types changed when updating to latest viem ([0aec96d](https://github.com/alchemyplatform/aa-sdk/commit/0aec96d184b5bcc3787ce9123260cf287f27f037)) + +# [0.1.0-alpha.9](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.8...v0.1.0-alpha.9) (2023-06-26) + +**Note:** Version bump only for package @alchemy/aa-alchemy + +# [0.1.0-alpha.8](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.7...v0.1.0-alpha.8) (2023-06-23) + +### Bug Fixes + +- **alchemy:** add opt mainnet to dummy gen ([#34](https://github.com/alchemyplatform/aa-sdk/issues/34)) ([ef21ad5](https://github.com/alchemyplatform/aa-sdk/commit/ef21ad514f9c1dfdfb49dedfd39586f58c2976c1)) + +# [0.1.0-alpha.7](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.6...v0.1.0-alpha.7) (2023-06-20) + +**Note:** Version bump only for package @alchemy/aa-alchemy + +# [0.1.0-alpha.6](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.5...v0.1.0-alpha.6) (2023-06-19) + +### Bug Fixes + +- return scaled prio fee as max fee per gas ([#27](https://github.com/alchemyplatform/aa-sdk/issues/27)) ([56bc34b](https://github.com/alchemyplatform/aa-sdk/commit/56bc34be3a50a2709ca546ed90a980f3c489cbbe)) + +# [0.1.0-alpha.5](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.4...v0.1.0-alpha.5) (2023-06-16) + +**Note:** Version bump only for package @alchemy/aa-alchemy + +# [0.1.0-alpha.4](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.3...v0.1.0-alpha.4) (2023-06-14) + +### Features + +- add aa-accounts subpackage ([#23](https://github.com/alchemyplatform/aa-sdk/issues/23)) ([a7fd5da](https://github.com/alchemyplatform/aa-sdk/commit/a7fd5da8600b0a346627df3a4b5cc338210aa256)) +- expose more user op methods on the provider ([#25](https://github.com/alchemyplatform/aa-sdk/issues/25)) ([2f39460](https://github.com/alchemyplatform/aa-sdk/commit/2f3946063d78a4fe1a99078f8fd315d87b24a901)) + +# [0.1.0-alpha.3](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.2...v0.1.0-alpha.3) (2023-06-13) + +### Bug Fixes + +- imports are broken because missing .js extension ([98f4a54](https://github.com/alchemyplatform/aa-sdk/commit/98f4a5469b0ac01a833ede08c6c077373255ed22)) + +# [0.1.0-alpha.2](https://github.com/alchemyplatform/aa-sdk/compare/v0.1.0-alpha.1...v0.1.0-alpha.2) (2023-06-12) + +### Features + +- add alchemy sub-package ([#22](https://github.com/alchemyplatform/aa-sdk/issues/22)) ([e7fc1aa](https://github.com/alchemyplatform/aa-sdk/commit/e7fc1aa93ebd57237009d3aa688d8c167f240aad)) diff --git a/packages/signers/README.md b/packages/signers/README.md new file mode 100644 index 0000000000..fbf1268caa --- /dev/null +++ b/packages/signers/README.md @@ -0,0 +1,34 @@ +# `@alchemy/aa-signers` + +This package contains various implementations of the [`SmartAccountSigner`](../core/src/signer/types.ts) and [`AuthSmartAccountSigner`](../core/src/signer/types.ts) classes defined in `aa-core`. This repo is community maintained and we welcome contributions! + +## Getting started + +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the accounts. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the [README](../../README.md) to get started. + +via `yarn` + +```bash +yarn add @alchemy/aa-signers +``` + +via `npm` + +```bash +npm i -s @alchemy/aa-signers +``` + +## Contributing + +If you are looking to add a new account type, please follow the following structure. + +1. Create a new folder in `src` with the name of your account type in `kebab-case` (we're following kebab casing for files throughout the project). +2. Create a new file in the folder you just created called `signer.ts` and add your implementation for `SmartAccountSigner`, along with any additional types or utils files. +3. If you need to extend the [`SmartAccountSigner`](../core/src/provider/base.ts) or [`AuthSmartAccountSigner`](../core/src/signer/types.ts) class, add a file called `signer.ts` in a new sub-folder under this package and add your implementation for. + +- Ideally, your `SmartAccountSigner` impl should _just_ work with the base provider provided by `aa-core` and whatever peer dependencies you install. +- If not, consider generalizing the use case and updating SmartAccountSigner + +5. Add some tests for your account and provider (if created) by creating a subfolder in your `signer/my-signer` called `__tests__` and make sure your files end with the `.test.ts` suffix +6. export the classes and types you've defined in `src/index.ts` +7. Open a PR and we'll review it as soon as possible! diff --git a/packages/signers/package.json b/packages/signers/package.json new file mode 100644 index 0000000000..bebd57acf5 --- /dev/null +++ b/packages/signers/package.json @@ -0,0 +1,64 @@ +{ + "name": "@alchemy/aa-signers", + "version": "1.2.0", + "description": "A collection of signers used to create ERC-4337 smart accounts", + "author": "Alchemy", + "license": "MIT", + "private": false, + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "sideEffects": false, + "files": [ + "dist", + "src/**/*.ts", + "!dist/**/*.tsbuildinfo", + "!vitest.config.ts", + "!.env", + "!src/**/*.test.ts", + "!src/__tests__/**/*" + ], + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "import": "./dist/esm/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, + "scripts": { + "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\"}'", + "build:types": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "clean": "rm -rf ./dist", + "test": "vitest", + "test:run": "vitest run", + "test:run-e2e": "vitest run --config vitest.config.e2e.ts" + }, + "devDependencies": { + "jsdom": "^22.1.0", + "typescript": "^5.0.4", + "typescript-template": "*", + "vitest": "^0.31.0" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/alchemyplatform/aa-sdk.git" + }, + "bugs": { + "url": "https://github.com/alchemyplatform/aa-sdk/issues" + }, + "homepage": "https://github.com/alchemyplatform/aa-sdk#readme", + "gitHead": "ee46e8bb857de3b631044fa70714ea706d9e317d", + "dependencies": { + "@alchemy/aa-core": "^1.2.0", + "viem": "^1.16.2" + } +} diff --git a/packages/signers/src/__tests__/signer.test.ts b/packages/signers/src/__tests__/signer.test.ts new file mode 100644 index 0000000000..9766101d70 --- /dev/null +++ b/packages/signers/src/__tests__/signer.test.ts @@ -0,0 +1,5 @@ +describe("Signer Tests", () => { + it("should work", async () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/signers/src/index.ts b/packages/signers/src/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/signers/tsconfig.build.json b/packages/signers/tsconfig.build.json new file mode 100644 index 0000000000..345f8f3fab --- /dev/null +++ b/packages/signers/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "typescript-template/build.json", + "exclude": ["node_modules", "**/*/__tests__", "vitest.config.ts"], + "include": ["src"], + "compilerOptions": { + "sourceMap": true + } +} diff --git a/packages/signers/tsconfig.json b/packages/signers/tsconfig.json new file mode 100644 index 0000000000..748018d6a6 --- /dev/null +++ b/packages/signers/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "typescript-template/base.json" +} diff --git a/packages/signers/vitest.config.e2e.ts b/packages/signers/vitest.config.e2e.ts new file mode 100644 index 0000000000..6cb1856f68 --- /dev/null +++ b/packages/signers/vitest.config.e2e.ts @@ -0,0 +1,12 @@ +import { configDefaults, defineProject } from "vitest/config"; + +export default defineProject({ + test: { + singleThread: true, + globals: true, + setupFiles: ["../../.vitest/setupTests.ts"], + exclude: [...configDefaults.exclude, "**/__tests__/**/*.test.ts"], + name: "signers", + environment: "jsdom", + }, +}); diff --git a/packages/signers/vitest.config.ts b/packages/signers/vitest.config.ts new file mode 100644 index 0000000000..f39e1f3da9 --- /dev/null +++ b/packages/signers/vitest.config.ts @@ -0,0 +1,12 @@ +import { configDefaults, defineProject } from "vitest/config"; + +export default defineProject({ + test: { + singleThread: true, + globals: true, + setupFiles: ["../../.vitest/setupTests.ts"], + exclude: [...configDefaults.exclude, "**/e2e-tests/**/*.test.ts"], + name: "signers", + environment: "jsdom", + }, +}); diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index f24b9f6164..a5dc0375e2 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -620,6 +620,18 @@ export default defineConfig({ { text: "Contributing", link: "/contributing" }, ], }, + { + text: "aa-signers", + collapsed: true, + base: "/packages/aa-signers", + items: [ + { + text: "Getting Started", + link: "/", + }, + { text: "Contributing", link: "/contributing" }, + ], + }, { text: "aa-ethers", base: "/packages/aa-ethers", diff --git a/site/overview/getting-started.md b/site/overview/getting-started.md index 22fd3c7230..4a614d05ad 100644 --- a/site/overview/getting-started.md +++ b/site/overview/getting-started.md @@ -68,18 +68,18 @@ Make sure your new `package.json` file looks something like the following. Note } ``` -You'll also want to make sure your `Node` version is _18.10.0_ using your version manager: +You'll also want to make sure your `Node` version is _18.16.0_ using your version manager: ::: code-group ```bash [nvm] -nvm install 18.10.0 -nvm use 18.10.0 +nvm install 18.16.0 +nvm use 18.16.0 ``` ```bash [asdf] -asdf install nodejs 18.10.0 -asdf global nodejs 18.10.0 +asdf install nodejs 18.16.0 +asdf global nodejs 18.16.0 asdf reshim nodejs ``` diff --git a/site/overview/package-overview.md b/site/overview/package-overview.md index 200717e058..1a000a9c42 100644 --- a/site/overview/package-overview.md +++ b/site/overview/package-overview.md @@ -6,16 +6,16 @@ head: content: Packages Overview - - meta - name: description - content: Explore the benefits and tradeoffs of four different packages that can be used with Account Kit namely aa-core, aa-alchemy, aa-accounts, and aa-ethers. + content: Explore the benefits and tradeoffs of four different packages that can be used with Account Kit namely aa-core, aa-alchemy, aa-accounts, aa-signers, and aa-ethers. - - meta - property: og:description - content: Explore the benefits and tradeoffs of four different packages that can be used with Account Kit namely aa-core, aa-alchemy, aa-accounts, and aa-ethers. + content: Explore the benefits and tradeoffs of four different packages that can be used with Account Kit namely aa-core, aa-alchemy, aa-accounts, aa-signers, and aa-ethers. - - meta - name: twitter:title content: Packages Overview - - meta - name: twitter:description - content: Explore the benefits and tradeoffs of four different packages that can be used with Account Kit namely aa-core, aa-alchemy, aa-accounts, and aa-ethers. + content: Explore the benefits and tradeoffs of four different packages that can be used with Account Kit namely aa-core, aa-alchemy, aa-accounts, aa-signers, and aa-ethers. next: text: Smart Accounts link: /smart-accounts/overview @@ -23,7 +23,9 @@ next: # Package Overview -The Alchemy Account Kit SDK is comprised of a number of smaller packages that developers can leverage to interact with [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) infrastructure. For almost all cases, `aa-core` is sufficient with the subsequent packages offering various utilities for interacting with specific Account Abstraction Infrastructure or Smart Accounts. +The Alchemy Account Kit SDK consists of a number of smaller packages that developers can leverage to interact with [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) infrastructure. + +For almost all cases, `aa-core` is sufficient with the subsequent packages offering various utilities for interacting with specific Account Abstraction infrastructure or smart accounts. However, we offer additional packages to augment your developer experience with custom Alchemy infrastructure (`aa-alchemy`), custom smart account (`aa-accounts`) and signer solutions (`aa-signers`), and an ethers.js-compatible solution (`aa-ethers`). ## [`aa-core`](/packages/aa-core/) @@ -53,6 +55,16 @@ For details on contributing your own Smart Account implementation, see the [aa-a To see all of the Smart Accounts that are supported by this package, see the [aa-accounts documentation](/packages/aa-accounts/). +## [`aa-signers`](/packages/aa-signers/) + +This packages provides various implementations of `SmartAccountSigner` and `SmartAccountAuthenticator` for integrating different Signers of your smart account. This package is not required to use `aa-core` or `aa-alchemy`. If you want to use your own Smart Account implementation, you can do so by following the guide ["Using Your Own Account"](/smart-accounts/accounts/using-your-own). + +If you'd like to use a signer that is not supported by this package, you can implement a `SmartAccountSigner` or `SmartAccountAuthenticator` yourself and use it with `aa-core` or `aa-alchemy`. + +For details on contributing your own Signer implementation, see the [aa-signers contribution guide](/packages/aa-signers/contributing). + +To see all of the Signers that are supported by this package, see the [aa-signers documentation](/packages/aa-signers/). + ## [`aa-ethers`](/packages/aa-ethers/) This package provides an adapter that allows you to convert a `SmartAccountProvider` or `AlchemyProvider` into an ethers `JsonRpcProvider` and `Signer`. These are primarily for convenience if your codebase expects a `JsonRpcProvider` or `Signer` in places and you want to use `aa-core` or `aa-alchemy` with minimal lift. diff --git a/site/packages/aa-ethers/index.md b/site/packages/aa-ethers/index.md index e889b8ceab..ce78b8bd86 100644 --- a/site/packages/aa-ethers/index.md +++ b/site/packages/aa-ethers/index.md @@ -11,8 +11,8 @@ head: - property: og:description content: aa-ethers landing page and getting started guide prev: - text: aa-accounts - link: /packages/aa-accounts/index + text: aa-signers + link: /packages/aa-signers/index next: text: EthersProviderAdapter --- diff --git a/site/packages/aa-signers/contributing.md b/site/packages/aa-signers/contributing.md new file mode 100644 index 0000000000..79a54a156a --- /dev/null +++ b/site/packages/aa-signers/contributing.md @@ -0,0 +1,27 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Contributing to aa-signers + - - meta + - name: description + content: How to add your own Signer Implementation to aa-signers + - - meta + - property: og:description + content: How to add your own Signer Implementation to aa-signers +next: + text: aa-ethers +--- + +# Contributing to `aa-signers` + +If you are looking to add a new Signer type, please follow the following structure. + +1. Create a new folder in `src` with the name of your Signer type in `kebab-case` (we're following kebab casing for files throughout the project). +2. If you require importing an external library for your implementation, add it as an `optionalDependency` +3. Create a new file in the folder you just created called `signer.ts` and add your implementation for `SmartAccountSigner` or `SmartAccountAuthenticator`. +4. If needed, create a file in your folder called `types.ts` and add any necesssary types required for authentication, details, or the inner SDK. +5. Add some tests for your Signer by creating a subfolder in your `signer/my-signer` called `__tests__` and make sure your files end with the `.test.ts` suffix. +6. Export the classes and types you've defined in `src/index.ts`. +7. Open a PR and we'll review it as soon as possible! diff --git a/site/packages/aa-signers/index.md b/site/packages/aa-signers/index.md new file mode 100644 index 0000000000..9ebb156d33 --- /dev/null +++ b/site/packages/aa-signers/index.md @@ -0,0 +1,42 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: aa-signers + - - meta + - name: description + content: aa-signers landing page and getting started guide + - - meta + - property: og:description + content: aa-signers landing page and getting started guide +prev: + text: aa-accounts + link: /packages/aa-accounts/index +next: + text: Magic +--- + +# `@alchemy/aa-signers` + +This package contains various implementations of the `SmartAccountSigner` and `SmartAccountAuthenticator` classes defined in `aa-signer`. This repo is community maintained and we welcome contributions! + +## Getting started + +If you are already using the `@alchemy/aa-core` package, you can simply install this package and start using the signers. If you are not using `@alchemy/aa-core`, you can install it and follow the instructions in the ["Getting Started"](/overview/getting-started) docs to get started. + +::: code-group + +```bash [yarn] +yarn add @alchemy/aa-signers +``` + +```bash [npm] +npm i -s @alchemy/aa-signers +``` + +```bash [pnpm] +pnpm i @alchemy/aa-signers +``` + +::: diff --git a/yarn.lock b/yarn.lock index 7104ad07ba..b17e05c71c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5076,6 +5076,11 @@ JSONStream@^1.0.4, JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -6520,6 +6525,13 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssstyle@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" + integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== + dependencies: + rrweb-cssom "^0.6.0" + csstype@^3.0.11, csstype@^3.0.2, csstype@^3.0.7, csstype@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -6559,6 +6571,15 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== +data-urls@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" + integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" + date-time@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" @@ -6605,6 +6626,11 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -6774,6 +6800,13 @@ dom-walk@^0.1.0: resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + dot-prop@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" @@ -6887,6 +6920,11 @@ enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -8358,6 +8396,13 @@ hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: dependencies: lru-cache "^7.5.1" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -8377,7 +8422,7 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -8421,6 +8466,13 @@ i18n-js@^4.3.2: lodash "*" make-plural "*" +iconv-lite@0.6.3, iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -8428,13 +8480,6 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -8781,6 +8826,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -9001,6 +9051,35 @@ js-yaml@^3.10.0: argparse "^1.0.7" esprima "^4.0.0" +jsdom@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" + integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== + dependencies: + abab "^2.0.6" + cssstyle "^3.0.0" + data-urls "^4.0.0" + decimal.js "^10.4.3" + domexception "^4.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.4" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.1" + ws "^8.13.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -10348,6 +10427,11 @@ number-to-bn@1.7.0: bn.js "4.11.6" strip-hex-prefix "1.0.0" +nwsapi@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + nx@15.9.7, "nx@>=15.5.2 < 16": version "15.9.7" resolved "https://registry.yarnpkg.com/nx/-/nx-15.9.7.tgz#f0e713cedb8637a517d9c4795c99afec4959a1b6" @@ -10762,6 +10846,13 @@ parse-url@^8.1.0: dependencies: parse-path "^7.0.0" +parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -11094,11 +11185,21 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@^2.1.1, punycode@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -11160,6 +11261,11 @@ query-string@^6.13.5: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -11513,6 +11619,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -11640,6 +11751,11 @@ rpc-websockets@^7.5.1: bufferutil "^4.0.1" utf-8-validate "^5.0.2" +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -11710,6 +11826,13 @@ safe-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -12253,6 +12376,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + tabbable@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" @@ -12464,6 +12592,23 @@ toggle-selection@^1.0.6: resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -12776,6 +12921,11 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -12801,6 +12951,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + url-set-query@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" @@ -13019,6 +13177,13 @@ vue@^3.2.45, vue@^3.3.6: "@vue/server-renderer" "3.3.7" "@vue/shared" "3.3.7" +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + wagmi@^1.3.11: version "1.4.5" resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-1.4.5.tgz#65ccf763e17892871196b6e5b188e29f0b08d3df" @@ -13166,6 +13331,11 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + websocket@^1.0.32, websocket@^1.0.34: version "1.0.34" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" @@ -13183,6 +13353,26 @@ well-known-symbols@^2.0.0: resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^12.0.0, whatwg-url@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -13373,7 +13563,7 @@ ws@^7.4.5, ws@^7.5.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.5.0: +ws@^8.13.0, ws@^8.5.0: version "8.14.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== @@ -13415,6 +13605,16 @@ xhr@^2.0.4: parse-headers "^2.0.0" xtend "^4.0.0" +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From 80dc4116a96262bba9a80331721f60c939b7311a Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 23 Nov 2023 16:55:45 -0800 Subject: [PATCH 67/79] chore: fix typescript export type for LogLevel in aa-core (#275) --- examples/aa-simple-dapp/package.json | 6 +++--- examples/alchemy-daapp/package.json | 6 +++--- packages/accounts/package.json | 2 +- packages/alchemy/package.json | 2 +- packages/core/src/index.ts | 3 +-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/examples/aa-simple-dapp/package.json b/examples/aa-simple-dapp/package.json index 768f889fd4..d93393c131 100644 --- a/examples/aa-simple-dapp/package.json +++ b/examples/aa-simple-dapp/package.json @@ -9,9 +9,9 @@ "lint": "next lint" }, "dependencies": { - "@alchemy/aa-accounts": "^1.0.0", - "@alchemy/aa-alchemy": "^1.0.0", - "@alchemy/aa-core": "^1.0.0", + "@alchemy/aa-accounts": "^1.2.0", + "@alchemy/aa-alchemy": "^1.2.0", + "@alchemy/aa-core": "^1.2.0", "@t3-oss/env-core": "^0.7.1", "@t3-oss/env-nextjs": "^0.7.1", "magic-sdk": "^20.1.1", diff --git a/examples/alchemy-daapp/package.json b/examples/alchemy-daapp/package.json index ef70b1ad3b..d24806e6ca 100644 --- a/examples/alchemy-daapp/package.json +++ b/examples/alchemy-daapp/package.json @@ -9,9 +9,9 @@ "lint": "next lint" }, "dependencies": { - "@alchemy/aa-accounts": "^1.0.0", - "@alchemy/aa-alchemy": "^1.0.0", - "@alchemy/aa-core": "^1.0.0", + "@alchemy/aa-accounts": "^1.2.0", + "@alchemy/aa-alchemy": "^1.2.0", + "@alchemy/aa-core": "^1.2.0", "@chakra-ui/react": "^2.6.1", "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 74bbfbc683..5128b80e51 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@alchemy/aa-alchemy": "^1.2.0", - "@alchemy/aa-core": "^1.0.0", + "@alchemy/aa-core": "^1.2.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" diff --git a/packages/alchemy/package.json b/packages/alchemy/package.json index 750aa7f576..3dc9f8037b 100644 --- a/packages/alchemy/package.json +++ b/packages/alchemy/package.json @@ -39,7 +39,7 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "@alchemy/aa-core": "^1.0.0", + "@alchemy/aa-core": "^1.2.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 58a73e8501..b82799cbaf 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -61,5 +61,4 @@ export { resolveProperties, } from "./utils/index.js"; -export { Logger } from "./logger.js"; -export type { LogLevel } from "./logger.js"; +export { LogLevel, Logger } from "./logger.js"; From 7f71e419d3cc72adea2371099d6f7847108d1092 Mon Sep 17 00:00:00 2001 From: TABASCO <84655644+TABASCOatw@users.noreply.github.com> Date: Fri, 24 Nov 2023 14:08:57 -0700 Subject: [PATCH 68/79] Small edits to particle-network.md (#278) --- site/smart-accounts/signers/particle-network.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/site/smart-accounts/signers/particle-network.md b/site/smart-accounts/signers/particle-network.md index 7f3b9906dd..3a08ab548d 100644 --- a/site/smart-accounts/signers/particle-network.md +++ b/site/smart-accounts/signers/particle-network.md @@ -14,7 +14,7 @@ head: # Particle Network -[**Particle Network**](https://particle.network/) is the Intent-Centric, Modular Access Layer of Web3. With Particle's Wallet-as-a-Service, developers can curate unparalleled user experience through modular and customizable embedded wallet components. By utilizing MPC-TSS for key management, Particle can streamline onboarding via familiar Web2 accounts—such as Google accounts, email addresses, phone numbers, etc. +[**Particle Network**](https://particle.network/) is the Intent-Centric, Modular Access Layer of Web3. With Particle's [Smart Wallet-as-a-Service](https://blog.particle.network/announcing-our-smart-wallet-as-a-service-modular-stack-upgrading-waas-with-erc-4337), developers can curate unparalleled user experience through modular and customizable embedded wallet components. By utilizing MPC-TSS for key management, Particle can streamline onboarding via familiar Web2 accounts—such as Google accounts, email addresses, phone numbers, etc. Leveraging both Particle and Account Kit enables a streamlined onboarding flow, with social logins and signer key management being handled by Particle while Account Kit takes this experience to the next level with account abstraction - facilitating powerful user experience. @@ -22,7 +22,7 @@ Leveraging both Particle and Account Kit enables a streamlined onboarding flow, ### Sign up for a Particle Account -To configure Particle, you'll need to start by quickly signing up for a Particle account, creating a project, and then creating an application. You can learn more about this process within our [quickstart guide](https://docs.particle.network/getting-started/dashboard/manage-projects). Additionally, you can sign up through the [Particle dashboard](https://dashboard.particle.network/#/login). +To configure Particle, you'll need to start by quickly signing up for a Particle account, creating a project, and then creating an application. You can learn more about this process within their [quickstart guide](https://docs.particle.network/getting-started/dashboard/manage-projects). Additionally, you can sign up through the [Particle dashboard](https://dashboard.particle.network/#/login). ### Install the SDK @@ -82,3 +82,7 @@ const provider = new AlchemyProvider({ <<< @/snippets/particle.ts ::: + +### Video tutorial + +Particle Network has also produced a comprehensive step-by-step video tutorial detailing the above process (the utilization of Particle as a signer within Account Kit). This video can be found [here](https://twitter.com/TABASCOweb3/status/1715034613184147721). From f54185946d4953184903c68f6a589e804ff12840 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Sun, 26 Nov 2023 03:37:48 -0500 Subject: [PATCH 69/79] docs: fix link to contribute a signer (#279) --- site/smart-accounts/signers/contributing.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/site/smart-accounts/signers/contributing.md b/site/smart-accounts/signers/contributing.md index 520e0089a3..146e30fdd5 100644 --- a/site/smart-accounts/signers/contributing.md +++ b/site/smart-accounts/signers/contributing.md @@ -22,8 +22,8 @@ head: If you'd like to add your signer to this list, we welcome PRs! Here's how to do it: -1. Fork this [repo](https://github.com/OMGWINNING/aa-sdk-staging) -2. In [`site/.vitepress/config.ts`](https://github.com/OMGWINNING/aa-sdk-private/blob/main/site/.vitepress/config.ts), there is a `sidebar` property. Find the `Choosing a Signer` item and add a new entry in `items`. The `text` property of the entry is what will be visible in the sidebar and the `link` property should be `kebab-case`. This should match the file name in the next step. Place it above the `Externally Owned Account` guide. eg: +1. Fork this [repo](https://github.com/alchemyplatform/aa-sdk) +2. In [`site/.vitepress/config.ts`](https://github.com/alchemyplatform/aa-sdk/blob/main/site/.vitepress/config.ts), there is a `sidebar` property. Find the `Choosing a Signer` item and add a new entry in `items`. The `text` property of the entry is what will be visible in the sidebar and the `link` property should be `kebab-case`. This should match the file name in the next step. Place it above the `Externally Owned Account` guide. eg: ```ts{9} { @@ -44,7 +44,7 @@ If you'd like to add your signer to this list, we welcome PRs! Here's how to do } ``` -3. Add your document to [`site/smart-accounts/signers/`](https://github.com/OMGWINNING/aa-sdk-staging/tree/main/site/smart-accounts/signers) and name it `your-signer-name.md` (the name should match the `link` property you added in the previous step) +3. Add your document to [`site/smart-accounts/signers/`](https://github.com/alchemyplatform/aa-sdk/tree/main/site/smart-accounts/signers) and name it `your-signer-name.md` (the name should match the `link` property you added in the previous step) 4. Open a PR! If your `Signer` or library exports an `EIP-1193` compliant provider, you can use the `WalletClientSigner` from `aa-core` to easily integrate with Account Kit. See the ["Using Your Own Signer"](/smart-accounts/signers/custom-signer) guide for more details. From 37db7505383f5f5732518dbbddaca4dc2ce90781 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Tue, 28 Nov 2023 13:59:39 -0500 Subject: [PATCH 70/79] feat: add magic signer to aa-signers (#229) --- packages/signers/package.json | 4 + packages/signers/src/__tests__/signer.test.ts | 5 - packages/signers/src/index.ts | 1 + .../src/magic/__tests__/signer.test.ts | 119 ++++++++++++++++++ packages/signers/src/magic/index.ts | 2 + packages/signers/src/magic/signer.ts | 73 +++++++++++ packages/signers/src/magic/types.ts | 16 +++ site/.vitepress/config.ts | 14 +++ .../packages/aa-signers/magic/authenticate.md | 60 +++++++++ site/packages/aa-signers/magic/constructor.md | 64 ++++++++++ site/packages/aa-signers/magic/getAddress.md | 40 ++++++ .../aa-signers/magic/getAuthDetails.md | 47 +++++++ .../packages/aa-signers/magic/introduction.md | 81 ++++++++++++ site/packages/aa-signers/magic/signMessage.md | 44 +++++++ .../aa-signers/magic/signTypedData.md | 79 ++++++++++++ site/smart-accounts/signers/magic.md | 8 +- site/snippets/magic.ts | 23 ++-- yarn.lock | 26 +++- 18 files changed, 681 insertions(+), 25 deletions(-) delete mode 100644 packages/signers/src/__tests__/signer.test.ts create mode 100644 packages/signers/src/magic/__tests__/signer.test.ts create mode 100644 packages/signers/src/magic/index.ts create mode 100644 packages/signers/src/magic/signer.ts create mode 100644 packages/signers/src/magic/types.ts create mode 100644 site/packages/aa-signers/magic/authenticate.md create mode 100644 site/packages/aa-signers/magic/constructor.md create mode 100644 site/packages/aa-signers/magic/getAddress.md create mode 100644 site/packages/aa-signers/magic/getAuthDetails.md create mode 100644 site/packages/aa-signers/magic/introduction.md create mode 100644 site/packages/aa-signers/magic/signMessage.md create mode 100644 site/packages/aa-signers/magic/signTypedData.md diff --git a/packages/signers/package.json b/packages/signers/package.json index bebd57acf5..16affd1059 100644 --- a/packages/signers/package.json +++ b/packages/signers/package.json @@ -40,6 +40,7 @@ }, "devDependencies": { "jsdom": "^22.1.0", + "magic-sdk": "^21.3.0", "typescript": "^5.0.4", "typescript-template": "*", "vitest": "^0.31.0" @@ -60,5 +61,8 @@ "dependencies": { "@alchemy/aa-core": "^1.2.0", "viem": "^1.16.2" + }, + "optionalDependencies": { + "magic-sdk": "^21.3.0" } } diff --git a/packages/signers/src/__tests__/signer.test.ts b/packages/signers/src/__tests__/signer.test.ts deleted file mode 100644 index 9766101d70..0000000000 --- a/packages/signers/src/__tests__/signer.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe("Signer Tests", () => { - it("should work", async () => { - expect(true).toBe(true); - }); -}); diff --git a/packages/signers/src/index.ts b/packages/signers/src/index.ts index e69de29bb2..786aa535a6 100644 --- a/packages/signers/src/index.ts +++ b/packages/signers/src/index.ts @@ -0,0 +1 @@ +export { MagicSigner, type MagicAuthParams } from "./magic/index.js"; diff --git a/packages/signers/src/magic/__tests__/signer.test.ts b/packages/signers/src/magic/__tests__/signer.test.ts new file mode 100644 index 0000000000..79294e017b --- /dev/null +++ b/packages/signers/src/magic/__tests__/signer.test.ts @@ -0,0 +1,119 @@ +import { Magic } from "magic-sdk"; +import { MagicSigner } from "../signer.js"; + +describe("Magic Signer Tests", () => { + it("should correctly get address if authenticated", async () => { + const signer = await givenSigner(); + + const address = await signer.getAddress(); + expect(address).toMatchInlineSnapshot( + '"0x1234567890123456789012345678901234567890"' + ); + }); + + it("should correctly fail to get address if unauthenticated", async () => { + const signer = await givenSigner(false); + + const address = signer.getAddress(); + await expect(address).rejects.toThrowErrorMatchingInlineSnapshot( + '"Not authenticated"' + ); + }); + + it("should correctly get auth details if authenticated", async () => { + const signer = await givenSigner(); + + const details = await signer.getAuthDetails(); + expect(details).toMatchInlineSnapshot(` + { + "email": "test", + "isMfaEnabled": false, + "issuer": null, + "phoneNumber": "1234567890", + "publicAddress": "0x1234567890123456789012345678901234567890", + "recoveryFactors": [], + } + `); + }); + + it("should correctly fail to get auth details if unauthenticated", async () => { + const signer = await givenSigner(false); + + const details = signer.getAuthDetails(); + await expect(details).rejects.toThrowErrorMatchingInlineSnapshot( + '"Not authenticated"' + ); + }); + + it("should correctly sign message if authenticated", async () => { + const signer = await givenSigner(); + + const signMessage = await signer.signMessage("test"); + expect(signMessage).toMatchInlineSnapshot('"0xtest"'); + }); + + it("should correctly fail to sign message if unauthenticated", async () => { + const signer = await givenSigner(false); + + const signMessage = signer.signMessage("test"); + await expect(signMessage).rejects.toThrowErrorMatchingInlineSnapshot( + '"Not authenticated"' + ); + }); + + it("should correctly sign typed data if authenticated", async () => { + const signer = await givenSigner(); + + const typedData = { + types: { + Request: [{ name: "hello", type: "string" }], + }, + primaryType: "Request", + message: { + hello: "world", + }, + }; + const signTypedData = await signer.signTypedData(typedData); + expect(signTypedData).toMatchInlineSnapshot('"0xtest"'); + }); +}); + +const givenSigner = async (auth = true) => { + const inner = new Magic("test"); + + inner.user.getInfo = vi.fn().mockResolvedValue({ + publicAddress: "0x1234567890123456789012345678901234567890", + issuer: null, + email: "test", + phoneNumber: "1234567890", + isMfaEnabled: false, + recoveryFactors: [], + }); + + inner.wallet.getProvider = vi.fn().mockResolvedValue({ + request: ({ method }: { method: string; params: any[] }) => { + switch (method) { + case "eth_accounts": + return Promise.resolve([ + "0x1234567890123456789012345678901234567890", + ]); + case "personal_sign": + return Promise.resolve("0xtest"); + case "eth_signTypedData_v4": + return Promise.resolve("0xtest"); + default: + return Promise.reject(new Error("Method not found")); + } + }, + }); + + const signer = new MagicSigner({ inner }); + + if (auth) { + await signer.authenticate({ + authenticate: () => Promise.resolve(), + }); + } + + return signer; +}; diff --git a/packages/signers/src/magic/index.ts b/packages/signers/src/magic/index.ts new file mode 100644 index 0000000000..74393239dc --- /dev/null +++ b/packages/signers/src/magic/index.ts @@ -0,0 +1,2 @@ +export { MagicSigner } from "./signer.js"; +export type * from "./types.js"; diff --git a/packages/signers/src/magic/signer.ts b/packages/signers/src/magic/signer.ts new file mode 100644 index 0000000000..6d86ce128c --- /dev/null +++ b/packages/signers/src/magic/signer.ts @@ -0,0 +1,73 @@ +import { + WalletClientSigner, + type SignTypedDataParams, + type SmartAccountAuthenticator, +} from "@alchemy/aa-core"; +import { Magic, type MagicUserMetadata } from "magic-sdk"; +import { createWalletClient, custom, type Hash } from "viem"; +import type { MagicAuthParams, MagicSDKParams } from "./types.js"; + +/** + * This class requires the `magic-sdk` dependency. + * `@alchemy/aa-signers` lists it as an optional dependency. + * + * @see: https://github.com/magiclabs/magic-js) + */ +export class MagicSigner + implements + SmartAccountAuthenticator +{ + inner: Magic; + private signer: WalletClientSigner | undefined; + + constructor(params: MagicSDKParams | { inner: Magic }) { + if ("inner" in params) { + this.inner = params.inner; + return; + } + + this.inner = new Magic(params.apiKey, params.options); + } + + readonly signerType = "magic"; + + getAddress = async () => { + if (!this.signer) throw new Error("Not authenticated"); + + const address = (await this.inner.user.getInfo()).publicAddress; + if (address == null) throw new Error("No address found"); + + return address as Hash; + }; + + signMessage = async (msg: Uint8Array | string) => { + if (!this.signer) throw new Error("Not authenticated"); + + return this.signer.signMessage(msg); + }; + + signTypedData = (params: SignTypedDataParams) => { + if (!this.signer) throw new Error("Not authenticated"); + + return this.signer.signTypedData(params); + }; + + authenticate = async (params: MagicAuthParams) => { + await params.authenticate(); + + this.signer = new WalletClientSigner( + createWalletClient({ + transport: custom(await this.inner.wallet.getProvider()), + }), + this.signerType + ); + + return this.inner.user.getInfo(); + }; + + getAuthDetails = async () => { + if (!this.signer) throw new Error("Not authenticated"); + + return this.inner.user.getInfo(); + }; +} diff --git a/packages/signers/src/magic/types.ts b/packages/signers/src/magic/types.ts new file mode 100644 index 0000000000..8b945c4153 --- /dev/null +++ b/packages/signers/src/magic/types.ts @@ -0,0 +1,16 @@ +import type { + MagicSDKAdditionalConfiguration, + MagicSDKExtensionsOption, +} from "magic-sdk"; + +export interface MagicAuthParams { + authenticate: () => Promise; +} + +export type MagicSDKParams = { + apiKey: string; + options?: MagicSDKAdditionalConfiguration< + string, + MagicSDKExtensionsOption + >; +}; diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index a5dc0375e2..6d62fd17bd 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -629,6 +629,20 @@ export default defineConfig({ text: "Getting Started", link: "/", }, + { + text: "Magic Signer", + collapsed: true, + base: "/packages/aa-signers/magic", + items: [ + { text: "Introduction", link: "/introduction" }, + { text: "constructor", link: "/constructor" }, + { text: "authenticate", link: "/authenticate" }, + { text: "getAddress", link: "/getAddress" }, + { text: "signMessage", link: "/signMessage" }, + { text: "signTypedData", link: "/signTypedData" }, + { text: "getAuthDetails", link: "/getAuthDetails" }, + ], + }, { text: "Contributing", link: "/contributing" }, ], }, diff --git a/site/packages/aa-signers/magic/authenticate.md b/site/packages/aa-signers/magic/authenticate.md new file mode 100644 index 0000000000..71dda1ceb2 --- /dev/null +++ b/site/packages/aa-signers/magic/authenticate.md @@ -0,0 +1,60 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: MagicSigner • authenticate + - - meta + - name: description + content: Overview of the authenticate method on MagicSigner + - - meta + - property: og:description + content: Overview of the authenticate method on MagicSigner +--- + +# authenticate + +`authenticate` is a method on the `MagicSigner` which leverages the `Magic` web SDK to authenticate a user. + +This method must be called before accessing the other methods available on the `MagicSigner`, such as signing messages or typed data or accessing user details. + +## Usage + +::: code-group + +```ts [example.ts] +// [!code focus:99] +import { MagicSigner } from "@alchemy/aa-signers"; + +const magicSigner = new MagicSigner({ apiKey: MAGIC_API_KEY }); +const authParams = { + authenticate: async () => { + await magicSigner.inner.wallet.connectWithUI(); + }, +}; + +await magicSigner.authenticate(authParams); +``` + +::: + +## Returns + +### `Promise` + +A Promise containing the `MagicUserMetadata`, and object with the following fields: + +- `issuer: string | null` -- the Decentralized ID of the user. +- `publicAddress: string | null` -- the authenticated user's public address (EOA public key). +- `email: string | null` -- email address of the authenticated user. +- `phoneNumber: string | null` -- phone number of the authenticated user. +- `isMfaEnabled: boolean` -- whether or not multi-factor authentication is enabled for the user. +- `recoveryFactors: RecoveryFactor[]` -- any recovery methods that have been enabled (ex. `[{ type: 'phone_number', value: '+99999999' }]`). + +## Parameters + +### `authParams: ` + +An object with the following fields: + +- `authenticate: () => Promise` -- a method you can define as necessary to leverage the `Magic` SDK for authentication. For instance, in the example above, `authenticate` uses the [`connectWithUI`](https://magic.link/docs/api/client-side-sdks/web#connectwithui) method. diff --git a/site/packages/aa-signers/magic/constructor.md b/site/packages/aa-signers/magic/constructor.md new file mode 100644 index 0000000000..a55b6266d2 --- /dev/null +++ b/site/packages/aa-signers/magic/constructor.md @@ -0,0 +1,64 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: MagicSigner • constructor + - - meta + - name: description + content: Overview of the constructor method on MagicSigner in aa-signers + - - meta + - property: og:description + content: Overview of the constructor method on MagicSigner in aa-signers +--- + +# constructor + +To initialize a `MagicSigner`, you must provide a set of parameters detailed below. + +## Usage + +::: code-group + +```ts [example.ts] +import { MagicSigner } from "@alchemy/aa-signers"; + +// instantiates using every possible parameter, as a reference +const magicSigner = new MagicSigner({ + apiKey: "MAGIC_API_KEY", + options: { + endpoint: "MAGIC_IFRAME_URL", + locale: "en_US", + network: "sepolia", + testMode: false, + }, +}); +``` + +::: + +## Returns + +### `MagicSigner` + +A new instance of a `MagicSigner`. + +## Parameters + +### `params: MagicSDKParams | { inner: Magic }` + +You can either pass in a constructed `Magic` object, or directly pass into the `MagicSigner` the `MagicSDKParams` used to construct a `Magic` object. These parameters are listed on the [Magic Docs](https://magic.link/docs/api/client-side-sdks/web#constructor-NaN) as well. + +`MagicSDKParams` takes in the following parameters: + +- `apiKey: string` -- a Magic API Key. You can get one at [Magic Dashboard](https://dashboard.magic.link/). + +- `options: MagicSDKAdditionalConfiguration` -- [optional] + + - `endpoint: string` -- [optional] a URL pointing to the Magic `` + +A Promise containing the address of the Signer. diff --git a/site/packages/aa-signers/magic/getAuthDetails.md b/site/packages/aa-signers/magic/getAuthDetails.md new file mode 100644 index 0000000000..80e49b12c8 --- /dev/null +++ b/site/packages/aa-signers/magic/getAuthDetails.md @@ -0,0 +1,47 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: MagicSigner • getAuthDetails + - - meta + - name: description + content: Overview of the getAuthDetails method on MagicSigner + - - meta + - property: og:description + content: Overview of the getAuthDetails method on MagicSigner +--- + +# getAuthDetails + +`getAuthDetails` returns the details about the authenticated user, in accordance with the `Magic` web SDK's [specifications](https://magic.link/docs/api/client-side-sdks/web#getinfo). + +This method must be called after [`authenticate`](/packages/aa-signers/magic/authenticate). Otherwise, this method will throw an error with the message `Not Authenticated`. + +## Usage + +::: code-group + +```ts [example.ts] +import { createMagicSigner } from "./magic"; +// [!code focus:99] +const magicSigner = await createMagicSigner(); + +const details = await magicSigner.getAuthDetails(); +``` + +<<< @/snippets/magic.ts +::: + +## Returns + +### `Promise` + +A Promise containing the `MagicUserMetadata`, and object with the following fields: + +- `issuer: string | null` -- the Decentralized ID of the user. +- `publicAddress: string | null` -- the authenticated user's public address (EOA public key). +- `email: string | null` -- email address of the authenticated user. +- `phoneNumber: string | null` -- phone number of the authenticated user. +- `isMfaEnabled: boolean` -- whether or not multi-factor authentication is enabled for the user. +- `recoveryFactors: RecoveryFactor[]` -- any recovery methods that have been enabled (ex. `[{ type: 'phone_number', value: '+99999999' }]`). diff --git a/site/packages/aa-signers/magic/introduction.md b/site/packages/aa-signers/magic/introduction.md new file mode 100644 index 0000000000..ee13213812 --- /dev/null +++ b/site/packages/aa-signers/magic/introduction.md @@ -0,0 +1,81 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: MagicSigner + - - meta + - name: description + content: Overview of the MagicSigner class in aa-signers + - - meta + - property: og:description + content: Overview of the MagicSigner class in aa-signers +--- + +# Magic Signer + +`MagicSigner` is a signer implementation which extends `SmartAccountAuthenticator` to leverage the [Magic web SDK](https://magic.link/docs/api/client-side-sdks/web). It supports features such as authentication, message and typed data signing, and authentication details retrieval. + +`MagicSigner` provides implementations for all methods on `SmartAccountAuthenticator`: + +1. [`authenticate`](/packages/aa-signers/magic/authenticate) -- supports user authentication. +2. [`getAddress`](/packages/aa-signers/magic/getAddress) -- supports typed data signatures from the smart contract account's owner address. +3. [`signMessage`](/packages/aa-signers/magic/signMessage) -- supports message signatures. +4. [`signTypedData`](/packages/aa-signers/magic/signTypedData) -- supports typed data signatures. +5. [`getAuthDetails`](/packages/aa-signers/magic/getAuthDetails) -- supports authentication details retrieval. + +## Install Dependencies + +`MagicSigner` requires installation of the [`magic-sdk`](https://github.com/magiclabs/magic-js) SDK. `aa-signers` lists it as an optional dependency. + +::: code-group + +```bash [npm] +npm i -s magic-sdk +``` + +```bash [yarn] +yarn add magic-sdk +``` + +## Usage + +::: code-group + +```ts [example.ts] +import { MagicSigner } from "@alchemy/aa-signers"; + +const magicSigner = new MagicSigner({ apiKey: "MAGIC_API_KEY" }); + +const authParams = { + authenticate: async () => { + await magicSigner.inner.wallet.connectWithUI(); + }, +}; +await magicSigner.authenticate(authParams); + +const address = await magicSigner.getAddress(); + +const details = await magicSigner.getAuthDetails(); + +const signedMessage = await magicSigner.signMessage("test"); + +const typedData = { + types: { + Request: [{ name: "hello", type: "string" }], + }, + primaryType: "Request", + message: { + hello: "world", + }, +}; +const signTypedData = await signer.signTypedData(typedData); +``` + +<<< @/snippets/magic.ts +::: + +## Developer Links + +- [Magic web SDK](https://magic.link/docs/api/client-side-sdks/web) +- [MagicSigner Tests](https://github.com/alchemyplatform/aa-sdk/blob/main/packages/signers/src/magic/__tests__/signer.test.ts) diff --git a/site/packages/aa-signers/magic/signMessage.md b/site/packages/aa-signers/magic/signMessage.md new file mode 100644 index 0000000000..5da186a7ba --- /dev/null +++ b/site/packages/aa-signers/magic/signMessage.md @@ -0,0 +1,44 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: MagicSigner • signMessage + - - meta + - name: description + content: Overview of the signMessage method on MagicSigner + - - meta + - property: og:description + content: Overview of the signMessage method on MagicSigner +--- + +# signMessage + +`signMessage` supports signing messages from the `MagicSigner`. + +This method must be called after [`authenticate`](/packages/aa-signers/magic/authenticate). Otherwise, this method will throw an error with the message `Not Authenticated`. + +## Usage + +::: code-group + +```ts [example.ts] +import { createMagicSigner } from "./magic"; +// [!code focus:99] +const magicSigner = await createMagicSigner(); + +const signedMessage = await magicSigner.signMessage("test"); +``` + +<<< @/snippets/magic.ts +::: + +## Returns + +### `Promise` + +A Promise containing the signature of the message. + +## Parameters + +### `msg: string | Uint8Array)` -- the message to sign diff --git a/site/packages/aa-signers/magic/signTypedData.md b/site/packages/aa-signers/magic/signTypedData.md new file mode 100644 index 0000000000..768ddaea0e --- /dev/null +++ b/site/packages/aa-signers/magic/signTypedData.md @@ -0,0 +1,79 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: MagicSigner • signTypedData + - - meta + - name: description + content: Overview of the signTypedData method on MagicSigner + - - meta + - property: og:description + content: Overview of the signTypedData method on MagicSigner +--- + +# signTypedData + +`signTypedData` supports signing typed data from the `MagicSigner`. + +This method must be called after [`authenticate`](/packages/aa-signers/magic/authenticate). Otherwise, this method will throw an error with the message `Not Authenticated`. + +## Usage + +::: code-group + +```ts [example.ts] +import { createMagicSigner } from "./magic"; +// [!code focus:99] +const magicSigner = await createMagicSigner(); + +const signedTypedData = await magicSigner.signTypedData({ + domain: { + name: "Ether Mail", + version: "1", + chainId: 1, + verifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + }, + types: { + Person: [ + { name: "name", type: "string" }, + { name: "wallet", type: "address" }, + ], + Mail: [ + { name: "from", type: "Person" }, + { name: "to", type: "Person" }, + { name: "contents", type: "string" }, + ], + }, + primaryType: "Mail", + message: { + from: { + name: "Cow", + wallet: "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", + }, + to: { + name: "Bob", + wallet: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB", + }, + contents: "Hello, Bob!", + }, +}); +``` + +<<< @/snippets/magic.ts +::: + +## Returns + +### `Promise` + +A Promise containing the signature of the typed data. + +## Parameters + +### `params: SignTypedDataParams` -- the typed data to sign + +- `domain: TypedDataDomain` -- The typed data domain +- `types: Object` -- the type definitions for the typed data +- `primaryType: inferred String` -- the primary type to extract from types and use in value +- `message: inferred from types & primaryType` -- the message, inferred from diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index 4d0927a8a7..fbb3aac551 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -22,12 +22,14 @@ head: [Magic](https://magic.link) is an embedded wallet provider that allows users to generate wallets scoped to your application via Social Logins, Email OTP, or Webauthn. This is great for enabling a better experience for your users. But ultimately these wallets are not much different from EOA's, so you don't have the benefit of Account Abstraction (gas sponsorship, batching, etc). -Combining Magic with Account Kit allows you to get the best of both worlds. You can use Magic to generate a wallet scoped to your application, and then use Account Kit to create Smart Contract Accounts for your users! +Combining Magic with Account Kit allows you to get the best of both worlds. You can use Magic via the [`aa-signers`](/packages/aa-signers/magic/introduction) package to generate a wallet scoped to your application, and then use [`aa-alchemy`](/packages/aa-alchemy/index) to create smart accounts for your users! ## Integration ### Install the SDK +Using `MagicSigner` in the `aa-signers` package requires installation of the [`magic-sdk`](https://github.com/magiclabs/magic-js) SDK. `aa-signers` lists it as optional dependency. + ::: code-group ```bash [npm] @@ -40,9 +42,9 @@ yarn add magic-sdk ::: -### Create a SmartAccountSigner +### Create a MagicSigner -Next, setup the magic sdk and create a `SmartAccountSigner`: +Next, setup the magic sdk and create an authenticated `MagicSigner` using the `aa-signers` package: <<< @/snippets/magic.ts diff --git a/site/snippets/magic.ts b/site/snippets/magic.ts index 5bc709000c..448429dc3c 100644 --- a/site/snippets/magic.ts +++ b/site/snippets/magic.ts @@ -1,25 +1,16 @@ -import { WalletClientSigner } from "@alchemy/aa-core"; -import { Magic } from "magic-sdk"; -import { createWalletClient, custom } from "viem"; +import { MagicSigner } from "@alchemy/aa-signers"; // this is generated from the [Magic Dashboard](https://dashboard.magic.link/) const MAGIC_API_KEY = "pk_test_..."; -// instantiate Magic SDK instance -export const magic = new Magic(MAGIC_API_KEY); - -// NOTE: because this is async, you will need to put this in a useEffect hook if using React export const createMagicSigner = async () => { - // 1. Authenticate the user (for other methods see magic docs https://magic.link/docs/dedicated/overview) - await magic.wallet.connectWithUI(); + const magicSigner = new MagicSigner({ apiKey: MAGIC_API_KEY }); - // 2. create a wallet client - const magicClient = createWalletClient({ - transport: custom(await magic.wallet.getProvider()), + await magicSigner.authenticate({ + authenticate: async () => { + await magicSigner.inner.wallet.connectWithUI(); + }, }); - return new WalletClientSigner( - magicClient, - "magic" // signerType - ); + return magicSigner; }; diff --git a/yarn.lock b/yarn.lock index b17e05c71c..0d7c431ad4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3090,6 +3090,11 @@ resolved "https://registry.yarnpkg.com/@magic-sdk/commons/-/commons-16.1.1.tgz#fd9394552389b629f9d34bceca606d8f46fe3b15" integrity sha512-ZNknl69zTYIdo4rLO9I8yk4pTSTczZHDXMeZcnLKy992L7arcZ/yGgF9qCqMbp7cOubRRVImFH2jLMM/DeO85w== +"@magic-sdk/commons@^17.3.0": + version "17.3.0" + resolved "https://registry.yarnpkg.com/@magic-sdk/commons/-/commons-17.3.0.tgz#cd072091fa8987863a15d513f3dd7f0d37a322b8" + integrity sha512-pFn42BuevncBNHhKl5ehWL3yPkkQAzugj1uF5OxS6WoyLhWdWE6RTcIEA5fz6BB/C+mWSo6cHCXSmofznq5irw== + "@magic-sdk/provider@^20.1.1": version "20.1.1" resolved "https://registry.yarnpkg.com/@magic-sdk/provider/-/provider-20.1.1.tgz#325c8c73c57a1bc05457289e924b472abf791c2e" @@ -3099,7 +3104,16 @@ eventemitter3 "^4.0.4" web3-core "1.5.2" -"@magic-sdk/types@^17.0.2": +"@magic-sdk/provider@^21.3.0": + version "21.3.0" + resolved "https://registry.yarnpkg.com/@magic-sdk/provider/-/provider-21.3.0.tgz#df7416e037776b9df431487c600fe95ea985cd97" + integrity sha512-yUqMpPMLUlj9aDdYNc41QhLwhKHBOox81tADfngUDLcWYrnMGsVKimNiE76BlR+fXchqTk0V+aRfdaWGTnTy7Q== + dependencies: + "@magic-sdk/types" "^17.2.0" + eventemitter3 "^4.0.4" + web3-core "1.5.2" + +"@magic-sdk/types@^17.0.2", "@magic-sdk/types@^17.2.0": version "17.2.0" resolved "https://registry.yarnpkg.com/@magic-sdk/types/-/types-17.2.0.tgz#3e554748808e2f35ca5bb9ceda0cdf88d2ce6d35" integrity sha512-VJmGP+DwMnuIuMLb+IDHNAkYLcHH+XqPwHb6mcLNI9e30CDMXoFN60hmdhDRZLjI9JF/NPS3eEsd40Xz6Iih2A== @@ -9617,6 +9631,16 @@ magic-sdk@^20.1.1: "@magic-sdk/types" "^17.0.2" localforage "^1.7.4" +magic-sdk@^21.3.0: + version "21.3.0" + resolved "https://registry.yarnpkg.com/magic-sdk/-/magic-sdk-21.3.0.tgz#5a3c5631e477ef6817c98484f09960c2ba0e21a9" + integrity sha512-Z17ASQyw+D+iLgy4uqWdcxcatC+npOsMYYQCLJeoEV5axLZJi5JUCVPljWwGjnNBSXni0zm8qwJvrY8g/H+Zog== + dependencies: + "@magic-sdk/commons" "^17.3.0" + "@magic-sdk/provider" "^21.3.0" + "@magic-sdk/types" "^17.2.0" + localforage "^1.7.4" + magic-string@^0.30.0, magic-string@^0.30.5: version "0.30.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" From 4368d08d9109b63f3bc3dc6b6da2d8cea430c670 Mon Sep 17 00:00:00 2001 From: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:04:40 -0500 Subject: [PATCH 71/79] feat: add web3auth signer to aa-signers (#247) --- packages/signers/package.json | 4 + packages/signers/src/index.ts | 4 + .../src/web3auth/__tests__/signer.test.ts | 136 +++ packages/signers/src/web3auth/index.ts | 2 + packages/signers/src/web3auth/signer.ts | 93 ++ packages/signers/src/web3auth/types.ts | 8 + site/.vitepress/config.ts | 14 + .../aa-signers/web3auth/authenticate.md | 76 ++ .../aa-signers/web3auth/constructor.md | 114 +++ .../aa-signers/web3auth/getAddress.md | 40 + .../aa-signers/web3auth/getAuthDetails.md | 55 ++ .../aa-signers/web3auth/introduction.md | 76 ++ .../aa-signers/web3auth/signMessage.md | 44 + .../aa-signers/web3auth/signTypedData.md | 79 ++ site/smart-accounts/signers/web3auth.md | 12 +- site/snippets/web3auth.ts | 44 +- yarn.lock | 841 +++++++++++++++++- 17 files changed, 1601 insertions(+), 41 deletions(-) create mode 100644 packages/signers/src/web3auth/__tests__/signer.test.ts create mode 100644 packages/signers/src/web3auth/index.ts create mode 100644 packages/signers/src/web3auth/signer.ts create mode 100644 packages/signers/src/web3auth/types.ts create mode 100644 site/packages/aa-signers/web3auth/authenticate.md create mode 100644 site/packages/aa-signers/web3auth/constructor.md create mode 100644 site/packages/aa-signers/web3auth/getAddress.md create mode 100644 site/packages/aa-signers/web3auth/getAuthDetails.md create mode 100644 site/packages/aa-signers/web3auth/introduction.md create mode 100644 site/packages/aa-signers/web3auth/signMessage.md create mode 100644 site/packages/aa-signers/web3auth/signTypedData.md diff --git a/packages/signers/package.json b/packages/signers/package.json index 16affd1059..079cdc743d 100644 --- a/packages/signers/package.json +++ b/packages/signers/package.json @@ -39,6 +39,8 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { + "@web3auth/base": "^7.1.0", + "@web3auth/modal": "^7.1.1", "jsdom": "^22.1.0", "magic-sdk": "^21.3.0", "typescript": "^5.0.4", @@ -63,6 +65,8 @@ "viem": "^1.16.2" }, "optionalDependencies": { + "@web3auth/base": "^7.1.0", + "@web3auth/modal": "^7.1.1", "magic-sdk": "^21.3.0" } } diff --git a/packages/signers/src/index.ts b/packages/signers/src/index.ts index 786aa535a6..c78d42b0eb 100644 --- a/packages/signers/src/index.ts +++ b/packages/signers/src/index.ts @@ -1 +1,5 @@ export { MagicSigner, type MagicAuthParams } from "./magic/index.js"; +export { + Web3AuthSigner, + type Web3AuthAuthenticationParams, +} from "./web3auth/index.js"; diff --git a/packages/signers/src/web3auth/__tests__/signer.test.ts b/packages/signers/src/web3auth/__tests__/signer.test.ts new file mode 100644 index 0000000000..d5d82de037 --- /dev/null +++ b/packages/signers/src/web3auth/__tests__/signer.test.ts @@ -0,0 +1,136 @@ +import type { RequestArguments } from "@web3auth/base"; +import { Web3Auth } from "@web3auth/modal"; +import { Web3AuthSigner } from "../signer.js"; + +describe("Web3Auth Signer Tests", () => { + it("should correctly get address", async () => { + const signer = await givenSigner(); + + const address = await signer.getAddress(); + expect(address).toMatchInlineSnapshot( + '"0x1234567890123456789012345678901234567890"' + ); + }); + + it("should correctly fail to get address if unauthenticated", async () => { + const signer = await givenSigner(false); + + const address = signer.getAddress(); + await expect(address).rejects.toThrowErrorMatchingInlineSnapshot( + '"Not authenticated"' + ); + }); + + it("should correctly get auth details", async () => { + const signer = await givenSigner(); + + const details = await signer.getAuthDetails(); + expect(details).toMatchInlineSnapshot(` + { + "aggregateVerifier": "aggregateVerifier", + "dappShare": "dappShare", + "email": "email", + "idToken": "idToken", + "name": "name", + "oAuthAccessToken": "oAuthAccessToken", + "oAuthIdToken": "oAuthIdToken", + "profileImage": "profileImage", + "typeOfLogin": "typeOfLogin", + "verifier": "verifier", + "verifierId": "verifierId", + } + `); + }); + + it("should correctly fail to get auth details if unauthenticated", async () => { + const signer = await givenSigner(false); + + const details = signer.getAuthDetails(); + await expect(details).rejects.toThrowErrorMatchingInlineSnapshot( + '"Not authenticated"' + ); + }); + + it("should correctly sign message if authenticated", async () => { + const signer = await givenSigner(); + + const signMessage = await signer.signMessage("test"); + expect(signMessage).toMatchInlineSnapshot('"0xtest"'); + }); + + it("should correctly fail to sign message if unauthenticated", async () => { + const signer = await givenSigner(false); + + const signMessage = signer.signMessage("test"); + await expect(signMessage).rejects.toThrowErrorMatchingInlineSnapshot( + '"Not authenticated"' + ); + }); + + it("should correctly sign typed data if authenticated", async () => { + const signer = await givenSigner(); + + const typedData = { + types: { + Request: [{ name: "hello", type: "string" }], + }, + primaryType: "Request", + message: { + hello: "world", + }, + }; + const signTypedData = await signer.signTypedData(typedData); + expect(signTypedData).toMatchInlineSnapshot('"0xtest"'); + }); +}); + +const givenSigner = async (auth = true) => { + const inner = new Web3Auth({ + clientId: "test", + chainConfig: { + chainNamespace: "eip155", + }, + }); + + inner.getUserInfo = vi.fn().mockResolvedValue({ + email: "email", + name: "name", + profileImage: "profileImage", + aggregateVerifier: "aggregateVerifier", + verifier: "verifier", + verifierId: "verifierId", + typeOfLogin: "typeOfLogin", + dappShare: "dappShare", + idToken: "idToken", + oAuthIdToken: "oAuthIdToken", + oAuthAccessToken: "oAuthAccessToken", + }); + + vi.spyOn(inner, "provider", "get").mockReturnValue({ + request: (args: RequestArguments) => { + switch (args.method) { + case "eth_accounts": + return Promise.resolve([ + "0x1234567890123456789012345678901234567890", + ]) as R; + case "personal_sign": + return Promise.resolve("0xtest") as R; + case "eth_signTypedData_v4": + return Promise.resolve("0xtest") as R; + default: + return Promise.reject(new Error("Method not found")); + } + }, + } as any); + + const signer = new Web3AuthSigner({ inner }); + + if (auth) { + await signer.authenticate({ + init: () => Promise.resolve(), + connect: () => Promise.resolve(), + }); + } + + return signer; +}; diff --git a/packages/signers/src/web3auth/index.ts b/packages/signers/src/web3auth/index.ts new file mode 100644 index 0000000000..6a6cc462fe --- /dev/null +++ b/packages/signers/src/web3auth/index.ts @@ -0,0 +1,2 @@ +export { Web3AuthSigner } from "./signer.js"; +export type * from "./types.js"; diff --git a/packages/signers/src/web3auth/signer.ts b/packages/signers/src/web3auth/signer.ts new file mode 100644 index 0000000000..23f1ff22a0 --- /dev/null +++ b/packages/signers/src/web3auth/signer.ts @@ -0,0 +1,93 @@ +import { + WalletClientSigner, + type SignTypedDataParams, + type SmartAccountAuthenticator, +} from "@alchemy/aa-core"; +import { Web3Auth, type Web3AuthOptions } from "@web3auth/modal"; +import { createWalletClient, custom, type Hash } from "viem"; +import type { + Web3AuthAuthenticationParams, + Web3AuthUserInfo, +} from "./types.js"; + +/** + * This class requires the `@web3auth/modal` and `@web3auth/base dependencies. + * `@alchemy/aa-signers` lists them as optional dependencies. + * + * @see: https://github.com/Web3Auth/web3auth-web/tree/master/packages/modal + * @see: https://github.com/Web3Auth/web3auth-web/tree/master/packages/base + */ +export class Web3AuthSigner + implements + SmartAccountAuthenticator< + Web3AuthAuthenticationParams, + Web3AuthUserInfo, + Web3Auth + > +{ + inner: Web3Auth; + private signer: WalletClientSigner | undefined; + + constructor(params: Web3AuthOptions | { inner: Web3Auth }) { + if ("inner" in params) { + this.inner = params.inner; + return; + } + + this.inner = new Web3Auth(params); + } + + readonly signerType = "web3auth"; + + getAddress = async () => { + if (!this.signer) throw new Error("Not authenticated"); + + const address = await this.signer.getAddress(); + if (address == null) throw new Error("No address found"); + + return address as Hash; + }; + + signMessage = async (msg: Uint8Array | string) => { + if (!this.signer) throw new Error("Not authenticated"); + + return this.signer.signMessage(msg); + }; + + signTypedData = (params: SignTypedDataParams) => { + if (!this.signer) throw new Error("Not authenticated"); + + return this.signer.signTypedData(params); + }; + + authenticate = async ( + params: Web3AuthAuthenticationParams = { + init: async () => { + await this.inner.initModal(); + }, + connect: async () => { + await this.inner.connect(); + }, + } + ) => { + await params.init(); + await params.connect(); + + if (this.inner.provider == null) throw new Error("No provider found"); + + this.signer = new WalletClientSigner( + createWalletClient({ + transport: custom(this.inner.provider), + }), + this.signerType + ); + + return this.inner.getUserInfo(); + }; + + getAuthDetails = async () => { + if (!this.signer) throw new Error("Not authenticated"); + + return this.inner.getUserInfo(); + }; +} diff --git a/packages/signers/src/web3auth/types.ts b/packages/signers/src/web3auth/types.ts new file mode 100644 index 0000000000..0b60140761 --- /dev/null +++ b/packages/signers/src/web3auth/types.ts @@ -0,0 +1,8 @@ +import type { UserInfo } from "@web3auth/base"; + +export interface Web3AuthAuthenticationParams { + init: () => Promise; + connect: () => Promise; +} + +export type Web3AuthUserInfo = Partial; diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index 6d62fd17bd..5b117d43ba 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -643,6 +643,20 @@ export default defineConfig({ { text: "getAuthDetails", link: "/getAuthDetails" }, ], }, + { + text: "Web3Auth Signer", + collapsed: true, + base: "/packages/aa-signers/web3auth", + items: [ + { text: "Introduction", link: "/introduction" }, + { text: "constructor", link: "/constructor" }, + { text: "authenticate", link: "/authenticate" }, + { text: "getAddress", link: "/getAddress" }, + { text: "signMessage", link: "/signMessage" }, + { text: "signTypedData", link: "/signTypedData" }, + { text: "getAuthDetails", link: "/getDgetAuthDetailsetails" }, + ], + }, { text: "Contributing", link: "/contributing" }, ], }, diff --git a/site/packages/aa-signers/web3auth/authenticate.md b/site/packages/aa-signers/web3auth/authenticate.md new file mode 100644 index 0000000000..d0dc39b910 --- /dev/null +++ b/site/packages/aa-signers/web3auth/authenticate.md @@ -0,0 +1,76 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Web3AuthSigner • authenticate + - - meta + - name: description + content: Overview of the authenticate method on Web3AuthSigner + - - meta + - property: og:description + content: Overview of the authenticate method on Web3AuthSigner +--- + +# authenticate + +`authenticate` is a method on the `Web3AuthSigner` which leverages the `web3auth` web modal SDK to authenticate a user. + +You must call this method before accessing the other methods available on the `Web3AuthSigner`, such as signing messages or typed data or accessing user details. + +## Usage + +::: code-group + +```ts [example.ts] +// [!code focus:99] +import { Web3AuthSigner } from "@alchemy/aa-signers"; + +const web3AuthSigner = new Web3AuthSigner({ + clientId: "test", + chainConfig: { + chainNamespace: "eip155", + }, +}); + +await web3AuthSigner.authenticate({ + init: async () => { + await web3AuthSigner.inner.initModal(); + }, + connect: async () => { + await web3AuthSigner.inner.connect(); + }, +}); +``` + +::: + +## Returns + +### `Promise` + +A Promise containing the `Web3AuthUserInfo`, an object with the following fields: + +- `verifier: string` -- details of the verifier (verifier type, ie. torus, metamask, openlogin etc.). +- `verifierId: string` -- id of the verifier. +- `typeOfLogin: LOGIN_PROVIDER_TYPE` -- the type of login done by the user (like google, facebook, twitter, github, etc.). +- `email: string` -- [optional] the decentralized ID of the user. +- `name: string` -- [optional] the name of the authenticated user. +- `profileImage: string` -- [optional] the profile image of the connected user +- `aggregateVerifier: string` -- [optional] the details of the aggregate verifier. +- `dappShare: string` -- [optional] if you are using a Custom Verifier, you can get a dapp share after successful login to replace device share. +- `idToken: string` -- [optional] the id of the token issued by Web3Auth. +- `oAuthIdToken: string` -- [optional] the id of the token issued by the OAuth provider. +- `oAuthAccessToken: string` -- [optional] the access token issued by the OAuth provider. +- `isMfaEnabled: boolean` -- [optional] whether or not multi-factor authentication is enabled for the user. +- `touchIDPreference: string` -- [optional] +- `isMfaEnabled: boolean` -- [optional] whether or not multi-factor authentication is enabled for the user. + +## Parameters + +### `authParams: ` + +An object with the following fields: + +- `init: () => Promise` -- a method you can define as necessary to leverage the `web3auth` SDK for authentication. For instance, in the example above, `authenticate` uses the [`initModal`](https://web3auth.io/docs/sdk/pnp/web/modal/initialize#initmodal) method. +- `connect: () => Promise` -- a method you can define as necessary to leverage the `web3auth` SDK for authentication. For instance, in the example above, `authenticate` uses the [`connect`](https://web3auth.io/docs/sdk/pnp/web/modal/usage) method. diff --git a/site/packages/aa-signers/web3auth/constructor.md b/site/packages/aa-signers/web3auth/constructor.md new file mode 100644 index 0000000000..5a5f9139a7 --- /dev/null +++ b/site/packages/aa-signers/web3auth/constructor.md @@ -0,0 +1,114 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Web3AuthSigner • constructor + - - meta + - name: description + content: Overview of the constructor method on Web3AuthSigner in aa-signers + - - meta + - property: og:description + content: Overview of the constructor method on Web3AuthSigner in aa-signers +--- + +# constructor + +To initialize a `Web3AuthSigner`, you must provide a set of parameters detailed below. + +## Usage + +::: code-group + +```ts [example.ts] +import { Web3AuthSigner } from "@alchemy/aa-signers"; + +// instantiates using every possible parameter, as a reference +const web3AuthSigner = new Web3AuthSigner({ + clientId: "test", + chainConfig: { + chainNamespace: "eip155", + chainId: "1", + rpcTarget: "RPC_URL", + wsTarget: "WS_RPC_URL", + displayName: "test", + blockExplorer: "BLOCK_EXPLORER_URL", + ticker: "ETH", + tickerName: "Ethereum", + decimals: 18, + }, + web3AuthNetwork: "mainnet", + authMode: "DAPP", + uiConfig: { + loginMethodsOrder: ["google", "facebook", "email"], + modalZIndex: "999998", + displayErrorsOnModal: true, + loginGridCol: 3, + primaryButton: "socialLogin", + }, + enableLogging: true, + storageKey: "local", + sessionTime: 86400, + useCoreKitKey: true, +}); +``` + +::: + +## Returns + +### `Web3AuthSigner` + +A new instance of a `Web3AuthSigner`. + +## Parameters + +### `params: Web3AuthOptions | { inner: Web3Auth }` + +You can either pass in a constructed `Web3Auth` object, or directly pass into the `Web3AuthSigner` the `Web3AuthOptions` used to construct a `Web3Auth` object. These parameters are listed on the [web3auth docs](https://web3auth.io/docs/sdk/pnp/web/modal/initialize#web3authoptions) as well. + +`Web3AuthOptions` takes in the following parameters: + +- `clientId: string` -- a web3Auth client ID. You can get one at the [Web3Auth Developer Dashboard](https://dashboard.web3auth.io/). + +- `chainConfig: Object` -- the custom chain configuration for chainNamespace. + + - `chainNamespace: "eip155" | "solana" | "other"`-- the type of chain. + + - `chainId: string`-- [optional] the id of the chain. + + - `rpcTarget: string`-- [optional] the RPC URL of the HTTP provider for the chain. + + - `wsTarget: string`-- [optional] the RPC URL of the websocket provider for the chain. + + - `blockExplorer: string`-- [optional] the url of the block explorer + + - `ticker: string`-- [optional] the currency ticker of the network. Default to "ETH". + + - `tickerName: string`-- [optional] the name for currency ticker. Defaults to "Ethereum". + + - `decimals: number`-- [optional] the number of decimals for the currency ticker. Defaults to 18. + +- `web3AuthNetwork: "mainnet" | "testnet" | "cyan" | "aqua" | "celeste" | "sapphire_devnet" | "sapphire_mainnet"` -- [optional] the web3auth network to use for the session & the issued idToken. + +- `authMode: "DAPP" | "WALLET"` -- [optional] flag to determine which adapter to use. Dapps should use "DAPP", and Wallets should use "WALLET". + +- `uiConfig: Object` -- [optional] the config for configuring modal ui display properties. + + - `loginMethodsOrder: string[]` -- [optional] the order of how login methods are shown. + + - `modalZIndex: string` -- [optional] the Z-index of the modal and iframe. + + - `displayErrorsOnModal: boolean` -- [optional] toggle to show errors on Web3Auth modal or not. + + - `loginGridCol: 2 | 3` -- [optional] the number of columns to display the Social Login buttons. + + - `primaryButton: "externalLogin" | "socialLogin" | "emailLogin"` -- [optional] flag to decide which button will be displayed as primary button in modal. + +- `enableLogging: boolean` -- [optional] toggle to enable logs. + +- `storageKey: "session" | "local"` -- [optional] flag on whether to persist social login session across tabs. Defaults to "local". + +- `sessionTime: number` -- [optional] the time (in seconds) for idToken issued by Web3Auth for server side verification. Defaults to 86,400 seconds (1 day). + +- `useCoreKitKey: boolean` -- [optional] toggle to use core-kit key with web3auth provider. Defaults to false. diff --git a/site/packages/aa-signers/web3auth/getAddress.md b/site/packages/aa-signers/web3auth/getAddress.md new file mode 100644 index 0000000000..af93226f97 --- /dev/null +++ b/site/packages/aa-signers/web3auth/getAddress.md @@ -0,0 +1,40 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Web3AuthSigner • getAddress + - - meta + - name: description + content: Overview of the getAddress method on Web3AuthSigner + - - meta + - property: og:description + content: Overview of the getAddress method on Web3AuthSigner +--- + +# getAddress + +`getAddress` returns the EOA address of the Signer. + +This method must be called after [`authenticate`](/packages/aa-signers/web3auth/authenticate). Otherwise, this method will throw an error with the message `Not Authenticated`. + +## Usage + +::: code-group + +```ts [example.ts] +import { createWeb3AuthSigner } from "./web3auth"; +// [!code focus:99] +const web3AuthSigner = await createWeb3AuthSigner(); + +const address = await web3AuthSigner.getAddress(); +``` + +<<< @/snippets/web3auth.ts +::: + +## Returns + +### `Promise

` + +A Promise containing the address of the Signer. diff --git a/site/packages/aa-signers/web3auth/getAuthDetails.md b/site/packages/aa-signers/web3auth/getAuthDetails.md new file mode 100644 index 0000000000..ad639c45d2 --- /dev/null +++ b/site/packages/aa-signers/web3auth/getAuthDetails.md @@ -0,0 +1,55 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Web3AuthSigner • getAuthDetails + - - meta + - name: description + content: Overview of the getAuthDetails method on Web3AuthSigner + - - meta + - property: og:description + content: Overview of the getAuthDetails method on Web3AuthSigner +--- + +# getAuthDetails + +`getAuthDetails` returns the details about the authenticated user, in accordance with the `Web3AuthSigner` web SDK's [specifications](https://web3auth.io/docs/sdk/pnp/web/modal/usage#getuserinfo). + +This method must be called after [`authenticate`](/packages/aa-signers/web3auth/authenticate). Otherwise, this method will throw an error with the message `Not Authenticated`. + +## Usage + +::: code-group + +```ts [example.ts] +import { createWeb3AuthSigner } from "./web3auth"; +// [!code focus:99] +const web3AuthSigner = await createWeb3AuthSigner(); + +const details = await web3AuthSigner.getAuthDetails(); +``` + +<<< @/snippets/web3auth.ts +::: + +## Returns + +### `Promise` + +A Promise containing the `Web3AuthUserInfo`, an object with the following fields: + +- `verifier: string` -- details of the verifier (verifier type, ie. torus, metamask, openlogin etc.). +- `verifierId: string` -- id of the verifier. +- `typeOfLogin: LOGIN_PROVIDER_TYPE` -- the type of login done by the user (like google, facebook, twitter, github, etc.). +- `email: string` -- [optional] the decentralized ID of the user. +- `name: string` -- [optional] the name of the authenticated user. +- `profileImage: string` -- [optional] the profile image of the connected user +- `aggregateVerifier: string` -- [optional] the details of the aggregate verifier. +- `dappShare: string` -- [optional] if you are using a Custom Verifier, you can get a dapp share after successful login to replace device share. +- `idToken: string` -- [optional] the id of the token issued by Web3Auth. +- `oAuthIdToken: string` -- [optional] the id of the token issued by the OAuth provider. +- `oAuthAccessToken: string` -- [optional] the access token issued by the OAuth provider. +- `isMfaEnabled: boolean` -- [optional] whether or not multi-factor authentication is enabled for the user. +- `touchIDPreference: string` -- [optional] +- `isMfaEnabled: boolean` -- [optional] whether or not multi-factor authentication is enabled for the user. diff --git a/site/packages/aa-signers/web3auth/introduction.md b/site/packages/aa-signers/web3auth/introduction.md new file mode 100644 index 0000000000..9f3ce70a16 --- /dev/null +++ b/site/packages/aa-signers/web3auth/introduction.md @@ -0,0 +1,76 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Web3AuthSigner + - - meta + - name: description + content: Overview of the Web3AuthSigner class in aa-signers + - - meta + - property: og:description + content: Overview of the Web3AuthSigner class in aa-signers +--- + +# web3auth Signer + +`Web3AuthSigner` is a signer implementation which extends `SmartAccountAuthenticator` to leverage the [web3auth web modal SDK](https://web3auth.io/docs/sdk/pnp/web/modal). It supports features such as authentication, message and typed data signing, and authentication details retrieval. + +`Web3AuthSigner` provides implementations for all methods on `SmartAccountAuthenticator`: + +1. [`authenticate`](/packages/aa-signers/web3auth/authenticate) -- supports user authentication. +2. [`getAddress`](/packages/aa-signers/web3auth/getAddress) -- supports typed data signatures from the smart contract account's owner address. +3. [`signMessage`](/packages/aa-signers/web3auth/signMessage) -- supports message signatures. +4. [`signTypedData`](/packages/aa-signers/web3auth/signTypedData) -- supports typed data signatures. +5. [`getAuthDetails`](/packages/aa-signers/web3auth/getAuthDetails) -- supports authentication details retrieval. + +## Install Dependencies + +`Web3AuthSigner` requires installation of the [`@web3auth/modal`](https://github.com/Web3Auth/web3auth-web/tree/master/packages/modal) and [`@web3auth/base`](https://github.com/Web3Auth/web3auth-web/tree/master/packages/base) SDKs. `aa-signers` lists them as optional dependencies. + +::: code-group + +```bash [npm] +npm i -s @web3auth/modal +npm i -s @web3auth/base +``` + +```bash [yarn] +yarn add @web3auth/modal +yarn add @web3auth/base +``` + +## Usage + +::: code-group + +```ts [example.ts] +import { createWeb3AuthSigner } from "./web3auth"; + +const web3AuthSigner = await createWeb3AuthSigner(); + +const address = await web3AuthSigner.getAddress(); + +const details = await web3AuthSigner.getAuthDetails(); + +const signedMessage = await web3AuthSigner.signMessage("test"); + +const typedData = { + types: { + Request: [{ name: "hello", type: "string" }], + }, + primaryType: "Request", + message: { + hello: "world", + }, +}; +const signTypedData = await web3AuthSigner.signTypedData(typedData); +``` + +<<< @/snippets/web3auth.ts +::: + +## Developer Links + +- [web3auth web modal SDK](https://web3auth.io/docs/sdk/pnp/web/modal) +- [Web3AuthSigner Tests](https://github.com/alchemyplatform/aa-sdk/blob/main/packages/signers/src/web3auth/__tests__/signer.test.ts) diff --git a/site/packages/aa-signers/web3auth/signMessage.md b/site/packages/aa-signers/web3auth/signMessage.md new file mode 100644 index 0000000000..a5642d11f0 --- /dev/null +++ b/site/packages/aa-signers/web3auth/signMessage.md @@ -0,0 +1,44 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Web3AuthSigner • signMessage + - - meta + - name: description + content: Overview of the signMessage method on Web3AuthSigner + - - meta + - property: og:description + content: Overview of the signMessage method on Web3AuthSigner +--- + +# signMessage + +`signMessage` supports signing messages from the `Web3AuthSigner`. + +This method must be called after [`authenticate`](/packages/aa-signers/web3auth/authenticate). Otherwise, this method will throw an error with the message `Not Authenticated`. + +## Usage + +::: code-group + +```ts [example.ts] +import { createWeb3AuthSigner } from "./web3auth"; +// [!code focus:99] +const web3AuthSigner = await createWeb3AuthSigner(); + +const signedMessage = await web3AuthSigner.signMessage("test"); +``` + +<<< @/snippets/web3auth.ts +::: + +## Returns + +### `Promise` + +A Promise containing the signature of the message. + +## Parameters + +### `msg: string | Uint8Array)` -- the message to sign diff --git a/site/packages/aa-signers/web3auth/signTypedData.md b/site/packages/aa-signers/web3auth/signTypedData.md new file mode 100644 index 0000000000..5bc625f9e2 --- /dev/null +++ b/site/packages/aa-signers/web3auth/signTypedData.md @@ -0,0 +1,79 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Web3AuthSigner • signTypedData + - - meta + - name: description + content: Overview of the signTypedData method on Web3AuthSigner + - - meta + - property: og:description + content: Overview of the signTypedData method on Web3AuthSigner +--- + +# signTypedData + +`signTypedData` supports signing typed data from the `Web3AuthSigner`. + +This method must be called after [`authenticate`](/packages/aa-signers/web3auth/authenticate). Otherwise, this method will throw an error with the message `Not Authenticated`. + +## Usage + +::: code-group + +```ts [example.ts] +import { createWeb3AuthSigner } from "./web3auth"; +// [!code focus:99] +const web3AuthSigner = await createWeb3AuthSigner(); + +const signedTypedData = await web3AuthSigner.signTypedData({ + domain: { + name: "Ether Mail", + version: "1", + chainId: 1, + verifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + }, + types: { + Person: [ + { name: "name", type: "string" }, + { name: "wallet", type: "address" }, + ], + Mail: [ + { name: "from", type: "Person" }, + { name: "to", type: "Person" }, + { name: "contents", type: "string" }, + ], + }, + primaryType: "Mail", + message: { + from: { + name: "Cow", + wallet: "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", + }, + to: { + name: "Bob", + wallet: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB", + }, + contents: "Hello, Bob!", + }, +}); +``` + +<<< @/snippets/web3auth.ts +::: + +## Returns + +### `Promise` + +A Promise containing the signature of the typed data. + +## Parameters + +### `params: SignTypedDataParams` -- the typed data to sign + +- `domain: TypedDataDomain` -- The typed data domain +- `types: Object` -- the type definitions for the typed data +- `primaryType: inferred String` -- the primary type to extract from types and use in value +- `message: inferred from types & primaryType` -- the message, inferred from diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index d1469591da..97c887a92e 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -22,27 +22,31 @@ head: [Web3Auth](https://web3auth.io/) is an embedded wallet provider that allows users to generate wallets scoped to your application via Social Logins, Email OTP, or Custom Authentication Methods. This is great for enabling a better experience for your users. But ultimately these wallets are not much different from EOA's, so you don't have the benefit of Account Abstraction (gas sponsorship, batching, etc). -Combining Web3Auth with Account Kit allows you to get the best of both worlds. You can use Web3Auth to generate a wallet scoped to your application, and then use Account Kit to create Smart Contract Accounts for your users! +Combining Web3Auth with Account Kit allows you to get the best of both worlds. You can use Web3Auth via the [`aa-signers`](/packages/aa-signers/index) package to generate a wallet scoped to your application, and then use [`aa-alchemy`](/packages/aa-alchemy/index) to create smart accounts for your users! # Integration ### Install the SDK +`Web3AuthSigner` requires installation of the [`@web3auth/modal`](https://github.com/Web3Auth/web3auth-web/tree/master/packages/modal) and [`@web3auth/base`](https://github.com/Web3Auth/web3auth-web/tree/master/packages/base) SDKs. They are listed as optional dependencies on `aa-signers`. `aa-signers` lists them as optional dependencies. + ::: code-group ```bash [npm] npm i -s @web3auth/modal +npm i -s @web3auth/base ``` ```bash [yarn] yarn add @web3auth/modal +yarn add @web3auth/base ``` ::: ### Create a SmartAccountSigner -Next, setup the web3auth sdk and create a `SmartAccountSigner` +Next, setup the web3auth sdk and create a `SmartAccountSigner` using the `aa-signers` package: <<< @/snippets/web3auth.ts @@ -58,7 +62,7 @@ import { getDefaultLightAccountFactoryAddress, } from "@alchemy/aa-accounts"; import { sepolia } from "viem/chains"; -import { web3authSigner } from "./web3auth"; +import { createWeb3AuthSigner } from "./web3auth"; const chain = sepolia; @@ -69,7 +73,7 @@ const provider = new AlchemyProvider({ (rpcClient) => new LightSmartContractAccount({ chain, - owner: web3authSigner, + owner: await createWeb3AuthSigner(), factoryAddress: getDefaultLightAccountFactoryAddress(chain), rpcClient, }) diff --git a/site/snippets/web3auth.ts b/site/snippets/web3auth.ts index 007208c272..c75d1debbe 100644 --- a/site/snippets/web3auth.ts +++ b/site/snippets/web3auth.ts @@ -1,29 +1,21 @@ -import { WalletClientSigner, type SmartAccountSigner } from "@alchemy/aa-core"; -import { Web3Auth } from "@web3auth/modal"; -import { createWalletClient, custom } from "viem"; +import { Web3AuthSigner } from "@alchemy/aa-signers"; -// see https://web3auth.io/docs/quick-start for more info -const web3auth = new Web3Auth({ - // web3auth config... -}); +export const createWeb3AuthSigner = async () => { + const web3AuthSigner = new Web3AuthSigner({ + clientId: "test", + chainConfig: { + chainNamespace: "eip155", + }, + }); -await web3auth.initModal(); + await web3AuthSigner.authenticate({ + init: async () => { + await web3AuthSigner.inner.initModal(); + }, + connect: async () => { + await web3AuthSigner.inner.connect(); + }, + }); -await web3auth.connect(); - -if (web3auth.provider == null) { - throw new Error("web3auth provider is available"); -} - -// a viem wallet client that wraps web3auth for utility methods -// NOTE: this isn't necessary since you can just use the `web3auth.rpcProvider` -// directly, but this makes things much easier -export const web3authClient = createWalletClient({ - transport: custom(web3auth.provider), -}); - -// a smart account signer you can use as an owner on ISmartContractAccount -export const web3authSigner: SmartAccountSigner = new WalletClientSigner( - web3authClient, - "web3auth" // signerType -); + return web3AuthSigner; +}; diff --git a/yarn.lock b/yarn.lock index 0d7c431ad4..f6eb29f672 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1214,7 +1214,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.22.10", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== @@ -2549,6 +2549,69 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.5" +"@ethereumjs/common@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-3.2.0.tgz#b71df25845caf5456449163012074a55f048e0a0" + integrity sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA== + dependencies: + "@ethereumjs/util" "^8.1.0" + crc-32 "^1.2.0" + +"@ethereumjs/common@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-4.1.0.tgz#0a959320a69bd2e3b194144b29c61b63bd6e2f6a" + integrity sha512-XWdQvUjlQHVwh4uGEPFKHpsic69GOsMXEhlHrggS5ju/+2zAmmlz6B25TkCCymeElC9DUp13tH5Tc25Iuvtlcg== + dependencies: + "@ethereumjs/util" "^9.0.1" + crc "^4.3.2" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/rlp@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.1.tgz#56c5433b9242f956e354fd7e4ce3523815e24854" + integrity sha512-Ab/Hfzz+T9Zl+65Nkg+9xAmwKPLicsnQ4NW49pgvJp9ovefuic95cgOS9CbPc9izIEgsqm1UitV0uNveCvud9w== + +"@ethereumjs/tx@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" + integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== + dependencies: + "@ethereumjs/common" "^3.2.0" + "@ethereumjs/rlp" "^4.0.1" + "@ethereumjs/util" "^8.1.0" + ethereum-cryptography "^2.0.0" + +"@ethereumjs/tx@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-5.1.0.tgz#c61a9048ec09fff360b18188224aae90c370e57f" + integrity sha512-VUhw2+4yXArJZRWhPjmZFrN4WUjUo0qUZUszVpW2KzsGlqCFf67kwJcH9Rca5eS0CRHjr2qHJLpvYOjNuaXVdA== + dependencies: + "@ethereumjs/common" "^4.1.0" + "@ethereumjs/rlp" "^5.0.1" + "@ethereumjs/util" "^9.0.1" + ethereum-cryptography "^2.1.2" + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethereumjs/util@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.0.1.tgz#cbe0380981263451e3080ddcd74accf4b10f8723" + integrity sha512-NdFFEzCc3H1sYkNnnySwLg6owdQMhjUc2jfuDyx8Xv162WSluCnnSKouKOSG3njGNEyy2I9NmF8zTRDwuqpZWA== + dependencies: + "@ethereumjs/rlp" "^5.0.1" + ethereum-cryptography "^2.1.2" + "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -3118,6 +3181,40 @@ resolved "https://registry.yarnpkg.com/@magic-sdk/types/-/types-17.2.0.tgz#3e554748808e2f35ca5bb9ceda0cdf88d2ce6d35" integrity sha512-VJmGP+DwMnuIuMLb+IDHNAkYLcHH+XqPwHb6mcLNI9e30CDMXoFN60hmdhDRZLjI9JF/NPS3eEsd40Xz6Iih2A== +"@metamask/abi-utils@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@metamask/abi-utils/-/abi-utils-2.0.2.tgz#ad394e9cb8a95ac177cad942daadd88a246c0de8" + integrity sha512-B/A1dY/w4F/t6cDHUscklO6ovb/ztFsrsTXFd8QlqSByk/vyy+QbPE3VVpmmyI/7RX+PA1AJcvBdzCIz+r9dVQ== + dependencies: + "@metamask/utils" "^8.0.0" + superstruct "^1.0.3" + +"@metamask/detect-provider@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/detect-provider/-/detect-provider-2.0.0.tgz#4bc2795e5e6f7d8b84b2e845058d2f222c99917d" + integrity sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ== + +"@metamask/eth-sig-util@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-7.0.0.tgz#b035a2b826018578a5d463668bb64828271376d8" + integrity sha512-8KeXZB4SKx3EfNS5ahbjUMegyGvDQYk6Nk3hmM658sXpfAQR5ZlIXBgj+9RF+ZROqsU6EuNVgKt7Fr10re60PQ== + dependencies: + "@ethereumjs/util" "^8.1.0" + "@metamask/abi-utils" "^2.0.2" + "@metamask/utils" "^8.1.0" + ethereum-cryptography "^2.1.2" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@metamask/rpc-errors@^6.0.0", "@metamask/rpc-errors@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.1.0.tgz#dfdef7cba4b9ad01ca3f99e990b5980575b89b4f" + integrity sha512-JQElKxai26FpDyRKO/yH732wI+BV90i1u6pOuDOpdADSbppB2g1pPh3AGST1zkZqEE9eIKIUw8UdBQ4rp3VTSg== + dependencies: + "@metamask/utils" "^8.1.0" + fast-safe-stringify "^2.0.6" + "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" @@ -3133,6 +3230,20 @@ semver "^7.3.8" superstruct "^1.0.3" +"@metamask/utils@^8.0.0", "@metamask/utils@^8.1.0": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.2.1.tgz#2f8b60c3b3c49423ca9d15061bb797464440e385" + integrity sha512-dlnpow8r0YHDDL1xKCEwUoTGOAo9icdv+gaJG0EbgDnkD/BDqW2eH1XMtm9i7rPaiHWo/aLtcrh9WBhkCq/viw== + dependencies: + "@ethereumjs/tx" "^4.2.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + debug "^4.3.4" + pony-cause "^2.1.10" + semver "^7.5.4" + superstruct "^1.0.3" + "@motionone/animation@^10.15.1", "@motionone/animation@^10.16.3": version "10.16.3" resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.16.3.tgz#f5b71e27fd8b88b61f983adb0ed6c8e3e89281f9" @@ -3323,6 +3434,13 @@ dependencies: eslint-scope "5.1.1" +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + "@noble/curves@1.2.0", "@noble/curves@^1.2.0", "@noble/curves@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -3330,7 +3448,12 @@ dependencies: "@noble/hashes" "1.3.2" -"@noble/hashes@1.3.2", "@noble/hashes@^1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": +"@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/hashes@1.3.2", "@noble/hashes@^1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1", "@noble/hashes@~1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== @@ -3793,11 +3916,20 @@ resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.12.0.tgz#aa767a32f4d10f4ec9a47ad7e32d547d3b51e94c" integrity sha512-hExCo62lScVC9/ztVqYEYL2pFxcqLTvB8fj0WtdP5FWrvbtEgD0pbVolchzD5bf85pbzvEwdAxSVS7EdCZxTNw== -"@scure/base@~1.1.0", "@scure/base@~1.1.2": +"@scure/base@^1.1.3", "@scure/base@~1.1.0", "@scure/base@~1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + "@scure/bip32@1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" @@ -3849,6 +3981,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + "@solana/buffer-layout@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" @@ -3877,6 +4014,27 @@ rpc-websockets "^7.5.1" superstruct "^0.14.2" +"@solana/web3.js@^1.78.4": + version "1.87.6" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.87.6.tgz#6744cfc5f4fc81e0f58241c0a92648a7320bb3bf" + integrity sha512-LkqsEBgTZztFiccZZXnawWa8qNCATEqE97/d0vIwjTclmVlc8pBpD1DmjfVHtZ1HS5fZorFlVhXfpwnCNDZfyg== + dependencies: + "@babel/runtime" "^7.23.2" + "@noble/curves" "^1.2.0" + "@noble/hashes" "^1.3.1" + "@solana/buffer-layout" "^4.0.0" + agentkeepalive "^4.3.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.0" + node-fetch "^2.6.12" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + "@stablelib/aead@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" @@ -4081,6 +4239,194 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@toruslabs/base-controllers@^4.0.1", "@toruslabs/base-controllers@^4.7.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@toruslabs/base-controllers/-/base-controllers-4.8.0.tgz#8784a91c885ffc2f3dea05ecdc6960f87d6b3e25" + integrity sha512-FfmbR44NEMBCptrKnUrUHs1VdC59g3GbuALScTnuv4DN+ilW7YmSGixQzYfri1OJsSns3WV1KfhyBItseGNMVA== + dependencies: + "@ethereumjs/util" "^9.0.1" + "@metamask/rpc-errors" "^6.1.0" + "@toruslabs/broadcast-channel" "^9.0.1" + "@toruslabs/http-helpers" "^5.0.0" + "@toruslabs/openlogin-jrpc" "^6.0.0" + async-mutex "^0.4.0" + bignumber.js "^9.1.2" + bowser "^2.11.0" + lodash "^4.17.21" + loglevel "^1.8.1" + +"@toruslabs/base-session-manager@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/base-session-manager/-/base-session-manager-3.0.0.tgz#4302d0747ef71a8278af79e577cf53253c907cd5" + integrity sha512-+EqwizmSFkVEczUtaw+swbAxRIIxC/EaFE040rwfgC5fixaQMNLw2cVYXWN67Ra47wC9A7Om6xwQTuGFR+dy4w== + dependencies: + "@toruslabs/http-helpers" "^5.0.0" + +"@toruslabs/broadcast-channel@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@toruslabs/broadcast-channel/-/broadcast-channel-9.0.1.tgz#ade7b642e4304ef23615bcf0914852d051b47fed" + integrity sha512-xypCZwwD+cJ8fRCtMiJMWuuPg/9rf4P3AhWGkrTKL49GXFEx23akUjq/ti4n1o1uJdQok6E9MH9Z/JpLniyRaA== + dependencies: + "@babel/runtime" "^7.22.10" + "@toruslabs/eccrypto" "^4.0.0" + "@toruslabs/metadata-helpers" "^5.0.0" + bowser "^2.11.0" + loglevel "^1.8.1" + oblivious-set "1.1.1" + socket.io-client "^4.7.2" + unload "^2.4.1" + +"@toruslabs/constants@^13.0.1", "@toruslabs/constants@^13.0.3": + version "13.0.3" + resolved "https://registry.yarnpkg.com/@toruslabs/constants/-/constants-13.0.3.tgz#260a3e5c430d201bd3d92e13ef2044bd89a4432e" + integrity sha512-DiksceNFwzV4XBwcPdKpV6tfrvWIxhmwseTJbNnlzdy6uXgzvtagfapu+98pjrkNrjoRLiM17QBgBi8sNw7oGQ== + +"@toruslabs/eccrypto@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-4.0.0.tgz#0b27ed2d1e9483e77f42a7619a2c3c19cb802f44" + integrity sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ== + dependencies: + elliptic "^6.5.4" + +"@toruslabs/http-helpers@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-5.0.0.tgz#2a309d2a2c5c00d50a725d83ccec8a7475771d62" + integrity sha512-GmezWz9JeF6YyhjLSm+9XDF4YaeICEckY0Jbo43i86SjhfJYgRWqEi63VSiNsaqc/z810Q0FQvEk1TnBRX2tgA== + dependencies: + lodash.merge "^4.6.2" + loglevel "^1.8.1" + +"@toruslabs/metadata-helpers@5.0.0", "@toruslabs/metadata-helpers@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/metadata-helpers/-/metadata-helpers-5.0.0.tgz#12be5de4e8a5d1af2dd080bdf05f5ad8953aaae7" + integrity sha512-ZUFfOHJVJC53c8wJYHjdF3bIgN2ZvfqehbTZ/zJ7oVFfrrd6O66V3gQ1i1zxBjH3yhOvZKQwc0DaMmh3G0NUXQ== + dependencies: + "@toruslabs/eccrypto" "^4.0.0" + "@toruslabs/http-helpers" "^5.0.0" + elliptic "^6.5.4" + ethereum-cryptography "^2.1.2" + json-stable-stringify "^1.0.2" + +"@toruslabs/openlogin-ed25519@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-ed25519/-/openlogin-ed25519-6.0.0.tgz#21bd0999db789023be024f890d8802b7f013c7ae" + integrity sha512-wdz8W0TeaKvENuPTeiHsn97N1GVvp880gXwj3ECtfPNWdz9S8zYtvv1R3M1DD+HJVlCoLzGGKe2dc9Ko+K5wGQ== + dependencies: + "@toruslabs/tweetnacl-js" "^1.0.4" + +"@toruslabs/openlogin-jrpc@^5.0.2": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-5.3.0.tgz#37fefe43d82b0ecfa7a99de56050e4b46bf68a5c" + integrity sha512-tM1XHG5UulvENhZYewo9eVWF5r9SffGru8+09qFED7g/PFupKs/rccaXYwyWRGVenQSMgj6ipgUd72zliuen+A== + dependencies: + "@metamask/rpc-errors" "^6.0.0" + "@toruslabs/openlogin-utils" "^5.3.0" + end-of-stream "^1.4.4" + events "^3.3.0" + fast-safe-stringify "^2.1.1" + once "^1.4.0" + pump "^3.0.0" + readable-stream "^4.4.2" + +"@toruslabs/openlogin-jrpc@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-6.0.0.tgz#3f96a51f4975d9800e775084e572aeccee514e31" + integrity sha512-qi4h0/abyreyeoL+mg4I8nkC/QmP7ID1nRCrz+Uzx/t8d7I11kmpVXwjclVxhd1qt+m4uXaWFaFZONBjYdBYqw== + dependencies: + "@metamask/rpc-errors" "^6.1.0" + "@toruslabs/openlogin-utils" "^6.0.0" + end-of-stream "^1.4.4" + events "^3.3.0" + fast-safe-stringify "^2.1.1" + once "^1.4.0" + pump "^3.0.0" + readable-stream "^4.4.2" + +"@toruslabs/openlogin-session-manager@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-session-manager/-/openlogin-session-manager-3.0.0.tgz#2f13af3ef96ddda48803a0265a798cffc3c9f78c" + integrity sha512-S+nnZQ+Y+XCHvTYaov3ltiV2hAAPpKpwxvB4TmbMvi7KWOZ8BcUJQykSITlIXV4aE5y5BD96rsmjQ3C3MyVtUQ== + dependencies: + "@toruslabs/base-session-manager" "^3.0.0" + "@toruslabs/eccrypto" "^4.0.0" + "@toruslabs/metadata-helpers" "5.0.0" + +"@toruslabs/openlogin-utils@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-utils/-/openlogin-utils-5.3.0.tgz#59906be13fe47c399513360e36b9262410e5a1f2" + integrity sha512-WfwadC7ZqKOTVqfI4rFANu7IzEgI7H4A/0TiIQihxHpFWdFM23yVuCCIm5zCzQ1QtA2mwBbBZYwOJ0YHVrV6HQ== + dependencies: + "@toruslabs/constants" "^13.0.1" + base64url "^3.0.1" + +"@toruslabs/openlogin-utils@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-utils/-/openlogin-utils-6.0.0.tgz#99b03c9d8aef9df02cef98fdf7c067c71157b94a" + integrity sha512-BbKgkUCNpGTJxuPSDYBoKEDSJ+q3bC0Po4VOUjszBNtHMlAcubIkuTLPt7qBQkLAtbiW4cfkojTRRjIGEcUaQQ== + dependencies: + "@toruslabs/constants" "^13.0.3" + base64url "^3.0.1" + +"@toruslabs/openlogin@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/openlogin/-/openlogin-6.0.0.tgz#b3e035772d7237bde370e42e646e3a83feda7f61" + integrity sha512-gfdjsOOwMbtjotmxzLO/+V7Kc6n0iMAkpSI/Wf3GfOTRcV5kHoLDOTOOwrTDvY0fAWS5uv6fFlARadm0i9E2xg== + dependencies: + "@toruslabs/eccrypto" "^4.0.0" + "@toruslabs/metadata-helpers" "^5.0.0" + "@toruslabs/openlogin-session-manager" "^3.0.0" + "@toruslabs/openlogin-utils" "^6.0.0" + "@toruslabs/secure-pub-sub" "^0.0.1" + bowser "^2.11.0" + events "^3.3.0" + loglevel "^1.8.1" + ts-custom-error "^3.3.1" + +"@toruslabs/secure-pub-sub@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@toruslabs/secure-pub-sub/-/secure-pub-sub-0.0.1.tgz#dda9d3c97755abaa40a7904de92ba59349f8e045" + integrity sha512-fuvjilsNhJ9zdeFcYBwFq6BxhFJU6vkCU3Xm4BcnXLtGxm79N9rj1C8rwFQY2TSgpAcD8NZsuuJqneRG7M9kpg== + dependencies: + "@toruslabs/eccrypto" "^4.0.0" + "@toruslabs/http-helpers" "^5.0.0" + "@toruslabs/metadata-helpers" "^5.0.0" + loglevel "^1.8.1" + socket.io-client "^4.7.2" + +"@toruslabs/solana-embed@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@toruslabs/solana-embed/-/solana-embed-2.0.0.tgz#c243296fd0dbb7a3877c361ddd2c2d2d3fd0aa6d" + integrity sha512-2Rqo8Y0/YZWDfu6IxoVMNSfJ+Mecvtg2+N8/jMUzFp9Fho1LADULl87QZW2Mgu1tMEhHPKAdisvhope3KkTZjA== + dependencies: + "@solana/web3.js" "^1.78.4" + "@toruslabs/base-controllers" "^4.0.1" + "@toruslabs/http-helpers" "^5.0.0" + "@toruslabs/openlogin-jrpc" "^5.0.2" + eth-rpc-errors "^4.0.3" + fast-deep-equal "^3.1.3" + lodash-es "^4.17.21" + loglevel "^1.8.1" + pump "^3.0.0" + +"@toruslabs/torus-embed@^4.0.4": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-4.0.7.tgz#16c18a3cba99e3021254042cbdf2ffb3e6714922" + integrity sha512-KHYdy/FCOw8Og83qcqJr73/Pb3SSXe0JJof1CbCu1Ad87zQTzEfblO6FyRCgFYSjsC6XjLpuEVM1M+6o9fAbHw== + dependencies: + "@metamask/rpc-errors" "^6.0.0" + "@toruslabs/http-helpers" "^5.0.0" + "@toruslabs/openlogin-jrpc" "^5.0.2" + fast-deep-equal "^3.1.3" + lodash.merge "^4.6.2" + loglevel "^1.8.1" + pump "^3.0.0" + readable-stream "^4.4.2" + +"@toruslabs/tweetnacl-js@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@toruslabs/tweetnacl-js/-/tweetnacl-js-1.0.4.tgz#0f1965d1b93d4061472b07ed21d71c33ac533cce" + integrity sha512-h8fVemW5pstsKbm/fTx+y61dZkh5Pepy/92lsyKp83KErf96jT+w4LGx4nEgeAVrdYQDTLg2tO7vu/boEb23Iw== + "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" @@ -4995,6 +5341,18 @@ "@walletconnect/logger" "^2.0.1" events "^3.3.0" +"@walletconnect/types@2.10.4": + version "2.10.4" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.4.tgz#23f6e4bd785671812dc6ea96848a6bd7ea78f038" + integrity sha512-eQpOElyiwJp3tepuOS3TS9dXTl9jVVlrC3iVA8bytnbLagkAUxmiv/s7PyDFx+ndXwQVh8PFBkWg1oxGwgCSBA== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + "@walletconnect/universal-provider@2.10.2": version "2.10.2" resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.10.2.tgz#85c8da39f65da8fe33f65f62689e703607b5ddc5" @@ -5030,6 +5388,26 @@ query-string "7.1.3" uint8arrays "^3.1.0" +"@walletconnect/utils@^2.10.4": + version "2.10.4" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.4.tgz#5f17938e7ea481541ec2dbae0df5cd494c72523f" + integrity sha512-XbrKgnQ0hC9DC9wjFb468MEYMoJxnCVmOj2gi01DA4FSr8fJi7wwNRUnlnZzLWrUWrHuaPReYe4PgBAgIv363g== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.4" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + "@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" @@ -5045,6 +5423,199 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" +"@web3auth/base-evm-adapter@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@web3auth/base-evm-adapter/-/base-evm-adapter-7.1.0.tgz#df13a5851711a80e195b6db6ae0abf5e605c4883" + integrity sha512-ot+uh0hfKvvA8G65SKmbqFOo6+XmQBwJ/pepBcIuLJ3zzHdGknlvBhMuUOEPl02VKWPcWwtd9lyCmZbfUMHVVQ== + dependencies: + "@web3auth/base" "^7.1.0" + +"@web3auth/base-plugin@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@web3auth/base-plugin/-/base-plugin-7.1.0.tgz#3ba2acf8a5193f65da099dbdbf6aad039df20831" + integrity sha512-ZFIEtDtdpXpsUV5SRRKspFzqX9EpXptfhnYPTv3723RYl6TXRD6vSGQ8etkrsKxVKoRG3rawkMo4VvuxTrtneA== + dependencies: + "@web3auth/base" "^7.1.0" + +"@web3auth/base-provider@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/base-provider/-/base-provider-7.1.1.tgz#77f51cda66cf1f0b7a1dbace9952cadec1fe303e" + integrity sha512-axmfWbyW1lPwECs22yWPWS/LA7ESUTutpuNHd87coWIBFEv8AuOXLmGIAONvCVB1AeRhSvJuWhUPRc7S637cLQ== + dependencies: + "@metamask/rpc-errors" "^6.1.0" + "@toruslabs/base-controllers" "^4.7.0" + "@toruslabs/openlogin-jrpc" "^6.0.0" + "@web3auth/base" "^7.1.0" + json-rpc-random-id "^1.0.1" + +"@web3auth/base-solana-adapter@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@web3auth/base-solana-adapter/-/base-solana-adapter-7.1.0.tgz#505bbb0b3379bd0dc0372b0891fc5406de293360" + integrity sha512-7p7lpy967gwc8q+Yp6Mfa1DZct5TRQnaxMol3KhaZpoRcIwvJVGr9Yr40np+fS3QcDWzm7BVBaZOb51X37lZGA== + dependencies: + "@web3auth/base" "^7.1.0" + bs58 "^5.0.0" + +"@web3auth/base@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@web3auth/base/-/base-7.1.0.tgz#b54a926415d35063b48af13dea12e265b414fe0f" + integrity sha512-yoFyJ1yP3vzkoGJwkJ+ltLjMgvUTftFm7oio088HRfrt3y7rP8HwQpCwFHjQS5VLJJjsiZJ+NtJG63yB955ccQ== + dependencies: + "@toruslabs/http-helpers" "^5.0.0" + "@toruslabs/openlogin" "^6.0.0" + "@toruslabs/openlogin-jrpc" "^6.0.0" + "@toruslabs/openlogin-utils" "^6.0.0" + jwt-decode "^4.0.0" + loglevel "^1.8.1" + ts-custom-error "^3.3.1" + +"@web3auth/ethereum-provider@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/ethereum-provider/-/ethereum-provider-7.1.1.tgz#21d5a9a6148c53bc59f92d18cd82da650764f88a" + integrity sha512-GSek6MqjXfhPV7P92GnhdFxFdV7vUGd2kC1GyEccg19hAOhfclSrMAEa5NEht4td9hTA14ijeu4vnWFquHQeSw== + dependencies: + "@ethereumjs/common" "^4.1.0" + "@ethereumjs/tx" "^5.1.0" + "@ethereumjs/util" "^9.0.1" + "@metamask/eth-sig-util" "^7.0.0" + "@metamask/rpc-errors" "^6.1.0" + "@toruslabs/base-controllers" "^4.7.0" + "@toruslabs/http-helpers" "^5.0.0" + "@toruslabs/openlogin-jrpc" "^6.0.0" + "@walletconnect/utils" "^2.10.4" + "@web3auth/base" "^7.1.0" + "@web3auth/base-provider" "^7.1.1" + assert "^2.1.0" + bignumber.js "^9.1.2" + bn.js "^5.2.1" + jsonschema "^1.4.1" + +"@web3auth/metamask-adapter@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@web3auth/metamask-adapter/-/metamask-adapter-7.1.0.tgz#71695e9e143f208d17bd6b44f50b60fd00cdc9e3" + integrity sha512-80xVGJMMnNc8tMh7vDCKod4jhAbGOVXxEPT5JUDokSHVQNKJBo0Sqp1PUHk7fCPwvf4kz1eQGRmglFgXItvB3g== + dependencies: + "@metamask/detect-provider" "^2.0.0" + "@web3auth/base" "^7.1.0" + "@web3auth/base-evm-adapter" "^7.1.0" + +"@web3auth/modal@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/modal/-/modal-7.1.1.tgz#1aa0a072a6e34207f0f8521421faefd22709f44d" + integrity sha512-gFJ6Fhdim+7zTZwZh22UAVVWv34D+jhTujWh4HyWm/XUpB1lyy41WXQmL7mrWsAP71eKPGJfVwiQwU+TMFMKyQ== + dependencies: + "@web3auth/base" "^7.1.0" + "@web3auth/base-provider" "^7.1.1" + "@web3auth/ethereum-provider" "^7.1.1" + "@web3auth/metamask-adapter" "^7.1.0" + "@web3auth/no-modal" "^7.1.1" + "@web3auth/openlogin-adapter" "^7.1.1" + "@web3auth/phantom-adapter" "^7.1.1" + "@web3auth/solana-provider" "^7.1.1" + "@web3auth/torus-evm-adapter" "^7.1.0" + "@web3auth/torus-solana-adapter" "^7.1.1" + "@web3auth/ui" "^7.1.0" + "@web3auth/wallet-connect-v2-adapter" "^7.1.1" + +"@web3auth/no-modal@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/no-modal/-/no-modal-7.1.1.tgz#0e9b973a5cadc4578b913071b2607921e4ae0eba" + integrity sha512-mZNLyfcliDClDLY5/hWFuq96fTu/8Vq80vonNZG7q2SV7SyYkk1XN6cTseXd97Yfb9zQke693QJYPNCGXffD1w== + dependencies: + "@toruslabs/openlogin" "^6.0.0" + "@toruslabs/openlogin-jrpc" "^6.0.0" + "@toruslabs/openlogin-utils" "^6.0.0" + "@web3auth/base" "^7.1.0" + "@web3auth/base-plugin" "^7.1.0" + "@web3auth/base-provider" "^7.1.1" + +"@web3auth/openlogin-adapter@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/openlogin-adapter/-/openlogin-adapter-7.1.1.tgz#5144f1f2ba6e244c3817a015225133e46df19b1f" + integrity sha512-dZhnxg/0eQzzy70fa8aAV8ocGYXGkYfaFS1kbmXMXD3ZYiEOwP66hcP2GyqhrHwoCjya4WJFN0e1+a5rZQYZig== + dependencies: + "@toruslabs/openlogin" "^6.0.0" + "@toruslabs/openlogin-utils" "^6.0.0" + "@web3auth/base" "^7.1.0" + "@web3auth/base-provider" "^7.1.1" + lodash.merge "^4.6.2" + +"@web3auth/phantom-adapter@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/phantom-adapter/-/phantom-adapter-7.1.1.tgz#f74b5f1710c66b3981c386b0b8dd31ca622c65de" + integrity sha512-nm3LH1XFhI3oXwXQxg3BkwtKqQwXhbKKo9OsY1TfUayko/pQHpgtXutnCBuvyN8SuJpizMxxaPgWb+BolcLZ8w== + dependencies: + "@web3auth/base" "^7.1.0" + "@web3auth/base-provider" "^7.1.1" + "@web3auth/base-solana-adapter" "^7.1.0" + "@web3auth/solana-provider" "^7.1.1" + bn.js "^5.2.1" + +"@web3auth/solana-provider@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/solana-provider/-/solana-provider-7.1.1.tgz#e1e5ac59880553e4212eaa2a71066568d1cf729d" + integrity sha512-1eTBupvAq8JTv2enb+SZ+0mOKFDy/1ctYvIan+nI+/5UeqzCmtQRjuh2cJxJiDqxLo6OjgAhYdNtr6l1mWDB1Q== + dependencies: + "@metamask/rpc-errors" "^6.1.0" + "@toruslabs/base-controllers" "^4.7.0" + "@toruslabs/openlogin-ed25519" "^6.0.0" + "@toruslabs/openlogin-jrpc" "^6.0.0" + "@toruslabs/tweetnacl-js" "^1.0.4" + "@web3auth/base" "^7.1.0" + "@web3auth/base-provider" "^7.1.1" + bn.js "^5.2.1" + bs58 "^5.0.0" + json-rpc-random-id "^1.0.1" + +"@web3auth/torus-evm-adapter@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@web3auth/torus-evm-adapter/-/torus-evm-adapter-7.1.0.tgz#26e34ef295d2d2e77cd8f2f8155a09e5442cc1f0" + integrity sha512-1y1kwY6TKmfeoz4hdWXOlykZMfozWq3xHd7VFZenBAAfMU1eQONMviDk10RLuSUmLXRpMtWBzanlmz3v3g/C+A== + dependencies: + "@toruslabs/torus-embed" "^4.0.4" + "@web3auth/base" "^7.1.0" + "@web3auth/base-evm-adapter" "^7.1.0" + +"@web3auth/torus-solana-adapter@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/torus-solana-adapter/-/torus-solana-adapter-7.1.1.tgz#91061fc47b026bf882515739d73d55c6ba4e89b0" + integrity sha512-AWPi80TKiY/O9z/ZOCZvHdzivg+0vOlF0tsDSM6/EWLxfu9hcpiuvcF2H1/8aYfdn1Tsvqx4rVNWJiuZFUIkLA== + dependencies: + "@toruslabs/solana-embed" "^2.0.0" + "@web3auth/base" "^7.1.0" + "@web3auth/base-provider" "^7.1.1" + "@web3auth/base-solana-adapter" "^7.1.0" + "@web3auth/solana-provider" "^7.1.1" + +"@web3auth/ui@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@web3auth/ui/-/ui-7.1.0.tgz#ad0a1c2c9e8fe43eca8ccf3360e9262ced6ecd86" + integrity sha512-p84offqntrDM8M+ZF52GPQZYU2o/GwYDOUzIs5dTTMYZm5QhCC2UyqB1kfH7VqrlGRoCjRaE6w33r5m2C9ZtCQ== + dependencies: + "@toruslabs/http-helpers" "^5.0.0" + "@toruslabs/openlogin" "^6.0.0" + "@toruslabs/openlogin-jrpc" "^6.0.0" + "@toruslabs/openlogin-utils" "^6.0.0" + "@web3auth/base" "^7.1.0" + bowser "^2.11.0" + classnames "^2.3.2" + copy-to-clipboard "^3.3.3" + i18next "^23.6.0" + lodash.clonedeep "^4.5.0" + lodash.merge "^4.6.2" + react-i18next "^13.3.1" + react-qrcode-logo "^2.9.0" + +"@web3auth/wallet-connect-v2-adapter@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@web3auth/wallet-connect-v2-adapter/-/wallet-connect-v2-adapter-7.1.1.tgz#da7ef4cef8fbbbcbce9bd6948dc73cef307d2d8a" + integrity sha512-TsJAi0wZwbyDTAJ6CsqWSH12bNAW08xZlH+I1iMhYdMuS1F2Bmx4wE1CX0XNqMyyj2Uejn9upfl3DbtExnLScw== + dependencies: + "@web3auth/base" "^7.1.0" + "@web3auth/base-evm-adapter" "^7.1.0" + "@web3auth/ethereum-provider" "^7.1.1" + lodash.merge "^4.6.2" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -5471,6 +6042,17 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +assert@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -5488,6 +6070,13 @@ async-mutex@^0.2.6: dependencies: tslib "^2.0.0" +async-mutex@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.0.tgz#ae8048cd4d04ace94347507504b3cf15e631c25f" + integrity sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA== + dependencies: + tslib "^2.4.0" + async@^3.2.3: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" @@ -5632,11 +6221,21 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" @@ -5654,7 +6253,7 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bignumber.js@*, bignumber.js@^9.0.0: +bignumber.js@*, bignumber.js@^9.0.0, bignumber.js@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== @@ -5729,6 +6328,11 @@ borsh@^0.7.0: bs58 "^4.0.0" text-encoding-utf-8 "^1.0.2" +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -5785,6 +6389,13 @@ bs58@^4.0.0, bs58@^4.0.1: dependencies: base-x "^3.0.2" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" @@ -6034,6 +6645,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -6465,6 +7081,11 @@ crc-32@^1.2.0: resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== +crc@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/crc/-/crc-4.3.2.tgz#49b7821cbf2cf61dfd079ed93863bbebd5469b9a" + integrity sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A== + create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -6606,7 +7227,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -6912,13 +7533,29 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +engine.io-client@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" + integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" + integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== + enhanced-resolve@^5.12.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -7468,7 +8105,7 @@ eth-rpc-errors@4.0.2: dependencies: fast-safe-stringify "^2.0.6" -eth-rpc-errors@^4.0.2: +eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== @@ -7503,6 +8140,16 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + ethereumjs-util@^7.1.5: version "7.1.5" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" @@ -7522,6 +8169,14 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" +ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" @@ -7688,7 +8343,7 @@ fast-redact@^3.0.0: resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== -fast-safe-stringify@^2.0.6: +fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== @@ -8417,6 +9072,13 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -8480,6 +9142,13 @@ i18n-js@^4.3.2: lodash "*" make-plural "*" +i18next@^23.6.0: + version "23.7.6" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.7.6.tgz#7328e76c899052d5d33d930164612dd21e575f74" + integrity sha512-O66BhXBw0fH4bEJMA0/klQKPEbcwAp5wjXEL803pdAynNbg2f4qhLIYlNHJyE7icrL6XmSZKPYaaXwy11kJ6YQ== + dependencies: + "@babel/runtime" "^7.23.2" + iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -8791,6 +9460,14 @@ is-map@^2.0.1: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -9152,6 +9829,13 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" + integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== + dependencies: + jsonify "^0.0.1" + json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" @@ -9188,11 +9872,21 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsonschema@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -9213,6 +9907,11 @@ just-diff@^6.0.0: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== +jwt-decode@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" + integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== + keccak@^3.0.0, keccak@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" @@ -9494,17 +10193,27 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.isequal@4.5.0: +lodash.isequal@4.5.0, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== @@ -9583,6 +10292,11 @@ log-update@^5.0.1: strip-ansi "^7.0.1" wrap-ansi "^8.0.1" +loglevel@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -9781,6 +10495,11 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromatch@4.0.5, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -10522,6 +11241,14 @@ object-inspect@^1.13.1, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -10582,6 +11309,11 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.0" es-abstract "^1.22.1" +oblivious-set@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.1.1.tgz#d9d38e9491d51f27a5c3ec1681d2ba40aa81e98b" + integrity sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w== + oboe@2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" @@ -11039,6 +11771,11 @@ pngjs@^5.0.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== +pony-cause@^2.1.10: + version "2.1.10" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" + integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== + postcss-import@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" @@ -11214,6 +11951,14 @@ psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -11229,6 +11974,11 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== +qrcode-generator@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7" + integrity sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw== + qrcode@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.0.tgz#95abb8a91fdafd86f8190f2836abbfc500c72d1b" @@ -11344,6 +12094,14 @@ react-focus-lock@^2.9.4: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-i18next@^13.3.1: + version "13.4.1" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.4.1.tgz#cc1fc0422b4652524c8f2f7856fa9b3db4c4dfae" + integrity sha512-z02JvLbt6Gavbuhr4CBOI6vasLypo+JSLvMgUOGeOMPv1g6spngfAb9jWAPwvuavPlKYU4dro9yRduflwyBeyA== + dependencies: + "@babel/runtime" "^7.22.5" + html-parse-stringify "^3.0.1" + react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -11359,6 +12117,14 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-qrcode-logo@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-qrcode-logo/-/react-qrcode-logo-2.9.0.tgz#34270d563b4a15396b5e7e7656ea2d079673adad" + integrity sha512-x9uctB/8kuQ+x7p4V/BRv6qbQV4xYopLcitBuQT3925U/zVFb3bbDUsUZsi7hEKuAX/wRsfhs331FhlPSYCO9Q== + dependencies: + lodash.isequal "^4.5.0" + qrcode-generator "^1.4.1" + react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" @@ -11520,7 +12286,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^4.1.0: +readable-stream@^4.1.0, readable-stream@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.2.tgz#e6aced27ad3b9d726d8308515b9a1b98dc1b9d13" integrity sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA== @@ -12035,6 +12801,24 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +socket.io-client@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" + integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + 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" @@ -12653,6 +13437,11 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== +ts-custom-error@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-3.3.1.tgz#8bd3c8fc6b8dc8e1cb329267c45200f1e17a65d1" + integrity sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" @@ -12727,6 +13516,16 @@ tuf-js@^1.1.7: debug "^4.3.4" make-fetch-happen "^11.1.1" +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -12955,6 +13754,11 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unload@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/unload/-/unload-2.4.1.tgz#b0c5b7fb44e17fcbf50dcb8fb53929c59dd226a5" + integrity sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw== + upath@2.0.1, upath@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" @@ -13025,7 +13829,7 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.0, util@^0.12.4: +util@^0.12.0, util@^0.12.4, util@^0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -13175,6 +13979,11 @@ vitest@^0.31.0: vite-node "0.31.4" why-is-node-running "^2.2.2" +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + vscode-oniguruma@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" @@ -13592,6 +14401,11 @@ ws@^8.13.0, ws@^8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + xhr-request-promise@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" @@ -13639,6 +14453,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From ab0403786d2140de9916e7855a2109c43a10a3ba Mon Sep 17 00:00:00 2001 From: Sahil Aujla Date: Tue, 28 Nov 2023 15:13:54 -0500 Subject: [PATCH 72/79] docs: change UserOperation to UO where needed (#288) --- .../accounts/src/kernel-zerodev/README.md | 2 +- site/guides/batching-transactions.md | 10 +++--- site/guides/sim-user-operation.md | 8 ++--- .../gas-sponsorship-eligibility.md | 4 +-- site/guides/sponsoring-gas/sponsoring-gas.md | 34 +++++++++---------- site/overview/getting-started.md | 14 ++++---- .../light-account/encodeTransferOwnership.md | 2 +- .../aa-alchemy/provider/constructor.md | 2 +- .../provider/withAlchemyUserOpSimulation.md | 4 +-- .../client/actions/sendUserOperation.md | 4 +-- site/packages/aa-core/client/index.md | 4 +-- .../aa-core/provider/buildUserOperation.md | 4 +-- .../provider/buildUserOperationFromTx.md | 4 +-- .../checkGasSponsorshipEligibility.md | 6 ++-- .../provider/dropAndReplaceUserOperation.md | 2 +- .../provider/getUserOperationByHash.md | 4 +-- .../aa-core/provider/sendTransaction.md | 4 +-- .../aa-core/provider/sendTransactions.md | 2 +- .../aa-core/provider/withFeeDataGetter.md | 6 ++-- .../aa-core/provider/withGasEstimator.md | 6 ++-- .../provider/withPaymasterMiddleware.md | 4 +-- .../aa-core/utils/getUserOperationHash.md | 8 ++--- 22 files changed, 69 insertions(+), 69 deletions(-) diff --git a/packages/accounts/src/kernel-zerodev/README.md b/packages/accounts/src/kernel-zerodev/README.md index 25c371bf43..25e2dc1c7b 100644 --- a/packages/accounts/src/kernel-zerodev/README.md +++ b/packages/accounts/src/kernel-zerodev/README.md @@ -76,7 +76,7 @@ The primary interfaces are the `KernelAccountProvider`, `KernelSmartContractAcco The `KernelAccountProvider` is an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant Provider built on top of Alchemy's `SmartAccountProvider` -1. `sendUserOperation` -- this takes in `target`, `callData`, and an optional `value` which then constructs a UserOperation (UO), sends it, and returns the `hash` of the UO. It handles estimating gas, fetching fee data, (optionally) requesting paymasterAndData, and lastly signing. This is done via a middleware stack that runs in a specific order. The middleware order is `getDummyPaymasterData` => `estimateGas` => `getFeeData` => `getPaymasterAndData`. The paymaster fields are set to `0x` by default. They can be changed using `provider.withPaymasterMiddleware`. +1. `sendUserOperation` -- this takes in `target`, `callData`, and an optional `value` which then constructs a `UserOperation` (UO), sends it, and returns the `hash` of the UO. It handles estimating gas, fetching fee data, (optionally) requesting paymasterAndData, and lastly signing. This is done via a middleware stack that runs in a specific order. The middleware order is `getDummyPaymasterData` => `estimateGas` => `getFeeData` => `getPaymasterAndData`. The paymaster fields are set to `0x` by default. They can be changed using `provider.withPaymasterMiddleware`. 2. `sendTransaction` -- this takes in a traditional Transaction Request object which then gets converted into a UO. This takes in a traditional Transaction Request object which then gets converted into a UO. Note that `to` field of transaction is required, and among other fields of transaction, only `data`, `value`, `maxFeePerGas`, `maxPriorityFeePerGas` fields are considered if given. Support for other fields is coming soon. `KernelSmartContractAccount` is Kernel's implementation of `BaseSmartContractAccount`. 6 main methods are implemented diff --git a/site/guides/batching-transactions.md b/site/guides/batching-transactions.md index b49c452052..050a33576c 100644 --- a/site/guides/batching-transactions.md +++ b/site/guides/batching-transactions.md @@ -20,7 +20,7 @@ head: # How to Submit Batch Transactions -One benefit of Smart Contract Accounts is that it's possible to batch transactions in one User Operation. Not all Smart Contract Accounts support batching. But, if the `ISmartContractAccount` implementation you're using has the [`encodeBatchExecute`](/packages/aa-core/accounts/optional/encodeBatchExecute.md) method, then implementations of `SmartAccountProvider` will allow you to make those calls. +One benefit of Smart Contract Accounts is that it's possible to batch transactions in one `UserOperation` (UO). Not all Smart Contract Accounts support batching. But, if the `ISmartContractAccount` implementation you're using has the [`encodeBatchExecute`](/packages/aa-core/accounts/optional/encodeBatchExecute.md) method, then implementations of `SmartAccountProvider` will allow you to make those calls. There are two ways you can batch transactions using `SmartAccountProvider`: @@ -32,16 +32,16 @@ Both `SimpleSmartContractAccount` and `LightSmartContractAccount` implement `enc ::: :::tip Note 2: Transactions Batched as a Single User Operation -When you batch transactions, the transaction actions (`target`s and `calldata`s) are batched into a single `UserOperation`, where the sender is the account itself. +When you batch transactions, the transaction actions (`target`s and `calldata`s) are batched into a single UO, where the sender is the account itself. ::: :::tip Note 3: Batched Transactions Ordering -The batched `UserOperation` gets executed by the account calling the `executeBatch` method on the [`SimpleAccount`](https://github.com/eth-infinitism/account-abstraction/blob/ver0.6.0/contracts/samples/SimpleAccount.sol) or [`LightAccount`](https://github.com/alchemyplatform/light-account/blob/v1.0.2/src/LightAccount.sol) smart contracts. `executeBatch` processes the input array of transactions data linearly, guaranteeing the execution order of those transactions to be **sequential**. +The batched UO gets executed by the account calling the `executeBatch` method on the [`SimpleAccount`](https://github.com/eth-infinitism/account-abstraction/blob/ver0.6.0/contracts/samples/SimpleAccount.sol) or [`LightAccount`](https://github.com/alchemyplatform/light-account/blob/v1.0.2/src/LightAccount.sol) smart contracts. `executeBatch` processes the input array of transactions data linearly, guaranteeing the execution order of those transactions to be **sequential**. ::: ## Batching using [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation.md) -The `SmartAccountProvider` supports passing either a single `UserOperation` or an array of `UserOperation`s to `sendUserOperation`. If you pass an array, the provider will batch the transactions into a single User Operation and submit it to the bundler. Let's see an example: +The `SmartAccountProvider` supports passing either a single UO or an array of UOs to `sendUserOperation`. If you pass an array, the provider will batch the transactions into a single User Operation and submit it to the bundler. Let's see an example: ::: code-group @@ -67,7 +67,7 @@ const { hash } = await provider.sendUserOperation([ ## Batching using [`sendTransactions`](/packages/aa-core/provider/sendTransactions.md) -The `SmartAccountProvider` supports sending `UserOperation`s and waiting for them to be mined in a transaction via the `sendTransaction` and `sendTransactions` methods. The latter allows for batching in the same way `sendUserOperation`: +The `SmartAccountProvider` supports sending UOs and waiting for them to be mined in a transaction via the `sendTransaction` and `sendTransactions` methods. The latter allows for batching in the same way `sendUserOperation`: ::: code-group diff --git a/site/guides/sim-user-operation.md b/site/guides/sim-user-operation.md index 0bdad1d64f..00808a02f5 100644 --- a/site/guides/sim-user-operation.md +++ b/site/guides/sim-user-operation.md @@ -23,9 +23,9 @@ prev: # How to Simulate a User Operation -This guide will show you how to simulate a `UserOperation` with Account Kit by adding support for `UserOperation` simulation on an `AlchemyProvider` and sending a User Operation from that provider only if simulation passes. By the end of this guide, you'll have a basic understanding of how to safely send `UserOperation`s with the `aa-sdk`. +This guide will show you how to simulate a `UserOperation` (UO) with Account Kit by adding support for UO simulation on an `AlchemyProvider` and sending a User Operation from that provider only if simulation passes. By the end of this guide, you'll have a basic understanding of how to safely send UOs with the `aa-sdk`. -There are two ways that Account Kit supports `UserOperation` simulation on an `AlchemyProvider`: +There are two ways that Account Kit supports UO simulation on an `AlchemyProvider`: 1. using the [`withAlchemyUserOpSimulation`](/packages/aa-alchemy/provider/withAlchemyUserOpSimulation) middleware 2. using the [`simulateUserOperationAssetChanges`](/packages/aa-alchemy/provider/simulateUserOperationAssetChanges) method @@ -34,7 +34,7 @@ There are two ways that Account Kit supports `UserOperation` simulation on an `A To simulate User Operations, we must connect the `provider` with the middleware to simulate `UserOperations` before sending them. This can be done in a single line code, as show below! -Then, whenever you call a method on the provider which generates the `UserOperation` to send (e.g. [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation), [`sendTransaction`](/packages/aa-core/provider/sendTransaction), [`sendTransactions`](/packages/aa-core/provider/sendTransactions), [`buildUserOperation`](/packages/aa-core/provider/buildUserOperation), or [`buildUserOperationFromTx`](/packages/aa-core/provider/buildUserOperationFromTx)), the provider will also simulate which assets change as a result of the `UserOperation`, and if simulation fails, the provider will not send the `UserOperation` unnecessarily! +Then, whenever you call a method on the provider which generates the UO to send (e.g. [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation), [`sendTransaction`](/packages/aa-core/provider/sendTransaction), [`sendTransactions`](/packages/aa-core/provider/sendTransactions), [`buildUserOperation`](/packages/aa-core/provider/buildUserOperation), or [`buildUserOperationFromTx`](/packages/aa-core/provider/buildUserOperationFromTx)), the provider will also simulate which assets change as a result of the UO, and if simulation fails, the provider will not send the UO unnecessarily! ::: code-group @@ -45,7 +45,7 @@ Then, whenever you call a method on the provider which generates the `UserOperat ## 2. Using [`simulateUserOperationAssetChanges`](/packages/aa-alchemy/provider/simulateUserOperationAssetChanges) -You can also selectively simulate `UserOperation`s by calling the [`simulateUserOperationAssetChanges`](/packages/aa-alchemy/provider/simulateUserOperationAssetChanges) method before sending a `UserOperation`. You'd be responsible for catching any errors like how it's done below, but this is a nice alternative to always running simulation. +You can also selectively simulate UOs by calling the [`simulateUserOperationAssetChanges`](/packages/aa-alchemy/provider/simulateUserOperationAssetChanges) method before sending a UO. You'd be responsible for catching any errors like how it's done below, but this is a nice alternative to always running simulation. ::: code-group diff --git a/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md index 847c370d2a..0cc7cc3004 100644 --- a/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md +++ b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md @@ -50,9 +50,9 @@ provider.withAlchemyGasManager({ ::: -Then, before you call `sendUserOperation` on the provider, you can use [`checkGasSponsorshipEligibility`](/packages/aa-core/provider/checkGasSponsorshipEligibility.md) to verify the eligibility of the connected account for gas sponsorship concerning the upcoming `UserOperation` that is intended to be sent. +Then, before you call `sendUserOperation` on the provider, you can use [`checkGasSponsorshipEligibility`](/packages/aa-core/provider/checkGasSponsorshipEligibility.md) to verify the eligibility of the connected account for gas sponsorship concerning the upcoming `UserOperation` (UO) that is intended to be sent. -Internally, this method invokes [`buildUserOperation`](/packages/aa-core/provider/buildUserOperation.md), which navigates through the middleware pipeline, including the `PaymasterMiddleware`. Its purpose is to construct the `UserOperation` struct meant for transmission to the bundler. Following the construction of the `UserOperation` struct, this function verifies if the resulting structure contains a non-empty `paymasterAndData` field. +Internally, this method invokes [`buildUserOperation`](/packages/aa-core/provider/buildUserOperation.md), which navigates through the middleware pipeline, including the `PaymasterMiddleware`. Its purpose is to construct the UO struct meant for transmission to the bundler. Following the construction of the UO struct, this function verifies if the resulting structure contains a non-empty `paymasterAndData` field. You can utilize this method before sending the user operation to confirm its eligibility for gas sponsorship. Depending on the outcome, it allows you to tailor the user experience accordingly, based on eligibility. diff --git a/site/guides/sponsoring-gas/sponsoring-gas.md b/site/guides/sponsoring-gas/sponsoring-gas.md index c7956b29ec..e09a081399 100644 --- a/site/guides/sponsoring-gas/sponsoring-gas.md +++ b/site/guides/sponsoring-gas/sponsoring-gas.md @@ -3,24 +3,24 @@ outline: deep head: - - meta - property: og:title - content: How to Sponsor Gas for a User Operation + content: How to Sponsor Gas for a UserOperation - - meta - name: description - content: Follow this guide to sponsor gas for User Operations from any ERC-4337 smart account. Account Kit is a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to sponsor gas for UserOperations from any ERC-4337 smart account. Account Kit is a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this guide to sponsor gas for User Operations from any ERC-4337 smart account. Account Kit is a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to sponsor gas for UserOperations from any ERC-4337 smart account. Account Kit is a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title - content: How to Sponsor Gas for a User Operation + content: How to Sponsor Gas for a UserOperation - - meta - name: twitter:description - content: Follow this guide to sponsor gas for User Operations from any ERC-4337 smart account. Account Kit is a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to sponsor gas for UserOperations from any ERC-4337 smart account. Account Kit is a vertically integrated stack for building apps that support ERC-4337. --- -# How to Sponsor Gas for a User Operation +# How to Sponsor Gas for a UserOperation -Gas fees are a significant barrier to entry for new user of your app. With Account Kit you can remove this barrier by sponsoring gas fees for transactions via the [Gas Manager](https://docs.alchemy.com/docs/gas-manager-services). This guide explains how to sponsor gas by creating a gas policy, linking it to your provider, and sending sponsored user operations from a smart account. +Gas fees are a significant barrier to entry for new user of your app. With Account Kit you can remove this barrier by sponsoring gas fees for transactions via the [Gas Manager](https://docs.alchemy.com/docs/gas-manager-services). This guide explains how to sponsor gas by creating a gas policy, linking it to your provider, and sending sponsored `UserOperations` (UOs) from a smart account. ## How to Sponsor Gas @@ -28,7 +28,7 @@ After [installing `aa-sdk`](/overview/getting-started#install-the-packages) in y ### 1. Set Up the Provider -First, create an `AlchemyProvider`. You'll use this to send user operations and interact with the blockchain. +First, create an `AlchemyProvider`. You'll use this to send UOs and interact with the blockchain. <<< @/snippets/provider.ts @@ -36,10 +36,10 @@ Remember to replace `ALCHEMY_API_KEY` with your Alchemy API key. If you don't ha ### 2. Create a Gas Manager Policy -A gas manager policy is a set of rules that define which user operations are eligible for gas sponsorship. You can control which operations are eligible for sponsorship by defining rules: +A gas manager policy is a set of rules that define which UOs are eligible for gas sponsorship. You can control which operations are eligible for sponsorship by defining rules: - **Spending rules**: limit the amount of money or the number of user ops that can be sponsored by this policy -- **Allowlist**: restrict wallet addresses that are eligible for sponsorship. The policy will only sponsor gas for user operations that were sent by addresses on this list. +- **Allowlist**: restrict wallet addresses that are eligible for sponsorship. The policy will only sponsor gas for UOs that were sent by addresses on this list. - **Blocklist**: ban certain addresses from receiving sponsorship under this policy - **Policy duration**: define the duration of your policy and the sponsorship expiry period. This is the period for which the Gas Manager signature (paymaster data) will remain valid once it is generated. @@ -64,13 +64,13 @@ import { provider } from "./provider.ts"; //dashboard.alchemy.com/gas-manager/policy/create const GAS_MANAGER_POLICY_ID = "YourGasManagerPolicyId"; -// Link the provider with the Gas Manager. This ensures user operations +// Link the provider with the Gas Manager. This ensures UOs // sent with this provider get sponsorship from the Gas Manager. provider.withAlchemyGasManager({ policyId: GAS_MANAGER_POLICY_ID, }); -// Here's how to send a sponsored user operation from your smart account: +// Here's how to send a sponsored UO from your smart account: const { hash } = await provider.sendUserOperation({ target: "0xTargetAddress", data: "0xCallData", @@ -82,11 +82,11 @@ const { hash } = await provider.sendUserOperation({ ::: -You've created a gas manager policy and linked it to the provider. This guarantees that user operations sent with this provider receive sponsorship if and only the user operation satisfies the rules defined in your gas policy. +You've created a gas manager policy and linked it to the provider. This guarantees that UOs sent with this provider receive sponsorship if and only the UO satisfies the rules defined in your gas policy. ### 4. Send the Sponsored UserOperation -Now you're ready to send sponsored user operations! You can send a user operation by calling `sendUserOperation` on the provider. The Gas Manager will check if this user operation satisfies the policy rules defined above and sponsor the gas costs if the rules are met. If the user operation does not meet the policy rules, an error will be thrown. +Now you're ready to send sponsored UOs! You can send a UO by calling `sendUserOperation` on the provider. The Gas Manager will check if this UO satisfies the policy rules defined above and sponsor the gas costs if the rules are met. If the UO does not meet the policy rules, an error will be thrown. ::: code-group @@ -97,13 +97,13 @@ import { provider } from "./provider.ts"; //dashboard.alchemy.com/gas-manager/policy/create const GAS_MANAGER_POLICY_ID = "YourGasManagerPolicyId"; -// Link the provider with the Gas Manager so the user operations +// Link the provider with the Gas Manager so the UOs // sent with this provider get sponsorship from the Gas Manager. provider.withAlchemyGasManager({ policyId: GAS_MANAGER_POLICY_ID, }); -// Send a sponsored user operation from your smart account like this: // [!code focus:6] +// Send a sponsored UO from your smart account like this: // [!code focus:6] const { hash } = await provider.sendUserOperation({ target: "0xTargetAddress", data: "0xCallData", @@ -115,4 +115,4 @@ const { hash } = await provider.sendUserOperation({ ::: -Congratulations! You've successfully sponsored gas for a user operation by creating a Gas Manager Policy, defining policy rules, linking your policy to the provider, and submitting a user operation. +Congratulations! You've successfully sponsored gas for a UO by creating a Gas Manager Policy, defining policy rules, linking your policy to the provider, and submitting a UO. diff --git a/site/overview/getting-started.md b/site/overview/getting-started.md index 4a614d05ad..4d2381c13e 100644 --- a/site/overview/getting-started.md +++ b/site/overview/getting-started.md @@ -20,7 +20,7 @@ head: # Getting Started -This guide will help you get started with Account Kit by setting up your environment, creating a smart account, and sending a `UserOperation` on its behalf. By the end of this guide, you'll have a basic understanding of how to use the SDK and where to look for more advanced use cases. +This guide will help you get started with Account Kit by setting up your environment, creating a smart account, and sending a `UserOperation` (UO) on its behalf. By the end of this guide, you'll have a basic understanding of how to use the SDK and where to look for more advanced use cases. ## 1. Install the Packages @@ -95,7 +95,7 @@ To read or write any data to a blockchain, you'll need an Alchemy API Key and RP ## 2. Query Your Smart Account Address -Using the SDK in the following example, we'll use the Account Kit to generate the address of your smart account from which to eventually send a `UserOperation`. +Using the SDK in the following example, we'll use the Account Kit to generate the address of your smart account from which to eventually send a UO. <<< @/snippets/getting-started/provider.ts @@ -113,7 +113,7 @@ Smart Account Address: 0xYOUR_SMART_ACCOUNT_ADDRESS ## 3. Fund Your Smart Account -To deploy the smart account and send `UserOperation`s on its behalf, you'll need to add native token to your smart account. +To deploy the smart account and send UOs on its behalf, you'll need to add native token to your smart account. At scale, you might consider using our Gas Manager to [sponsor UserOperations](/guides/sponsoring-gas/sponsoring-gas) for smart accounts. But for the purpose of this example, and because we're using a testnet, let's fund the account using the [Alchemy Faucet](https://sepoliafaucet.com). Make sure to log in with Alchemy to receive your testnet tokens. @@ -121,7 +121,7 @@ At scale, you might consider using our Gas Manager to [sponsor UserOperations](/ ## 4. Send a User Operation Using Account Kit -Finally, let's deploy the newly funded smart account and send a `UserOperation` on its behalf. +Finally, let's deploy the newly funded smart account and send a UO on its behalf. <<< @/snippets/getting-started/send-user-operation.ts @@ -140,9 +140,9 @@ Transaction Hash: 0xYOUR_TXN_HASH ``` :::tip Note -The `UserOperation` Hash is what our [Bundler](https://github.com/alchemyplatform/rundler) returns once it submits the `UserOperation` to the Blockchain on behalf of your smart account. +The UO hash is what our [Bundler](https://github.com/alchemyplatform/rundler) returns once it submits the UO to the Blockchain on behalf of your smart account. -To know when the `UserOperation` is mined on a blockchain in order query information about it, you'll want to use the `Transaction Hash`. +To know when the UO is mined on a blockchain in order query information about it, you'll want to use the `Transaction Hash`. ::: :::tip Handling Errors @@ -158,7 +158,7 @@ Since this "Getting Started" example is a simple script, you'll need to consider ## 5. Dive Deeper -In this guide, we initialized an `AlchemyProvider` with the `aa-alchemy` package to send a `UserOperation`. However, you can do a lot more with Account Kit and its many packages. +In this guide, we initialized an `AlchemyProvider` with the `aa-alchemy` package to send a UO. However, you can do a lot more with Account Kit and its many packages. 1. To learn more about the different packages and their use cases, check out the ["Packages Overview"](/overview/package-overview) page. diff --git a/site/packages/aa-accounts/light-account/encodeTransferOwnership.md b/site/packages/aa-accounts/light-account/encodeTransferOwnership.md index ed1f9dc8fc..79c8d585db 100644 --- a/site/packages/aa-accounts/light-account/encodeTransferOwnership.md +++ b/site/packages/aa-accounts/light-account/encodeTransferOwnership.md @@ -14,7 +14,7 @@ head: # encodeTransferOwnership -`encodeTransferOwnership` is a static class method on the `LightSmartContractAccount` which generates the call data necessary to send a userOperation calling `transferOwnership` on the connected smart contract account. +`encodeTransferOwnership` is a static class method on the `LightSmartContractAccount` which generates the call data necessary to send a `UserOperation` calling `transferOwnership` on the connected smart contract account. ## Usage diff --git a/site/packages/aa-alchemy/provider/constructor.md b/site/packages/aa-alchemy/provider/constructor.md index 1cbae43327..efefaf1074 100644 --- a/site/packages/aa-alchemy/provider/constructor.md +++ b/site/packages/aa-alchemy/provider/constructor.md @@ -82,4 +82,4 @@ A new instance of an `AlchemyProvider`. - `maxPriorityFeeBufferPercent: bigint | undefined` -- [optional] a percent buffer on top of the priority fee estimated (default 5%). This is only applied if the default fee estimator is used. - - `preVerificationGasBufferPercent: bigint | undefined` -- [optional] a percent buffer on top of the preVerificationGas estimated (default 5% on Arbitrum and Optimism, 0% elsewhere). This is only useful on Arbitrum and Optimism, where the preVerificationGas is dependent on the gas fee during the time of estimation. To improve chances of the UserOperation being mined, users can increase the preVerificationGas by a buffer. This buffer will always be charged, regardless of price at time of mine. This is only applied if the default gas estimator is used. + - `preVerificationGasBufferPercent: bigint | undefined` -- [optional] a percent buffer on top of the preVerificationGas estimated (default 5% on Arbitrum and Optimism, 0% elsewhere). This is only useful on Arbitrum and Optimism, where the preVerificationGas is dependent on the gas fee during the time of estimation. To improve chances of the `UserOperation` being mined, users can increase the preVerificationGas by a buffer. This buffer will always be charged, regardless of price at time of mine. This is only applied if the default gas estimator is used. diff --git a/site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md b/site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md index 1deb4d208f..792e11a57f 100644 --- a/site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md +++ b/site/packages/aa-alchemy/provider/withAlchemyUserOpSimulation.md @@ -16,7 +16,7 @@ next: # withAlchemyUserOpSimulation -`withAlchemyUserOpSimulation` is a method on `AlchemyProvider` that you can optionally call to create a new provider instance with added middleware leveraging the Alchemy `UserOperation` Simulation API. Under the hood, this will call the [`withAlchemyUserOpSimulation`](/packages/aa-alchemy/middleware/withAlchemyUserOpSimulation) middleware to simulate asset changes resulting from user operation. +`withAlchemyUserOpSimulation` is a method on `AlchemyProvider` that you can optionally call to create a new provider instance with added middleware leveraging the Alchemy `UserOperation` (UO) Simulation API. Under the hood, this will call the [`withAlchemyUserOpSimulation`](/packages/aa-alchemy/middleware/withAlchemyUserOpSimulation) middleware to simulate asset changes resulting from user operation. ## Usage @@ -37,4 +37,4 @@ const providerWithGasManager = provider.withAlchemyUserOpSimulation(); ### `AlchemyProvider` -A new instance of an `AlchemyProvider` with the same attributes as the input, now with middleware for accessing the Alchemy `UserOperation` Simulation API to simulate asset changes resulting from user operation. +A new instance of an `AlchemyProvider` with the same attributes as the input, now with middleware for accessing the Alchemy UO Simulation API to simulate asset changes resulting from user operation. diff --git a/site/packages/aa-core/client/actions/sendUserOperation.md b/site/packages/aa-core/client/actions/sendUserOperation.md index 5de426ec6d..d0140481a4 100644 --- a/site/packages/aa-core/client/actions/sendUserOperation.md +++ b/site/packages/aa-core/client/actions/sendUserOperation.md @@ -16,7 +16,7 @@ prev: # sendUserOperation -Calls `eth_sendUserOperation` and returns the hash of the sent UserOperation. +Calls `eth_sendUserOperation` and returns the hash of the sent `UserOperation` (UO). ## Usage @@ -40,7 +40,7 @@ const hash = await client.sendUserOperation( ### `Promise` -the hash of the sent UserOperation +the hash of the sent UO ## Parameters diff --git a/site/packages/aa-core/client/index.md b/site/packages/aa-core/client/index.md index ac043bb322..dcf39f294c 100644 --- a/site/packages/aa-core/client/index.md +++ b/site/packages/aa-core/client/index.md @@ -44,7 +44,7 @@ Sends a user operation to the RPC provider and returns gas estimates for the Use #### Returns -- `UserOperationEstimateGasResponse` - gas estimates for the UserOperation. +- `UserOperationEstimateGasResponse` - gas estimates for the `UserOperation` (UO). ### `eth_getUserOperationReceipt` @@ -68,7 +68,7 @@ Given a User Operation hash, returns the User Operation. #### Returns -- `UserOperationResponse | null` - The UserOperation if it exists or null if it does not. +- `UserOperationResponse | null` - The UO if it exists or null if it does not. ### `eth_supportedEntryPoints` diff --git a/site/packages/aa-core/provider/buildUserOperation.md b/site/packages/aa-core/provider/buildUserOperation.md index 29f4443e42..aecb2915bb 100644 --- a/site/packages/aa-core/provider/buildUserOperation.md +++ b/site/packages/aa-core/provider/buildUserOperation.md @@ -14,7 +14,7 @@ head: # buildUserOperation -Builds an _unsigned_ UserOperation struct with the all of the middleware run on it through the middleware pipeline. +Builds an _unsigned_ `UserOperation` (UO) struct with the all of the middleware run on it through the middleware pipeline. The order of the middlewares is: @@ -65,7 +65,7 @@ const { hash: batchedUoHash } = await provider.sendUserOperation( ### `Promise` -A Promise containing the _unsigned_ UserOperation struct resulting from the middleware pipeline +A Promise containing the _unsigned_ UO struct resulting from the middleware pipeline ## Parameters diff --git a/site/packages/aa-core/provider/buildUserOperationFromTx.md b/site/packages/aa-core/provider/buildUserOperationFromTx.md index 9d14bc18a4..af5203f379 100644 --- a/site/packages/aa-core/provider/buildUserOperationFromTx.md +++ b/site/packages/aa-core/provider/buildUserOperationFromTx.md @@ -14,7 +14,7 @@ head: # buildUserOperationFromTx -Converts a traditional Ethereum transaction and builds an _unsigned_ UserOperation struct with the all of the middleware run on it through the middleware pipeline. +Converts a traditional Ethereum transaction and builds an _unsigned_ `UserOperation` (UO) struct with the all of the middleware run on it through the middleware pipeline. The order of the middlewares is: @@ -52,7 +52,7 @@ const uoHash = await provider.sendUserOperation(uoStruct); ### `Promise` -A Promise containing the _unsigned_ UserOperation struct converted from the input transaction with all the middleware run on the resulting UserOperation +A Promise containing the _unsigned_ UO struct converted from the input transaction with all the middleware run on the resulting UO ## Parameters diff --git a/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md b/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md index 42fdcb7f56..ac289d914e 100644 --- a/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md +++ b/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md @@ -14,9 +14,9 @@ head: # checkGasSponsorshipEligibility -This function verifies the eligibility of the connected account for gas sponsorship concerning the upcoming `UserOperation` that is intended to be sent. +This function verifies the eligibility of the connected account for gas sponsorship concerning the upcoming `UserOperation` (UO) that is intended to be sent. -Internally, this method invokes [`buildUserOperation`](./buildUserOperation.md), which navigates through the middleware pipeline, including the `PaymasterMiddleware`. Its purpose is to construct the `UserOperation` struct meant for transmission to the bundler. Following the construction of the `UserOperation` struct, this function verifies if the resulting structure contains a non-empty `paymasterAndData` field. +Internally, this method invokes [`buildUserOperation`](./buildUserOperation.md), which navigates through the middleware pipeline, including the `PaymasterMiddleware`. Its purpose is to construct the UO struct meant for transmission to the bundler. Following the construction of the UO struct, this function verifies if the resulting structure contains a non-empty `paymasterAndData` field. You can utilize this method before sending the user operation to confirm its eligibility for gas sponsorship. Depending on the outcome, it allows you to tailor the user experience accordingly, based on eligibility. @@ -49,7 +49,7 @@ console.log( ### `Promise` -A Promise containing the boolean value indicating whether the `UserOperation` to be sent is eligible for gas sponsorship or not. +A Promise containing the boolean value indicating whether the UO to be sent is eligible for gas sponsorship or not. ## Parameters diff --git a/site/packages/aa-core/provider/dropAndReplaceUserOperation.md b/site/packages/aa-core/provider/dropAndReplaceUserOperation.md index 907d7b0c1f..525be3ee5a 100644 --- a/site/packages/aa-core/provider/dropAndReplaceUserOperation.md +++ b/site/packages/aa-core/provider/dropAndReplaceUserOperation.md @@ -49,7 +49,7 @@ A Promise containing the hash of the user operation and the request that was sen ### `UserOperationRequest` -A previously submitted UserOperation. +A previously submitted `UserOperation`. ### `overrides?: UserOperationOverrides` diff --git a/site/packages/aa-core/provider/getUserOperationByHash.md b/site/packages/aa-core/provider/getUserOperationByHash.md index 65c57135a2..fd9dc91daa 100644 --- a/site/packages/aa-core/provider/getUserOperationByHash.md +++ b/site/packages/aa-core/provider/getUserOperationByHash.md @@ -14,7 +14,7 @@ head: # getUserOperationByHash -Return a UserOperation based on a hash (userOpHash). +Return a `UserOperation` (UO) based on a hash (userOpHash). ## Usage @@ -34,7 +34,7 @@ provider.getUserOperationByHash("0xUserOpResultHash"); ### `Promise` -A Promise containing the UserOperation if found on-chain or null if not found. +A Promise containing the UO if found on-chain or null if not found. ## Parameters diff --git a/site/packages/aa-core/provider/sendTransaction.md b/site/packages/aa-core/provider/sendTransaction.md index f85dbd67c2..fb6a0d6b83 100644 --- a/site/packages/aa-core/provider/sendTransaction.md +++ b/site/packages/aa-core/provider/sendTransaction.md @@ -14,9 +14,9 @@ head: # sendTransaction -This takes an ethereum transaction and converts it into a UserOperation, sends the UserOperation, and waits on the receipt of that UserOperation (ie. has it been mined). +This takes an ethereum transaction and converts it into a `UserOperation` (UO), sends the UO, and waits on the receipt of that UO (ie. has it been mined). -If you don't want to wait for the UserOperation to mine, it's recommended to user [sendUserOperation](./sendUserOperation) instead. +If you don't want to wait for the UO to mine, it's recommended to user [sendUserOperation](./sendUserOperation) instead. Note that `to` field of transaction is required, and among other fields of transaction, only `data`, `value`, `maxFeePerGas`, `maxPriorityFeePerGas` fields are considered if given. Support for other fields is coming soon. diff --git a/site/packages/aa-core/provider/sendTransactions.md b/site/packages/aa-core/provider/sendTransactions.md index 4ad5c4d566..05d710eb8c 100644 --- a/site/packages/aa-core/provider/sendTransactions.md +++ b/site/packages/aa-core/provider/sendTransactions.md @@ -14,7 +14,7 @@ head: # sendTransactions -This takes a set of ethereum transactions and converts them into one single UserOperation, sends the UserOperation, and waits on the receipt of that UserOperation (ie. has it been mined). If you don't want to wait for the UserOperation to mine, it's recommended to user [sendUserOperation](./sendUserOperation) instead. +This takes a set of ethereum transactions and converts them into one single `UserOperation` (UO), sends the UO, and waits on the receipt of that UO (ie. has it been mined). If you don't want to wait for the UO to mine, it's recommended to user [sendUserOperation](./sendUserOperation) instead. **NOTE**: The account you're sending the transactions _to_ MUST support batch transactions. diff --git a/site/packages/aa-core/provider/withFeeDataGetter.md b/site/packages/aa-core/provider/withFeeDataGetter.md index fbad657b8b..254b61fb61 100644 --- a/site/packages/aa-core/provider/withFeeDataGetter.md +++ b/site/packages/aa-core/provider/withFeeDataGetter.md @@ -14,7 +14,7 @@ head: # withFeeDataGetter -Overrides the default [`feeDataGetter`](#feedatagetter) middleware. This middleware is used for setting the `maxFeePerGas` and `maxPriorityFeePerGas` fields on the `UserOperation` prior to its execution. +Overrides the default [`feeDataGetter`](#feedatagetter) middleware. This middleware is used for setting the `maxFeePerGas` and `maxPriorityFeePerGas` fields on the `UserOperation` (UO) prior to its execution. ## Usage @@ -63,11 +63,11 @@ An updated instance of the provider, which now uses the overridden `feeDataGette ### `override: FeeDataMiddleware` -A function for overriding the default `feeDataGetter` middleware. This middleware is specifically utilized to set the fee-related fields (`maxFeePerGas` and `maxPriorityFeePerGas`) on the `UserOperation` before it's executed. +A function for overriding the default `feeDataGetter` middleware. This middleware is specifically utilized to set the fee-related fields (`maxFeePerGas` and `maxPriorityFeePerGas`) on the UO before it's executed. ## `feeDataGetter` -The `feeDataGetter` is a readonly field on the `ISmartAccountProvider` interface that represents the default fee data getter middleware. It's used to set the fee-related fields on a `UserOperation` by making calls to the connected `rpcClient` to estimate the maximum priority fee per gas and retrieve fee data. +The `feeDataGetter` is a readonly field on the `ISmartAccountProvider` interface that represents the default fee data getter middleware. It's used to set the fee-related fields on a UO by making calls to the connected `rpcClient` to estimate the maximum priority fee per gas and retrieve fee data. You can access the current fee data getter configuration for the provider via: diff --git a/site/packages/aa-core/provider/withGasEstimator.md b/site/packages/aa-core/provider/withGasEstimator.md index 8232ef268e..ebd44704e7 100644 --- a/site/packages/aa-core/provider/withGasEstimator.md +++ b/site/packages/aa-core/provider/withGasEstimator.md @@ -16,7 +16,7 @@ head: Override the [`gasEstimator`](#gasEstimator) middleware. -This middleware is used for setting the `callGasLimit`, `preVerificationGas`, and `verificationGasLimit` fields on the `UserOperation` prior to its execution. This middleware is between the `feeDataGetter` middleware and the `paymasterDataMiddleware`. +This middleware is used for setting the `callGasLimit`, `preVerificationGas`, and `verificationGasLimit` fields on the `UserOperation` (UO) prior to its execution. This middleware is between the `feeDataGetter` middleware and the `paymasterDataMiddleware`. ## Usage @@ -65,13 +65,13 @@ An updated instance of the provider, which now uses the overridden `gasEstimator ### `override: GasEstimatorMiddleware` -A function for overriding the default gas estimator middleware. This middleware is specifically utilized to set the gas-related fields (`callGasLimit`, `preVerificationGas`, and `verificationGasLimit`) on the `UserOperation` before it's executed. +A function for overriding the default gas estimator middleware. This middleware is specifically utilized to set the gas-related fields (`callGasLimit`, `preVerificationGas`, and `verificationGasLimit`) on the UO before it's executed. ## `gasEstimator` The `gasEstimator` is a readonly field on the `ISmartAccountProvider` interface that represents the default gas estimator middleware. -It's used to set the gas-related fields on a `UserOperation` by making calls to the connected `rpcClient` to estimate the user operation gas limits. +It's used to set the gas-related fields on a UO by making calls to the connected `rpcClient` to estimate the user operation gas limits. You can access the current fee data getter configuration for the provider via: diff --git a/site/packages/aa-core/provider/withPaymasterMiddleware.md b/site/packages/aa-core/provider/withPaymasterMiddleware.md index c496c0bb93..0ff549c480 100644 --- a/site/packages/aa-core/provider/withPaymasterMiddleware.md +++ b/site/packages/aa-core/provider/withPaymasterMiddleware.md @@ -85,7 +85,7 @@ An updated instance of the provider, which now uses the overridden `dummyPaymast ## `dummyPaymasterDataMiddleware` -The `dummyPaymasterDataMiddleware` is a readonly field on the `ISmartAccountProvider` interface that represents the default dummy paymaster data middleware. It's used to set the `paymasterAndData` fields on a `UserOperation`. +The `dummyPaymasterDataMiddleware` is a readonly field on the `ISmartAccountProvider` interface that represents the default dummy paymaster data middleware. It's used to set the `paymasterAndData` fields on a `UserOperation` (UO). You can access the current dummy paymaster data middleware configuration for the provider via: @@ -96,7 +96,7 @@ const currentDummyPaymasterDataMiddleware = ## `paymasterDataMiddleware` -The `paymasterDataMiddleware` is a readonly field on the `ISmartAccountProvider` interface that represents the default paymaster data middleware. It's used to set the `paymasterAndData` field on a `UserOperation`. +The `paymasterDataMiddleware` is a readonly field on the `ISmartAccountProvider` interface that represents the default paymaster data middleware. It's used to set the `paymasterAndData` field on a UO. You can access the current paymaster data middleware configuration for the provider via: diff --git a/site/packages/aa-core/utils/getUserOperationHash.md b/site/packages/aa-core/utils/getUserOperationHash.md index 1bf5da3234..c82148e9b3 100644 --- a/site/packages/aa-core/utils/getUserOperationHash.md +++ b/site/packages/aa-core/utils/getUserOperationHash.md @@ -14,7 +14,7 @@ head: # getUserOperationHash -Generates a hash for a UserOperation valid from entrypoint version 0.6 onwards +Generates a hash for a `UserOperation` (UO) valid from entrypoint version 0.6 onwards ## Usage @@ -45,12 +45,12 @@ The hash of the user operation ### `request: UserOperationRequest` -The UserOperation to hash +The UO to hash ### `entrypointAddress: Address` -The entrypoint address to use for the UserOperation +The entrypoint address to use for the UO ### `chainId: bigint` -The chainId that this UserOperation will be submitted to +The chainId that this UO will be submitted to From af85e3bd4f5ecf5642cf920141ae63212ad7cea7 Mon Sep 17 00:00:00 2001 From: Sahil Aujla Date: Tue, 28 Nov 2023 19:22:55 -0500 Subject: [PATCH 73/79] docs: make edits to follow style guidelines (#257) --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- README.md | 8 +-- examples/README.md | 6 +- examples/aa-simple-dapp/README.md | 2 +- .../aa-simple-dapp/src/components/Footer.tsx | 4 +- examples/alchemy-daapp/README.md | 8 +-- .../accounts/src/kernel-zerodev/README.md | 8 +-- .../accounts/src/light-account/account.ts | 2 +- packages/core/src/account/types.ts | 8 +-- packages/core/src/provider/types.ts | 2 +- packages/ethers/README.md | 2 +- site/getting-started.md | 67 +++++++++++++++++++ site/guides/enhanced-apis/nft.md | 10 +-- site/guides/enhanced-apis/token.md | 6 +- site/guides/send-user-operation.md | 10 +-- .../gas-sponsorship-eligibility.md | 4 +- site/guides/transferring-ownership.md | 10 +-- site/index.md | 8 +-- site/overview/demos.md | 8 +-- site/overview/introduction.md | 36 +++++----- site/overview/package-overview.md | 14 ++-- site/overview/why-account-kit.md | 12 ++-- .../light-account/encodeTransferOwnership.md | 2 +- .../light-account/getOwnerAddress.md | 2 +- .../aa-accounts/light-account/introduction.md | 12 ++-- .../light-account/signMessageWith6492.md | 2 +- .../light-account/signTypedData.md | 2 +- .../light-account/signTypedDataWith6492.md | 2 +- .../light-account/transferOwnership.md | 2 +- site/packages/aa-alchemy/index.md | 2 +- .../aa-alchemy/middleware/introduction.md | 2 +- .../middleware/withAlchemyGasFeeEstimator.md | 4 +- .../middleware/withAlchemyGasManager.md | 8 +-- .../aa-alchemy/provider/gasEstimator.md | 2 +- .../aa-alchemy/provider/introduction.md | 4 +- .../provider/withAlchemyEnhancedApis.md | 2 +- .../provider/withAlchemyGasManager.md | 4 +- .../packages/aa-core/accounts/introduction.md | 4 +- .../accounts/optional/signMessageWith6492.md | 2 +- .../optional/signTypedDataWith6492.md | 2 +- .../accounts/required/getDummySignature.md | 2 +- site/packages/aa-core/provider/connect.md | 4 +- .../aa-core/provider/signMessageWith6492.md | 2 +- .../aa-core/provider/signTypedDataWith6492.md | 2 +- .../packages/aa-core/signers/local-account.md | 2 +- .../signers/utils/verifyEIP6492Signature.md | 4 +- .../signers/utils/wrapSignatureWith6492.md | 4 +- .../aa-ethers/account-signer/connect.md | 2 +- .../aa-ethers/account-signer/getAddress.md | 6 +- .../aa-ethers/account-signer/introduction.md | 10 +-- .../account-signer/sendTransaction.md | 2 +- site/packages/aa-ethers/index.md | 4 +- .../provider-adapter/connectToAccount.md | 2 +- .../provider-adapter/introduction.md | 2 +- .../accounts/choosing-a-smart-account.md | 4 +- .../accounts/deployment-addresses.md | 4 +- site/smart-accounts/accounts/light-account.md | 8 +-- .../accounts/modular-account.md | 16 ++--- .../smart-accounts/accounts/using-your-own.md | 4 +- site/smart-accounts/overview.md | 6 +- site/smart-accounts/signers/capsule.md | 10 +-- .../signers/choosing-a-signer.md | 28 ++++---- site/smart-accounts/signers/contributing.md | 8 +-- site/smart-accounts/signers/custom-signer.md | 14 ++-- site/smart-accounts/signers/dynamic.md | 8 +-- site/smart-accounts/signers/eoa.md | 10 +-- site/smart-accounts/signers/fireblocks.md | 10 +-- site/smart-accounts/signers/lit.md | 10 +-- site/smart-accounts/signers/magic.md | 12 ++-- .../signers/particle-network.md | 8 +-- site/smart-accounts/signers/portal.md | 10 +-- site/smart-accounts/signers/privy.md | 8 +-- site/smart-accounts/signers/turnkey.md | 8 +-- site/smart-accounts/signers/web3auth.md | 8 +-- site/snippets/account-alchemy.ts | 2 +- site/snippets/account-core.ts | 2 +- 76 files changed, 305 insertions(+), 238 deletions(-) create mode 100644 site/getting-started.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 1ddafb4aa8..8b9533376d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -8,7 +8,7 @@ assignees: "" Thanks for filling out this bug report. Please provide as much detail as possible. -If your issue is with Alchemy's RPC APIs and not the SDK please report your issue on (discord)[https://alchemy.com/discord]. +If your issue is with our RPC APIs and not the SDK please report your issue on (discord)[https://alchemy.com/discord]. ### [REQUIRED] Environment diff --git a/README.md b/README.md index 96a94dad7c..19732d50d8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Account Abstraction SDK (aa-sdk) -The `aa-sdk` is a type-safe and performant TypeScript library built on top of [viem](https://viem.sh/) to provide ergonomic methods for sending user operations, sponsoring gas, and deploying smart contract accounts. It handles all the complexity of ERC-4337 under the hood to make account abstraction simple. +The `aa-sdk` is a type-safe and performant TypeScript library built on top of [viem](https://viem.sh/) to provide ergonomic methods for sending user operations, sponsoring gas, and deploying smart accounts. It handles all the complexity of ERC-4337 under the hood to make account abstraction simple. The SDK also implements an EIP-1193 provider interface to easily plug into any popular dapp or wallet connect libraries such as RainbowKit, Wagmi, and Web3Modal. It also includes ethers.js adapters to provide full support for ethers.js apps. -The `aa-sdk` is modular at every layer of the stack and can be easily extended to fit your custom needs. You can plug in any [smart account](https://accountkit.alchemy.com/smart-accounts/accounts/using-your-own) implementation, [Signer](https://accountkit.alchemy.com/smart-accounts/signers/overview), gas manager API, RPC provider. +The `aa-sdk` is modular at every layer of the stack and can be easily extended to fit your custom needs. You can plug in any [smart account](https://accountkit.alchemy.com/smart-accounts/accounts/using-your-own) implementation, [Signer](https://accountkit.alchemy.com/smart-accounts/signers/overview), [Gas Manager API](https://accountkit.alchemy.com/overview/introduction.html#gas-manager-api), RPC provider. ## Getting Started @@ -18,7 +18,7 @@ yarn add @alchemy/aa-accounts @alchemy/aa-core ## Docs -The `aa-sdk` is part of Alchemy's Account Kit. For more information, check out the [Account Kit docs](https://accountkit.alchemy.com). +The `aa-sdk` is part of Account Kit. For more information, check out the [Account Kit docs](https://accountkit.alchemy.com). ## Contributing @@ -40,7 +40,7 @@ The `aa-sdk` is part of Alchemy's Account Kit. For more information, check out t - example: `feat: add sanity check on provider connect for clearer error message (#181)` - note: run `git log` to see more examples and acceptable subject-types 9. push to your github fork -10. create a pull request with the original Alchemy project +10. create a pull request with the original github repo - note: pull request title must pass the Enforce PR Title Format - format: `[subject-type]: [description starting with lowercase letters]` diff --git a/examples/README.md b/examples/README.md index 30573a3d6e..0a6e6273b4 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,8 +1,8 @@ -# AA-SDK Examples +# aa-sdk Examples ## aa-simple-dapp -This dapp provides an example of how to use Alchemy's Account Kit to build a dApp that mints a token to a Light Account SCA using Alchemy's Gas Manager to provide a gas-less minting experience +This dapp provides an example of how to use Account Kit to build a dApp that mints a token to a Light Account SCA using our Gas Manager to provide a gasless minting experience [Try it out!](https://aa-simple-dapp.vercel.app/) @@ -12,6 +12,6 @@ This dapp provides an example of how to use Alchemy's Account Kit to build a dAp ## alchemy-dAApp -This dapp provides an example of how to use Alchemy's Account Kit to build an account abstraction dApp that mints an NFT. It supports configurations so that you can provide a gas-less experience across multiple chains. +This dapp provides an example of how to use Account Kit to build an account abstraction dApp that mints an NFT. It supports configurations so that you can provide a gasless experience across multiple chains. [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/alchemyplatform/aa-sdk/tree/main/examples/alchemy-dapp?file=README.md) diff --git a/examples/aa-simple-dapp/README.md b/examples/aa-simple-dapp/README.md index df049d2142..1b3720b5a2 100644 --- a/examples/aa-simple-dapp/README.md +++ b/examples/aa-simple-dapp/README.md @@ -1,6 +1,6 @@ # Alchemy Simple Account Abstraction Dapp -This is a simple Next.js single page application that leverages account abstraction via the Alchemy aa-sdk, allowing users to mint an ERC-20 Token to an SCA without needing to have an EOA wallet or incur any gas fees. +This is a simple Next.js single page application that leverages account abstraction via the aa-sdk, allowing users to mint an ERC-20 Token to an SCA without needing to have an EOA wallet or incur any gas fees. ## Run Locally @ [http://localhost:3000](http://localhost:3000) diff --git a/examples/aa-simple-dapp/src/components/Footer.tsx b/examples/aa-simple-dapp/src/components/Footer.tsx index 269094b39c..da036e30d0 100644 --- a/examples/aa-simple-dapp/src/components/Footer.tsx +++ b/examples/aa-simple-dapp/src/components/Footer.tsx @@ -5,8 +5,8 @@ export default function Footer() { return (
= { ``` ### **🗒️ Notes:** for `nftContractAddress` and `lightAccountFactoryAddress` - There are already contract addresses deployed for them across [various chains here](https://github.com/alchemyplatform/aa-sdk/blob/main/examples/alchemy-daapp/src/configs/clientConfigs.ts). -- We used Alchemy's [lightAccountFactory here](https://github.com/alchemyplatform/light-account). +- We used the Alchemy [Light Account Factory here](https://github.com/alchemyplatform/light-account). - Finally, the contracts sibling package has the copy of the [NFT contract](https://github.com/alchemyplatform/aa-sdk/tree/main/examples/contracts/DAAppNFT/src) along instructions on [how to deploy it](https://github.com/alchemyplatform/aa-sdk/blob/main/examples/contracts/README.md). 4. Update the serverConfigs.ts file with your alchemy API keys: @@ -58,7 +58,7 @@ yarn dev ``` ## How This Works -The [`onboarding-controller.ts`](https://github.com/alchemyplatform/aa-sdk/blob/master/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts) file contains the onboarding controller, which handles the onboarding process for new users. The controller uses the Alchemy SDK to create a new account and mint an NFT. +The [`onboarding-controller.ts`](https://github.com/alchemyplatform/aa-sdk/blob/master/examples/alchemy-daapp/src/surfaces/onboarding/OnboardingController.ts) file contains the onboarding controller, which handles the onboarding process for new users. The controller uses `aa-sdk` to create a new account and mint an NFT. In the [`clientConfigs.ts`](https://github.com/alchemyplatform/aa-sdk/blob/main/examples/alchemy-daapp/src/configs/clientConfigs.ts) file, you will find the configuration for the DAApp, including the nft contract address, light account factory address, gas manager policy id, rpc url, and chain. You'll also find an example NFT contract in [`examples/contracts/DAAppNFT`](https://github.com/alchemyplatform/aa-sdk/tree/main/examples/contracts/DAAppNFT) @@ -73,6 +73,6 @@ We welcome contributions to the examples/alchemy-daapp repo! If you would like t 2. Create a new branch for your changes 3. Make your changes and commit them 4. Push your changes to your forked repository -5. Submit a pull request to the examples/aa-sdk repo +5. Submit a pull request to the `examples/aa-sdk` repo Please ensure that your code follows our coding standards and that you have added appropriate tests for your changes. We appreciate your contributions and look forward to working with you. diff --git a/packages/accounts/src/kernel-zerodev/README.md b/packages/accounts/src/kernel-zerodev/README.md index 25e2dc1c7b..85ee53cc05 100644 --- a/packages/accounts/src/kernel-zerodev/README.md +++ b/packages/accounts/src/kernel-zerodev/README.md @@ -27,7 +27,7 @@ const chain = polygonMumbai; const KERNEL_ACCOUNT_FACTORY_ADDRESS = "0x5D006d3880645ec6e254E18C1F879DAC9Dd71A39"; -// 1. define the EOA owner of the Smart Account +// 1. define the EOA owner of the smart account // This is just one exapmle of how to interact with EOAs, feel free to use any other interface const owner = LocalAccountSigner.privateKeyToAccountSigner(PRIVATE_KEY); @@ -74,7 +74,7 @@ const { hash } = provider.sendUserOperation({ The primary interfaces are the `KernelAccountProvider`, `KernelSmartContractAccount` and `KernelBaseValidator` -The `KernelAccountProvider` is an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant Provider built on top of Alchemy's `SmartAccountProvider` +The `KernelAccountProvider` is an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant Provider built on top of `SmartAccountProvider` 1. `sendUserOperation` -- this takes in `target`, `callData`, and an optional `value` which then constructs a `UserOperation` (UO), sends it, and returns the `hash` of the UO. It handles estimating gas, fetching fee data, (optionally) requesting paymasterAndData, and lastly signing. This is done via a middleware stack that runs in a specific order. The middleware order is `getDummyPaymasterData` => `estimateGas` => `getFeeData` => `getPaymasterAndData`. The paymaster fields are set to `0x` by default. They can be changed using `provider.withPaymasterMiddleware`. 2. `sendTransaction` -- this takes in a traditional Transaction Request object which then gets converted into a UO. This takes in a traditional Transaction Request object which then gets converted into a UO. Note that `to` field of transaction is required, and among other fields of transaction, only `data`, `value`, `maxFeePerGas`, `maxPriorityFeePerGas` fields are considered if given. Support for other fields is coming soon. @@ -91,8 +91,8 @@ The `KernelAccountProvider` is an [EIP-1193](https://eips.ethereum.org/EIPS/eip- The `KernelBaseValidator` is a plugin that modify how transactions are validated. It allows for extension and implementation of arbitrary validation logic. It implements 3 methods: 1. `getAddress` -- this returns the address of the validator -2. `getOwnerAddress` -- this returns the eligible signer's address for the active smart wallet -3. `signMessageWithValidatorParams` -- this method signs the userop hash using signer object and then concats additional params based on validator mode. +2. `getOwnerAddress` -- this returns the eligible Signer's address for the active smart wallet +3. `signMessageWithValidatorParams` -- this method signs the userop hash using Signer object and then concats additional params based on validator mode. ## Contributing diff --git a/packages/accounts/src/light-account/account.ts b/packages/accounts/src/light-account/account.ts index bf9e04ef6e..6b693fc90c 100644 --- a/packages/accounts/src/light-account/account.ts +++ b/packages/accounts/src/light-account/account.ts @@ -56,7 +56,7 @@ export class LightSmartContractAccount< } /** - * Encodes the transferOwnership function call using the LightAccount ABI. + * Encodes the transferOwnership function call using Light Account ABI. * * @param newOwner - the new owner of the account * @returns {Hex} the encoded function call diff --git a/packages/core/src/account/types.ts b/packages/core/src/account/types.ts index cc5bed7b6e..d47668d216 100644 --- a/packages/core/src/account/types.ts +++ b/packages/core/src/account/types.ts @@ -103,18 +103,18 @@ export interface ISmartContractAccount { getAddress(): Promise
; /** - * @returns the smart contract account owner instance if it exists. - * It is optional for a smart contract account to have an owner account. + * @returns the smart account owner instance if it exists. + * It is optional for a smart account to have an owner account. */ getOwner(): SmartAccountSigner | undefined; /** - * @returns the address of the factory contract for the smart contract account + * @returns the address of the factory contract for the smart account */ getFactoryAddress(): Address; /** - * @returns the address of the entry point contract for the smart contract account + * @returns the address of the entry point contract for the smart account */ getEntryPointAddress(): Address; } diff --git a/packages/core/src/provider/types.ts b/packages/core/src/provider/types.ts index 1ed87c1f41..904c7ce695 100644 --- a/packages/core/src/provider/types.ts +++ b/packages/core/src/provider/types.ts @@ -344,7 +344,7 @@ export interface ISmartAccountProvider< * Sets the current account to the account returned by the given function. The function parameter * provides the public rpc client that is used by this provider so the account can make RPC calls. * - * @param fn - a function that given public rpc client, returns a smart contract account + * @param fn - a function that given public rpc client, returns a smart account */ connect( fn: ( diff --git a/packages/ethers/README.md b/packages/ethers/README.md index 938e66fdf4..999439cfb2 100644 --- a/packages/ethers/README.md +++ b/packages/ethers/README.md @@ -1,6 +1,6 @@ # `@alchemy/aa-ethers` -This package contains `EthersProviderAdapter` and `AccountSigner`, respective extensions of the [`JsonRpcProvider`](https://docs.ethers.org/v5/api/providers/jsonrpc-provider/) and [`Signer`](https://docs.ethers.org/v5/api/signer/#Signer-getaddress) classes defined in [`ethers.js`](https://docs.ethers.org/v5/) external library. +This package contains `EthersProviderAdapter` and `AccountSigner`, respective extensions of the [`JsonRpcProvider`](https://docs.ethers.org/v5/api/providers/jsonrpc-provider/) and [`Signer`](https://docs.ethers.org/v5/api/signer/) classes defined in [`ethers.js`](https://docs.ethers.org/v5/) external library. If you currently rely `ethers.js` for web3 development, you can use these `ethers.js`-compatible `JsonRpcProvider` and `Signer` to integrate Account Abstraction into your dApp. You may also find the [`util`](https://accountkit.alchemy.com/packages/aa-ethers/utils/introduction.html) methods helpful. diff --git a/site/getting-started.md b/site/getting-started.md new file mode 100644 index 0000000000..858e282742 --- /dev/null +++ b/site/getting-started.md @@ -0,0 +1,67 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Getting Started Guide + - - meta + - name: description + content: Learn how to get started with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - property: og:description + content: Learn how to get started with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + - - meta + - name: twitter:title + content: Getting Started Guide + - - meta + - name: twitter:description + content: Learn how to get started with Account Kit, a vertically integrated stack for building apps that support ERC-4337. +--- + +# Getting Started + +This guide will help you get started with Account Kit by setting up your environment, creating a Light Account (a type of smart account implementation), and sending a User Operation from it. By the end of this guide, you'll have a basic understanding of how to use the SDK and where to look for more advanced use cases. + +## Install the Packages + +In your project directory, you'll need to install the required packages: + +::: code-group + +```bash [npm] +npm install @alchemy/aa-alchemy @alchemy/aa-accounts @alchemy/aa-core viem +``` + +```bash [yarn] +yarn add @alchemy/aa-alchemy @alchemy/aa-accounts @alchemy/aa-core viem +``` + +Note that we're installing [viem](https://viem.sh/) as well. Viem contains helpful abstractions and modules that may come in handy when using Account Kit. Additionally, many Account Kit modules leverage viem themselves. + +::: + +## A Simple Light Account Example + +Using the SDK, we'll deploy a Light Account and send a User Operation from it. The Light Account will be owned by an Externally Owned Account (EOA). Here's a demonstration: + +<<< @/snippets/light-account.ts + +This initializes a `provider` for your smart account which is then used to send user operations from it. It also logs the address of the deployed smart account. + +::: tip Note +Remember to: + +1. Replace `"0xYourEOAPrivateKey"` with your actual EOA private key. +2. Set `"ALCHEMY_API_KEY"` with your unique Alchemy API key. +3. Fund your smart account address with some SepoliaETH in order for the user operation to go through. This address is logged to the console when you run the script. +4. Adjust the `target` and `data` fields in the `sendUserOperation` function to match your requirements. + +::: + +## Dive Deeper + +In this guide we initialized `provider` with the `aa-alchemy` package however we could have done the same with the other packages of Account Kit as well. To learn more about the different packages and their use cases, check out the ["Packages Overview"](/overview/package-overview) page. + +## Next Steps + +To learn about the end-to-end process of integrating smart accounts in your applications check out the section on [smart accounts overview](/smart-accounts/overview.html) diff --git a/site/guides/enhanced-apis/nft.md b/site/guides/enhanced-apis/nft.md index 4c7a92af43..39f9792574 100644 --- a/site/guides/enhanced-apis/nft.md +++ b/site/guides/enhanced-apis/nft.md @@ -6,27 +6,27 @@ head: content: How to Fetch a Smart Account's NFTs - - meta - name: description - content: Follow this guide to fetch a Smart Account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to fetch a smart account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this guide to fetch a Smart Account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to fetch a smart account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: How to Get a Smart Account's NFTs - - meta - name: twitter:description - content: Follow this guide to fetch a Smart Account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to fetch a smart account's NFTs with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # How to Fetch a Smart Account's NFTs -Alchemy provides several [Enhanced APIs](https://www.alchemy.com/enhanced-apis), which are especially useful for querying information about the smart accounts you create using Account Kit, such as the account's owned NFTs using the [NFT API](https://www.alchemy.com/nft-api). +We provide several [Enhanced APIs](https://www.alchemy.com/enhanced-apis), which are especially useful for querying information about the smart accounts you create using Account Kit, such as the account's owned NFTs using the [NFT API](https://www.alchemy.com/nft-api). For the purposes of our example, we'll use the NFT API to query our smart account's data by extending the Alchemy Provider [with Enhanced APIs](/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md). ## 1. Install the [`alchemy-sdk`](https://github.com/alchemyplatform/alchemy-sdk-js) -Alchemy has developed a Typescript SDK to make development with the Enhanced APIs simple. The SDK includes ways to leverage Alchemy's Simulation API, Token API, Transact API, NFT API, Webhooks and Websockets, and more across Alchemy's supported chains. Take a look at the code [here](https://github.com/alchemyplatform/alchemy-sdk-js). +We have developed a Typescript SDK to make development with the Enhanced APIs simple. The SDK includes ways to leverage Alchemy's Simulation API, Token API, Transact API, NFT API, Webhooks and Websockets, and more across our supported chains. Take a look at the code [here](https://github.com/alchemyplatform/alchemy-sdk-js). We will use the Alchemy SDK Client to extend our Alchemy Provider using the provider's [`withAlchemyEnhancedApis`](/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md) method. That way, our provider will have direct access to the Enhanced APIs. diff --git a/site/guides/enhanced-apis/token.md b/site/guides/enhanced-apis/token.md index 5d47ec1972..4e0c7b5a34 100644 --- a/site/guides/enhanced-apis/token.md +++ b/site/guides/enhanced-apis/token.md @@ -6,16 +6,16 @@ head: content: How to Fetch a Smart Account's ERC-20 Tokens - - meta - name: description - content: Follow this guide to fetch a Smart Account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to fetch a smart account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this guide to fetch a Smart Account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to fetch a smart account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: How to Fetch a Smart Account's ERC-20 Tokens - - meta - name: twitter:description - content: Follow this guide to fetch a Smart Account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to fetch a smart account's ERC-20 Tokens with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # How to Fetch a Smart Account's ERC-20 Tokens diff --git a/site/guides/send-user-operation.md b/site/guides/send-user-operation.md index 785e77fdf8..04d5f4a210 100644 --- a/site/guides/send-user-operation.md +++ b/site/guides/send-user-operation.md @@ -6,16 +6,16 @@ head: content: How to Send a User Operation - - meta - name: description - content: Follow this guide to send a User Operation with Alchemy's Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to send a User Operation with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this guide to send a User Operation with Alchemy's Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to send a User Operation with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: How to Send a User Operation - - meta - name: twitter:description - content: Follow this guide to send a User Operation with Alchemy's Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to send a User Operation with Account Kit, a vertically integrated stack for building apps that support ERC-4337. prev: text: Smart Accounts link: /smart-accounts/overview @@ -35,7 +35,7 @@ See [Alchemy Provider](/packages/aa-alchemy/provider/introduction.md) for more d ## 2. Connect Your Smart Account -To send User Operations, we must connect the `provider` with a smart account. The Light Account is Alchemy's gas-optimized smart account implementation, which we'll use in this example. +To send User Operations, we must connect the `provider` with a smart account. The Light Account is our gas-optimized smart account implementation, which we'll use in this example. See [Light Account](/packages/aa-accounts/light-account/introduction.md) for more details. @@ -55,7 +55,7 @@ Some other helpful viem methods include: [encodeFunctionData](https://viem.sh/do Now we'll use the connected provider to send a user operation. We'll use the [sendUserOperation](/packages/aa-core/provider/sendUserOperation.md) method on the provider. -You can either send ETH to the smart account to pay for User Operation's gas, or you can connect your provider to an Alchemy Gas Manager using the [withAlchemyGasManager](/packages/aa-alchemy/provider/withAlchemyGasManager.md) method to sponsor the UO's gas. We'll use the latter approach below. You can go to the [Alchemy Dashboard](https://dashboard.alchemy.com/gas-manager) to get a Gas Manager policy ID. +You can either send ETH to the smart account to pay for User Operation's gas, or you can connect your provider to our Gas Manager using the [withAlchemyGasManager](/packages/aa-alchemy/provider/withAlchemyGasManager.md) method to sponsor the UO's gas. We'll use the latter approach below. You can go to the [Alchemy Dashboard](https://dashboard.alchemy.com/gas-manager) to get a Gas Manager policy ID. We'll also want to wait for the transaction which contains the User Operation, so that we know the User Operation executed on-chain. We can use the [waitForUserOperationTransaction](/packages/aa-core/provider/waitForUserOperationTransaction.md) method on provider to do so, as seen below. diff --git a/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md index 0cc7cc3004..7805727f74 100644 --- a/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md +++ b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md @@ -20,7 +20,7 @@ head: # How to Handle User Operations that are Not Eligible for Gas Sponsorship -As mentioned from the previous guide on [How to Sponsor Gas for a User Operation](./sponsoring-gas.md), with Account Kit can sponsor gas fees for transactions via the [Alchemy Gas Manager](https://docs.alchemy.com/docs/gas-manager-services). +As mentioned from the previous guide on [How to Sponsor Gas for a User Operation](./sponsoring-gas.md), with Account Kit can sponsor gas fees for transactions via the [Gas Manager](https://docs.alchemy.com/docs/gas-manager-services). But what happens when the user operation you are sending fails to satisfy the criteria set in the gas manager policy? How do you check if the user operation is eligible for gas sponsorship before sending the user operation? @@ -115,4 +115,4 @@ That's it! By using the above methods, you can provide the desired user experien 2. Provide users with the choice to unblock themselves by sending the user operation without gas sponsorship. 3. Still send the user operation by reverting to the default behavior of paying gas fees from the user's account balance by bypassing the paymster middleware for the ineligible user operations. -AccountKit provides much flexibility for you to design optimal user experiences to handle different cases of gas sponsonship eligibility accordingly. +Account Kit provides much flexibility for you to design optimal user experiences to handle different cases of gas sponsonship eligibility accordingly. diff --git a/site/guides/transferring-ownership.md b/site/guides/transferring-ownership.md index d5c7396f5c..1c201d4070 100644 --- a/site/guides/transferring-ownership.md +++ b/site/guides/transferring-ownership.md @@ -22,7 +22,7 @@ next: # How to Transfer Ownership of a Smart Account -Not all Smart Contract Account implementations support transfering the owner (e.g. `SimpleAccount`). However, a number of the accounts in this guide and in the Account Kit do, including Alchemy's Light Account! Let's see a few different ways we can transfer ownership of an Account (using Light Account as an example). +Not all smart account implementations support transfering the owner (e.g. `SimpleAccount`). However, a number of the accounts in this guide and in Account Kit do, including our Light Account! Let's see a few different ways we can transfer ownership of an Account (using Light Account as an example). ## Light Account @@ -32,7 +32,7 @@ Light Account exposes the following method which allows the existing owner to tr function transferOwnership(address newOwner) public virtual onlyOwner ``` -There a number of ways you can call this method using the Account Kit. +There a number of ways you can call this method using Account Kit. ### 1. Using `LightSmartContractAccount` @@ -42,7 +42,7 @@ There a number of ways you can call this method using the Account Kit. import { LightSmartContractAccount } from "@alchemy/aa-accounts"; import { provider } from "./provider"; -// this will return the address of the smart contract account you want to transfer ownerhip of +// this will return the address of the smart account you want to transfer ownerhip of const accountAddress = await provider.getAddress(); const newOwner = "0x..."; // the address of the new owner @@ -65,7 +65,7 @@ Assuming you have connected the `provider` to a `LightAccount` using `provider.c import { encodeFunctionData } from "viem"; import { provider } from "./provider"; -// this will return the address of the smart contract account you want to transfer ownerhip of +// this will return the address of the smart account you want to transfer ownerhip of const accountAddress = await provider.getAddress(); const newOwner = "0x..."; // the address of the new owner @@ -98,4 +98,4 @@ const { hash: userOperationHash } = provider.sendUserOperation({ ::: -See the [`LightSmartContractAccount`](/packages/aa-accounts/light-account/introduction) docs for more details about the Alchemy Light Account implementation. +See the [`LightSmartContractAccount`](/packages/aa-accounts/light-account/introduction) docs for more details about our Light Account implementation. diff --git a/site/index.md b/site/index.md index cc22001d68..86de084b41 100644 --- a/site/index.md +++ b/site/index.md @@ -9,16 +9,16 @@ head: content: Account Kit Documentation - - meta - name: description - content: Account Kit is a vertically integrated stack for building apps that support ERC-4337 smart accounts, signer integrations, sponsoring gas, bundlers, and an SDK. + content: Account Kit is a vertically integrated stack for building apps that support ERC-4337 smart accounts, Signer integrations, sponsoring gas, bundlers, and an SDK. - - meta - property: og:description - content: Account Kit is a vertically integrated stack for building apps that support ERC-4337 smart accounts, signer integrations, sponsoring gas, bundlers, and an SDK. + content: Account Kit is a vertically integrated stack for building apps that support ERC-4337 smart accounts, Signer integrations, sponsoring gas, bundlers, and an SDK. - - meta - name: twitter:title content: Account Kit Documentation - - meta - name: twitter:description - content: Account Kit is a vertically integrated stack for building apps that support ERC-4337 smart accounts, signer integrations, sponsoring gas, bundlers, and an SDK. + content: Account Kit is a vertically integrated stack for building apps that support ERC-4337 smart accounts, Signer integrations, sponsoring gas, bundlers, and an SDK. titleTemplate: :title Documentation # you can also add HTML or Markdown components below the --- line to add custom HTML or Markdown content (eg: https://github.com/wagmi-dev/viem/blob/main/site/index.md?plain=1) --- @@ -52,7 +52,7 @@ titleTemplate: :title Documentation
- Account Kit is a vertically integrated stack for building apps that support ERC-4337: smart accounts, signer integrations, sponsoring gas, bundlers, and an SDK. + Account Kit is a vertically integrated stack for building apps that support ERC-4337: smart accounts, Signer integrations, sponsoring gas, bundlers, and an SDK.
diff --git a/site/overview/demos.md b/site/overview/demos.md index d9e48d62aa..287510787a 100644 --- a/site/overview/demos.md +++ b/site/overview/demos.md @@ -6,10 +6,10 @@ head: content: Demos - - meta - name: description - content: Demos using Alchemy's Account Kit + content: Demos using Account Kit - - meta - property: og:description - content: Demos using Alchemy's Account Kit + content: Demos using Account Kit next: text: Smart Accounts --- @@ -18,7 +18,7 @@ next: ## Gasless Token Minting Demo -This demo shows how to mint an ERC-20 token to a Light Account using Alchemy's Gas Manager to provide a gas-less minting experience. +This demo shows how to mint an ERC-20 token to a Light Account using our Gas Manager to provide a gasless minting experience. [Try it out!](https://aa-simple-dapp.vercel.app/) @@ -28,6 +28,6 @@ This demo shows how to mint an ERC-20 token to a Light Account using Alchemy's G ## Gasless NFT Minting Demo -This demo shows how to mint an NFT (ERC-721 token) to a Light Account using Alchemy's Gas Manager to provide a gas-less minting experience. +This demo shows how to mint an NFT (ERC-721 token) to a Light Account using our Gas Manager to provide a gasless minting experience. [Try it out!](https://gasless-nft-minter-v2.vercel.app/) diff --git a/site/overview/introduction.md b/site/overview/introduction.md index 8ff96a95e1..a0184d39a9 100644 --- a/site/overview/introduction.md +++ b/site/overview/introduction.md @@ -6,29 +6,29 @@ head: content: Introduction - - meta - name: description - content: Learn what Account Kit is, how it works, and how web3 application developers can use it to add support for smart accounts. + content: Learn what Account Kit is, how it works, and how you can use it to add support for smart accounts. - - meta - property: og:description - content: Learn what Account Kit is, how it works, and how web3 application developers can use it to add support for smart accounts. + content: Learn what Account Kit is, how it works, and how you can use it to add support for smart accounts. - - meta - name: twitter:title content: Introduction - - meta - name: twitter:description - content: Learn what Account Kit is, how it works, and how web3 application developers can use it to add support for smart accounts. + content: Learn what Account Kit is, how it works, and how you can use it to add support for smart accounts. --- # What is Account Kit? **Account Kit** is a framework to embed smart accounts in your web3 app, unlocking [powerful features](/overview/getting-started) like email/social login, gas sponsorship, batched transactions, and more. The `aa-sdk` makes it easy to integrate and deploy smart accounts, send user operations, and sponsor gas with just a few lines of code. -## What is included in the Account Kit stack? +## What is the Account Kit stack? Account Kit is a complete solution for [account abstraction](https://www.alchemy.com/overviews/what-is-account-abstraction). It includes five components: -- **AA-SDK**: A simple, powerful interface to integrate, deploy, and use smart accounts. The `aa-sdk` orchestrates everything under the hood to make development easy. -- **LightAccount:** Secure, audited smart contract accounts. Easy to deploy, just when your users need them. -- **Signer:** Integrations with the most popular wallet providers. Secure your accounts with email, social login, passkeys, or a self-custodial wallet signer. +- **aa-sdk**: A simple, powerful interface to integrate, deploy, and use smart accounts. The `aa-sdk` orchestrates everything under the hood to make development easy. +- **Light Account:** Secure, audited smart accounts. Easy to deploy, just when your users need them. +- **Signer:** Integrations with the most popular wallet providers. Secure your accounts with email, social login, passkeys, or a self-custodial wallet Signer. - **Gas Manager API:** A programmable API to sponsor gas for UserOps that meet your criteria. - **Bundler API:** The most reliable ERC-4337 Bundler. Land your UserOps onchain, batch operations, and sponsor gas at massive scale. @@ -36,21 +36,21 @@ Account Kit is a complete solution for [account abstraction](https://www.alchemy Let’s dive into each component. -### AA-SDK +### aa-sdk -The `aa-sdk` is a type-safe and performant TypeScript library built on top of [viem](https://viem.sh/) to provide ergonomic methods for sending user operations, sponsoring gas, and deploying smart contract accounts. It handles all the complexity of ERC-4337 under the hood to make account abstraction simple. +The `aa-sdk` is a type-safe and performant TypeScript library built on top of [viem](https://viem.sh/) to provide ergonomic methods for sending user operations, sponsoring gas, and deploying smart accounts. It handles all the complexity of ERC-4337 under the hood to make account abstraction simple. The SDK also implements an EIP-1193 provider interface to easily plug into any popular dapp or wallet connect libraries such as RainbowKit, Wagmi, and Web3Modal. It also includes ethers.js adapters to provide full support for ethers.js apps. -The `aa-sdk` is modular at every layer of the stack and can be easily extended to fit your custom needs. You can plug in any [smart account](/smart-accounts/accounts/using-your-own) implementation, [Signer](/smart-accounts/signers/choosing-a-signer), gas manager API, RPC provider. +The `aa-sdk` is modular at every layer of the stack and can be easily extended to fit your custom needs. You can plug in any [smart account](/smart-accounts/accounts/using-your-own) implementation, [Signer](/smart-accounts/signers/choosing-a-signer), Gas Manager API, RPC provider. Get started with `aa-sdk` in our [Getting Started guide](/overview/getting-started) or checkout the [open source repo](https://github.com/alchemyplatform/aa-sdk). -### LightAccount +### Light Account -`LightAccount` is a secure, gas-optimized, ERC-4337 smart contract account. +`LightAccount` is a secure, gas-optimized, ERC-4337 smart account. -We started with the Ethereum Foundation’s canonical [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) and added key improvements for production app developers: +We started with the Ethereum Foundation’s canonical [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) and added key improvements for production app development: - Significantly [reduced gas costs](/smart-accounts/accounts/choosing-a-smart-account#benchmarks) - ERC-1271 signature support to ensure users can sign messages, such as on Opensea @@ -58,15 +58,15 @@ We started with the Ethereum Foundation’s canonical [SimpleAccount](https://gi `LightAccount` was audited by Quantstamp ([report](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf)). -`LightAccount` is forward-compatible with [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900), a new standard for **modular** smart contract accounts. Once we stabilize the ERC with the [community](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885/35) and publish a reference implementation, we will release an optional upgrade for `LightAccount` to upgrade to modular EIP-6900 compliant accounts. [Join the discussion](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885/35) on ERC-6900! +`LightAccount` is forward-compatible with [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900), a new standard for **modular** smart accounts. Once we stabilize the ERC with the [community](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885/35) and publish a reference implementation, we will release an optional upgrade for `LightAccount` to upgrade to modular EIP-6900 compliant accounts. [Join the discussion](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885/35) on ERC-6900! -To learn how to deploy a `LightAccount`, see [LightAccount](/smart-accounts/accounts/light-account). +To learn how to deploy a `LightAccount`, see [Light Account](/smart-accounts/accounts/light-account). ### Signers -A Signer is responsible for securely managing the private key and signing transaction requests on the smart account. Account Kit supports many popular wallet signers including [Magic](/smart-accounts/signers/magic), [web3auth](/smart-accounts/signers/web3auth), [Turnkey](/smart-accounts/signers/turnkey), [Privy](/smart-accounts/signers/privy), [Dynamic](/smart-accounts/signers/dynamic), [Fireblocks](/smart-accounts/signers/fireblocks), [Portal](/smart-accounts/signers/portal), [Capsule](/smart-accounts/signers/capsule) and [Lit Protocol](/smart-accounts/signers/lit). It also supports self-custodial wallets like Metamask or Ledger. +A Signer is responsible for securely managing the private key and signing transaction requests on the smart account. Account Kit supports many popular wallet signers including [Magic](/smart-accounts/signers/magic), [web3auth](/smart-accounts/signers/web3auth), [Turnkey](/smart-accounts/signers/turnkey), [Privy](/smart-accounts/signers/privy), [Dynamic](/smart-accounts/signers/dynamic), [Fireblocks](/smart-accounts/signers/fireblocks), [Portal](/smart-accounts/signers/portal), [Capsule](/smart-accounts/signers/capsule) and [Lit Protocol](/smart-accounts/signers/lit). It also supports self-custodial wallets like MetaMask or Ledger. -To get started with a signer, read the doc: [How to Choose a Signer](/smart-accounts/signers/choosing-a-signer). +To get started with a Signer, read the doc: [How to Choose a Signer](/smart-accounts/signers/choosing-a-signer). ### Gas Manager API @@ -76,7 +76,7 @@ To learn how to sponsor gas with the Gas Manager API, see the [Sponsoring Gas](/ ### Bundler API -The Bundler is a mission-critical piece of secondary infrastructure defined in the ERC-4337 spec that is responsible for submitting UserOps from a Smart Account onchain. If your Bundler API is unreliable, then User Operations are going to fail or get stuck. +The Bundler is a mission-critical piece of secondary infrastructure defined in the ERC-4337 spec that is responsible for submitting UserOps from a smart account onchain. If your Bundler API is unreliable, then User Operations are going to fail or get stuck. We built our [Bundler in Rust](https://www.alchemy.com/blog/open-sourcing-rundler) to handle the highest loads at production scale. It’s able to handle massive scale because we operate it alongside our fleet of nodes powering the biggest dapps in web3 from Opensea to Circle. diff --git a/site/overview/package-overview.md b/site/overview/package-overview.md index 1a000a9c42..212930369e 100644 --- a/site/overview/package-overview.md +++ b/site/overview/package-overview.md @@ -23,7 +23,7 @@ next: # Package Overview -The Alchemy Account Kit SDK consists of a number of smaller packages that developers can leverage to interact with [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) infrastructure. +Account Kit consists of a number of SDK packages that you can leverage to interact with [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) infrastructure. For almost all cases, `aa-core` is sufficient with the subsequent packages offering various utilities for interacting with specific Account Abstraction infrastructure or smart accounts. However, we offer additional packages to augment your developer experience with custom Alchemy infrastructure (`aa-alchemy`), custom smart account (`aa-accounts`) and signer solutions (`aa-signers`), and an ethers.js-compatible solution (`aa-ethers`). @@ -39,21 +39,21 @@ For more details on all the utilities exported by `aa-core` see the [aa-core doc ## [`aa-alchemy`](/packages/aa-alchemy/) -This package builds on `aa-core` by exporting an `AlchemyProvider` which extends `SmartAccountProvider` and adds some additional utilities for interacting with Alchemy APIs and Alchemy's `Rundler`. The Provider also exports utilities for leveraging Alchemy's Gas Manager. +This package builds on `aa-core` by exporting an `AlchemyProvider` which extends `SmartAccountProvider` and adds some additional utilities for interacting with our APIs and `Rundler`. The Provider also exports utilities for leveraging our Gas Manager. -**If you are using the Alchemy Bundler (`Rundler`) and Gas Manager you have to use this package.** This is due to the specifics around how Alchemy's bundler does gas estimation. Not using this package and it's provider can result in incorrect gas estimations and failed transactions. +**If you are using our Bundler (`Rundler`) and Gas Manager you have to use this package.** This is due to the specifics around how our bundler does gas estimation. Not using this package and it's provider can result in incorrect gas estimations and failed transactions. For more details on all the utilities exported by `aa-alchemy` see the [aa-alchemy documentation](/packages/aa-alchemy/). ## [`aa-accounts`](/packages/aa-accounts/) -This packages provides various implementations of `BaseSmartContractAccount` for interacting with different Smart Accounts. This package is not required to use `aa-core` or `aa-alchemy`. If you want to use your own Smart Account implementation, you can do so by following the guide ["Using Your Own Account"](/smart-accounts/accounts/using-your-own). +This packages provides various implementations of `BaseSmartContractAccount` for interacting with different smart accounts. This package is not required to use `aa-core` or `aa-alchemy`. If you want to use your own smart account implementation, you can do so by following the guide ["Using Your Own Account"](/smart-accounts/accounts/using-your-own). -If you'd like to use a Smart Account that is not supported by this package, you can implement `BaseSmartContractAccount` yourself and use it with `aa-core` or `aa-alchemy` +If you'd like to use a smart account that is not supported by this package, you can implement `BaseSmartContractAccount` yourself and use it with `aa-core` or `aa-alchemy` -For details on contributing your own Smart Account implementation, see the [aa-accounts contribution guide](/packages/aa-accounts/contributing). +For details on contributing your own smart account implementation, see the [aa-accounts contribution guide](/packages/aa-accounts/contributing). -To see all of the Smart Accounts that are supported by this package, see the [aa-accounts documentation](/packages/aa-accounts/). +To see all of the smart accounts that are supported by this package, see the [aa-accounts documentation](/packages/aa-accounts/). ## [`aa-signers`](/packages/aa-signers/) diff --git a/site/overview/why-account-kit.md b/site/overview/why-account-kit.md index 189f84a26a..77e6b745c0 100644 --- a/site/overview/why-account-kit.md +++ b/site/overview/why-account-kit.md @@ -48,7 +48,7 @@ Account Kit makes it possible to build a web3 app that feels like web2: simple a It’s enabled by [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337), a new account abstraction standard developed by Vitalik and the Ethereum Foundation. This is the beginning of a major [transition](https://vitalik.ca/general/2023/06/09/three_transitions.html) from traditional EOA wallets to smart accounts. -Account Kit was designed to make it easy for every developer to leverage account abstraction. It includes everything you need to ship smart accounts in minutes! +Account Kit was designed to make it easy for you to leverage account abstraction. It includes everything you need to ship smart accounts in minutes! ## Your app, your UX @@ -65,9 +65,9 @@ Streamline your sign up flow with simple web2 login options supported by Account - Self-custodial wallets like MetaMask or Ledger - and more -Account Kit integrates all the leading wallet Signers with bespoke integration guides for [Magic](/smart-accounts/signers/magic), [web3auth](/smart-accounts/signers/web3auth), [Turnkey](/smart-accounts/signers/turnkey), [Privy](/smart-accounts/signers/privy), [Dynamic](/smart-accounts/signers/dynamic), [Fireblocks](/smart-accounts/signers/fireblocks), [Portal](/smart-accounts/signers/portal), [Capsule](/smart-accounts/signers/capsule) and [Lit Protocol](/smart-accounts/signers/lit). Account Kit even supports self-custodial wallets like Metamask or Ledger. Users can even change their signer later via Account Kit’s [ownership transfer](/guides/transferring-ownership) functionality. +Account Kit integrates all the leading wallet Signers with bespoke integration guides for [Magic](/smart-accounts/signers/magic), [web3auth](/smart-accounts/signers/web3auth), [Turnkey](/smart-accounts/signers/turnkey), [Privy](/smart-accounts/signers/privy), [Dynamic](/smart-accounts/signers/dynamic), [Fireblocks](/smart-accounts/signers/fireblocks), [Portal](/smart-accounts/signers/portal), [Capsule](/smart-accounts/signers/capsule) and [Lit Protocol](/smart-accounts/signers/lit). Account Kit even supports self-custodial wallets like MetaMask or Ledger. Users can even change their Signer later via Account Kit’s [ownership transfer](/guides/transferring-ownership) functionality. -Learn [how to choose the right signer for your use case in this doc](/smart-accounts/signers/choosing-a-signer). +Learn [how to choose the right Signer for your use case in this doc](/smart-accounts/signers/choosing-a-signer). ## Sponsor gas @@ -99,9 +99,9 @@ Account Kit is instantly [compatible with your dapp](https://docs.alchemy.com/do We built Account Kit from the ground up to be reliable, scalable, and developer-friendly. When you use Account Kit, you’re tapping into a vertically integrated stack designed to work together seamlessly from bottom to top: -- **AA-SDK**: A lightweight library to integrate, deploy, and use smart accounts. The `aa-sdk` orchestrates operations like gas estimation, UserOp submission, and counterfactual address generation under the hood. We handled all the details so you don’t have to. -- **LightAccount:** Secure, gas-optimized, audited smart contract accounts. Purpose-built for [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) and forward compatible with [EIP-6900](https://eips.ethereum.org/EIPS/eip-6900). -- **Signer:** Bespoke developer guides to integrate the most popular wallet providers. Secure your accounts with email, social login, passkeys, or a self-custodial wallet signer. +- **aa-sdk**: A lightweight library to integrate, deploy, and use smart accounts. The `aa-sdk` orchestrates operations like gas estimation, UserOp submission, and counterfactual address generation under the hood. We handled all the details so you don’t have to. +- **Light Account:** Secure, gas-optimized, audited smart accounts. Purpose-built for [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) and forward compatible with [EIP-6900](https://eips.ethereum.org/EIPS/eip-6900). +- **Signer:** Bespoke developer guides to integrate the most popular wallet providers. Secure your accounts with email, social login, passkeys, or a self-custodial wallet Signer. - **Gas Manager API:** A programmable API to abstract away gas fees for UserOps that meet your criteria. We built [programmable policies](https://docs.alchemy.com/reference/gas-manager-admin-api-quickstart) to give you flexibility and control to decide which transactions should be sponsored. The Gas Manager works hand-in-hand with the Bundler. - **Bundler API:** The most reliable ERC-4337 Bundler. Land your UserOps onchain at massive scale. We wrote our Bundler from scratch, in Rust, to handle the highest loads at production scale. Check out the open source code in our affectionately named [Rundler github repo](https://github.com/alchemyplatform/rundler). diff --git a/site/packages/aa-accounts/light-account/encodeTransferOwnership.md b/site/packages/aa-accounts/light-account/encodeTransferOwnership.md index 79c8d585db..3b144904d1 100644 --- a/site/packages/aa-accounts/light-account/encodeTransferOwnership.md +++ b/site/packages/aa-accounts/light-account/encodeTransferOwnership.md @@ -40,4 +40,4 @@ A Promise containing the encoded Hex of the`transferOwnership` function call wit ## Parameters -### `newOwner:
` -- the new owner to transfer ownership to for the smart contract account +### `newOwner:
` -- the new owner to transfer ownership to for the smart account diff --git a/site/packages/aa-accounts/light-account/getOwnerAddress.md b/site/packages/aa-accounts/light-account/getOwnerAddress.md index d6730fce03..3e1f28e239 100644 --- a/site/packages/aa-accounts/light-account/getOwnerAddress.md +++ b/site/packages/aa-accounts/light-account/getOwnerAddress.md @@ -34,4 +34,4 @@ const owner = await provider.account.getOwnerAddress(); ### `Promise
` -A Promise containing the address of the smart contract account's owner address. +A Promise containing the address of the smart account's owner address. diff --git a/site/packages/aa-accounts/light-account/introduction.md b/site/packages/aa-accounts/light-account/introduction.md index d4a5ea1e7d..7d326166c6 100644 --- a/site/packages/aa-accounts/light-account/introduction.md +++ b/site/packages/aa-accounts/light-account/introduction.md @@ -18,11 +18,11 @@ head: Notable differences between `LightSmartContractAccount` and `SimpleSmartContractAccount` are implementations for: -1. [`signMessageWith6492`](/packages/aa-accounts/light-account/signMessageWith6492) -- supports message signatures for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). -2. [`signTypedData`](/packages/aa-accounts/light-account/signTypedData) -- supports typed data signatures from the smart contract account's owner address. -3. [`signTypedDataWith6492`](/packages/aa-accounts/light-account/signTypedDataWith6492) -- supports typed data signatures for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses) using ERC-6492. +1. [`signMessageWith6492`](/packages/aa-accounts/light-account/signMessageWith6492) -- supports message signatures for deployed smart accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). +2. [`signTypedData`](/packages/aa-accounts/light-account/signTypedData) -- supports typed data signatures from the smart account's owner address. +3. [`signTypedDataWith6492`](/packages/aa-accounts/light-account/signTypedDataWith6492) -- supports typed data signatures for deployed smart accounts, as well as undeployed accounts (counterfactual addresses) using ERC-6492. 4. [`getOwnerAddress`](/packages/aa-accounts/light-account/getOwnerAddress) -- returns the on-chain owner address of the account. -5. [`encodeTransferOwnership`](/packages/aa-accounts/light-account/encodeTransferOwnership) -- encodes the transferOwnership function call using the LightAccount ABI. +5. [`encodeTransferOwnership`](/packages/aa-accounts/light-account/encodeTransferOwnership) -- encodes the transferOwnership function call using Light Account ABI. 6. [`transferOwnership`](/packages/aa-accounts/light-account/transferOwnership) -- transfers ownership of the account to a new owner, and returns either the UO hash or transaction hash. ## Usage @@ -70,6 +70,6 @@ const result = await LightSmartContractAccount.transferOwnership( ## Developer Links -- [LightAccount & Simple Account Deployment Addresses](/smart-accounts/accounts/deployment-addresses) -- [LightAccount Github Repo](https://github.com/alchemyplatform/light-account) +- [Light Account & Simple Account Deployment Addresses](/smart-accounts/accounts/deployment-addresses) +- [Light Account Github Repo](https://github.com/alchemyplatform/light-account) - [Quantstamp Audit Report](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf) diff --git a/site/packages/aa-accounts/light-account/signMessageWith6492.md b/site/packages/aa-accounts/light-account/signMessageWith6492.md index ddf6b27a1c..f0396ee911 100644 --- a/site/packages/aa-accounts/light-account/signMessageWith6492.md +++ b/site/packages/aa-accounts/light-account/signMessageWith6492.md @@ -14,7 +14,7 @@ head: # signMessageWith6492 -`signMessageWith6492` supports signing messages for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). +`signMessageWith6492` supports signing messages for deployed smart accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). ## Usage diff --git a/site/packages/aa-accounts/light-account/signTypedData.md b/site/packages/aa-accounts/light-account/signTypedData.md index ac9ebb3296..1cf07a9903 100644 --- a/site/packages/aa-accounts/light-account/signTypedData.md +++ b/site/packages/aa-accounts/light-account/signTypedData.md @@ -14,7 +14,7 @@ head: # signTypedData -`signTypedData` supports signing typed data from the smart contract account's owner address. +`signTypedData` supports signing typed data from the smart account's owner address. ## Usage diff --git a/site/packages/aa-accounts/light-account/signTypedDataWith6492.md b/site/packages/aa-accounts/light-account/signTypedDataWith6492.md index 5f774a24d1..71ad269a0b 100644 --- a/site/packages/aa-accounts/light-account/signTypedDataWith6492.md +++ b/site/packages/aa-accounts/light-account/signTypedDataWith6492.md @@ -14,7 +14,7 @@ head: # signTypedDataWith6492 -`signTypedDataWith6492` supports signing typed data for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). +`signTypedDataWith6492` supports signing typed data for deployed smart accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). ## Usage diff --git a/site/packages/aa-accounts/light-account/transferOwnership.md b/site/packages/aa-accounts/light-account/transferOwnership.md index 90177d925f..a49193d168 100644 --- a/site/packages/aa-accounts/light-account/transferOwnership.md +++ b/site/packages/aa-accounts/light-account/transferOwnership.md @@ -41,7 +41,7 @@ const result = await LightSmartContractAccount.transferOwnership( ### `Promise<0x${string}>` -A Promise containing the hash of either the UO or transaction containing the UO which transferred ownership of the smart contract account's owner. +A Promise containing the hash of either the UO or transaction containing the UO which transferred ownership of the smart account's owner. ## Parameters diff --git a/site/packages/aa-alchemy/index.md b/site/packages/aa-alchemy/index.md index 863d84a776..0d79fd21e8 100644 --- a/site/packages/aa-alchemy/index.md +++ b/site/packages/aa-alchemy/index.md @@ -19,7 +19,7 @@ next: # `@alchemy/aa-alchemy` -This package contains `AlchemyProvider`, an implementation of `SmartAccountProvider` class defined in `aa-core`. It also contains middleware for accessing the Alchemy Gas Manager (an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster) and for doing Fee Estimates according to the expectations of the Alchemy [Rundler](https://github.com/alchemyplatform/rundler/tree/main) (an ERC-4337 Bundler). You may also find the util methods helpful. This repo is community maintained and we welcome contributions! +This package contains `AlchemyProvider`, an implementation of `SmartAccountProvider` class defined in `aa-core`. It also contains middleware for accessing the Gas Manager (an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster) and for doing Fee Estimates according to the expectations of the [Rundler](https://github.com/alchemyplatform/rundler/tree/main) (an ERC-4337 Bundler). You may also find the util methods helpful. This repo is community maintained and we welcome contributions! ## Getting started diff --git a/site/packages/aa-alchemy/middleware/introduction.md b/site/packages/aa-alchemy/middleware/introduction.md index bcab44490b..77391f507a 100644 --- a/site/packages/aa-alchemy/middleware/introduction.md +++ b/site/packages/aa-alchemy/middleware/introduction.md @@ -14,7 +14,7 @@ head: # Middleware -The `aa-alchemy` package contains middleware you can use to easily leverage the Alchemy Rundler (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler) and Alchemy Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster). +The `aa-alchemy` package contains middleware you can use to easily leverage our Bundler(Rundler) (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler) and our Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster). Currently, `aa-alchemy` has implementations for: diff --git a/site/packages/aa-alchemy/middleware/withAlchemyGasFeeEstimator.md b/site/packages/aa-alchemy/middleware/withAlchemyGasFeeEstimator.md index 153c102d04..43455da592 100644 --- a/site/packages/aa-alchemy/middleware/withAlchemyGasFeeEstimator.md +++ b/site/packages/aa-alchemy/middleware/withAlchemyGasFeeEstimator.md @@ -14,7 +14,7 @@ head: # withAlchemyGasFeeEstimator -`withAlchemyGasFeeEstimator` is a middleware method you can use to easily leverage the Alchemy Rundler (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler) for estimating gas fees for user operations. +`withAlchemyGasFeeEstimator` is a middleware method you can use to easily leverage Rundler (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler) for estimating gas fees for user operations. ## Usage @@ -24,7 +24,7 @@ head: import { provider } from "./provider"; import { withAlchemyGasFeeEstimator } from "@alchemy/aa-alchemy"; -// use Alchemy Gas Fee Estimator to estimate gas fees according to the expectations of the Alchemy Rundler. +// use Alchemy Gas Fee Estimator to estimate gas fees according to the expectations of Rundler. // this is already set on AlchemyProvider, but you can always use the middleware directly to create a new instance. const providerWithGasFeeEstimator = withAlchemyGasFeeEstimator( provider, diff --git a/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md b/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md index 1a0ec1e4e4..011e051996 100644 --- a/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md +++ b/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md @@ -16,7 +16,7 @@ next: # withAlchemyGasManager -`withAlchemyGasManager` is a middleware method you can use to easily leverage the Alchemy Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster) for sponsoring user operations. +`withAlchemyGasManager` is a middleware method you can use to easily leverage our Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster) for sponsoring user operations. ## Usage @@ -26,7 +26,7 @@ next: import { provider } from "./provider"; import { withAlchemyGasManager } from "@alchemy/aa-alchemy"; -// use Alchemy Gas Manager to sponsorship transactions +// use Gas Manager to sponsorship transactions const providerWithGasManager = withAlchemyGasManager( provider, { @@ -43,7 +43,7 @@ const providerWithGasManager = withAlchemyGasManager( ### `AlchemyProvider` -A new instance of an `AlchemyProvider` with the same attributes as the input, now with middleware for accessing the Alchemy Gas Manager to sponsor UserOperations. +A new instance of an `AlchemyProvider` with the same attributes as the input, now with middleware for accessing the Gas Manager to sponsor UserOperations. ## Parameters @@ -51,6 +51,6 @@ A new instance of an `AlchemyProvider` with the same attributes as the input, no ### `AlchemyGasManagerConfig: AlchemyGasManagerConfig` -- `policyId: string` -- the Alchemy Gas Manager policy ID +- `policyId: string` -- the Gas Manager policy ID ### `estimateGas: boolean` -- a flag to additionally estimate gas as part of diff --git a/site/packages/aa-alchemy/provider/gasEstimator.md b/site/packages/aa-alchemy/provider/gasEstimator.md index 4d63e890b0..834c295ca3 100644 --- a/site/packages/aa-alchemy/provider/gasEstimator.md +++ b/site/packages/aa-alchemy/provider/gasEstimator.md @@ -14,7 +14,7 @@ head: # gasEstimator -`gasEstimator` is an override of the same middleware on `SmartAccountProvider`. As part of the middleware stack that the `AlchemyProvider` would run on each UO built and sent, this middleware estimates gas using the Alchemy Rundler (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler), and updates `callGasLimit`, `verificationGasLimit`, and `preVerificationGas` in a UO request with appropriate buffers. +`gasEstimator` is an override of the same middleware on `SmartAccountProvider`. As part of the middleware stack that the `AlchemyProvider` would run on each UO built and sent, this middleware estimates gas using the Rundler (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler), and updates `callGasLimit`, `verificationGasLimit`, and `preVerificationGas` in a UO request with appropriate buffers. ## Usage diff --git a/site/packages/aa-alchemy/provider/introduction.md b/site/packages/aa-alchemy/provider/introduction.md index 1c8c0e405b..e5b83887c5 100644 --- a/site/packages/aa-alchemy/provider/introduction.md +++ b/site/packages/aa-alchemy/provider/introduction.md @@ -14,7 +14,7 @@ head: # AlchemyProvider -`AlchemyProvider` is an extension of the [`SmartAccountProvider`](/packages/aa-core/provider/introduction) implementation. It's a simpler interface you can use to leverage the Alchemy stack - JSON-RPC requests via API Key or JSON Web Token (JWT), Alchemy Rundler (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler), and Alchemy Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster). +`AlchemyProvider` is an extension of the [`SmartAccountProvider`](/packages/aa-core/provider/introduction) implementation. It's a simpler interface you can use to leverage the Alchemy stack - JSON-RPC requests via API Key or JSON Web Token (JWT), Rundler (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Bundler), and Gas Manager (an [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) Paymaster). Notable differences between `AlchemyProvider` and `SmartAccountProvider` are implementations for: @@ -36,7 +36,7 @@ const uoStruct = await provider.buildUserOperation({ }); const uoHash = await provider.sendUserOperation(uoStruct); -// use Alchemy Gas Manager to sponsorship transactions +// use Gas Manager to sponsorship transactions const providerWithGasManager = provider.withAlchemyGasManager({ policyId: PAYMASTER_POLICY_ID, }); diff --git a/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md b/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md index d24327542c..de86966034 100644 --- a/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md +++ b/site/packages/aa-alchemy/provider/withAlchemyEnhancedApis.md @@ -19,7 +19,7 @@ head: :::tip Note This method requires an optional dependency on the [`alchemy-sdk`](https://github.com/alchemyplatform/alchemy-sdk-js) package, as the input to this method is an Alchemy SDK client. -The Alchemy SDK client must be configured with the same API key and network as the AlchemyProvider. This method validates such at runtime. +The Alchemy SDK client must be configured with the same API key and network as the `AlchemyProvider`. This method validates such at runtime. Additionally, since the Alchemy SDK client does not yet support JWT authentication, an `AlchemyProvider` initialized with JWTs cannot use this method. They must be initialized with an API key or RPC URL. ::: diff --git a/site/packages/aa-alchemy/provider/withAlchemyGasManager.md b/site/packages/aa-alchemy/provider/withAlchemyGasManager.md index d63c06e747..8ec6215e8d 100644 --- a/site/packages/aa-alchemy/provider/withAlchemyGasManager.md +++ b/site/packages/aa-alchemy/provider/withAlchemyGasManager.md @@ -26,7 +26,7 @@ next: import { provider } from "./provider"; // [!code focus:99] -// use Alchemy Gas Manager to sponsorship transactions +// use Gas Manager to sponsorship transactions const providerWithGasManager = provider.withAlchemyGasManager({ policyId: PAYMASTER_POLICY_ID, }); @@ -45,4 +45,4 @@ A new instance of an `AlchemyProvider` with the same attributes as the input, no ### `config: AlchemyGasManagerConfig` -- `policyId: string` -- the Alchemy Gas Manager policy ID +- `policyId: string` -- the Gas Manager policy ID diff --git a/site/packages/aa-core/accounts/introduction.md b/site/packages/aa-core/accounts/introduction.md index d66ce35588..def9a7dbbb 100644 --- a/site/packages/aa-core/accounts/introduction.md +++ b/site/packages/aa-core/accounts/introduction.md @@ -44,7 +44,7 @@ The `BaseSmartContractAccount` is an abstract class that provides the base imple In addition, it provides other optional methods that need to be implemented by the subclass in order to support functionalities such as: - [`signTypedData`](/packages/aa-core/accounts/optional/signTypedData) -- Signs typed data per [ERC-712](https://eips.ethereum.org/EIPS/eip-712) -- [`signMessageWith6492`](/packages/aa-core/accounts/optional/signMessageWith6492) -- Wraps the result of `signMessage` as per [EIP-6492](https://eips.ethereum.org/EIPS/eip-6492) for signing the message for deployed smart contract accounts, as well as undeployed accounts +- [`signMessageWith6492`](/packages/aa-core/accounts/optional/signMessageWith6492) -- Wraps the result of `signMessage` as per [EIP-6492](https://eips.ethereum.org/EIPS/eip-6492) for signing the message for deployed smart accounts, as well as undeployed accounts - [`signTypedDataWith6492`](/packages/aa-core/accounts/optional/signTypedDataWith6492) -- Similar to the signMessageWith6492 method above, this method wraps the result of `signTypedData` as per [EIP-6492](https://eips.ethereum.org/EIPS/eip-6492) - [`encodeBatchExecute`](/packages/aa-core/accounts/optional/encodeBatchExecute) -- If your contract does support batching, encodes a list of transactions into the call data that will be passed to your contract's `batchExecute` method. @@ -54,7 +54,7 @@ In addition, it provides other optional methods that need to be implemented by t [SimpleSmartContractAccount](packages/core/src/account/simple.ts) a minimal implementation version of `BaseSmartContractAccount`. It implements the required abstraction methods in `BaseSmartContractAccount`, and additionally implements the optional methods indicated above. -**Note:** While `SimpleSmartContractAccount` fully implements the `ISmartContractAccount` interface for use as your basic Smart Contract Account, we recommend using our [Light Account](/smart-accounts/accounts/light-account) as it is a simple, yet more secure, and cost-effective smart account implementation. +**Note:** While `SimpleSmartContractAccount` fully implements the `ISmartContractAccount` interface for use as your basic smart account, we recommend using our [Light Account](/smart-accounts/accounts/light-account) as it is a simple, yet more secure, and cost-effective smart account implementation. ## Usage diff --git a/site/packages/aa-core/accounts/optional/signMessageWith6492.md b/site/packages/aa-core/accounts/optional/signMessageWith6492.md index 9ea5b499ea..5018014d3e 100644 --- a/site/packages/aa-core/accounts/optional/signMessageWith6492.md +++ b/site/packages/aa-core/accounts/optional/signMessageWith6492.md @@ -14,7 +14,7 @@ head: # signMessageWith6492 -This method wraps the result of `signMessage` as per [EIP-6492](https://eips.ethereum.org/EIPS/eip-6492) for signing the message for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses). +This method wraps the result of `signMessage` as per [EIP-6492](https://eips.ethereum.org/EIPS/eip-6492) for signing the message for deployed smart accounts, as well as undeployed accounts (counterfactual addresses). **Note**: This method is already implemented on `BaseSmartContractAccount`, so any class that extends and implements `BaseSmartContractAccount` may call this method. diff --git a/site/packages/aa-core/accounts/optional/signTypedDataWith6492.md b/site/packages/aa-core/accounts/optional/signTypedDataWith6492.md index 2d43a3d0b9..0291877b24 100644 --- a/site/packages/aa-core/accounts/optional/signTypedDataWith6492.md +++ b/site/packages/aa-core/accounts/optional/signTypedDataWith6492.md @@ -16,7 +16,7 @@ next: # signTypedDataWith6492 -Similar to the signMessageWith6492 method above, this method wraps the result of `signTypedData` as per [EIP-6492](https://eips.ethereum.org/EIPS/eip-6492) to support signing the typed data for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses). +Similar to the signMessageWith6492 method above, this method wraps the result of `signTypedData` as per [EIP-6492](https://eips.ethereum.org/EIPS/eip-6492) to support signing the typed data for deployed smart accounts, as well as undeployed accounts (counterfactual addresses). **Note**: This method is already implemented on `BaseSmartContractAccount`, so any class that extends and implements `BaseSmartContractAccount` may call this method. diff --git a/site/packages/aa-core/accounts/required/getDummySignature.md b/site/packages/aa-core/accounts/required/getDummySignature.md index b75d7537ff..9ed565c723 100644 --- a/site/packages/aa-core/accounts/required/getDummySignature.md +++ b/site/packages/aa-core/accounts/required/getDummySignature.md @@ -20,7 +20,7 @@ Please note that the dummy signature is specific to the account implementation a **Reference:** -- [Alchemy Bundler API docs](https://docs.alchemy.com/reference/eth-estimateuseroperationgas#dummy-signature-for-simpleaccount) +- [Our Bundler API docs](https://docs.alchemy.com/reference/eth-estimateuseroperationgas#dummy-signature-for-simpleaccount) - [EIP-4337: `eth_estimateUserOperationGas`](https://eips.ethereum.org/EIPS/eip-4337#-eth_estimateuseroperationgas) ## Example Implementation diff --git a/site/packages/aa-core/provider/connect.md b/site/packages/aa-core/provider/connect.md index a0d3487ddd..20b1e5e33b 100644 --- a/site/packages/aa-core/provider/connect.md +++ b/site/packages/aa-core/provider/connect.md @@ -14,7 +14,7 @@ head: # connect -Sets the current account to the smart contract account returned by the given function. +Sets the current account to the smart account returned by the given function. The function parameter is called with the public rpc client that is used by this provider so the account can make RPC calls. @@ -38,4 +38,4 @@ The provider with the account connected ### `fn: (provider: PublicErc4337Client) => BaseSmartContractAccount` -The function that given public rpc client, returns a smart contract account +The function that given public rpc client, returns a smart account diff --git a/site/packages/aa-core/provider/signMessageWith6492.md b/site/packages/aa-core/provider/signMessageWith6492.md index b741fb0d75..99d11eaffe 100644 --- a/site/packages/aa-core/provider/signMessageWith6492.md +++ b/site/packages/aa-core/provider/signMessageWith6492.md @@ -14,7 +14,7 @@ head: # signMessageWith6492 -This method supports signing messages for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). +This method supports signing messages for deployed smart accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). ## Usage diff --git a/site/packages/aa-core/provider/signTypedDataWith6492.md b/site/packages/aa-core/provider/signTypedDataWith6492.md index 0ccd65dee8..b97b4d8c87 100644 --- a/site/packages/aa-core/provider/signTypedDataWith6492.md +++ b/site/packages/aa-core/provider/signTypedDataWith6492.md @@ -14,7 +14,7 @@ head: # signTypedDataWith6492 -This method supports signing typed data for deployed smart contract accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). +This method supports signing typed data for deployed smart accounts, as well as undeployed accounts (counterfactual addresses) using [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492). ## Usage diff --git a/site/packages/aa-core/signers/local-account.md b/site/packages/aa-core/signers/local-account.md index 430bab6162..7151038f71 100644 --- a/site/packages/aa-core/signers/local-account.md +++ b/site/packages/aa-core/signers/local-account.md @@ -16,7 +16,7 @@ next: # LocalAccountSigner -The `LocalAccountSigner` allows you to use accounts for which you already have the private key available locally as signers on Smart Contracts. This signer is used with `HDAccount | PrivateKeyAccount | LocalAccount` types from `viem`. +The `LocalAccountSigner` allows you to use accounts for which you already have the private key available locally as signers on Smart Contracts. This Signer is used with `HDAccount | PrivateKeyAccount | LocalAccount` types from `viem`. ## Usage diff --git a/site/packages/aa-core/signers/utils/verifyEIP6492Signature.md b/site/packages/aa-core/signers/utils/verifyEIP6492Signature.md index fc924fb19f..5625f4738d 100644 --- a/site/packages/aa-core/signers/utils/verifyEIP6492Signature.md +++ b/site/packages/aa-core/signers/utils/verifyEIP6492Signature.md @@ -41,7 +41,7 @@ const signature = await verifyEIP6492Signature({ ### `Promise` -Returns whether or not the signature is valid for the given signer and message hash +Returns whether or not the signature is valid for the given Signer and message hash ## Parameters @@ -49,7 +49,7 @@ Returns whether or not the signature is valid for the given signer and message h - #### `signer: Address` - The address of the signer of the message (eg. the smart contract account address) + The address of the Signer of the message (eg. the smart account address) - #### `hash: Hash` diff --git a/site/packages/aa-core/signers/utils/wrapSignatureWith6492.md b/site/packages/aa-core/signers/utils/wrapSignatureWith6492.md index 9f2c2a77a3..c54c88777a 100644 --- a/site/packages/aa-core/signers/utils/wrapSignatureWith6492.md +++ b/site/packages/aa-core/signers/utils/wrapSignatureWith6492.md @@ -14,7 +14,7 @@ head: # wrapSignatureWith6492 -Allows you to generate a signature in [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492) format which is useful to verifying signatures of undeployed smart contract accounts. +Allows you to generate a signature in [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492) format which is useful to verifying signatures of undeployed smart accounts. ## Usage @@ -44,7 +44,7 @@ The original signature wrapped in ERC-6492 format - #### `factoryAddress: Hash` - The factory address that will be used to deploy the smart contract account that you want to verify the signature of + The factory address that will be used to deploy the smart account that you want to verify the signature of - #### `factoryCallData: Hex` diff --git a/site/packages/aa-ethers/account-signer/connect.md b/site/packages/aa-ethers/account-signer/connect.md index 0e952e556c..9b2b855fc0 100644 --- a/site/packages/aa-ethers/account-signer/connect.md +++ b/site/packages/aa-ethers/account-signer/connect.md @@ -16,7 +16,7 @@ next: # connect -`connect` is a method on `AccountSigner` that you can call to connect an `EthersProviderAdapter` to this signer. This lets the returned `AccountSigner` leverage the provider when signing messages, UserOperations, and transactions for a smart contract account using the owner account. +`connect` is a method on `AccountSigner` that you can call to connect an `EthersProviderAdapter` to this Signer. This lets the returned `AccountSigner` leverage the provider when signing messages, UserOperations, and transactions for a smart account using the owner account. ## Usage diff --git a/site/packages/aa-ethers/account-signer/getAddress.md b/site/packages/aa-ethers/account-signer/getAddress.md index a9c7f4d167..883e6917e8 100644 --- a/site/packages/aa-ethers/account-signer/getAddress.md +++ b/site/packages/aa-ethers/account-signer/getAddress.md @@ -14,7 +14,7 @@ head: # getAddress -`getAddress` is a method on `AccountSigner` that gets the `AccountSigner`'s smart contract account address. +`getAddress` is a method on `AccountSigner` that gets the `AccountSigner`'s smart account address. ## Usage @@ -23,7 +23,7 @@ head: ```ts [example.ts] import { signer } from "./ethers-signer"; -// get the signer's smart contract account address +// get the signer's smart account address const client = await signer.getAddress(); ``` @@ -34,4 +34,4 @@ const client = await signer.getAddress(); ### `Promise
` -A promise containing the `Signer`'s smart contract account address +A promise containing the `Signer`'s smart account address diff --git a/site/packages/aa-ethers/account-signer/introduction.md b/site/packages/aa-ethers/account-signer/introduction.md index c421859219..520bb6de98 100644 --- a/site/packages/aa-ethers/account-signer/introduction.md +++ b/site/packages/aa-ethers/account-signer/introduction.md @@ -14,13 +14,13 @@ head: # AccountSigner -`AccountSigner` is an extension of the ethers.js `Signer` which includes a implementation of `ISmartContractAccount` to integrate [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) smart contract accounts. The interface is similar to a standard `Signer`, with additional methods to leverage the Alchemy Account Abstraction stack. +`AccountSigner` is an extension of the ethers.js `Signer` which includes a implementation of `ISmartContractAccount` to integrate [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) smart accounts. The interface is similar to a standard `Signer`, with additional methods to leverage the Alchemy Account Abstraction stack. Notable differences between `EthersProviderAdapter` and `JsonRpcProvider` are implementations for: -1. [`getAddress`](/packages/aa-ethers/account-signer/getAddress) -- gets the `AccountSigner`'s smart contract account address. +1. [`getAddress`](/packages/aa-ethers/account-signer/getAddress) -- gets the `AccountSigner`'s smart account address. 2. [`signMessage`](/packages/aa-ethers/account-signer/signMessage) -- signs messages with the `AccountSigner`'s owner address. -3. [`sendTransaction`](/packages/aa-ethers/account-signer/sendTransaction) -- sends transactions on behalf of the `AccountSigner`'s smart contract account, with request and response formatted as if you were using the ethers.js library. +3. [`sendTransaction`](/packages/aa-ethers/account-signer/sendTransaction) -- sends transactions on behalf of the `AccountSigner`'s smart account, with request and response formatted as if you were using the ethers.js library. 4. [`getPublicErc4337Client`](/packages/aa-ethers/account-signer/getPublicErc4337Client) -- gets the underlying viem cliemt with ERC-4337 compatability. 5. [`connect`](/packages/aa-ethers/account-signer/connect) -- connects the inputted provider to an account and returns an `AccountSigner`. @@ -31,13 +31,13 @@ Notable differences between `EthersProviderAdapter` and `JsonRpcProvider` are im ```ts [example.ts] import { signer } from "./ethers-signer"; -// get the signer's smart contract account address +// get the signer's smart account address const address = await signer.getAddress(); // sign message with the signer's owner address const signedMessage = await signer.signMessage("test"); -// sends transaction on behalf of the smart contract account +// sends transaction on behalf of the smart account const txn = await signer.sendTransaction({ to: "0xRECIPIENT_ADDRESS", data: "0xDATA", diff --git a/site/packages/aa-ethers/account-signer/sendTransaction.md b/site/packages/aa-ethers/account-signer/sendTransaction.md index a68a370a5f..08162a6324 100644 --- a/site/packages/aa-ethers/account-signer/sendTransaction.md +++ b/site/packages/aa-ethers/account-signer/sendTransaction.md @@ -14,7 +14,7 @@ head: # sendTransaction -`sendTransaction` is a method on `AccountSigner` that sends transactions on behalf of the `AccountSigner`'s smart contract account, with request and response formatted as if you were using the ethers.js library. +`sendTransaction` is a method on `AccountSigner` that sends transactions on behalf of the `AccountSigner`'s smart account, with request and response formatted as if you were using the ethers.js library. Note that `to` field of transaction is required, and among other fields of transaction, only `data`, `value`, `maxFeePerGas`, `maxPriorityFeePerGas` fields are considered and optional. Support for other fields is coming soon. diff --git a/site/packages/aa-ethers/index.md b/site/packages/aa-ethers/index.md index ce78b8bd86..317a430d06 100644 --- a/site/packages/aa-ethers/index.md +++ b/site/packages/aa-ethers/index.md @@ -19,7 +19,7 @@ next: # `@alchemy/aa-ethers` -This package contains `EthersProviderAdapter` and `AccountSigner`, respective extensions of the [`JsonRpcProvider`](https://docs.ethers.org/v5/api/providers/jsonrpc-provider/) and [`Signer`](https://docs.ethers.org/v5/api/signer/#Signer-getaddress) classes defined in [`ethers.js`](https://docs.ethers.org/v5/) external library. +This package contains `EthersProviderAdapter` and `AccountSigner`, respective extensions of the [`JsonRpcProvider`](https://docs.ethers.org/v5/api/providers/jsonrpc-provider/) and [`Signer`](https://docs.ethers.org/v5/api/signer/) classes defined in [`ethers.js`](https://docs.ethers.org/v5/) external library. If you currently rely `ethers.js` for web3 development, you can use these `ethers.js`-compatible `JsonRpcProvider` and `Signer` to integrate Account Abstraction into your dApp. You may also find the [`util`](./utils/introduction.md) methods helpful. @@ -45,7 +45,7 @@ pnpm i @alchemy/aa-ethers ::: -You can create a provider and connect it to a signer account like so: +You can create a provider and connect it to a Signer account like so: ::: code-group <<< @/snippets/ethers-signer.ts diff --git a/site/packages/aa-ethers/provider-adapter/connectToAccount.md b/site/packages/aa-ethers/provider-adapter/connectToAccount.md index ec667b7d38..14597289e9 100644 --- a/site/packages/aa-ethers/provider-adapter/connectToAccount.md +++ b/site/packages/aa-ethers/provider-adapter/connectToAccount.md @@ -14,7 +14,7 @@ head: # connectToAccount -`connectToAccount` is a method on `EthersProviderAdapter` that you can optionally call to connect the provider to an account and returns a `AccountSigner`. This enables the returned `AccountSigner` to leverage the provider when signing messages, UserOperations, and transactions for a smart contract account using the owner account. +`connectToAccount` is a method on `EthersProviderAdapter` that you can optionally call to connect the provider to an account and returns a `AccountSigner`. This enables the returned `AccountSigner` to leverage the provider when signing messages, UserOperations, and transactions for a smart account using the owner account. ## Usage diff --git a/site/packages/aa-ethers/provider-adapter/introduction.md b/site/packages/aa-ethers/provider-adapter/introduction.md index 8381fac7b6..e6167bbb6e 100644 --- a/site/packages/aa-ethers/provider-adapter/introduction.md +++ b/site/packages/aa-ethers/provider-adapter/introduction.md @@ -14,7 +14,7 @@ head: # EthersProviderAdapter -`EthersProviderAdapter` is an extension of the `ethers.js` `JsonRpcProvider` which includes a `SmartAccountProvider` field to integrate [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) smart contract accounts. The interface is similar to a standard `JsonRpcProvider`, with additional methods to leverage the Alchemy Account Abstraction stack. +`EthersProviderAdapter` is an extension of the `ethers.js` `JsonRpcProvider` which includes a `SmartAccountProvider` field to integrate [EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) smart accounts. The interface is similar to a standard `JsonRpcProvider`, with additional methods to leverage the Alchemy Account Abstraction stack. Notable differences between `EthersProviderAdapter` and `JsonRpcProvider` are implementations for: diff --git a/site/smart-accounts/accounts/choosing-a-smart-account.md b/site/smart-accounts/accounts/choosing-a-smart-account.md index c400949743..e18c36aef9 100644 --- a/site/smart-accounts/accounts/choosing-a-smart-account.md +++ b/site/smart-accounts/accounts/choosing-a-smart-account.md @@ -25,7 +25,7 @@ prev: ## What's a Smart Account? -A smart account is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) smart contract account. You can use it to manage assets, execute transactions (known as `userOperations` or `userOps`), and more. There are many different implementations of a smart account, including our [Light Account](/smart-accounts/accounts/light-account). +A smart account is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) smart account. You can use it to manage assets, execute transactions (known as `userOperations` or `userOps`), and more. There are many different implementations of a smart account, including our [Light Account](/smart-accounts/accounts/light-account). ## Light Account @@ -33,7 +33,7 @@ Account Kit provides a default smart account called `LightAccount`. [Light Account](/smart-accounts/accounts/light-account) is a secure, audited, gas-optimized, ERC-4337 compatible smart account implementation. It comes equipped with features like owner transfers, [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) message signing, and batched transactions. It's also [open source](https://github.com/alchemyplatform/light-account)! -For most applications, we recommend using the Light Account. It is [deployed](/smart-accounts/accounts/deployment-addresses) on Ethereum, Optimism, Arbitrum, Polygon, Base, and the respective testnets. +For most applications, we recommend using Light Account. It is [deployed](/smart-accounts/accounts/deployment-addresses) on Ethereum, Optimism, Arbitrum, Polygon, Base, and the respective testnets. ## Modular Account (coming soon) diff --git a/site/smart-accounts/accounts/deployment-addresses.md b/site/smart-accounts/accounts/deployment-addresses.md index 1b18533646..984fabd7e1 100644 --- a/site/smart-accounts/accounts/deployment-addresses.md +++ b/site/smart-accounts/accounts/deployment-addresses.md @@ -6,10 +6,10 @@ head: content: Deployment Addresses - - meta - name: description - content: Deployment Addresses for LightAccount and SimpleAccount + content: Deployment Addresses for Light Account and SimpleAccount - - meta - property: og:description - content: Deployment Addresses for LightAccount and SimpleAccount + content: Deployment Addresses for Light Account and SimpleAccount --- # Deployment Addresses diff --git a/site/smart-accounts/accounts/light-account.md b/site/smart-accounts/accounts/light-account.md index 31707a32eb..f56a818902 100644 --- a/site/smart-accounts/accounts/light-account.md +++ b/site/smart-accounts/accounts/light-account.md @@ -24,7 +24,7 @@ head: ## Overview -Light Account is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) smart account. We started with the Ethereum Foundation’s canonical [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) and added key improvements. It's fully production-ready with a security [audit](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf), gas optimizations, and [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) signature support. Additionally, Light Account supports ownership transfer to ensure you and your user don't get locked into a particular signer. +Light Account is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) smart account. We started with the Ethereum Foundation’s canonical [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) and added key improvements. It's fully production-ready with a security [audit](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf), gas optimizations, and [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) signature support. Additionally, Light Account supports ownership transfer to ensure you and your user don't get locked into a particular Signer. ## Why Light Account @@ -36,7 +36,7 @@ Light Account is engineered to minimize gas costs, as measured by the following | Account | Native transfer | ERC20 transfer | Creation | | ----------------------------------------------------------------------------------------------------------------------- | --------------- | -------------- | -------- | -| Alchemy LightAccount | 100844 | 90345 | 279746 | +| Alchemy Light Account | 100844 | 90345 | 279746 | | Kernel v2.1-lite | 101002 | 90321 | 230968 | | [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) | 101319 | 90907 | 383218 | | Etherspot | 103719 | 93324 | 279219 | @@ -60,6 +60,6 @@ The code snippet below demonstrates how to use Light Account with Account Kit. I ## Developer Links -- [LightAccount & Simple Account Deployment Addresses](/smart-accounts/accounts/deployment-addresses) -- [LightAccount Github Repo](https://github.com/alchemyplatform/light-account) +- [Light Account & Simple Account Deployment Addresses](/smart-accounts/accounts/deployment-addresses) +- [Light Account Github Repo](https://github.com/alchemyplatform/light-account) - [Quantstamp Audit Report](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf) diff --git a/site/smart-accounts/accounts/modular-account.md b/site/smart-accounts/accounts/modular-account.md index 4eae751c40..85d2864f2d 100644 --- a/site/smart-accounts/accounts/modular-account.md +++ b/site/smart-accounts/accounts/modular-account.md @@ -25,16 +25,16 @@ Soon after the first stable version of [ERC-6900](https://eips.ethereum.org/EIPS Read on to learn more about ERC-6900 and modular accounts. :::tip Note -We are working towards the first stable version of [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900) with [the community](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885). If you're developing a plugin or modular account, we'd love to chat! Join the Modular Accounts [Telegram group](https://t.me/+KfB9WuhKDgk5YzIx) or [say hello](mailto:account-abstraction@alchemy.com) to a team member at Alchemy. +We are working towards the first stable version of [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900) with [the community](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885). If you're developing a plugin or modular account, we'd love to chat! Join the Modular Accounts [Telegram group](https://t.me/+KfB9WuhKDgk5YzIx) or [say hello](mailto:account-abstraction@alchemy.com) to us! ::: ## Motivation -In the coming years, we expect most user accounts to be smart contract accounts that leverage the benefits of account abstraction. These accounts will generally share a similar set of core features such as signature validation and ownership transfer. To ensure this core feature set is secure and does not contain any vulnerabilities, it will be prudent for most developers to re-use battle-tested smart accounts rather than writing their own accounts. +In the coming years, we expect most user accounts to be smart accounts that leverage the benefits of account abstraction. These accounts will generally share a similar set of core features such as signature validation and ownership transfer. To ensure this core feature set is secure and does not contain any vulnerabilities, it will be prudent for most developers to re-use battle-tested smart accounts rather than writing their own accounts. -However, smart acounts are also programmable, enabling developers to build new and innovative features that hook into the validation and execution logic of a smart account. We hope and expect to see a diverse ecosystem of plugins flourish. +However, smart acounts are also programmable, enabling you to build new and innovative features that hook into the validation and execution logic of a smart account. We hope and expect to see a diverse ecosystem of plugins flourish. -In order to maximize interoperability and code re-use, these plugins will ideally share a standard interface that is compatible with every smart contract account. +In order to maximize interoperability and code re-use, these plugins will ideally share a standard interface that is compatible with every smart account. Refer to the Account Abstraction [series](https://www.alchemy.com/blog/account-abstraction) on our blog to learn more. @@ -42,7 +42,7 @@ Refer to the Account Abstraction [series](https://www.alchemy.com/blog/account-a ### Introduction -We authored [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900) to propose a standard interface for modular smart contract accounts and plugins. +We authored [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900) to propose a standard interface for modular smart accounts and plugins. The standard builds on earlier work by the Android developer community to standardize the interface between smart accounts and plugins. Each compliant plugin will incorporate a manifest that establishes various functions and hooks that need to be added to the smart account on installation. It will also specify aspects of the plugin (metadata, dependencies and permissions) that are necessary to constrain the plugin’s ability to act on the smart account. @@ -51,7 +51,7 @@ Taken together, these interactions enable a workflow that supports the seamless 1. Plugin developers and users set each plugin’s permissions and specifies validation and hooks during installation of the the plugin onto the account. 2. Based on these permissions, plugins can then change account states or execute on behalf of the account. -By standardizing basic functions and interfaces, ERC-6900 seeks to foster a growing ecosystem of wallet and plugin developers. These developers should be able to write one plugin that works with all smart accounts, rather than fragmenting their efforts across multiple different account implementations. +By standardizing basic functions and interfaces, ERC-6900 seeks to foster a growing ecosystem of wallet and plugin developers. You should be able to write one plugin that works with all smart accounts, rather than fragmenting their efforts across multiple different account implementations. For users, this standard will make it easier to discover and enable plugins. Imagine a future where a user with an ERC-6900 compatible account can install any of a thousand plugins to their smart account. @@ -59,7 +59,7 @@ For more detailed specifications of transaction flows, see the [ERC-6900 spec](h ### Architecture -The standard focuses on the development of modules or plugins, and on the interactions between these plugins and modular smart contract accounts (or “MSCA”). Following [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337), it splits validation and execution functions in order to allow for greater customization within these components while also ensuring that they remain composable. It also adds pre- and post-execution hooks as a third functional component to plugins, enabling more finely grained functionality. +The standard focuses on the development of modules or plugins, and on the interactions between these plugins and modular smart accounts (or “MSCA”). Following [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337), it splits validation and execution functions in order to allow for greater customization within these components while also ensuring that they remain composable. It also adds pre- and post-execution hooks as a third functional component to plugins, enabling more finely grained functionality. ![ERC-6900](/images/erc-6900.png) @@ -67,7 +67,7 @@ _[Source](https://eips.ethereum.org/EIPS/eip-6900)_ The architecture described in the image above is designed to achieve two technical goals: -- Provide standards for designing plugins for smart contract accounts. +- Provide standards for designing plugins for smart accounts. - Provide standards for how compliant accounts should interact with plugins. ### Designing Plugins diff --git a/site/smart-accounts/accounts/using-your-own.md b/site/smart-accounts/accounts/using-your-own.md index fa86ebe345..c49b2b8b27 100644 --- a/site/smart-accounts/accounts/using-your-own.md +++ b/site/smart-accounts/accounts/using-your-own.md @@ -22,7 +22,7 @@ next: # Using Your Own Smart Account -You are not limited to the accounts defined in `@alchemy/aa-accounts`. The `SmartAccountProvider` can be used with any Smart Contract Account because it only relies on the [`ISmartContractAccount`](https://github.com/alchemyplatform/aa-sdk/blob/main/packages/core/src/account/types.ts#L8) interface. This means you can use your own Smart Contract Account implementation with the Account Kit. +You are not limited to the accounts defined in `@alchemy/aa-accounts`. The `SmartAccountProvider` can be used with any Smart Contract Account because it only relies on the [`ISmartContractAccount`](https://github.com/alchemyplatform/aa-sdk/blob/main/packages/core/src/account/types.ts#L8) interface. This means you can use your own Smart Contract Account implementation with Account Kit. ## Implementing `ISmartContractAccount` @@ -52,7 +52,7 @@ See ["Contributing to `aa-accounts`"](/packages/aa-accounts/contributing) for mo ## `LightSmartContractAccount` as an Example -The team at Alchemy has built an extension of the eth-infinitism `SimpleAccount` called [LightAccount.sol](https://github.com/alchemyplatform/light-account/blob/main/src/LightAccount.sol). You can learn more about the Light Account in the [Light Account documentation](/smart-accounts/accounts/light-account). +We have built an extension of the eth-infinitism `SimpleAccount` called [LightAccount.sol](https://github.com/alchemyplatform/light-account/blob/main/src/LightAccount.sol). You can learn more about Light Account in the [Light Account documentation](/smart-accounts/accounts/light-account). We provide an implementation of `ISmartContractAccount` that works with `LightAccount.sol` which can be used as an example of how to implement your own Smart Contract Account: ::: details LightSmartContractAccount diff --git a/site/smart-accounts/overview.md b/site/smart-accounts/overview.md index 58d05940da..7088d49c11 100644 --- a/site/smart-accounts/overview.md +++ b/site/smart-accounts/overview.md @@ -25,11 +25,11 @@ next: # Overview -In this guide we'll explain the end-to-end journey of integrating smart accounts in your applications with Account Kit. We'll cover the necessary steps such as creating an Alchemy account, selecting the right account and signer and sending a User Operation. Additionally, we'll touch upon advanced functionalities like sponsoring gas, batching transactions and transferring ownership. +In this guide we'll explain the end-to-end journey of integrating smart accounts in your applications with Account Kit. We'll cover the necessary steps such as creating an Alchemy account, selecting the right account and Signer and sending a User Operation. Additionally, we'll touch upon advanced functionalities like sponsoring gas, batching transactions and transferring ownership. ## 1. Setting Up an Alchemy Account -Before diving into smart accounts, it's important to [set up your Alchemy account](https://auth.alchemy.com/signup). This will allow you to access the Alchemy API key which is required to initialize a provider and interact with the blockchain. Additionally, you'll get access to Alchemy's Gas Manager, which will enable you to sponsor gas for your users. +Before diving into smart accounts, it's important to [set up your Alchemy account](https://auth.alchemy.com/signup). This will allow you to access the Alchemy API key which is required to initialize a provider and interact with the blockchain. Additionally, you'll get access to our Gas Manager, which will enable you to sponsor gas for your users. ## 2. Deploying a Smart Account @@ -44,7 +44,7 @@ The `LightAccount` implementation is not [ERC-6900](/smart-accounts/accounts/mod ## 3. Choosing a Signer -A signer is the entity that signs transactions (User Operations) on behalf of the smart account. It can be an EOA, a custodial service, or a multi-party computation (MPC) service. We explain the different types of signers in detail in the [overview](signers/choosing-a-signer) section on choosing a signer. We'll also cover the common signer examples in detail in the following sections: +A Signer is the entity that signs transactions (User Operations) on behalf of the smart account. It can be an EOA, a custodial service, or a multi-party computation (MPC) service. We explain the different types of signers in detail in the [overview](signers/choosing-a-signer) section on choosing a Signer. We'll also cover the common Signer examples in detail in the following sections: - [Dynamic](signers/dynamic) - [Magic](signers/magic) diff --git a/site/smart-accounts/signers/capsule.md b/site/smart-accounts/signers/capsule.md index d81ee2e9f2..249e72dd24 100644 --- a/site/smart-accounts/signers/capsule.md +++ b/site/smart-accounts/signers/capsule.md @@ -6,23 +6,23 @@ head: content: Capsule Integration Guide - - meta - name: description - content: Follow this integration guide to use Capsule as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Capsule as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use Capsule as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Capsule as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Capsule Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use Capsule as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Capsule as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Capsule Integration Guide [Capsule](https://usecapsule.com/) is a signing solution that you can use to create secure, embedded [MPC wallets](https://www.alchemy.com/overviews/mpc-wallet) with just an email or a social login. Capsule-enabled wallets are portable across applications, recoverable, and programmable, so your users do not need to create different signers or contract accounts for every application they use. -Combining Capsule with Account Kit allows you to get the best of both on and off-chain programmability. You can use Capsule as a signer to create a wallet that works across apps, and then connect it to Account Kit to create expressive smart accounts for your users! +Combining Capsule with Account Kit allows you to get the best of both on and off-chain programmability. You can use Capsule as a Signer to create a wallet that works across apps, and then connect it to Account Kit to create expressive smart accounts for your users! ## Integration @@ -65,7 +65,7 @@ Next, setup the Capsule SDK and create a `SmartAccountSigner` <<< @/snippets/capsule.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/smart-accounts/signers/choosing-a-signer.md b/site/smart-accounts/signers/choosing-a-signer.md index 8c888b01a4..5bd56ba795 100644 --- a/site/smart-accounts/signers/choosing-a-signer.md +++ b/site/smart-accounts/signers/choosing-a-signer.md @@ -26,19 +26,19 @@ next: # What is a Signer? -A **signer** is a service (e.g. Magic or Turnkey) or application (e.g. Metamask) that manages the private key and signs operations. Most web3 users today use an [Externally Owned Account (EOA)](https://ethereum.org/en/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) with a self-custodial signer such as Metamask to manage the private key. +A **Signer** is a service (e.g. Magic or Turnkey) or application (e.g. MetaMask) that manages the private key and signs operations. Most web3 users today use an [Externally Owned Account (EOA)](https://ethereum.org/en/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) with a self-custodial Signer such as MetaMask to manage the private key. With Account Kit, you will deploy a **smart account** for each user instead of an EOA wallet. This smart account stores the user’s assets (e.g. tokens or NFTs). The default smart account in Account Kit is called [`LightAccount`](/smart-accounts/accounts/light-account) and it uses a typical single-owner architecture. The smart account is controlled by an **Owner** address. The smart account will only execute a transaction if it was signed by the owner’s private key. -You can choose any signer service or application to manage the Owner private key for the user. Using services like Magic, Turnkey, or Web3auth, you can secure the user’s account with an email, social login, or passkeys. You can also use a self-custodial wallet like Metamask as the signer. +You can choose any Signer service or application to manage the Owner private key for the user. Using services like Magic, Turnkey, or Web3auth, you can secure the user’s account with an email, social login, or passkeys. You can also use a self-custodial wallet like MetaMask as the Signer. -This doc provides a basic introduction to signers and the criteria you should consider when choosing which signer to use with Account Kit in your application. +This doc provides a basic introduction to signers and the criteria you should consider when choosing which Signer to use with Account Kit in your application. ## Role of a Signer -The signer plays a crucial role in your app because it controls the user’s smart account. The signer is responsible for: +The Signer plays a crucial role in your app because it controls the user’s smart account. The Signer is responsible for: - Securely storing the user’s private key which controls the user’s assets - Authenticating the user @@ -59,13 +59,13 @@ Account Kit is compatible with any EIP-1193 provider. Many of the most popular s - [Portal](/smart-accounts/signers/portal) - [Capsule](/smart-accounts/signers/capsule) - [Lit Protocol](/smart-accounts/signers/lit) -- [Self-custodial wallets like Metamask or Ledger](/smart-accounts/signers/eoa) +- [Self-custodial wallets like MetaMask or Ledger](/smart-accounts/signers/eoa) -If you want to use another signer, you can integrate any other signer by wrapping it in an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) provider or using [`SmartAccountSigner`](/smart-accounts/signers/custom-signer#implementing-smartaccountsigner) to adapt non-standard signers. +If you want to use another Signer, you can integrate any other Signer by wrapping it in an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) provider or using [`SmartAccountSigner`](/smart-accounts/signers/custom-signer#implementing-smartaccountsigner) to adapt non-standard Signer. ## Criteria to consider -Here are some important criteria to consider when choosing a signer. +Here are some important criteria to consider when choosing a Signer. - **Custody model:** Who has access to the private key? - Self-Custodial: the end user controls the private key and manually approves signature requests @@ -76,10 +76,10 @@ Here are some important criteria to consider when choosing a signer. - Email + Password: sign up for a smart account with an email and password. - Social Logins: sign up for a smart account with Google, Facebook, or other social logins. - Passkeys: sign up for a smart account secured by a passkey (e.g. fingerprint or Face ID) stored on-device. - - Self Custodial Wallet: sign up for a smart account using a self-custodial wallet such as Metamask or Ledger. -- **Availability:** If the signer service provider goes down, will users be able to sign transactions? -- **Key Export:** Does the signer allow the end user to export their private key? Can the user initiate an export even if the service provider has gone down? This is an important factor to ensure the user retains control of their assets no matter what happens to the service provider. -- **Key Recovery**: If the user forgets their password or loses their passkey, what recovery methods does the signer provide? If the provider stores a backup copy of the private key or MPC key shares, where are those backups stored and who has access to them? + - Self Custodial Wallet: sign up for a smart account using a self-custodial wallet such as MetaMask or Ledger. +- **Availability:** If the Signer service provider goes down, will users be able to sign transactions? +- **Key Export:** Does the Signer allow the end user to export their private key? Can the user initiate an export even if the service provider has gone down? This is an important factor to ensure the user retains control of their assets no matter what happens to the service provider. +- **Key Recovery**: If the user forgets their password or loses their passkey, what recovery methods does the Signer provide? If the provider stores a backup copy of the private key or MPC key shares, where are those backups stored and who has access to them? ## Types of Signers @@ -91,9 +91,9 @@ Non-custodial wallet providers store private keys such that they cannot access t ### MPC Wallets (non-custodial) -Multi-Party Computation (MPC) signers split the Owner Account private key into key shares that are then distributed to a number of share holders. Share holders only know the value of their key share and transaction holders can sign transactions without revealing their key shares to other holders. +Multi-Party Computation (MPC) Signers split the Owner Account private key into key shares that are then distributed to a number of share holders. Share holders only know the value of their key share and transaction holders can sign transactions without revealing their key shares to other holders. -Valid signatures do not always require all shares to sign a transaction. MPC signers can set a threshold, requiring a certain number of shares for a signature to be valid. Common configurations are 2 of 2 shares or 2 of 3 shares. By requiring multiple shares, MPC models mitigate the risks associated with a single key being compromised. +Valid signatures do not always require all shares to sign a transaction. MPC Signers can set a threshold, requiring a certain number of shares for a signature to be valid. Common configurations are 2 of 2 shares or 2 of 3 shares. By requiring multiple shares, MPC models mitigate the risks associated with a single key being compromised. Some MPC signers provide recovery services in which key share(s) are backed up in the service provider’s cloud, on the end user’s device, or in the end user’s cloud (e.g. iCloud or Google Drive). When evaluating an MPC provider, it’s important to under where each key share is stored. @@ -124,7 +124,7 @@ Self-custodial wallets store the private key locally where only the end user can Self-custodial wallets require the user to maintain good security hygiene at all times. They also rely on the user to backup a copy of their private key in the event the wallet is lost or destroyed. If the user loses access to the device on which their private key is stored, they will have no way to recover the account unless they backed up the private key in another device or location. -**Example**: Metamask, Ledger +**Example**: MetaMask, Ledger ### Custodial Wallet diff --git a/site/smart-accounts/signers/contributing.md b/site/smart-accounts/signers/contributing.md index 146e30fdd5..b390c2b612 100644 --- a/site/smart-accounts/signers/contributing.md +++ b/site/smart-accounts/signers/contributing.md @@ -6,21 +6,21 @@ head: content: Contributing Your Signer - - meta - name: description - content: Follow this guide to contribute a new signer to the Account Kit documentation, and enable developers to sign ERC-4337 transactions with your signer. + content: Follow this guide to contribute a new Signer to Account Kit documentation, and enable developers to sign ERC-4337 transactions with your Signer. - - meta - property: og:description - content: Follow this guide to contribute a new signer to the Account Kit documentation, and enable developers to sign ERC-4337 transactions with your signer. + content: Follow this guide to contribute a new Signer to Account Kit documentation, and enable developers to sign ERC-4337 transactions with your Signer. - - meta - name: twitter:title content: Contributing Your Signer - - meta - name: twitter:description - content: Follow this guide to contribute a new signer to the Account Kit documentation, and enable developers to sign ERC-4337 transactions with your signer. + content: Follow this guide to contribute a new Signer to Account Kit documentation, and enable developers to sign ERC-4337 transactions with your Signer. --- # Contributing Your Signer -If you'd like to add your signer to this list, we welcome PRs! Here's how to do it: +If you'd like to add your Signer to this list, we welcome PRs! Here's how to do it: 1. Fork this [repo](https://github.com/alchemyplatform/aa-sdk) 2. In [`site/.vitepress/config.ts`](https://github.com/alchemyplatform/aa-sdk/blob/main/site/.vitepress/config.ts), there is a `sidebar` property. Find the `Choosing a Signer` item and add a new entry in `items`. The `text` property of the entry is what will be visible in the sidebar and the `link` property should be `kebab-case`. This should match the file name in the next step. Place it above the `Externally Owned Account` guide. eg: diff --git a/site/smart-accounts/signers/custom-signer.md b/site/smart-accounts/signers/custom-signer.md index 59a02be272..045aaa0d64 100644 --- a/site/smart-accounts/signers/custom-signer.md +++ b/site/smart-accounts/signers/custom-signer.md @@ -6,30 +6,30 @@ head: content: How to Use Your Own Account Signer - - meta - name: description - content: Follow this guide to use any signer you want with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to use any Signer you want with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this guide to use any signer you want with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to use any Signer you want with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: How to Use Your Own Account Signer - - meta - name: twitter:description - content: Follow this guide to use any signer you want with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this guide to use any Signer you want with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # How to Use Your Own Account Signer -Account Kit is designed to be flexible and allow you to use any signer you want. You have two options. You can either: +Account Kit is designed to be flexible and allow you to use any Signer you want. You have two options. You can either: -1. If your signer is an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant provider, you can leverage `viem`'s `WalletClient` and the `WalletClientSigner` exported in `aa-core` +1. If your Signer is an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) compliant provider, you can leverage `viem`'s `WalletClient` and the `WalletClientSigner` exported in `aa-core` 2. Implement `SmartAccountSigner` (exported in `aa-core`) ## Using `WalletClientSigner` Viem allows you to create `WalletClient`s which can be used to wrap local or JSON RPC based wallets. You can see the complete docs for leveraging the `WalletClient` [here](https://viem.sh/docs/clients/wallet.html). -We support a `SmartAccountSigner` implementation called `WalletClientSigner` that makes it really easy to use a viem `WalletClient` as an owner on your Smart Contract Account. If your signer is EIP-1193 compliant, it's really easy to use with `WalletClient`. Let's take a look at a simple example: +We support a `SmartAccountSigner` implementation called `WalletClientSigner` that makes it really easy to use a viem `WalletClient` as an owner on your Smart Contract Account. If your Signer is EIP-1193 compliant, it's really easy to use with `WalletClient`. Let's take a look at a simple example: <<< @/snippets/wallet-client-signer.ts @@ -41,7 +41,7 @@ The `SmartAccountSigner` interface is really straighforward: ## Adding Your Signer to This List -If you'd like to add your signer to this list, we welcome PRs! Here's how to do it: +If you'd like to add your Signer to this list, we welcome PRs! Here's how to do it: 1. Fork this [repo](https://github.com/alchemyplatform/aa-sdk) 2. In [`site/.vitepress/config.ts`](https://github.com/alchemyplatform/aa-sdk/blob/main/site/.vitepress/config.ts), there is a `sidebar` property. Find the `Choosing a Signer` item and add a new entry in `items`. The `text` property of the entry is what will be visible in the sidebar and the `link` property should be `kebab-case`. This should match the file name in the next step. Place it above the `Externally Owned Account` guide and maintain alphabetical order. eg: diff --git a/site/smart-accounts/signers/dynamic.md b/site/smart-accounts/signers/dynamic.md index 679b1dec20..e2ef440886 100644 --- a/site/smart-accounts/signers/dynamic.md +++ b/site/smart-accounts/signers/dynamic.md @@ -6,16 +6,16 @@ head: content: Dynamic Integration Guide - - meta - name: description - content: Follow this integration guide to use Dynamic as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Dynamic as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use Dynamic as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Dynamic as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Dynamic Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use Dynamic as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Dynamic as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Dynamic @@ -76,7 +76,7 @@ Next, inside any component which is wrapped by the above DynamicContextProvider, <<< @/snippets/dynamic.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/smart-accounts/signers/eoa.md b/site/smart-accounts/signers/eoa.md index 9c28293670..b870cbc65e 100644 --- a/site/smart-accounts/signers/eoa.md +++ b/site/smart-accounts/signers/eoa.md @@ -6,21 +6,21 @@ head: content: EOA Integration Guide - - meta - name: description - content: Follow this integration guide to use an EOA as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use an EOA as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use an EOA as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use an EOA as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: EOA Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use an EOA as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use an EOA as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # EOA Integration Guide -An Externally Owned Account (EOA) is a regular Ethereum account that is controlled by a private key. This is the most common type of account, and is what you are used to when using MetaMask or other wallets. The Account Kit supports EOAs as signers and the process for connecting an EOA is simple, but can depend on how you are connecting to the EOA in your dApp. +An Externally Owned Account (EOA) is a regular Ethereum account that is controlled by a private key. This is the most common type of account, and is what you are used to when using MetaMask or other wallets. The Account Kit supports EOAs as Signers and the process for connecting an EOA is simple, but can depend on how you are connecting to the EOA in your dApp. ## Integration @@ -28,7 +28,7 @@ In this example we'll use `viem` in two ways. The first way allows you to connec ### JSON RPC -A JSON RPC based account is one where the key material is not available locally, but on some external client (eg. Metamask extension or hardware wallet). +A JSON RPC based account is one where the key material is not available locally, but on some external client (eg. MetaMask extension or hardware wallet). ```ts import { createWalletClient, custom } from "viem"; diff --git a/site/smart-accounts/signers/fireblocks.md b/site/smart-accounts/signers/fireblocks.md index c6bf7da023..b278fb6b1b 100644 --- a/site/smart-accounts/signers/fireblocks.md +++ b/site/smart-accounts/signers/fireblocks.md @@ -6,16 +6,16 @@ head: content: Fireblocks Integration Guide - - meta - name: description - content: Follow this integration guide to use Fireblocks as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Fireblocks as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use Fireblocks as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Fireblocks as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Fireblocks Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use Fireblocks as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Fireblocks as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Fireblocks @@ -24,7 +24,7 @@ head: Fireblocks' security structure provides a truly secure environment for storing, transferring, and issuing digital assets. This ensures that your assets are protected from cyberattacks, internal colluders, and human errors. As a result, Fireblocks serves as the foundation for thousands of digital asset businesses and has securely transferred over $3T in digital assets. -Fireblocks' MPC wallets are EOA accounts, which in any account abstraction enabled wallet is the root of their security & trust model. Using Fireblocks MPC based EOA wallets in combination with the Alchemy Account Kit will give you the best of both worlds; Enterprise grade security for securing your off-chain key material, and the utmost flexibility of your on-chain Smart Accounts +Fireblocks' MPC wallets are EOA accounts, which in any account abstraction enabled wallet is the root of their security & trust model. Using Fireblocks MPC based EOA wallets in combination with the Account Kit will give you the best of both worlds; Enterprise grade security for securing your off-chain key material, and the utmost flexibility of your on-chain smart accounts # Integration @@ -48,7 +48,7 @@ Next, setup the Fireblocks Web3 Provider and create a `SmartAccountSigner`: <<< @/snippets/fireblocks.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/smart-accounts/signers/lit.md b/site/smart-accounts/signers/lit.md index 9e3c7588f6..cc201385f9 100644 --- a/site/smart-accounts/signers/lit.md +++ b/site/smart-accounts/signers/lit.md @@ -6,21 +6,21 @@ head: content: Lit Protocol Integration Guide - - meta - name: description - content: Follow this integration guide to use PKP Wallet as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use PKP Wallet as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use PKP Wallet as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use PKP Wallet as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Lit Protocol Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use PKP Wallet as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use PKP Wallet as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Lit Protocol Integration Guide -[LitProtocol](https://litprotocol.com/) is distributed cryptography for signing, encryption, and compute. A generalizable key management network, Lit provides developers with a set of tools for managing sovereign identities on the open Web. +[LitProtocol](https://litprotocol.com/) is distributed cryptography for signing, encryption, and compute. A generalizable key management network, Lit provides you with a set of tools for managing sovereign identities on the open Web. Combining Lit Protocol's [pkp wallet](https://www.npmjs.com/package/@lit-protocol/pkp-ethers) with Account Kit allows you to use your Programmable Key Pairs (PKPs) as a smart account for your users. @@ -70,7 +70,7 @@ Next, setup the `LitNodeClient` and `PKPEthersWallet` to create a `SmartAccountS <<< @/snippets/lit.ts -### Use it with LightAccount +### Use it with Light Account We can link our `SmartAccountSigner` to a `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/smart-accounts/signers/magic.md b/site/smart-accounts/signers/magic.md index fbb3aac551..9ec441b211 100644 --- a/site/smart-accounts/signers/magic.md +++ b/site/smart-accounts/signers/magic.md @@ -6,16 +6,16 @@ head: content: Magic Link Integration Guide - - meta - name: description - content: Follow this integration guide to use Magic.Link as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Magic.Link as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use Magic.Link as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Magic.Link as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Magic Link Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use Magic.Link as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Magic.Link as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Magic Link Integration Guide @@ -48,7 +48,7 @@ Next, setup the magic sdk and create an authenticated `MagicSigner` using the `a <<< @/snippets/magic.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group @@ -64,8 +64,8 @@ import { createMagicSigner } from "./magic"; const chain = sepolia; -// NOTE: the below is async because it depends on creating a magic signer. You can choose to break that up how you want -// eg. use a useEffect + useState to create the signer and then pass it down to the provider +// NOTE: the below is async because it depends on creating a magic Signer. You can choose to break that up how you want +// eg. use a useEffect + useState to create the Signer and then pass it down to the provider const provider = new AlchemyProvider({ apiKey: "ALCHEMY_API_KEY", chain, diff --git a/site/smart-accounts/signers/particle-network.md b/site/smart-accounts/signers/particle-network.md index 3a08ab548d..44f90513e2 100644 --- a/site/smart-accounts/signers/particle-network.md +++ b/site/smart-accounts/signers/particle-network.md @@ -6,17 +6,17 @@ head: content: Particle Network - - meta - name: description - content: Guide to use Particle Network as a signer + content: Guide to use Particle Network as a Signer - - meta - property: og:description - content: Guide to use Particle Network as a signer + content: Guide to use Particle Network as a Signer --- # Particle Network [**Particle Network**](https://particle.network/) is the Intent-Centric, Modular Access Layer of Web3. With Particle's [Smart Wallet-as-a-Service](https://blog.particle.network/announcing-our-smart-wallet-as-a-service-modular-stack-upgrading-waas-with-erc-4337), developers can curate unparalleled user experience through modular and customizable embedded wallet components. By utilizing MPC-TSS for key management, Particle can streamline onboarding via familiar Web2 accounts—such as Google accounts, email addresses, phone numbers, etc. -Leveraging both Particle and Account Kit enables a streamlined onboarding flow, with social logins and signer key management being handled by Particle while Account Kit takes this experience to the next level with account abstraction - facilitating powerful user experience. +Leveraging both Particle and Account Kit enables a streamlined onboarding flow, with social logins and Signer key management being handled by Particle while Account Kit takes this experience to the next level with account abstraction - facilitating powerful user experience. ## Integration @@ -48,7 +48,7 @@ From here, setting up a `SmartAccountSigner` involves the initialization of `Par <<< @/snippets/particle.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/smart-accounts/signers/portal.md b/site/smart-accounts/signers/portal.md index 7754184cb5..0688818df2 100644 --- a/site/smart-accounts/signers/portal.md +++ b/site/smart-accounts/signers/portal.md @@ -6,23 +6,23 @@ head: content: Portal Integration Guide - - meta - name: description - content: Follow this integration guide to use Portal as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Portal as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use Portal as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Portal as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Portal Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use Portal as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Portal as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Portal Integration Guide [Portal](https://www.portalhq.io/) is an embedded blockchain infrastructure company that powers companies with an end to end platform for key management for self-custodial wallets (MPC and AA), security firewall, and web3 protocol connect kit. -A combination of Portal and Alchemy's Account Kit allows you to have robust key management and security, while also exploring everything that web3 has to offer with smart contract accounts for your users. +A combination of Portal and Account Kit allows you to have robust key management and security, while also exploring everything that web3 has to offer with smart accounts for your users. ## Integration @@ -48,7 +48,7 @@ Next, setup the Portal SDK and create a `SmartAccountSigner`: <<< @/snippets/portal.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/smart-accounts/signers/privy.md b/site/smart-accounts/signers/privy.md index cda851361c..ddefe58e58 100644 --- a/site/smart-accounts/signers/privy.md +++ b/site/smart-accounts/signers/privy.md @@ -6,21 +6,21 @@ head: content: Privy Integration Guide - - meta - name: description - content: Follow this integration guide to use Privy as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Privy as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use Privy as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Privy as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Privy Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use Privy as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Privy as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Privy Integration Guide -[Privy](https://privy.io) is an easy way for web3 developers to onboard users across mobile and desktop, regardless of whether they already have a wallet or not. +[Privy](https://privy.io) is an easy way for you to onboard users across mobile and desktop, regardless of whether they already have a wallet or not. With Privy, you can easily provision **self-custodial embedded wallets** for your users when they login with email, SMS, or social logins, while also enabling web3-native users to use their existing wallets with your app, if they prefer. diff --git a/site/smart-accounts/signers/turnkey.md b/site/smart-accounts/signers/turnkey.md index 6851fcf413..caeeea7bd6 100644 --- a/site/smart-accounts/signers/turnkey.md +++ b/site/smart-accounts/signers/turnkey.md @@ -6,16 +6,16 @@ head: content: Turnkey Integration Guide - - meta - name: description - content: Follow this integration guide to use Turnkey as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Turnkey as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use Turnkey as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Turnkey as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Turnkey Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use Turnkey as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use Turnkey as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Turnkey Integration Guide @@ -52,7 +52,7 @@ Next, setup the Turnkey sdk and create a `SmartAccountSigner`: <<< @/snippets/turnkey.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/smart-accounts/signers/web3auth.md b/site/smart-accounts/signers/web3auth.md index 97c887a92e..f930ddd5fc 100644 --- a/site/smart-accounts/signers/web3auth.md +++ b/site/smart-accounts/signers/web3auth.md @@ -6,16 +6,16 @@ head: content: Web3Auth Integration Guide - - meta - name: description - content: Follow this integration guide to use an EOA as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use an EOA as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - property: og:description - content: Follow this integration guide to use an EOA as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use an EOA as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. - - meta - name: twitter:title content: Web3Auth Integration Guide - - meta - name: twitter:description - content: Follow this integration guide to use an EOA as a signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. + content: Follow this integration guide to use an EOA as a Signer with Account Kit, a vertically integrated stack for building apps that support ERC-4337. --- # Web3Auth Integration Guide @@ -50,7 +50,7 @@ Next, setup the web3auth sdk and create a `SmartAccountSigner` using the `aa-sig <<< @/snippets/web3auth.ts -### Use it with LightAccount +### Use it with Light Account Let's see it in action with `aa-alchemy` and `LightSmartContractAccount` from `aa-accounts`: ::: code-group diff --git a/site/snippets/account-alchemy.ts b/site/snippets/account-alchemy.ts index 7520ad282a..936b7a5603 100644 --- a/site/snippets/account-alchemy.ts +++ b/site/snippets/account-alchemy.ts @@ -12,7 +12,7 @@ import { polygonMumbai } from "viem/chains"; const chain = polygonMumbai; -// 1. define the EOA owner of the Smart Account +// 1. define the EOA owner of the smart account // this uses a utility method for creating an account signer using mnemonic // we also have a utility for creating an account signer from a private key const owner: SmartAccountSigner = diff --git a/site/snippets/account-core.ts b/site/snippets/account-core.ts index 64ef5a2627..943751f2d7 100644 --- a/site/snippets/account-core.ts +++ b/site/snippets/account-core.ts @@ -9,7 +9,7 @@ import { } from "@alchemy/aa-core"; import { polygonMumbai } from "viem/chains"; -// 1. define the EOA owner of the Smart Account +// 1. define the EOA owner of the smart account // this uses a utility method for creating an account signer using mnemonic // we also have a utility for creating an account signer from a private key const owner: SmartAccountSigner = From 4420295d008d8583761d9cf33abf0aeb58070ec5 Mon Sep 17 00:00:00 2001 From: Sahil Aujla Date: Tue, 28 Nov 2023 22:10:57 -0500 Subject: [PATCH 74/79] docs: update CONTRIBUTING guide, fix PR template, and clean up README (#290) * docs: update CONTRIBUTING guide, fix PR template, and clean up README * Update CONTRIBUTING.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update README.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * docs: make requested changes --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> --- ...t_template.md => PULL_REQUEST_TEMPLATE.md} | 5 +- CONTRIBUTING.md | 66 ++++++++++++++----- README.md | 43 ++---------- 3 files changed, 57 insertions(+), 57 deletions(-) rename .github/{PULL_REQUEST_TEMPLATE/pull_request_template.md => PULL_REQUEST_TEMPLATE.md} (67%) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 67% rename from .github/PULL_REQUEST_TEMPLATE/pull_request_template.md rename to .github/PULL_REQUEST_TEMPLATE.md index 8b5d472ca1..18082f2f19 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,9 +1,10 @@ # Pull Request Checklist - [ ] Did you add new tests and confirm existing tests pass? (`yarn test`) -- [ ] Did you update relevant docs? (docs are found in the `site` folder, see guidleines below) +- [ ] Did you update relevant docs? (docs are found in the `site` folder, and guidelines for updating/adding docs can be found in the [contribution guide](https://github.com/alchemyplatform/aa-sdk/blob/main/CONTRIBUTING.md)) - [ ] Do your commits follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? - [ ] Does your PR title also follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? -- [ ] If you have a breaking change, is it [correctly reflected in your commit message](https://www.conventionalcommits.org/en/v1.0.0/#examples? (e.g. `feat!: breaking change`) +- [ ] If you have a breaking change, is it [correctly reflected in your commit message](https://www.conventionalcommits.org/en/v1.0.0/#examples)? (e.g. `feat!: breaking change`) - [ ] Did you run lint (`yarn lint:check`) and fix any issues? (`yarn lint:fix`) - [ ] Is the base branch you're merging into `development` and not `main`? +- [ ] Did you follow the [contribution guidelines](https://github.com/alchemyplatform/aa-sdk/blob/main/CONTRIBUTING.md)? diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 47c5469041..28e6252033 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,24 +1,58 @@ # Contributing -We welcome any and all contributions. To get started, +We're excited to have you contribute to the `aa-sdk`. Here's a step-by-step guide to help you get started. -1. Make sure you have `yarn` installed. We are still using version 1.x. The installation instructions can be found here: https://classic.yarnpkg.com/lang/en/docs/install -2. [Fork](https://github.com/alchemyplatform/aa-sdk/fork) this repo -3. Run `yarn` to install dependencies -4. Make changes to packages +## Getting Started -## Pull Request Checklist +1. **Fork and Clone**: First, [fork the `aa-sdk` repository](https://github.com/alchemyplatform/aa-sdk/fork). Then, clone your forked repo to your local machine. -- [ ] Did you add new tests and confirm existing tests pass? (`yarn test`) -- [ ] Did you update relevant docs? (docs are found in the `site` folder, see guidleines below) -- [ ] Do your commits follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? -- [ ] Does your PR title also follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard? -- [ ] If you have a breaking change, is it [correctly reflected in your commit message](https://www.conventionalcommits.org/en/v1.0.0/#examples? (e.g. `feat!: breaking change`) -- [ ] Did you run lint (`yarn lint:check`) and fix any issues? (`yarn lint:fix`) -- [ ] Is the base branch you're merging into `development` and not `main`? +2. **Install Dependencies**: Ensure you have `yarn` installed (we use version 1.x). Installation instructions are available [here](https://classic.yarnpkg.com/lang/en/docs/install). Run `yarn` in the project root to install all necessary dependencies. -## Docs guidelines +3. **Testing Environment**: Before making changes, make sure to verify the testing environment. -We leverage `vitepress` to build our docs. You can find the docs in the `site` folder. To run the docs locally, run `yarn docs:dev` from the `site` folder. To build the docs, run `yarn docs:build`. Docs are automatically deployed with each package published. + - Use the Node version specified in `package.json` (currently 18.16.0). Run `node -v` to check your version. + - Build the project with `yarn build`. + - Run existing tests using `yarn test` to ensure everything is working correctly. -When updating code, be sure to update the relevant doc within `site/packages/*`. The `packages` directory is broken down by the relevant package found within this repository. When adding new functionality, be sure to add a new doc outlining the method or class that you've added! +4. **Make Changes**: Now, you can start making changes to the packages or docs. When updating or adding new functionality, update or add a new doc in `site/packages/*` corresponding to the package you've worked on to document the changes. + +5. **Re-verify Tests**: After making your changes, re-run `yarn test` to ensure all tests still pass. + +6. **Code Formatting**: + + - Format your code changes with `yarn run lint:write`. + - Confirm that your code passes format checks with `yarn run lint:check`. + +7. **Docs Changes**: + + - We use `vitepress` for our docs located in the `site` folder. + - To run docs locally: `yarn dev` from the `site` folder. + - To build docs: `yarn build` from the `site` folder. + - When editing or adding new docs, make sure you follow the guidelines mentioned below: + - Follow the [Google style guidelines](https://developers.google.com/style) for docs content. + - Additional Guidelines: + - Use terms consistently (e.g., "smart account", not "Smart Account"). + - Refer to "Account Kit" correctly, without "the" or "AccountKit". + - Use `LightAccount` for code references, "Light Account" in text. + - Use "gasless" over "gas-less". + - Write documentation in the [second person voice](https://developers.google.com/style/person). + - Use "aa-sdk" or "Account Kit" depending on context, not "Account Kit SDK". + - Capitalize "Gas Manager API" and "Bundler API". + - Capitalize definitions for type primitives like `Provider`, `Signer`, `Account`. + +8. **Committing Changes**: Commit your changes using a standardized message format. + + - Format: `[subject-type]: [description starting with lowercase letters] (#[issue number])`. + - For breaking changes, clearly reflect in your commit message (e.g., `feat!: breaking change`). + - Example: `feat: add sanity check on provider connect for clearer error message (#181)`. + - Example: `docs: add new section on gasless transactions (#189)`. + - Use `git log` to see more examples and acceptable subject-types. + - For more details on semantic PR titles, refer to [Flank's guide on PR titles](https://flank.github.io/flank/pr_titles/). + +9. **Creating a Pull Request**: + + - Push your changes to your GitHub fork. + - Create a pull request against the original `aa-sdk` repository's `development` branch. + - Ensure the pull request title follows the Enforce PR Title Format: `[subject-type]: [description starting with lowercase letters]`. You can check this using `echo "[YOUR_PR_TITLE_HERE] | yarn commitlint`. + +10. **Celebrate** your contribution! diff --git a/README.md b/README.md index 19732d50d8..6bf960331f 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,15 @@ -# Account Abstraction SDK (aa-sdk) +# aa-sdk The `aa-sdk` is a type-safe and performant TypeScript library built on top of [viem](https://viem.sh/) to provide ergonomic methods for sending user operations, sponsoring gas, and deploying smart accounts. It handles all the complexity of ERC-4337 under the hood to make account abstraction simple. The SDK also implements an EIP-1193 provider interface to easily plug into any popular dapp or wallet connect libraries such as RainbowKit, Wagmi, and Web3Modal. It also includes ethers.js adapters to provide full support for ethers.js apps. -The `aa-sdk` is modular at every layer of the stack and can be easily extended to fit your custom needs. You can plug in any [smart account](https://accountkit.alchemy.com/smart-accounts/accounts/using-your-own) implementation, [Signer](https://accountkit.alchemy.com/smart-accounts/signers/overview), [Gas Manager API](https://accountkit.alchemy.com/overview/introduction.html#gas-manager-api), RPC provider. +The `aa-sdk` is modular at every layer of the stack and can be easily extended to fit your custom needs. You can plug in any [smart account](https://accountkit.alchemy.com/smart-accounts/accounts/using-your-own) implementation, [Signer](https://accountkit.alchemy.com/smart-accounts/signers/overview), [Gas Manager API](https://accountkit.alchemy.com/overview/introduction.html#gas-manager-api) and RPC Provider. ## Getting Started -### Install the Packages - -```bash [yarn] -yarn add @alchemy/aa-accounts @alchemy/aa-core -``` - -### [Light Account Example](https://accountkit.alchemy.com/overview/getting-started#a-simple-light-account-example) - -## Docs - -The `aa-sdk` is part of Account Kit. For more information, check out the [Account Kit docs](https://accountkit.alchemy.com). +The `aa-sdk` is part of [Account Kit](https://accountkit.alchemy.com). Check out this [quickstart guide](https://accountkit.alchemy.com/getting-started.html) to get started. ## Contributing -1. clone the repo -2. run `yarn` -3. verify tests pass - - be sure to use the node version specified in package.json, currently 18.16 - - run `node -v` - - run `yarn build` - - run `yarn test` -4. make changes to packages -5. reverify that all tests pass -6. format code changes - - run `yarn run lint:write` -7. confirm code passes format checks - - run `yarn run lint:check` -8. commit code with a standardized commit message - - format: `[subject-type]: [description starting with lowercase letters] (#[issue number])` - - example: `feat: add sanity check on provider connect for clearer error message (#181)` - - note: run `git log` to see more examples and acceptable subject-types -9. push to your github fork -10. create a pull request with the original github repo - -- note: pull request title must pass the Enforce PR Title Format -- format: `[subject-type]: [description starting with lowercase letters]` -- run `echo "[YOUR_PR_TITLE_HERE] | yarn commitlint` -- passing example: run `echo "docs: add build and test documentation update (#195)" | yarn commitlint` - -11. celebrate +We welcome contributions to `aa-sdk`. Please see our [contributing guidelines](CONTRIBUTING.md) for more information. From a969bb5d65c0b40215e368f1098805613773f499 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Wed, 29 Nov 2023 17:43:16 -0800 Subject: [PATCH 75/79] feat: aa-core smart account provider fee options to handle more systematic fee options for userops (#276) * feat: aa-core smart account provider fee options to handle more systematic fee options for userops * feat: remove fee options middleware and expose fee options to middleware functions * feat: aa-alchemy ergonomic support for handling gas estimation (#243) * feat: support updated overrides for alchemy request gas and paymaster and data * feat: rebase parent where account middle func def is updated * Update site/packages/aa-alchemy/middleware/withAlchemyGasManager.md Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update packages/core/src/utils/index.ts Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update packages/core/src/utils/index.ts Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> * Update packages/core/src/provider/base.ts Co-authored-by: Michael Moldoveanu * fix: alchemy gas manager 0x check for user op overrides --------- Co-authored-by: Ajay Vasisht <43521356+avasisht23@users.noreply.github.com> Co-authored-by: Michael Moldoveanu --- .../e2e-tests/light-account.test.ts | 54 ++-- .../alchemy/e2e-tests/simple-account.test.ts | 100 ++++--- packages/alchemy/src/defaults.ts | 34 +++ packages/alchemy/src/middleware/client.ts | 6 +- packages/alchemy/src/middleware/gas-fees.ts | 59 +++-- .../alchemy/src/middleware/gas-manager.ts | 121 +++++++-- .../alchemy/src/middleware/types/index.ts | 10 + packages/alchemy/src/provider.ts | 72 ++--- packages/alchemy/src/schema.ts | 33 +-- packages/alchemy/src/type.ts | 3 - .../core/e2e-tests/simple-account.test.ts | 96 ++++++- packages/core/src/account/base.ts | 13 +- packages/core/src/index.ts | 4 + packages/core/src/logger.ts | 9 +- packages/core/src/provider/base.ts | 250 +++++++++++------- packages/core/src/provider/schema.ts | 62 +++-- packages/core/src/provider/types.ts | 11 +- packages/core/src/types.ts | 33 ++- packages/core/src/utils/bigint.ts | 48 +++- packages/core/src/utils/defaults.ts | 18 ++ packages/core/src/utils/index.ts | 61 ++++- packages/core/src/utils/schema.ts | 24 +- .../middleware/withAlchemyGasManager.md | 2 +- 23 files changed, 775 insertions(+), 348 deletions(-) create mode 100644 packages/alchemy/src/defaults.ts diff --git a/packages/accounts/src/light-account/e2e-tests/light-account.test.ts b/packages/accounts/src/light-account/e2e-tests/light-account.test.ts index 62833a8af5..48afbc762a 100644 --- a/packages/accounts/src/light-account/e2e-tests/light-account.test.ts +++ b/packages/accounts/src/light-account/e2e-tests/light-account.test.ts @@ -1,17 +1,23 @@ import { AlchemyProvider } from "@alchemy/aa-alchemy"; -import { LocalAccountSigner, type SmartAccountSigner } from "@alchemy/aa-core"; +import { + LocalAccountSigner, + Logger, + LogLevel, + type SmartAccountSigner, + type UserOperationFeeOptions, +} from "@alchemy/aa-core"; import { isAddress, type Address, type Chain, - type HDAccount, type Hash, + type HDAccount, } from "viem"; import { generatePrivateKey } from "viem/accounts"; import { sepolia } from "viem/chains"; import { - LightSmartContractAccount, getDefaultLightAccountFactoryAddress, + LightSmartContractAccount, } from "../../index.js"; import { API_KEY, @@ -22,6 +28,8 @@ import { const chain = sepolia; +Logger.setLogLevel(LogLevel.DEBUG); + describe("Light Account Tests", () => { const owner: SmartAccountSigner = LocalAccountSigner.mnemonicToAccountSigner(LIGHT_ACCOUNT_OWNER_MNEMONIC); @@ -107,7 +115,7 @@ describe("Light Account Tests", () => { ); await expect(txnHash).resolves.not.toThrowError(); - }, 50000); + }, 100000); it("should fail to execute if account address is not deployed and not correct", async () => { const accountAddress = "0xc33AbD9621834CA7c6Fc9f9CC3c47b9c17B03f9F"; @@ -147,15 +155,6 @@ describe("Light Account Tests", () => { }); it("should transfer ownership successfully", async () => { - const provider = givenConnectedProvider({ - owner, - chain, - feeOpts: { - baseFeeBufferPercent: 50n, - maxPriorityFeeBufferPercent: 50n, - preVerificationGasBufferPercent: 50n, - }, - }); // create a throwaway address const throwawayOwner = LocalAccountSigner.privateKeyToAccountSigner( generatePrivateKey() @@ -165,17 +164,6 @@ describe("Light Account Tests", () => { chain, }); - // fund the throwaway address - const fundThrowawayResult = await provider.sendUserOperation({ - target: await throwawayProvider.getAddress(), - data: "0x", - value: 10000000000000n, - }); - const fundThrowawayTxnHash = provider.waitForUserOperationTransaction( - fundThrowawayResult.hash - ); - await expect(fundThrowawayTxnHash).resolves.not.toThrowError(); - // create new owner and transfer ownership const newThrowawayOwner = LocalAccountSigner.privateKeyToAccountSigner( generatePrivateKey() @@ -184,6 +172,7 @@ describe("Light Account Tests", () => { throwawayProvider, newThrowawayOwner ); + const txnHash = throwawayProvider.waitForUserOperationTransaction(result); await expect(txnHash).resolves.not.toThrowError(); @@ -200,21 +189,24 @@ const givenConnectedProvider = ({ owner, chain, accountAddress, - feeOpts, + feeOptions, }: { owner: SmartAccountSigner; chain: Chain; accountAddress?: Address; - feeOpts?: { - baseFeeBufferPercent?: bigint; - maxPriorityFeeBufferPercent?: bigint; - preVerificationGasBufferPercent?: bigint; - }; + feeOptions?: UserOperationFeeOptions; }) => { const provider = new AlchemyProvider({ apiKey: API_KEY!, chain, - feeOpts, + opts: { + txMaxRetries: 10, + feeOptions: { + maxFeePerGas: { percentage: 100 }, + maxPriorityFeePerGas: { percentage: 100 }, + ...feeOptions, + }, + }, }).connect( (rpcClient) => new LightSmartContractAccount({ diff --git a/packages/alchemy/e2e-tests/simple-account.test.ts b/packages/alchemy/e2e-tests/simple-account.test.ts index cabe5af917..651d770cb9 100644 --- a/packages/alchemy/e2e-tests/simple-account.test.ts +++ b/packages/alchemy/e2e-tests/simple-account.test.ts @@ -1,7 +1,11 @@ +import type { UserOperationOverrides } from "@alchemy/aa-core"; import { + LogLevel, + Logger, SimpleSmartContractAccount, getDefaultSimpleAccountFactoryAddress, type SmartAccountSigner, + type UserOperationFeeOptions, } from "@alchemy/aa-core"; import { Alchemy, Network } from "alchemy-sdk"; import { @@ -19,6 +23,8 @@ import { API_KEY, OWNER_MNEMONIC, PAYMASTER_POLICY_ID } from "./constants.js"; const chain = sepolia; const network = Network.ETH_SEPOLIA; +Logger.setLogLevel(LogLevel.DEBUG); + describe("Simple Account Tests", () => { const ownerAccount = mnemonicToAccount(OWNER_MNEMONIC); const owner: SmartAccountSigner = { @@ -50,7 +56,7 @@ describe("Simple Account Tests", () => { ); await expect(txnHash).resolves.not.toThrowError(); - }, 50000); + }, 100000); it("should fail to execute if account address is not deployed and not correct", async () => { const accountAddress = "0xc33AbD9621834CA7c6Fc9f9CC3c47b9c17B03f9F"; @@ -81,10 +87,14 @@ describe("Simple Account Tests", () => { ); await expect(txnHash).resolves.not.toThrowError(); - }, 50000); + }, 100000); it("should successfully override fees in alchemy paymaster", async () => { - const provider = givenConnectedProvider({ owner, chain }) + const provider = givenConnectedProvider({ + owner, + chain, + feeOptions: { maxFeePerGas: undefined, maxPriorityFeePerGas: undefined }, + }) .withAlchemyGasManager({ policyId: PAYMASTER_POLICY_ID, }) @@ -101,7 +111,7 @@ describe("Simple Account Tests", () => { data: "0x", }) ).rejects.toThrow(); - }, 50000); + }, 100000); it("should support overrides for buildUserOperation", async () => { const signer = givenConnectedProvider({ @@ -111,11 +121,12 @@ describe("Simple Account Tests", () => { policyId: PAYMASTER_POLICY_ID, }); - const overrides = { + const overrides: UserOperationOverrides = { maxFeePerGas: 100000000n, maxPriorityFeePerGas: 100000000n, paymasterAndData: "0x", }; + const uoStruct = await signer.buildUserOperation( { target: await signer.getAddress(), @@ -129,16 +140,16 @@ describe("Simple Account Tests", () => { overrides.maxPriorityFeePerGas ); expect(uoStruct.paymasterAndData).toEqual(overrides.paymasterAndData); - }, 50000); + }, 100000); it("should successfully use paymaster with fee opts", async () => { const provider = givenConnectedProvider({ owner, chain, - feeOpts: { - baseFeeBufferPercent: 50n, - maxPriorityFeeBufferPercent: 50n, - preVerificationGasBufferPercent: 50n, + feeOptions: { + maxFeePerGas: { percentage: 50 }, + maxPriorityFeePerGas: { percentage: 50 }, + preVerificationGas: { percentage: 50 }, }, }); @@ -151,7 +162,7 @@ describe("Simple Account Tests", () => { ); await expect(txnHash).resolves.not.toThrowError(); - }, 50000); + }, 100000); it("should execute successfully via drop and replace", async () => { const provider = givenConnectedProvider({ @@ -171,7 +182,7 @@ describe("Simple Account Tests", () => { replacedResult.hash ); await expect(txnHash).resolves.not.toThrowError(); - }, 50000); + }, 100000); it("should execute successfully via drop and replace when using paymaster", async () => { const provider = givenConnectedProvider({ @@ -193,7 +204,7 @@ describe("Simple Account Tests", () => { replacedResult.hash ); await expect(txnHash).resolves.not.toThrowError(); - }, 50000); + }, 100000); it("should get token balances for the smart account", async () => { const alchemy = new Alchemy({ @@ -212,7 +223,7 @@ describe("Simple Account Tests", () => { const address = await provider.getAddress(); const balances = await provider.core.getTokenBalances(address); expect(balances.tokenBalances.length).toMatchInlineSnapshot(`4`); - }, 50000); + }, 100000); it("should get owned nfts for the smart account", async () => { const alchemy = new Alchemy({ @@ -231,7 +242,7 @@ describe("Simple Account Tests", () => { const address = await provider.getAddress(); const nfts = await provider.nft.getNftsForOwner(address); expect(nfts.ownedNfts).toMatchInlineSnapshot("[]"); - }, 50000); + }, 100000); it("should correctly simulate asset changes for the user operation", async () => { const provider = givenConnectedProvider({ @@ -246,28 +257,29 @@ describe("Simple Account Tests", () => { value: 1n, }); - expect(simulatedAssetChanges).toMatchInlineSnapshot(` + expect(simulatedAssetChanges.changes.length).toEqual(2); + expect( + simulatedAssetChanges.changes.map((change) => ({ + assertType: change.assetType, + changeType: change.changeType, + from: change.from.toLowerCase(), + to: change.to.toLowerCase(), + })) + ).toEqual([ { - "changes": [ - { - "amount": "0.000000000000000001", - "assetType": "NATIVE", - "changeType": "TRANSFER", - "contractAddress": null, - "decimals": 18, - "from": "0xb856dbd4fa1a79a46d426f537455e7d3e79ab7c4", - "logo": "https://static.alchemyapi.io/images/network-assets/eth.png", - "name": "Ethereum", - "rawAmount": "1", - "symbol": "ETH", - "to": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", - "tokenId": null, - }, - ], - "error": null, - } - `); - }, 50000); + assertType: "NATIVE", + changeType: "TRANSFER", + from: (await provider.getAddress()).toLowerCase(), + to: provider.getEntryPointAddress().toLowerCase(), + }, + { + assertType: "NATIVE", + changeType: "TRANSFER", + from: (await provider.getAddress()).toLowerCase(), + to: provider.getEntryPointAddress().toLowerCase(), + }, + ]); + }, 100000); it("should simulate as part of middleware stack when added to provider", async () => { const provider = givenConnectedProvider({ @@ -284,30 +296,30 @@ describe("Simple Account Tests", () => { }); expect(spy).toHaveBeenCalledOnce(); - }, 50000); + }, 100000); }); const givenConnectedProvider = ({ owner, chain, accountAddress, - feeOpts, + feeOptions, }: { owner: SmartAccountSigner; chain: Chain; accountAddress?: Address; - feeOpts?: { - baseFeeBufferPercent?: bigint; - maxPriorityFeeBufferPercent?: bigint; - preVerificationGasBufferPercent?: bigint; - }; + feeOptions?: UserOperationFeeOptions; }) => new AlchemyProvider({ apiKey: API_KEY!, chain, - feeOpts, opts: { txMaxRetries: 10, + feeOptions: { + ...feeOptions, + maxFeePerGas: { percentage: 50 }, + maxPriorityFeePerGas: { percentage: 50 }, + }, }, }).connect( (provider) => diff --git a/packages/alchemy/src/defaults.ts b/packages/alchemy/src/defaults.ts new file mode 100644 index 0000000000..a31e7ff3a6 --- /dev/null +++ b/packages/alchemy/src/defaults.ts @@ -0,0 +1,34 @@ +import type { UserOperationFeeOptions } from "@alchemy/aa-core"; +import type { Chain } from "viem"; +import { + arbitrum, + arbitrumGoerli, + arbitrumSepolia, + optimism, + optimismGoerli, + optimismSepolia, +} from "viem/chains"; + +export const getDefaultUserOperationFeeOptions = ( + chain: Chain +): UserOperationFeeOptions => { + const feeOptions: UserOperationFeeOptions = { + maxFeePerGas: { percentage: 50 }, + maxPriorityFeePerGas: { percentage: 5 }, + }; + + if ( + new Set([ + arbitrum.id, + arbitrumGoerli.id, + arbitrumSepolia.id, + optimism.id, + optimismGoerli.id, + optimismSepolia.id, + ]).has(chain.id) + ) { + feeOptions.preVerificationGas = { percentage: 5 }; + } + + return feeOptions; +}; diff --git a/packages/alchemy/src/middleware/client.ts b/packages/alchemy/src/middleware/client.ts index b8665c9d76..40cf44de81 100644 --- a/packages/alchemy/src/middleware/client.ts +++ b/packages/alchemy/src/middleware/client.ts @@ -4,6 +4,7 @@ import { } from "@alchemy/aa-core"; import type { Address, Hex } from "viem"; import type { + RequestGasAndPaymasterAndDataOverrides, SimulateUserOperationAssetChangesRequest, SimulateUserOperationAssetChangesResponse, } from "./types/index.js"; @@ -30,10 +31,7 @@ export type ClientWithAlchemyMethods = PublicErc4337Client & { entryPoint: Address; userOperation: UserOperationRequest; dummySignature: Hex; - feeOverride?: { - maxFeePerGas: Hex; - maxPriorityFeePerGas: Hex; - }; + overrides?: RequestGasAndPaymasterAndDataOverrides; } ]; }): Promise<{ diff --git a/packages/alchemy/src/middleware/gas-fees.ts b/packages/alchemy/src/middleware/gas-fees.ts index 9047d832cc..316bba5a1d 100644 --- a/packages/alchemy/src/middleware/gas-fees.ts +++ b/packages/alchemy/src/middleware/gas-fees.ts @@ -1,33 +1,44 @@ +import { applyFeeOption, type BigNumberish } from "@alchemy/aa-core"; import type { AlchemyProvider } from "../provider.js"; import type { ClientWithAlchemyMethods } from "./client.js"; -export const withAlchemyGasFeeEstimator =

( - provider: P, - baseFeeBufferPercent: bigint, - maxPriorityFeeBufferPercent: bigint -): P => { - provider.withFeeDataGetter(async () => { - const block = await provider.rpcClient.getBlock({ blockTag: "latest" }); - const baseFeePerGas = block.baseFeePerGas; - if (baseFeePerGas == null) { - throw new Error("baseFeePerGas is null"); - } - const priorityFeePerGas = BigInt( - // it's a fair assumption that if someone is using this Alchemy Middleware, then they are using Alchemy RPC - await (provider.rpcClient as ClientWithAlchemyMethods).request({ - method: "rundler_maxPriorityFeePerGas", - params: [], - }) - ); +export const withAlchemyGasFeeEstimator = ( + provider: AlchemyProvider +): AlchemyProvider => { + provider.withFeeDataGetter(async (struct, overrides, feeOptions) => { + const maxPriorityFeePerGas = + overrides?.maxPriorityFeePerGas != null + ? overrides?.maxPriorityFeePerGas + : // it's a fair assumption that if someone is using this Alchemy Middleware, then they are using Alchemy RPC + applyFeeOption( + await (provider.rpcClient as ClientWithAlchemyMethods).request({ + method: "rundler_maxPriorityFeePerGas", + params: [], + }), + feeOptions?.maxPriorityFeePerGas + ); - const baseFeeIncrease = - (baseFeePerGas * (100n + baseFeeBufferPercent)) / 100n; - const prioFeeIncrease = - (priorityFeePerGas * (100n + maxPriorityFeeBufferPercent)) / 100n; + const estimateMaxFeePerGas = async (priorityFeePerGas: BigNumberish) => { + const block = await provider.rpcClient.getBlock({ blockTag: "latest" }); + const baseFeePerGas = block.baseFeePerGas; + if (baseFeePerGas == null) { + throw new Error("baseFeePerGas is null"); + } + return applyFeeOption( + baseFeePerGas + BigInt(priorityFeePerGas), + feeOptions?.maxFeePerGas + ); + }; + + const maxFeePerGas = + overrides?.maxFeePerGas != null + ? overrides?.maxFeePerGas + : await estimateMaxFeePerGas(maxPriorityFeePerGas); return { - maxFeePerGas: baseFeeIncrease + prioFeeIncrease, - maxPriorityFeePerGas: prioFeeIncrease, + ...struct, + maxPriorityFeePerGas, + maxFeePerGas, }; }); return provider; diff --git a/packages/alchemy/src/middleware/gas-manager.ts b/packages/alchemy/src/middleware/gas-manager.ts index 413df2f5a5..9ac692e613 100644 --- a/packages/alchemy/src/middleware/gas-manager.ts +++ b/packages/alchemy/src/middleware/gas-manager.ts @@ -1,19 +1,33 @@ import { deepHexlify, + filterUndefined, + isPercentage, resolveProperties, + type AccountMiddlewareFn, + type Hex, + type Percentage, + type UserOperationFeeOptions, type UserOperationRequest, } from "@alchemy/aa-core"; +import { fromHex } from "viem"; import type { AlchemyProvider } from "../provider.js"; import type { ClientWithAlchemyMethods } from "./client.js"; +import type { RequestGasAndPaymasterAndDataOverrides } from "./types/index.js"; export interface AlchemyGasManagerConfig { policyId: string; } +export interface AlchemyGasEstimationOptions { + estimateGas: boolean; + fallbackGasEstimator?: AccountMiddlewareFn; + fallbackFeeDataGetter?: AccountMiddlewareFn; +} + /** * This middleware wraps the Alchemy Gas Manager APIs to provide more flexible UserOperation gas sponsorship. * - * If `estimateGas` is true, it will use `alchemy_requestGasAndPaymasterAndData` to get all of the gas estimates + paymaster data + * If `delegateGasEstimation` is true, it will use `alchemy_requestGasAndPaymasterAndData` to get all of the gas estimates + paymaster data * in one RPC call. * * Otherwise, it will use `alchemy_requestPaymasterAndData` to get only paymaster data, allowing you @@ -21,27 +35,67 @@ export interface AlchemyGasManagerConfig { * * @param provider - the smart account provider to override to use the alchemy gas manager * @param config - the alchemy gas manager configuration - * @param estimateGas - if true, this will use `alchemy_requestGasAndPaymasterAndData` else will use `alchemy_requestPaymasterAndData` + * @param delegateGasEstimation - if true, this will use `alchemy_requestGasAndPaymasterAndData` else will use `alchemy_requestPaymasterAndData` * @returns the provider augmented to use the alchemy gas manager */ export const withAlchemyGasManager =

( provider: P, config: AlchemyGasManagerConfig, - estimateGas: boolean = true + gasEstimationOptions: AlchemyGasEstimationOptions = { estimateGas: true } ): P => { - return estimateGas + const fallbackGasEstimator = + gasEstimationOptions.fallbackGasEstimator ?? provider.gasEstimator; + const fallbackFeeDataGetter = + gasEstimationOptions.fallbackFeeDataGetter ?? provider.feeDataGetter; + + return gasEstimationOptions.estimateGas ? provider // no-op gas estimator - .withGasEstimator(async () => ({ - callGasLimit: 0n, - preVerificationGas: 0n, - verificationGasLimit: 0n, - })) + .withGasEstimator(async (struct, overrides, feeOptions) => { + // but if user is bypassing paymaster to fallback to having the account to pay the gas (one-off override), + // we cannot delegate gas estimation to the bundler because paymaster middleware will not be called + if (overrides?.paymasterAndData === "0x") { + const result = await fallbackGasEstimator( + struct, + overrides, + feeOptions + ); + return { + callGasLimit: (await result.callGasLimit) ?? 0n, + preVerificationGas: (await result.preVerificationGas) ?? 0n, + verificationGasLimit: (await result.verificationGasLimit) ?? 0n, + }; + } else { + return { + callGasLimit: 0n, + preVerificationGas: 0n, + verificationGasLimit: 0n, + }; + } + }) // no-op fee because the alchemy api will do it - .withFeeDataGetter(async (struct) => ({ - maxFeePerGas: (await struct.maxFeePerGas) ?? 0n, - maxPriorityFeePerGas: (await struct.maxPriorityFeePerGas) ?? 0n, - })) + .withFeeDataGetter(async (struct, overrides, feeOptions) => { + let maxFeePerGas = (await struct.maxFeePerGas) ?? 0n; + let maxPriorityFeePerGas = (await struct.maxPriorityFeePerGas) ?? 0n; + + // but if user is bypassing paymaster to fallback to having the account to pay the gas (one-off override), + // we cannot delegate gas estimation to the bundler because paymaster middleware will not be called + if (overrides?.paymasterAndData === "0x") { + const result = await fallbackFeeDataGetter( + struct, + overrides, + feeOptions + ); + maxFeePerGas = (await result.maxFeePerGas) ?? maxFeePerGas; + maxPriorityFeePerGas = + (await result.maxPriorityFeePerGas) ?? maxPriorityFeePerGas; + } + + return { + maxFeePerGas, + maxPriorityFeePerGas, + }; + }) .withPaymasterMiddleware( withAlchemyGasAndPaymasterAndDataMiddleware(provider, config) ) @@ -107,18 +161,40 @@ const withAlchemyGasAndPaymasterAndDataMiddleware =

( provider: P, config: AlchemyGasManagerConfig ): Parameters["0"] => ({ - paymasterDataMiddleware: async (struct) => { + paymasterDataMiddleware: async (struct, overrides, feeOptions) => { const userOperation: UserOperationRequest = deepHexlify( await resolveProperties(struct) ); - let feeOverride = undefined; - if (userOperation.maxFeePerGas && BigInt(userOperation.maxFeePerGas) > 0n) { - feeOverride = { - maxFeePerGas: userOperation.maxFeePerGas, - maxPriorityFeePerGas: userOperation.maxPriorityFeePerGas, - }; - } + const overrideField = ( + field: keyof UserOperationFeeOptions + ): Hex | Percentage | undefined => { + // one-off absolute override + if (overrides?.[field] != null) { + return deepHexlify(overrides[field]); + } + + // provider level fee options with percentage + if (isPercentage(feeOptions?.[field])) { + return { + percentage: 100 + Number(feeOptions?.[field]?.percentage), + }; + } + + if (fromHex(userOperation[field], "bigint") > 0n) { + return userOperation[field]; + } + + return undefined; + }; + + const _overrides: RequestGasAndPaymasterAndDataOverrides = filterUndefined({ + maxFeePerGas: overrideField("maxFeePerGas"), + maxPriorityFeePerGas: overrideField("maxPriorityFeePerGas"), + callGasLimit: overrideField("callGasLimit"), + verificationGasLimit: overrideField("verificationGasLimit"), + preVerificationGas: overrideField("preVerificationGas"), + }); const result = await ( provider.rpcClient as ClientWithAlchemyMethods @@ -130,7 +206,8 @@ const withAlchemyGasAndPaymasterAndDataMiddleware =

( entryPoint: provider.getEntryPointAddress(), userOperation: userOperation, dummySignature: userOperation.signature, - feeOverride: feeOverride, + overrides: + Object.keys(_overrides).length > 0 ? _overrides : undefined, }, ], }); diff --git a/packages/alchemy/src/middleware/types/index.ts b/packages/alchemy/src/middleware/types/index.ts index e48eef16ea..bb75eaa15e 100644 --- a/packages/alchemy/src/middleware/types/index.ts +++ b/packages/alchemy/src/middleware/types/index.ts @@ -1 +1,11 @@ +import type { Percentage, UserOperationRequest } from "@alchemy/aa-core"; + export type * from "./simulate-uo/index.js"; + +export type RequestGasAndPaymasterAndDataOverrides = Partial<{ + maxFeePerGas: UserOperationRequest["maxFeePerGas"] | Percentage; + maxPriorityFeePerGas: UserOperationRequest["maxFeePerGas"] | Percentage; + callGasLimit: UserOperationRequest["maxFeePerGas"] | Percentage; + preVerificationGas: UserOperationRequest["maxFeePerGas"] | Percentage; + verificationGasLimit: UserOperationRequest["maxFeePerGas"] | Percentage; +}>; diff --git a/packages/alchemy/src/provider.ts b/packages/alchemy/src/provider.ts index 544a9f1951..607e54572c 100644 --- a/packages/alchemy/src/provider.ts +++ b/packages/alchemy/src/provider.ts @@ -2,21 +2,14 @@ import { SmartAccountProvider, createPublicErc4337Client, deepHexlify, - resolveProperties, - type AccountMiddlewareFn, type BatchUserOperationCallData, type UserOperationCallData, type UserOperationOverrides, } from "@alchemy/aa-core"; import { Alchemy } from "alchemy-sdk"; import { type HttpTransport } from "viem"; -import { - arbitrum, - arbitrumGoerli, - optimism, - optimismGoerli, -} from "viem/chains"; import { SupportedChains } from "./chains.js"; +import { getDefaultUserOperationFeeOptions } from "./defaults.js"; import type { ClientWithAlchemyMethods } from "./middleware/client.js"; import { withAlchemyGasFeeEstimator } from "./middleware/gas-fees.js"; import { @@ -31,15 +24,12 @@ import { import type { AlchemyProviderConfig } from "./type.js"; export class AlchemyProvider extends SmartAccountProvider { - private pvgBuffer: bigint; - private feeOptsSet: boolean; private rpcUrl: string; constructor(config: AlchemyProviderConfig) { AlchemyProviderConfigSchema.parse(config); - const { chain, entryPointAddress, opts, feeOpts, ...connectionConfig } = - config; + const { chain, entryPointAddress, opts, ...connectionConfig } = config; const _chain = typeof chain === "number" ? SupportedChains.get(chain) : chain; if (!_chain || !_chain.rpcUrls["alchemy"]) { @@ -63,52 +53,20 @@ export class AlchemyProvider extends SmartAccountProvider { }), }); + const feeOptions = + config.opts?.feeOptions ?? getDefaultUserOperationFeeOptions(_chain); + super({ rpcProvider: client, entryPointAddress, chain: _chain, - opts, + opts: { ...opts, feeOptions }, }); - withAlchemyGasFeeEstimator( - this, - feeOpts?.baseFeeBufferPercent ?? 50n, - feeOpts?.maxPriorityFeeBufferPercent ?? 5n - ); - - if (feeOpts?.preVerificationGasBufferPercent) { - this.pvgBuffer = feeOpts?.preVerificationGasBufferPercent; - } else if ( - new Set([ - arbitrum.id, - arbitrumGoerli.id, - optimism.id, - optimismGoerli.id, - ]).has(this.chain.id) - ) { - this.pvgBuffer = 5n; - } else { - this.pvgBuffer = 0n; - } - - this.feeOptsSet = !!feeOpts; this.rpcUrl = rpcUrl; - } - override gasEstimator: AccountMiddlewareFn = async (struct) => { - const request = deepHexlify(await resolveProperties(struct)); - const estimates = await this.rpcClient.estimateUserOperationGas( - request, - this.getEntryPointAddress() - ); - estimates.preVerificationGas = - (BigInt(estimates.preVerificationGas) * (100n + this.pvgBuffer)) / 100n; - - return { - ...struct, - ...estimates, - }; - }; + withAlchemyGasFeeEstimator(this); + } simulateUserOperationAssetChanges = async ( data: UserOperationCallData | BatchUserOperationCallData, @@ -128,16 +86,26 @@ export class AlchemyProvider extends SmartAccountProvider { * This methods adds the Alchemy Gas Manager middleware to the provider. * * @param config - the Alchemy Gas Manager configuration + * @param delegateGasEstimation - whether to delegate the gas estimation entirely to bundler + * + * Note that with delegateGasEstimation set to true, the gas estimation middleware will be no-op'd + * and fee options set upon provider init will be ignored. + * * @returns {AlchemyProvider} - a new AlchemyProvider with the Gas Manager middleware */ - withAlchemyGasManager(config: AlchemyGasManagerConfig): this { + withAlchemyGasManager( + config: AlchemyGasManagerConfig, + delegateGasEstimation: boolean = true + ): AlchemyProvider { if (!this.isConnected()) { throw new Error( "AlchemyProvider: account is not set, did you call `connect` first?" ); } - return withAlchemyGasManager(this, config, !this.feeOptsSet); + return withAlchemyGasManager(this, config, { + estimateGas: delegateGasEstimation, + }); } /** diff --git a/packages/alchemy/src/schema.ts b/packages/alchemy/src/schema.ts index 12b6691f8e..a36c4e30e7 100644 --- a/packages/alchemy/src/schema.ts +++ b/packages/alchemy/src/schema.ts @@ -25,34 +25,9 @@ export const ConnectionConfigSchema = z.union([ }), ]); -export const FeeOptsSchema = z.object({ - /** this adds a percent buffer on top of the base fee estimated (default 50%) - * NOTE: this is only applied if the default fee estimator is used. - */ - baseFeeBufferPercent: z.bigint().optional(), - /** this adds a percent buffer on top of the priority fee estimated (default 5%)' - * * NOTE: this is only applied if the default fee estimator is used. - */ - maxPriorityFeeBufferPercent: z.bigint().optional(), - /** this adds a percent buffer on top of the preVerificationGas estimated - * - * Defaults 5% on Arbitrum and Optimism, 0% elsewhere - * - * This is only useful on Arbitrum and Optimism, where the preVerificationGas is - * dependent on the gas fee during the time of estimation. To improve chances of - * the UserOperation being mined, users can increase the preVerificationGas by - * a buffer. This buffer will always be charged, regardless of price at time of mine. - * - * NOTE: this is only applied if the defualt gas estimator is used. - */ - preVerificationGasBufferPercent: z.bigint().optional(), -}); - -export const AlchemyProviderConfigSchema = z - .object({ - feeOpts: FeeOptsSchema.optional(), - }) - .and(createSmartAccountProviderConfigSchema().omit({ rpcProvider: true })) - .and(ConnectionConfigSchema); +export const AlchemyProviderConfigSchema = + createSmartAccountProviderConfigSchema() + .omit({ rpcProvider: true }) + .and(ConnectionConfigSchema); export const AlchemySdkClientSchema = z.instanceof(Alchemy); diff --git a/packages/alchemy/src/type.ts b/packages/alchemy/src/type.ts index 20544bc3a9..306ef79aeb 100644 --- a/packages/alchemy/src/type.ts +++ b/packages/alchemy/src/type.ts @@ -2,11 +2,8 @@ import { z } from "zod"; import type { AlchemyProviderConfigSchema, ConnectionConfigSchema, - FeeOptsSchema, } from "./schema"; export type ConnectionConfig = z.infer; -export type FeeOpts = z.infer; - export type AlchemyProviderConfig = z.infer; diff --git a/packages/core/e2e-tests/simple-account.test.ts b/packages/core/e2e-tests/simple-account.test.ts index 302d521599..052ac36e67 100644 --- a/packages/core/e2e-tests/simple-account.test.ts +++ b/packages/core/e2e-tests/simple-account.test.ts @@ -1,10 +1,19 @@ -import { isAddress, type Address, type Chain, type Hash } from "viem"; +import { + fromHex, + isAddress, + type Address, + type Chain, + type Hash, + type Hex, +} from "viem"; import { generatePrivateKey } from "viem/accounts"; import { polygonMumbai } from "viem/chains"; import { SimpleSmartContractAccount } from "../src/account/simple.js"; import { getDefaultSimpleAccountFactoryAddress, type SmartAccountSigner, + type UserOperationFeeOptions, + type UserOperationOverrides, } from "../src/index.js"; import { SmartAccountProvider } from "../src/provider/base.js"; import { LocalAccountSigner } from "../src/signer/local-account.js"; @@ -58,20 +67,105 @@ describe("Simple Account Tests", () => { await expect(address).resolves.not.toThrowError(); expect(isAddress(await address)).toBe(true); }); + + it("should correctly handle percentage overrides for buildUserOperation", async () => { + const signer = givenConnectedProvider({ + owner, + chain, + }); + + const structPromise = signer.buildUserOperation({ + target: await signer.getAddress(), + data: "0x", + }); + await expect(structPromise).resolves.not.toThrowError(); + + const signerWithFeeOptions = givenConnectedProvider({ + owner, + chain, + feeOptions: { + preVerificationGas: { percentage: 100 }, + }, + }); + + const structWithFeeOptionsPromise = signerWithFeeOptions.buildUserOperation( + { + target: await signer.getAddress(), + data: "0x", + } + ); + await expect(structWithFeeOptionsPromise).resolves.not.toThrowError(); + + const [struct, structWithFeeOptions] = await Promise.all([ + structPromise, + structWithFeeOptionsPromise, + ]); + + const preVerificationGas = + typeof struct.preVerificationGas === "string" + ? fromHex(struct.preVerificationGas as Hex, "bigint") + : struct.preVerificationGas; + const preVerificationGasWithFeeOptions = + typeof structWithFeeOptions.preVerificationGas === "string" + ? fromHex(structWithFeeOptions.preVerificationGas as Hex, "bigint") + : structWithFeeOptions.preVerificationGas; + + expect(preVerificationGasWithFeeOptions).toBeGreaterThan( + preVerificationGas! + ); + }, 60000); + + it("should correctly handle absolute overrides for sendUserOperation", async () => { + const signer = givenConnectedProvider({ owner, chain }); + + const overrides: UserOperationOverrides = { + preVerificationGas: 100_000_000n, + }; + const promise = signer.buildUserOperation( + { + target: await signer.getAddress(), + data: "0x", + }, + overrides + ); + await expect(promise).resolves.not.toThrowError(); + + const struct = await promise; + expect(struct.preVerificationGas).toBe(100_000_000n); + }, 60000); + + it("should correctly handle percentage overrides for sendUserOperation", async () => { + const signer = givenConnectedProvider({ + owner, + chain, + feeOptions: { + preVerificationGas: { percentage: 100 }, + }, + }); + + const struct = signer.sendUserOperation({ + target: await signer.getAddress(), + data: "0x", + }); + await expect(struct).resolves.not.toThrowError(); + }, 60000); }); const givenConnectedProvider = ({ owner, chain, accountAddress, + feeOptions, }: { owner: SmartAccountSigner; chain: Chain; accountAddress?: Address; + feeOptions?: UserOperationFeeOptions; }) => { const provider = new SmartAccountProvider({ rpcProvider: `${chain.rpcUrls.alchemy.http[0]}/${API_KEY}`, chain, + opts: { feeOptions }, }); const feeDataGetter = async () => ({ maxFeePerGas: 100_000_000_000n, diff --git a/packages/core/src/account/base.ts b/packages/core/src/account/base.ts index b95cedc38a..09336025a7 100644 --- a/packages/core/src/account/base.ts +++ b/packages/core/src/account/base.ts @@ -232,6 +232,7 @@ export abstract class BaseSmartContractAccount< if (this.deploymentState === DeploymentState.DEPLOYED) { return "0x"; } + const contractCode = await this.rpcProvider.getBytecode({ address: await this.getAddress(), }); @@ -249,19 +250,19 @@ export abstract class BaseSmartContractAccount< async getAddress(): Promise

{ if (!this.accountAddress) { const initCode = await this._getAccountInitCode(); - Logger.debug( + Logger.verbose( "[BaseSmartContractAccount](getAddress) initCode: ", initCode ); try { await this.entryPoint.simulate.getSenderAddress([initCode]); } catch (err: any) { - Logger.debug( - "[BaseSmartContractAccount](getAddress) entrypoint.getSenderAddress result: ", - err - ); if (err.cause?.data?.errorName === "SenderAddressResult") { this.accountAddress = err.cause.data.args[0] as Address; + Logger.verbose( + "[BaseSmartContractAccount](getAddress) entrypoint.getSenderAddress result:", + this.accountAddress + ); return this.accountAddress; } } @@ -329,7 +330,7 @@ export abstract class BaseSmartContractAccount< const [factoryAddress, factoryCalldata] = await this.parseFactoryAddressFromAccountInitCode(); - Logger.debug( + Logger.verbose( `[BaseSmartContractAccount](create6492Signature)\ factoryAddress: ${factoryAddress}, factoryCalldata: ${factoryCalldata}` ); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b82799cbaf..a43fd77964 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -49,15 +49,19 @@ export type * from "./types.js"; export type * from "./utils/index.js"; export { ChainSchema, + applyFeeOption, asyncPipe, bigIntMax, bigIntPercent, deepHexlify, defineReadOnly, + filterUndefined, getChain, getDefaultEntryPointAddress, getDefaultSimpleAccountFactoryAddress, getUserOperationHash, + isBigNumberish, + isPercentage, resolveProperties, } from "./utils/index.js"; diff --git a/packages/core/src/logger.ts b/packages/core/src/logger.ts index 164f84eefc..de61019864 100644 --- a/packages/core/src/logger.ts +++ b/packages/core/src/logger.ts @@ -1,4 +1,5 @@ export enum LogLevel { + VERBOSE = 5, DEBUG = 4, INFO = 3, WARN = 2, @@ -7,7 +8,7 @@ export enum LogLevel { } export class Logger { - static logLevel: LogLevel = LogLevel.NONE; + static logLevel: LogLevel = LogLevel.INFO; static logFilter?: string; static setLogLevel(logLevel: LogLevel) { @@ -42,6 +43,12 @@ export class Logger { console.info(msg, ...args); } + static verbose(msg: string, ...args: any[]) { + if (!this.shouldLog(msg, LogLevel.VERBOSE)) return; + + console.log(msg, ...args); + } + private static shouldLog(msg: string, level: LogLevel) { if (this.logLevel < level) return false; if (this.logFilter && !msg.includes(this.logFilter)) return false; diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index aa8b11abf5..4465be42bf 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -10,7 +10,6 @@ import { type Transaction, type Transport, } from "viem"; -import { arbitrum, arbitrumGoerli, arbitrumSepolia } from "viem/chains"; import type { ISmartContractAccount, SignTypedDataParams, @@ -20,9 +19,12 @@ import type { PublicErc4337Client, SupportedTransports, } from "../client/types.js"; +import { Logger } from "../logger.js"; import { type BatchUserOperationCallData, + type BigNumberish, type UserOperationCallData, + type UserOperationFeeOptions, type UserOperationOverrides, type UserOperationReceipt, type UserOperationRequest, @@ -30,12 +32,15 @@ import { type UserOperationStruct, } from "../types.js"; import { + applyFeeOption, asyncPipe, bigIntMax, bigIntPercent, deepHexlify, defineReadOnly, + filterUndefined, getDefaultEntryPointAddress, + getDefaultUserOperationFeeOptions, getUserOperationHash, isValidRequest, resolveProperties, @@ -55,15 +60,11 @@ import type { } from "./types.js"; export const noOpMiddleware: AccountMiddlewareFn = async ( - struct: Deferrable + struct: Deferrable, + _overrides?: UserOperationOverrides, + _feeOptions?: UserOperationFeeOptions ) => struct; -const minPriorityFeePerBidDefaults = new Map([ - [arbitrum.id, 10_000_000n], - [arbitrumGoerli.id, 10_000_000n], - [arbitrumSepolia.id, 10_000_000n], -]); - export class SmartAccountProvider< TTransport extends SupportedTransports = Transport > @@ -73,9 +74,7 @@ export class SmartAccountProvider< private txMaxRetries: number; private txRetryIntervalMs: number; private txRetryMulitplier: number; - - private minPriorityFeePerBid: bigint; - private maxPriorityFeePerGasEstimateBuffer: number; + private feeOptions: UserOperationFeeOptions; readonly account?: ISmartContractAccount; @@ -100,13 +99,10 @@ export class SmartAccountProvider< this.txRetryMulitplier = opts?.txRetryMulitplier ?? 1.5; this.entryPointAddress = entryPointAddress; - this.minPriorityFeePerBid = - opts?.minPriorityFeePerBid ?? - minPriorityFeePerBidDefaults.get(chain.id) ?? - 100_000_000n; - - this.maxPriorityFeePerGasEstimateBuffer = - opts?.maxPriorityFeePerGasEstimateBuffer ?? 33; + this.feeOptions = { + ...getDefaultUserOperationFeeOptions(chain), + ...opts?.feeOptions, + }; this.rpcClient = typeof rpcProvider === "string" @@ -221,15 +217,21 @@ export class SmartAccountProvider< throw new Error("transaction is missing to address"); } - const _overrides: UserOperationOverrides = {}; - if (overrides?.maxFeePerGas || request.maxFeePerGas) { - _overrides.maxFeePerGas = overrides?.maxFeePerGas ?? request.maxFeePerGas; - } - if (overrides?.maxPriorityFeePerGas || request.maxPriorityFeePerGas) { - _overrides.maxPriorityFeePerGas = - overrides?.maxPriorityFeePerGas ?? request.maxPriorityFeePerGas; - } - _overrides.paymasterAndData = overrides?.paymasterAndData; + const _overrides: UserOperationOverrides = { + maxFeePerGas: + overrides?.maxFeePerGas != null + ? overrides?.maxFeePerGas + : request.maxFeePerGas + ? fromHex(request.maxFeePerGas, "bigint") + : undefined, + maxPriorityFeePerGas: + overrides?.maxPriorityFeePerGas != null + ? overrides?.maxPriorityFeePerGas + : request.maxPriorityFeePerGas + ? fromHex(request.maxPriorityFeePerGas, "bigint") + : undefined, + }; + filterUndefined(_overrides); return this.buildUserOperation( { @@ -259,26 +261,28 @@ export class SmartAccountProvider< }; }); - const maxFeePerGas = bigIntMax( - ...requests - .filter((x) => x.maxFeePerGas != null) - .map((x) => fromHex(x.maxFeePerGas!, "bigint")) - ); - - const maxPriorityFeePerGas = bigIntMax( - ...requests - .filter((x) => x.maxPriorityFeePerGas != null) - .map((x) => fromHex(x.maxPriorityFeePerGas!, "bigint")) - ); - const _overrides: UserOperationOverrides = {}; - if (overrides?.maxFeePerGas || maxFeePerGas != null) { - _overrides.maxFeePerGas = overrides?.maxFeePerGas ?? maxFeePerGas; - } + const maxFeePerGas = + overrides?.maxFeePerGas != null + ? overrides?.maxFeePerGas + : bigIntMax( + ...requests + .filter((x) => x.maxFeePerGas != null) + .map((x) => fromHex(x.maxFeePerGas!, "bigint")) + ); + const maxPriorityFeePerGas = + overrides?.maxPriorityFeePerGas != null + ? overrides?.maxPriorityFeePerGas + : bigIntMax( + ...requests + .filter((x) => x.maxPriorityFeePerGas != null) + .map((x) => fromHex(x.maxPriorityFeePerGas!, "bigint")) + ); - if (overrides?.maxPriorityFeePerGas || maxPriorityFeePerGas != null) { - _overrides.maxPriorityFeePerGas = - overrides?.maxPriorityFeePerGas ?? maxPriorityFeePerGas; - } + const _overrides: UserOperationOverrides = { + maxFeePerGas, + maxPriorityFeePerGas, + }; + filterUndefined(_overrides); return { batch, @@ -309,9 +313,13 @@ export class SmartAccountProvider< await new Promise((resolve) => setTimeout(resolve, txRetryIntervalWithJitterMs) ); - const receipt = await this.getUserOperationReceipt(hash as `0x${string}`) - // TODO: should maybe log the error? - .catch(() => null); + const receipt = await this.getUserOperationReceipt( + hash as `0x${string}` + ).catch((e) => { + Logger.error( + `[SmartAccountProvider] waitForUserOperationTransaction error fetching receipt for ${hash}: ${e}` + ); + }); if (receipt) { return this.getTransaction(receipt.receipt.transactionHash).then( (x) => x.hash @@ -433,14 +441,12 @@ export class SmartAccountProvider< this.dummyPaymasterDataMiddleware, this.feeDataGetter, this.gasEstimator, - // run this before paymaster middleware - async (struct) => ({ ...struct, ...overrides }), - this.customMiddleware, - overrides?.paymasterAndData - ? noOpMiddleware + this.customMiddleware ?? noOpMiddleware, + overrides?.paymasterAndData != null + ? this.overridePaymasterDataMiddleware : this.paymasterDataMiddleware, this.simulateUOMiddleware - )(uo); + )(uo, overrides, this.feeOptions); return resolveProperties(result); }; @@ -483,59 +489,117 @@ export class SmartAccountProvider< // You should implement your own middleware to override these // or extend this class and provider your own implemenation readonly dummyPaymasterDataMiddleware: AccountMiddlewareFn = async ( - struct + struct, + _overrides, + _feeOptions ) => { struct.paymasterAndData = "0x"; return struct; }; - readonly paymasterDataMiddleware: AccountMiddlewareFn = async (struct) => { + readonly overridePaymasterDataMiddleware: AccountMiddlewareFn = async ( + struct, + overrides, + _feeOptions + ) => { + struct.paymasterAndData = + overrides?.paymasterAndData != null ? overrides?.paymasterAndData : "0x"; + return struct; + }; + + readonly paymasterDataMiddleware: AccountMiddlewareFn = async ( + struct, + _overrides, + _feeOptions + ) => { struct.paymasterAndData = "0x"; return struct; }; - readonly gasEstimator: AccountMiddlewareFn = async (struct) => { - const request = deepHexlify(await resolveProperties(struct)); - const estimates = await this.rpcClient.estimateUserOperationGas( - request, - this.getEntryPointAddress() - ); + readonly gasEstimator: AccountMiddlewareFn = async ( + struct, + overrides, + feeOptions + ) => { + let { callGasLimit, verificationGasLimit, preVerificationGas } = + overrides ?? {}; + + if ( + callGasLimit == null || + verificationGasLimit == null || + preVerificationGas == null + ) { + const request = deepHexlify(await resolveProperties(struct)); + const estimates = await this.rpcClient.estimateUserOperationGas( + request, + this.getEntryPointAddress() + ); + + callGasLimit = + callGasLimit ?? + applyFeeOption(estimates.callGasLimit, feeOptions?.callGasLimit); + verificationGasLimit = + verificationGasLimit ?? + applyFeeOption( + estimates.verificationGasLimit, + feeOptions?.verificationGasLimit + ); + preVerificationGas = + preVerificationGas ?? + applyFeeOption( + estimates.preVerificationGas, + feeOptions?.preVerificationGas + ); + } - struct.callGasLimit = estimates.callGasLimit; - struct.verificationGasLimit = estimates.verificationGasLimit; - struct.preVerificationGas = estimates.preVerificationGas; + struct.callGasLimit = callGasLimit; + struct.verificationGasLimit = verificationGasLimit; + struct.preVerificationGas = preVerificationGas; return struct; }; - readonly feeDataGetter: AccountMiddlewareFn = async (struct) => { - const [maxPriorityFeePerGas, feeData] = await Promise.all([ - this.rpcClient.estimateMaxPriorityFeePerGas(), - this.rpcClient.estimateFeesPerGas(), - ]); - if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas) { - throw new Error( - "feeData is missing maxFeePerGas or maxPriorityFeePerGas" - ); - } + readonly feeDataGetter: AccountMiddlewareFn = async ( + struct, + overrides, + feeOptions + ) => { + const estimateMaxPriorityFeePerGas = async () => { + const estimate = await this.rpcClient.estimateMaxPriorityFeePerGas(); + return applyFeeOption(estimate, feeOptions?.maxPriorityFeePerGas); + }; - // set maxPriorityFeePerGasBid to the max between 33% added priority fee estimate and - // the min priority fee per gas set for the provider - const maxPriorityFeePerGasBid = bigIntMax( - bigIntPercent( - maxPriorityFeePerGas, - BigInt(100 + this.maxPriorityFeePerGasEstimateBuffer) - ), - this.minPriorityFeePerBid - ); + // maxFeePerGas must be at least the sum of maxPriorityFeePerGas and baseFee + // so we need to accommodate for the fee option applied maxPriorityFeePerGas for the maxFeePerGas + // + // Note that if maxFeePerGas is not at least the sum of maxPriorityFeePerGas and required baseFee + // after applying the fee options, then the transaction will fail + // + // Refer to https://docs.alchemy.com/docs/maxpriorityfeepergas-vs-maxfeepergas + // for more information about maxFeePerGas and maxPriorityFeePerGas + const estimateMaxFeePerGas = async (maxPriorityFeePerGas: BigNumberish) => { + const feeData = await this.rpcClient.estimateFeesPerGas(); + if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas) { + throw new Error( + "feeData is missing maxFeePerGas or maxPriorityFeePerGas" + ); + } + const baseFee = applyFeeOption( + feeData.maxFeePerGas - feeData.maxPriorityFeePerGas, + feeOptions?.maxFeePerGas + ); - const maxFeePerGasBid = - BigInt(feeData.maxFeePerGas) - - BigInt(feeData.maxPriorityFeePerGas) + - maxPriorityFeePerGasBid; + return BigInt(baseFee) + BigInt(maxPriorityFeePerGas); + }; - struct.maxFeePerGas = maxFeePerGasBid; - struct.maxPriorityFeePerGas = maxPriorityFeePerGasBid; + struct.maxPriorityFeePerGas = + overrides?.maxPriorityFeePerGas != null + ? overrides?.maxPriorityFeePerGas + : await estimateMaxPriorityFeePerGas(); + struct.maxFeePerGas = + overrides?.maxFeePerGas != null + ? overrides?.maxFeePerGas + : await estimateMaxFeePerGas(struct.maxPriorityFeePerGas); return struct; }; @@ -688,10 +752,10 @@ export class SmartAccountProvider< private overrideMiddlewareFunction = ( override: AccountMiddlewareOverrideFn ): AccountMiddlewareFn => { - return async (struct) => { + return async (struct, overrides) => { return { ...struct, - ...(await override(struct)), + ...(await override(struct, overrides)), }; }; }; diff --git a/packages/core/src/provider/schema.ts b/packages/core/src/provider/schema.ts index 5dfa7f7ec0..b807aac281 100644 --- a/packages/core/src/provider/schema.ts +++ b/packages/core/src/provider/schema.ts @@ -3,35 +3,49 @@ import type { Transport } from "viem"; import z from "zod"; import { createPublicErc4337ClientSchema } from "../client/schema.js"; import type { SupportedTransports } from "../client/types"; -import { ChainSchema } from "../utils/index.js"; +import { + BigNumberishRangeSchema, + ChainSchema, + PercentageSchema, +} from "../utils/index.js"; -export const SmartAccountProviderOptsSchema = z.object({ - /** - * The maximum number of times to try fetching a transaction receipt before giving up (default: 5) - */ - txMaxRetries: z.number().min(0).optional(), +export const UserOperationFeeOptionsFieldSchema = + BigNumberishRangeSchema.merge(PercentageSchema).partial(); - /** - * The interval in milliseconds to wait between retries while waiting for tx receipts (default: 2_000) - */ - txRetryIntervalMs: z.number().min(0).optional(), +export const UserOperationFeeOptionsSchema = z + .object({ + maxFeePerGas: UserOperationFeeOptionsFieldSchema, + maxPriorityFeePerGas: UserOperationFeeOptionsFieldSchema, + callGasLimit: UserOperationFeeOptionsFieldSchema, + verificationGasLimit: UserOperationFeeOptionsFieldSchema, + preVerificationGas: UserOperationFeeOptionsFieldSchema, + }) + .partial() + .strict(); - /** - * The mulitplier on interval length to wait between retries while waiting for tx receipts (default: 1.5) - */ - txRetryMulitplier: z.number().min(0).optional(), +export const SmartAccountProviderOptsSchema = z + .object({ + /** + * The maximum number of times to try fetching a transaction receipt before giving up (default: 5) + */ + txMaxRetries: z.number().min(0).optional(), - /** - * Used when computing the fees for a user operation (default: 100_000_000n) - */ - minPriorityFeePerBid: z.bigint().min(0n).optional(), + /** + * The interval in milliseconds to wait between retries while waiting for tx receipts (default: 2_000) + */ + txRetryIntervalMs: z.number().min(0).optional(), - /** - * Percent value for maxPriorityFeePerGas estimate added buffer. maxPriorityFeePerGasBid is set to the max - * between the buffer "added" priority fee estimate and the minPriorityFeePerBid (default: 33) - */ - maxPriorityFeePerGasEstimateBuffer: z.number().min(0).optional(), -}); + /** + * The mulitplier on interval length to wait between retries while waiting for tx receipts (default: 1.5) + */ + txRetryMulitplier: z.number().min(0).optional(), + + /** + * Optional user operation fee options to be set globally at the provider level + */ + feeOptions: UserOperationFeeOptionsSchema.optional(), + }) + .strict(); export const createSmartAccountProviderConfigSchema = < TTransport extends SupportedTransports = Transport diff --git a/packages/core/src/provider/types.ts b/packages/core/src/provider/types.ts index 904c7ce695..1efdde77a6 100644 --- a/packages/core/src/provider/types.ts +++ b/packages/core/src/provider/types.ts @@ -19,6 +19,7 @@ import type { import type { BatchUserOperationCallData, UserOperationCallData, + UserOperationFeeOptions, UserOperationOverrides, UserOperationReceipt, UserOperationRequest, @@ -53,14 +54,18 @@ export type SendUserOperationResult = { }; export type AccountMiddlewareFn = ( - struct: Deferrable + struct: Deferrable, + overrides?: UserOperationOverrides, + feeOptions?: UserOperationFeeOptions ) => Promise>; export type AccountMiddlewareOverrideFn< Req extends keyof UserOperationStruct = never, Opt extends keyof UserOperationStruct = never > = ( - struct: Deferrable + struct: Deferrable, + overrides?: UserOperationOverrides, + feeOptions?: UserOperationFeeOptions ) => Promise< WithRequired & WithOptional @@ -74,7 +79,6 @@ export type PaymasterAndDataMiddleware = AccountMiddlewareOverrideFn< | "maxFeePerGas" | "maxPriorityFeePerGas" >; - export type GasEstimatorMiddleware = AccountMiddlewareOverrideFn< "callGasLimit" | "preVerificationGas" | "verificationGasLimit" >; @@ -326,6 +330,7 @@ export interface ISmartAccountProvider< * prior to execution. * * @param override - a function for overriding the default feeDataGetter middleware + * @param feeOptions - optional FeeDataFeeOptions to set at the global level of the provider. * @returns */ withFeeDataGetter: (override: FeeDataMiddleware) => this; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 8babbe411a..d3a889aa91 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,12 +1,26 @@ import type { Address, Hash } from "viem"; +import type { z } from "zod"; +import type { + UserOperationFeeOptionsFieldSchema, + UserOperationFeeOptionsSchema, +} from "./provider/schema"; +import type { + BigNumberishRangeSchema, + BigNumberishSchema, + HexSchema, + PercentageSchema, +} from "./utils"; -export type Hex = `0x${string}`; +export type Hex = z.infer; export type EmptyHex = `0x`; // based on @account-abstraction/common export type PromiseOrValue = T | Promise; -export type BigNumberish = string | bigint | number; export type BytesLike = Uint8Array | string; +export type Percentage = z.infer; + +export type BigNumberish = z.infer; +export type BigNumberishRange = z.infer; export type UserOperationCallData = | { @@ -21,10 +35,23 @@ export type UserOperationCallData = export type BatchUserOperationCallData = Exclude[]; +export type UserOperationFeeOptionsField = z.infer< + typeof UserOperationFeeOptionsFieldSchema +>; + +export type UserOperationFeeOptions = z.infer< + typeof UserOperationFeeOptionsSchema +>; + export type UserOperationOverrides = Partial< Pick< UserOperationStruct, - "maxFeePerGas" | "maxPriorityFeePerGas" | "paymasterAndData" + | "callGasLimit" + | "maxFeePerGas" + | "maxPriorityFeePerGas" + | "paymasterAndData" + | "preVerificationGas" + | "verificationGasLimit" > >; diff --git a/packages/core/src/utils/bigint.ts b/packages/core/src/utils/bigint.ts index 7aecaae565..5242abdd8e 100644 --- a/packages/core/src/utils/bigint.ts +++ b/packages/core/src/utils/bigint.ts @@ -6,7 +6,7 @@ import type { BigNumberish } from "../types"; * @param args a list of bigints to get the max of * @returns the max bigint in the list */ -export const bigIntMax = (...args: bigint[]) => { +export const bigIntMax = (...args: bigint[]): bigint => { if (!args.length) { throw new Error("bigIntMax requires at least one argument"); } @@ -14,6 +14,52 @@ export const bigIntMax = (...args: bigint[]) => { return args.reduce((m, c) => (m > c ? m : c)); }; +/** + * Returns the min bigint in a list of bigints + * + * @param args a list of bigints to get the max of + * @returns the min bigint in the list + */ +export const bigIntMin = (...args: bigint[]): bigint => { + if (!args.length) { + throw new Error("bigIntMin requires at least one argument"); + } + + return args.reduce((m, c) => (m < c ? m : c)); +}; + +/** + * Given a bigint and a min-max range, returns the min-max clamped bigint value + * + * @param value a bigint value to clamp + * @param lower lower bound min max tuple value + * @param upper upper bound min max tuple value + * @returns the clamped bigint value per given range + */ +export const bigIntClamp = ( + value: BigNumberish, + lower: BigNumberish | null | undefined, + upper: BigNumberish | null | undefined +) => { + lower = lower != null ? BigInt(lower) : null; + upper = upper != null ? BigInt(upper) : null; + + if (upper != null && lower != null && upper < lower) { + throw new Error( + `invalid range: upper bound ${upper} is less than lower bound ${lower}` + ); + } + + let ret = BigInt(value); + if (lower != null && lower > ret) { + ret = lower; + } + if (upper != null && upper < ret) { + ret = upper; + } + return ret; +}; + /** * Useful if you want to increment a bigint by N% or decrement by N% * diff --git a/packages/core/src/utils/defaults.ts b/packages/core/src/utils/defaults.ts index 8b490f0e2e..349697a829 100644 --- a/packages/core/src/utils/defaults.ts +++ b/packages/core/src/utils/defaults.ts @@ -15,6 +15,7 @@ import { polygonMumbai, sepolia, } from "viem/chains"; +import type { UserOperationFeeOptions } from "../types"; /** * Utility method returning the entry point contrafct address given a {@link Chain} object @@ -79,3 +80,20 @@ export const getDefaultSimpleAccountFactoryAddress = ( `no default simple account factory contract exists for ${chain.name}` ); }; + +export const minPriorityFeePerBidDefaults = new Map([ + [arbitrum.id, 10_000_000n], + [arbitrumGoerli.id, 10_000_000n], + [arbitrumSepolia.id, 10_000_000n], +]); + +export const getDefaultUserOperationFeeOptions = ( + chain: Chain +): UserOperationFeeOptions => { + return { + maxPriorityFeePerGas: { + min: minPriorityFeePerBidDefaults.get(chain.id) ?? 100_000_000n, + percentage: 33, + }, + }; +}; diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 3b6c49269e..89a2ceb1ae 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -1,7 +1,15 @@ import type { Address, Hash, Hex } from "viem"; import { encodeAbiParameters, hexToBigInt, keccak256, toHex } from "viem"; import * as chains from "viem/chains"; -import type { PromiseOrValue, UserOperationRequest } from "../types.js"; +import type { + BigNumberish, + Percentage, + PromiseOrValue, + UserOperationFeeOptionsField, + UserOperationRequest, +} from "../types.js"; +import { bigIntClamp, bigIntPercent } from "./bigint.js"; +import { BigNumberishSchema, PercentageSchema } from "./schema.js"; /** * Utility method for converting a chainId to a {@link chains.Chain} object @@ -26,11 +34,11 @@ export const getChain = (chainId: number): chains.Chain => { * @returns result of the pipe */ export const asyncPipe = - (...fns: ((x: T) => Promise)[]) => - async (x: T) => { - let result = x; + (...fns: ((s: S, o?: O, f?: F) => Promise)[]) => + async (s: S, o?: O, f?: F) => { + let result = s; for (const fn of fns) { - result = await fn(result); + result = await fn(result, o, f); } return result; }; @@ -89,6 +97,24 @@ export function deepHexlify(obj: any): any { ); } +export function applyFeeOption( + value: BigNumberish | undefined, + feeOption?: UserOperationFeeOptionsField +): BigNumberish { + if (feeOption == null) { + return value ?? 0n; + } + return value + ? bigIntClamp( + feeOption.percentage + ? bigIntPercent(value, BigInt(100 + feeOption.percentage)) + : value, + feeOption.min, + feeOption.max + ) + : feeOption.min ?? 0n; +} + /** * Generates a hash for a UserOperation valid from entrypoint version 0.6 onwards * @@ -156,6 +182,31 @@ export function defineReadOnly( }); } +export function isBigNumberish(x: any): x is BigNumberish { + return BigNumberishSchema.safeParse(x).success; +} + +export function isPercentage(x: any): x is Percentage { + return PercentageSchema.safeParse(x).success; +} + +export function filterUndefined( + obj: Record +): Record { + Object.keys(obj).forEach((key) => { + if (obj[key] == null) { + delete obj[key]; + } + }); + return obj; +} + +export function pick(obj: Record, keys: string | string[]) { + return Object.keys(obj) + .filter((k) => keys.includes(k)) + .reduce((res, k) => Object.assign(res, { [k]: obj[k] }), {}); +} + export * from "./bigint.js"; export * from "./defaults.js"; export * from "./schema.js"; diff --git a/packages/core/src/utils/schema.ts b/packages/core/src/utils/schema.ts index 140dd4f42b..f560885c9f 100644 --- a/packages/core/src/utils/schema.ts +++ b/packages/core/src/utils/schema.ts @@ -1,4 +1,4 @@ -import type { Chain } from "viem"; +import { isHex, type Chain } from "viem"; import { z } from "zod"; import { getChain } from "./index.js"; @@ -18,3 +18,25 @@ export const ChainSchema = z.custom((chain) => { return false; } }); + +export const HexSchema = z.custom<`0x${string}` | "0x">((val) => { + return isHex(val); +}); + +export const BigNumberishSchema = z.union([HexSchema, z.number(), z.bigint()]); + +export const BigNumberishRangeSchema = z + .object({ + min: BigNumberishSchema.optional(), + max: BigNumberishSchema.optional(), + }) + .strict(); + +export const PercentageSchema = z + .object({ + /** + * Percent value between 1 and 1000 inclusive + */ + percentage: z.number().min(1).max(1000), + }) + .strict(); diff --git a/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md b/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md index 011e051996..8b0cf6a6bf 100644 --- a/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md +++ b/site/packages/aa-alchemy/middleware/withAlchemyGasManager.md @@ -53,4 +53,4 @@ A new instance of an `AlchemyProvider` with the same attributes as the input, no - `policyId: string` -- the Gas Manager policy ID -### `estimateGas: boolean` -- a flag to additionally estimate gas as part of +### `delegateGasEstimation: boolean` -- a flag to additionally estimate gas as part of requesting paymaster and data From 225b7c37165ade6792631ff64ce3c606f1d419fc Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 30 Nov 2023 16:10:32 -0800 Subject: [PATCH 76/79] feat: support one-off percentage overrides for user operations (#289) * feat: support one-off percentage overrides for user operations * feat: apply user op override or fee option utils in aa-core --- packages/alchemy/src/middleware/gas-fees.ts | 51 ++++----- .../alchemy/src/middleware/gas-manager.ts | 17 ++- packages/core/src/index.ts | 4 +- packages/core/src/provider/base.ts | 102 ++++++++---------- packages/core/src/provider/types.ts | 1 - packages/core/src/types.ts | 23 ++-- packages/core/src/utils/index.ts | 24 +---- packages/core/src/utils/userop.ts | 58 +++++++++- 8 files changed, 157 insertions(+), 123 deletions(-) diff --git a/packages/alchemy/src/middleware/gas-fees.ts b/packages/alchemy/src/middleware/gas-fees.ts index 316bba5a1d..92992dbd91 100644 --- a/packages/alchemy/src/middleware/gas-fees.ts +++ b/packages/alchemy/src/middleware/gas-fees.ts @@ -1,4 +1,4 @@ -import { applyFeeOption, type BigNumberish } from "@alchemy/aa-core"; +import { applyUserOpOverrideOrFeeOption } from "@alchemy/aa-core"; import type { AlchemyProvider } from "../provider.js"; import type { ClientWithAlchemyMethods } from "./client.js"; @@ -6,34 +6,29 @@ export const withAlchemyGasFeeEstimator = ( provider: AlchemyProvider ): AlchemyProvider => { provider.withFeeDataGetter(async (struct, overrides, feeOptions) => { - const maxPriorityFeePerGas = - overrides?.maxPriorityFeePerGas != null - ? overrides?.maxPriorityFeePerGas - : // it's a fair assumption that if someone is using this Alchemy Middleware, then they are using Alchemy RPC - applyFeeOption( - await (provider.rpcClient as ClientWithAlchemyMethods).request({ - method: "rundler_maxPriorityFeePerGas", - params: [], - }), - feeOptions?.maxPriorityFeePerGas - ); + let [block, maxPriorityFeePerGasEstimate] = await Promise.all([ + provider.rpcClient.getBlock({ blockTag: "latest" }), + // it's a fair assumption that if someone is using this Alchemy Middleware, then they are using Alchemy RPC + (provider.rpcClient as ClientWithAlchemyMethods).request({ + method: "rundler_maxPriorityFeePerGas", + params: [], + }), + ]); + const baseFeePerGas = block.baseFeePerGas; + if (baseFeePerGas == null) { + throw new Error("baseFeePerGas is null"); + } - const estimateMaxFeePerGas = async (priorityFeePerGas: BigNumberish) => { - const block = await provider.rpcClient.getBlock({ blockTag: "latest" }); - const baseFeePerGas = block.baseFeePerGas; - if (baseFeePerGas == null) { - throw new Error("baseFeePerGas is null"); - } - return applyFeeOption( - baseFeePerGas + BigInt(priorityFeePerGas), - feeOptions?.maxFeePerGas - ); - }; - - const maxFeePerGas = - overrides?.maxFeePerGas != null - ? overrides?.maxFeePerGas - : await estimateMaxFeePerGas(maxPriorityFeePerGas); + const maxPriorityFeePerGas = applyUserOpOverrideOrFeeOption( + maxPriorityFeePerGasEstimate, + overrides?.maxPriorityFeePerGas, + feeOptions?.maxPriorityFeePerGas + ); + const maxFeePerGas = applyUserOpOverrideOrFeeOption( + baseFeePerGas + BigInt(maxPriorityFeePerGas), + overrides?.maxFeePerGas, + feeOptions?.maxFeePerGas + ); return { ...struct, diff --git a/packages/alchemy/src/middleware/gas-manager.ts b/packages/alchemy/src/middleware/gas-manager.ts index 9ac692e613..b1fc6eabb1 100644 --- a/packages/alchemy/src/middleware/gas-manager.ts +++ b/packages/alchemy/src/middleware/gas-manager.ts @@ -1,6 +1,7 @@ import { deepHexlify, filterUndefined, + isBigNumberish, isPercentage, resolveProperties, type AccountMiddlewareFn, @@ -169,15 +170,25 @@ const withAlchemyGasAndPaymasterAndDataMiddleware =

( const overrideField = ( field: keyof UserOperationFeeOptions ): Hex | Percentage | undefined => { - // one-off absolute override if (overrides?.[field] != null) { - return deepHexlify(overrides[field]); + // one-off absolute override + if (isBigNumberish(overrides[field])) { + return deepHexlify(overrides[field]); + } + // one-off percentage overrides + else { + return { + percentage: + 100 + Number((overrides[field] as Percentage).percentage), + }; + } } // provider level fee options with percentage if (isPercentage(feeOptions?.[field])) { return { - percentage: 100 + Number(feeOptions?.[field]?.percentage), + percentage: + 100 + Number((feeOptions![field] as Percentage).percentage), }; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index a43fd77964..c6dada652f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -49,7 +49,9 @@ export type * from "./types.js"; export type * from "./utils/index.js"; export { ChainSchema, - applyFeeOption, + applyUserOpFeeOption, + applyUserOpOverride, + applyUserOpOverrideOrFeeOption, asyncPipe, bigIntMax, bigIntPercent, diff --git a/packages/core/src/provider/base.ts b/packages/core/src/provider/base.ts index 4465be42bf..b6117fcfe8 100644 --- a/packages/core/src/provider/base.ts +++ b/packages/core/src/provider/base.ts @@ -32,7 +32,7 @@ import { type UserOperationStruct, } from "../types.js"; import { - applyFeeOption, + applyUserOpOverrideOrFeeOption, asyncPipe, bigIntMax, bigIntPercent, @@ -521,41 +521,31 @@ export class SmartAccountProvider< overrides, feeOptions ) => { - let { callGasLimit, verificationGasLimit, preVerificationGas } = - overrides ?? {}; - - if ( - callGasLimit == null || - verificationGasLimit == null || - preVerificationGas == null - ) { - const request = deepHexlify(await resolveProperties(struct)); - const estimates = await this.rpcClient.estimateUserOperationGas( - request, - this.getEntryPointAddress() - ); + const request = deepHexlify(await resolveProperties(struct)); + const estimates = await this.rpcClient.estimateUserOperationGas( + request, + this.getEntryPointAddress() + ); - callGasLimit = - callGasLimit ?? - applyFeeOption(estimates.callGasLimit, feeOptions?.callGasLimit); - verificationGasLimit = - verificationGasLimit ?? - applyFeeOption( - estimates.verificationGasLimit, - feeOptions?.verificationGasLimit - ); - preVerificationGas = - preVerificationGas ?? - applyFeeOption( - estimates.preVerificationGas, - feeOptions?.preVerificationGas - ); - } + const callGasLimit = applyUserOpOverrideOrFeeOption( + estimates.callGasLimit, + overrides?.callGasLimit, + feeOptions?.callGasLimit + ); + const verificationGasLimit = applyUserOpOverrideOrFeeOption( + estimates.verificationGasLimit, + overrides?.verificationGasLimit, + feeOptions?.verificationGasLimit + ); + const preVerificationGas = applyUserOpOverrideOrFeeOption( + estimates.preVerificationGas, + overrides?.preVerificationGas, + feeOptions?.preVerificationGas + ); struct.callGasLimit = callGasLimit; struct.verificationGasLimit = verificationGasLimit; struct.preVerificationGas = preVerificationGas; - return struct; }; @@ -564,11 +554,6 @@ export class SmartAccountProvider< overrides, feeOptions ) => { - const estimateMaxPriorityFeePerGas = async () => { - const estimate = await this.rpcClient.estimateMaxPriorityFeePerGas(); - return applyFeeOption(estimate, feeOptions?.maxPriorityFeePerGas); - }; - // maxFeePerGas must be at least the sum of maxPriorityFeePerGas and baseFee // so we need to accommodate for the fee option applied maxPriorityFeePerGas for the maxFeePerGas // @@ -577,30 +562,35 @@ export class SmartAccountProvider< // // Refer to https://docs.alchemy.com/docs/maxpriorityfeepergas-vs-maxfeepergas // for more information about maxFeePerGas and maxPriorityFeePerGas - const estimateMaxFeePerGas = async (maxPriorityFeePerGas: BigNumberish) => { - const feeData = await this.rpcClient.estimateFeesPerGas(); - if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas) { - throw new Error( - "feeData is missing maxFeePerGas or maxPriorityFeePerGas" - ); - } - const baseFee = applyFeeOption( - feeData.maxFeePerGas - feeData.maxPriorityFeePerGas, - feeOptions?.maxFeePerGas + + const feeData = await this.rpcClient.estimateFeesPerGas(); + if (!feeData.maxFeePerGas || !feeData.maxPriorityFeePerGas) { + throw new Error( + "feeData is missing maxFeePerGas or maxPriorityFeePerGas" ); + } - return BigInt(baseFee) + BigInt(maxPriorityFeePerGas); - }; + let maxPriorityFeePerGas: BigNumberish = + await this.rpcClient.estimateMaxPriorityFeePerGas(); + maxPriorityFeePerGas = applyUserOpOverrideOrFeeOption( + maxPriorityFeePerGas, + overrides?.maxPriorityFeePerGas, + feeOptions?.maxPriorityFeePerGas + ); - struct.maxPriorityFeePerGas = - overrides?.maxPriorityFeePerGas != null - ? overrides?.maxPriorityFeePerGas - : await estimateMaxPriorityFeePerGas(); - struct.maxFeePerGas = - overrides?.maxFeePerGas != null - ? overrides?.maxFeePerGas - : await estimateMaxFeePerGas(struct.maxPriorityFeePerGas); + let maxFeePerGas: BigNumberish = + feeData.maxFeePerGas - + feeData.maxPriorityFeePerGas + + BigInt(maxPriorityFeePerGas); + + maxFeePerGas = applyUserOpOverrideOrFeeOption( + maxFeePerGas, + overrides?.maxFeePerGas, + feeOptions?.maxFeePerGas + ); + struct.maxFeePerGas = maxFeePerGas; + struct.maxPriorityFeePerGas = maxPriorityFeePerGas; return struct; }; diff --git a/packages/core/src/provider/types.ts b/packages/core/src/provider/types.ts index 1efdde77a6..a02f1b608a 100644 --- a/packages/core/src/provider/types.ts +++ b/packages/core/src/provider/types.ts @@ -330,7 +330,6 @@ export interface ISmartAccountProvider< * prior to execution. * * @param override - a function for overriding the default feeDataGetter middleware - * @param feeOptions - optional FeeDataFeeOptions to set at the global level of the provider. * @returns */ withFeeDataGetter: (override: FeeDataMiddleware) => this; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index d3a889aa91..c6af246ad1 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -43,17 +43,18 @@ export type UserOperationFeeOptions = z.infer< typeof UserOperationFeeOptionsSchema >; -export type UserOperationOverrides = Partial< - Pick< - UserOperationStruct, - | "callGasLimit" - | "maxFeePerGas" - | "maxPriorityFeePerGas" - | "paymasterAndData" - | "preVerificationGas" - | "verificationGasLimit" - > ->; +export type UserOperationOverrides = Partial<{ + callGasLimit: UserOperationStruct["callGasLimit"] | Percentage; + maxFeePerGas: UserOperationStruct["maxFeePerGas"] | Percentage; + maxPriorityFeePerGas: + | UserOperationStruct["maxPriorityFeePerGas"] + | Percentage; + preVerificationGas: UserOperationStruct["preVerificationGas"] | Percentage; + verificationGasLimit: + | UserOperationStruct["verificationGasLimit"] + | Percentage; + paymasterAndData: UserOperationStruct["paymasterAndData"]; +}>; // represents the request as it needs to be formatted for RPC requests export interface UserOperationRequest { diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 89a2ceb1ae..75a835e7b2 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -5,10 +5,8 @@ import type { BigNumberish, Percentage, PromiseOrValue, - UserOperationFeeOptionsField, UserOperationRequest, } from "../types.js"; -import { bigIntClamp, bigIntPercent } from "./bigint.js"; import { BigNumberishSchema, PercentageSchema } from "./schema.js"; /** @@ -97,24 +95,6 @@ export function deepHexlify(obj: any): any { ); } -export function applyFeeOption( - value: BigNumberish | undefined, - feeOption?: UserOperationFeeOptionsField -): BigNumberish { - if (feeOption == null) { - return value ?? 0n; - } - return value - ? bigIntClamp( - feeOption.percentage - ? bigIntPercent(value, BigInt(100 + feeOption.percentage)) - : value, - feeOption.min, - feeOption.max - ) - : feeOption.min ?? 0n; -} - /** * Generates a hash for a UserOperation valid from entrypoint version 0.6 onwards * @@ -183,11 +163,11 @@ export function defineReadOnly( } export function isBigNumberish(x: any): x is BigNumberish { - return BigNumberishSchema.safeParse(x).success; + return x != null && BigNumberishSchema.safeParse(x).success; } export function isPercentage(x: any): x is Percentage { - return PercentageSchema.safeParse(x).success; + return x != null && PercentageSchema.safeParse(x).success; } export function filterUndefined( diff --git a/packages/core/src/utils/userop.ts b/packages/core/src/utils/userop.ts index 21d3a9255d..34bbe729dc 100644 --- a/packages/core/src/utils/userop.ts +++ b/packages/core/src/utils/userop.ts @@ -1,4 +1,12 @@ -import type { UserOperationRequest, UserOperationStruct } from "../types"; +import type { + BigNumberish, + Percentage, + UserOperationFeeOptionsField, + UserOperationRequest, + UserOperationStruct, +} from "../types"; +import { bigIntClamp, bigIntPercent } from "./bigint.js"; +import { isBigNumberish } from "./index.js"; /** * Utility method for asserting a {@link UserOperationStruct} is a {@link UserOperationRequest} @@ -18,3 +26,51 @@ export function isValidRequest( !!request.verificationGasLimit ); } + +export function applyUserOpOverride( + value: BigNumberish | undefined, + override?: BigNumberish | Percentage +): BigNumberish | undefined { + if (override == null) { + return value; + } + + if (isBigNumberish(override)) { + return override; + } + + // percentage override + else { + return value != null + ? bigIntPercent(value, BigInt(100 + override.percentage)) + : value; + } +} + +export function applyUserOpFeeOption( + value: BigNumberish | undefined, + feeOption?: UserOperationFeeOptionsField +): BigNumberish { + if (feeOption == null) { + return value ?? 0n; + } + return value != null + ? bigIntClamp( + feeOption.percentage + ? bigIntPercent(value, BigInt(100 + feeOption.percentage)) + : value, + feeOption.min, + feeOption.max + ) + : feeOption.min ?? 0n; +} + +export function applyUserOpOverrideOrFeeOption( + value: BigNumberish | undefined, + override?: BigNumberish | Percentage, + feeOption?: UserOperationFeeOptionsField +): BigNumberish { + return value != null && override != null + ? applyUserOpOverride(value, override)! + : applyUserOpFeeOption(value, feeOption); +} From bebe7024e88a7d78ea103da357319dca967f4bea Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Thu, 30 Nov 2023 16:12:48 -0800 Subject: [PATCH 77/79] docs: add documentation for smart account provider fee options and overrides (#277) * feat: support one-off percentage overrides for user operations * feat: apply user op override or fee option utils in aa-core * docs: add documentation for smart account provider fee options and overrides * docs: add glossary section and add general types doc in the section --- packages/core/src/types.ts | 2 +- site/.vitepress/config.ts | 41 +++++++++ site/glossary/types/bigNumberish.md | 46 ++++++++++ site/glossary/types/bigNumberishRange.md | 50 +++++++++++ site/glossary/types/percentage.md | 56 ++++++++++++ .../gas-sponsorship-eligibility.md | 2 +- .../aa-alchemy/provider/introduction.md | 4 +- .../simulateUserOperationAssetChanges.md | 4 +- .../aa-core/provider/buildUserOperation.md | 4 +- .../provider/buildUserOperationFromTx.md | 4 +- .../checkGasSponsorshipEligibility.md | 4 +- site/packages/aa-core/provider/constructor.md | 19 +++- .../provider/dropAndReplaceUserOperation.md | 4 +- .../aa-core/provider/sendTransaction.md | 4 +- .../aa-core/provider/sendTransactions.md | 4 +- .../aa-core/provider/sendUserOperation.md | 4 +- .../aa-core/types/userOperationFeeOptions.md | 62 +++++++++++++ .../types/userOperationFeeOptionsField.md | 45 ++++++++++ .../aa-core/types/userOperationOverrides.md | 89 +++++++++++++++++++ 19 files changed, 426 insertions(+), 22 deletions(-) create mode 100644 site/glossary/types/bigNumberish.md create mode 100644 site/glossary/types/bigNumberishRange.md create mode 100644 site/glossary/types/percentage.md create mode 100644 site/packages/aa-core/types/userOperationFeeOptions.md create mode 100644 site/packages/aa-core/types/userOperationFeeOptionsField.md create mode 100644 site/packages/aa-core/types/userOperationOverrides.md diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index c6af246ad1..773db2f966 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -16,7 +16,7 @@ export type EmptyHex = `0x`; // based on @account-abstraction/common export type PromiseOrValue = T | Promise; -export type BytesLike = Uint8Array | string; +export type BytesLike = Uint8Array | Hex; export type Percentage = z.infer; export type BigNumberish = z.infer; diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index 5b117d43ba..d66b359e9e 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -451,6 +451,25 @@ export default defineConfig({ }, ], }, + { + text: "Types", + base: "/packages/aa-core/types", + collapsed: true, + items: [ + { + text: "UserOperationFeeOptions", + link: "/UserOperationFeeOptions", + }, + { + text: "UserOperationFeeOptionsField", + link: "/userOperationFeeOptionsField", + }, + { + text: "UserOperationOverrides", + link: "/userOperationOverrides", + }, + ], + }, { text: "Utils", base: "/packages/aa-core/utils", @@ -752,6 +771,28 @@ export default defineConfig({ }, ], }, + { + text: "Glossary", + base: "/glossary", + items: [ + { + text: "Types", + base: "/glossary/types", + collapsed: true, + items: [ + { text: "BigNumberish", link: "/bigNumberish" }, + { + text: "BigNumberishRange", + link: "/bigNumberishRange", + }, + { + text: "Percentage", + link: "/percentage", + }, + ], + }, + ], + }, ], socialLinks: [ diff --git a/site/glossary/types/bigNumberish.md b/site/glossary/types/bigNumberish.md new file mode 100644 index 0000000000..7f11399841 --- /dev/null +++ b/site/glossary/types/bigNumberish.md @@ -0,0 +1,46 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: BigNumberish + - - meta + - name: description + content: Overview of the BigNumberish type in aa-core types + - - meta + - property: og:description + content: Overview of the BigNumberish type in aa-core types +--- + +# BigNumberish + +one of `Hex` (`0x{string}`), `bigint` or `number` type for representing `bigint` convertible values + +```ts +import { z } from "zod"; + +export const HexSchema = z.custom<`0x${string}` | "0x">((val) => { + return isHex(val) || val === "0x"; +}); + +/* + * type BigNumberish = Hex | number | bigint + */ +export const BigNumberishSchema = z.union([HexSchema, z.number(), z.bigint()]); +``` + +## Usage + +::: code-group + +```ts [example.ts] +import { type BigNumberish, isBigNumberish } from "@alchemy/aa-core"; + +const bigNumberish1 = 10000000n; +const bigNumberish2 = 0xf23cde; + +console.log(isBigNumberish(bigNumberish1)); // true +console.log(isBigNumberish(bigNumberish2)); // true +``` + +::: diff --git a/site/glossary/types/bigNumberishRange.md b/site/glossary/types/bigNumberishRange.md new file mode 100644 index 0000000000..120cbd51f2 --- /dev/null +++ b/site/glossary/types/bigNumberishRange.md @@ -0,0 +1,50 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: BigNumberishRange + - - meta + - name: description + content: Overview of the BigNumberishRange type in aa-core types + - - meta + - property: og:description + content: Overview of the BigNumberishRange type in aa-core types +--- + +# BigNumberishRange + +object with optional fields `min` and `max` where each field is of type [`BigNumberish`](./bigNumberish.md) to represent a range type value between `min` and `max` inclusive + +```ts +import { z } from "zod"; + +/* + * type BigNumberishRange = { + * min?: Hex | number | bigint + * max?: Hex | number | bigint + * } + */ + +export const BigNumberishRangeSchema = z + .object({ + min: BigNumberishSchema.optional(), + max: BigNumberishSchema.optional(), + }) + .strict(); +``` + +## Usage + +::: code-group + +```ts [example.ts] +import { type BigNumberishRange } from "@alchemy/aa-core"; + +const bigNumberishRange = { + min: 1n, + max: "0x345dfe", +}; +``` + +::: diff --git a/site/glossary/types/percentage.md b/site/glossary/types/percentage.md new file mode 100644 index 0000000000..b2eba9ae55 --- /dev/null +++ b/site/glossary/types/percentage.md @@ -0,0 +1,56 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: Percentage + - - meta + - name: description + content: Overview of the Percentage type in aa-core types + - - meta + - property: og:description + content: Overview of the Percentage type in aa-core types +--- + +# Percentage + +object with required field `percentage` with a `number` value between 1 and 1000 inclusive + +```ts +import { z } from "zod"; + +/* + * type Percentage = { + * percentage?: number + * } + */ + +export const PercentageSchema = z + .object({ + /** + * Percent value between 1 and 1000 inclusive + */ + percentage: z.number().min(1).max(1000), + }) + .strict(); +``` + +## Usage + +::: code-group + +```ts [example.ts] +import { type Percentage, isPercentage } from "@alchemy/aa-core"; + +const percentage1 = { + percentage: 10, +}; +const percentage2 = { + percentage: 100000, +}; + +console.log(isPercentage(percentage1)); // true +console.log(isPercentage(percentage2)); // false +``` + +::: diff --git a/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md index 7805727f74..bacfe81d33 100644 --- a/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md +++ b/site/guides/sponsoring-gas/gas-sponsorship-eligibility.md @@ -76,7 +76,7 @@ If you attempt to execute the `sendUserOperation` method for user operations ine This section of the guide elucidates how you can circumvent the `PaymasterMiddleware`, enabling the sending of user operations without gas sponsorship. This functionality permits the sending of user operations where users pay the gas fee themselves via their smart account. -When employing various methods on `SmartAccountProvider` to send user operations (e.g., [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation.md) or [`sendTransaction`](/packages/aa-core/provider/sendTransaction.md)), apart from the `UserOperationCallData` or `BatchUserOperationCallData`, you have the option to include an additional parameter named `overrides`. This parameter allows the specification of override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData`. To bypass the `PaymasterMiddleware`, you can specifically set the `paymasterAndData` override. For example, assigning an empty hex string (`0x`) to the `paymasterAndData` field in the overrides would result in the user operation being sent without the paymaster covering the gas fee, but rather paid from the user's own smart account. +When employing various methods on `SmartAccountProvider` to send user operations (e.g., [`sendUserOperation`](/packages/aa-core/provider/sendUserOperation.md) or [`sendTransaction`](/packages/aa-core/provider/sendTransaction.md)), apart from the `UserOperationCallData` or `BatchUserOperationCallData`, you have the option to include an additional parameter named `overrides`. This parameter allows the specification of override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData`. To bypass the `PaymasterMiddleware`, you can specifically set the `paymasterAndData` override. For example, assigning an empty hex string (`0x`) to the `paymasterAndData` field in the overrides would result in the user operation being sent without the paymaster covering the gas fee, but rather paid from the user's own smart account. ```ts [bypass-paymaster-middleware.ts] // If gas sponsorship ineligible, baypass paymaster middleware by passing in the paymasterAndData override diff --git a/site/packages/aa-alchemy/provider/introduction.md b/site/packages/aa-alchemy/provider/introduction.md index e5b83887c5..efe625c328 100644 --- a/site/packages/aa-alchemy/provider/introduction.md +++ b/site/packages/aa-alchemy/provider/introduction.md @@ -18,8 +18,8 @@ head: Notable differences between `AlchemyProvider` and `SmartAccountProvider` are implementations for: -1. [`gasEstimator`](/packages/aa-alchemy/provider/gasEstimator) -- overrides the `SmartAccountProvider` gas estimator. -2. [`withAlchemyGasManager`](/packages/aa-alchemy/provider/withAlchemyGasManager) -- adds the Alchemy Gas Manager middleware to the provider. +1. [`gasEstimator`](/packages/aa-core/provider/withGasEstimator.md) -- overrides the base `SmartAccountProvider` gas estimator. +2. [`withAlchemyGasManager`](/packages/aa-alchemy/provider/withAlchemyGasManager.md) -- adds the Alchemy Gas Manager middleware to the provider. ## Usage diff --git a/site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md b/site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md index 12b2f29bbb..057513e13c 100644 --- a/site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md +++ b/site/packages/aa-alchemy/provider/simulateUserOperationAssetChanges.md @@ -70,6 +70,6 @@ const uo = await provider.sendUserOperation(uoStruct); - `data: Hex` - can be either `0x` or a call data string - `value?: bigint` - optionally, set the value in wei you want to send to the target -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/buildUserOperation.md b/site/packages/aa-core/provider/buildUserOperation.md index aecb2915bb..cee3bb9b45 100644 --- a/site/packages/aa-core/provider/buildUserOperation.md +++ b/site/packages/aa-core/provider/buildUserOperation.md @@ -75,6 +75,6 @@ A Promise containing the _unsigned_ UO struct resulting from the middleware pipe - `data: Hex` - can be either `0x` or a call data string - `value?: bigint` - optionally, set the value in wei you want to send to the target -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/buildUserOperationFromTx.md b/site/packages/aa-core/provider/buildUserOperationFromTx.md index af5203f379..000722bdba 100644 --- a/site/packages/aa-core/provider/buildUserOperationFromTx.md +++ b/site/packages/aa-core/provider/buildUserOperationFromTx.md @@ -60,6 +60,6 @@ A Promise containing the _unsigned_ UO struct converted from the input transacti The `RpcTransactionRequest` object representing a traditional ethereum transaction -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md b/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md index ac289d914e..f6fecb2337 100644 --- a/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md +++ b/site/packages/aa-core/provider/checkGasSponsorshipEligibility.md @@ -59,6 +59,6 @@ A Promise containing the boolean value indicating whether the UO to be sent is e - `data: Hex` - can be either `0x` or a call data string - `value?: bigint` - optionally, set the value in wei you want to send to the target -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/constructor.md b/site/packages/aa-core/provider/constructor.md index a37c92d078..3019a8f6af 100644 --- a/site/packages/aa-core/provider/constructor.md +++ b/site/packages/aa-core/provider/constructor.md @@ -57,7 +57,7 @@ A new instance of a `SmartAccountProvider`. - `entryPointAddress: Address | undefined` -- [optional] the entry point contract address. If not provided, the entry point contract address for the provider is the connected account's entry point contract, or if not connected, falls back to the default entry point contract for the chain. See [getDefaultEntryPointAddress](/packages/aa-core/utils/getDefaultEntryPointAddress.html#getdefaultentrypointaddress). -- `opts: Object | undefined` -- [optional] overrides on provider config variables having to do with fetching transaction receipts and fee computation. +- `opts: SmartAccountProviderOpts | undefined` -- [optional] overrides on provider config variables having to do with fetching transaction receipts and fee computation. - `txMaxRetries: string | undefined` -- [optional] the maximum number of times to try fetching a transaction receipt before giving up (default: 5). @@ -65,4 +65,19 @@ A new instance of a `SmartAccountProvider`. - `txRetryMulitplier: string | undefined` -- [optional] the mulitplier on interval length to wait between retries while waiting for transaction receipts (default: 1.5). - - `minPriorityFeePerBid: string | undefined` --[optional] used when computing the fees for a user operation (default: 100_000_000). + - `feeOptions:` [`UserOperationFeeOptions`](/packages/aa-core/types/userOperationFeeOptions.md) `| undefined` --[optional] user operation fee options to be used for gas estimation, set at the global level on the provider. + If not set, default fee options for the chain are used. Available fields in `feeOptions` include `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` where each field is of type [`UserOperationFeeOptionsField`](/packages/aa-core/types/userOperationFeeOptionsField.md). + + - `maxFeePerGas`: `UserOperationFeeOptionsField` + - `maxPriorityFeePerGas`: `UserOperationFeeOptionsField` + - `callGasLimit`: `UserOperationFeeOptionsField` + - `verificationGasLimit`: `UserOperationFeeOptionsField` + - `preVerificationGas`: `UserOperationFeeOptionsField` + +:::tip Note +The fee options set upon the provider initialization are available from each middleware of the `SmartAccountProvider`. For example, the default middlewares such as [`gasEstimator`](/packages/aa-core/provider/withGasEstimator.md) or [`feeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) apply the fee options to the estimated values if the fee options are set. +::: + +:::tip Note +Note that if you are using your own middleware, for example a custom `feeDataGetter` using [`withFeeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) method on the provider, then the default `feeDataGetter` middleware is overriden. As you are opting out of using the default middleware, you are also responsible for handling the fee options appropriately for the fee options set upon provider initialization. +::: diff --git a/site/packages/aa-core/provider/dropAndReplaceUserOperation.md b/site/packages/aa-core/provider/dropAndReplaceUserOperation.md index 525be3ee5a..6409019500 100644 --- a/site/packages/aa-core/provider/dropAndReplaceUserOperation.md +++ b/site/packages/aa-core/provider/dropAndReplaceUserOperation.md @@ -51,6 +51,6 @@ A Promise containing the hash of the user operation and the request that was sen A previously submitted `UserOperation`. -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/sendTransaction.md b/site/packages/aa-core/provider/sendTransaction.md index fb6a0d6b83..cd822120fb 100644 --- a/site/packages/aa-core/provider/sendTransaction.md +++ b/site/packages/aa-core/provider/sendTransaction.md @@ -54,6 +54,6 @@ A Promise containing the transaction hash The `RpcTransactionRequest` object representing a traditional ethereum transaction -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/sendTransactions.md b/site/packages/aa-core/provider/sendTransactions.md index 05d710eb8c..4aac873ea2 100644 --- a/site/packages/aa-core/provider/sendTransactions.md +++ b/site/packages/aa-core/provider/sendTransactions.md @@ -75,6 +75,6 @@ A Promise containing the transaction hash An `RpcTransactionRequest` array representing a traditional ethereum transaction -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/provider/sendUserOperation.md b/site/packages/aa-core/provider/sendUserOperation.md index de3e1b2c1a..79b9a0dccc 100644 --- a/site/packages/aa-core/provider/sendUserOperation.md +++ b/site/packages/aa-core/provider/sendUserOperation.md @@ -73,6 +73,6 @@ A Promise containing the hash of the user operation and the request that was sen - `data: Hex` - can be either `0x` or a call data string - `value?: bigint` - optionally, set the value in wei you want to send to the target -### `overrides?: UserOperationOverrides` +### `overrides?:` [`UserOperationOverrides`](/packages/aa-core/types/userOperationOverrides.md) -Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas` or `paymasterAndData` on the user operation request +Optional parameter where you can specify override values for `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData` on the user operation request diff --git a/site/packages/aa-core/types/userOperationFeeOptions.md b/site/packages/aa-core/types/userOperationFeeOptions.md new file mode 100644 index 0000000000..eff39350f9 --- /dev/null +++ b/site/packages/aa-core/types/userOperationFeeOptions.md @@ -0,0 +1,62 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: UserOperationFeeOptions + - - meta + - name: description + content: Overview of the UserOperationFeeOptions type in aa-core types + - - meta + - property: og:description + content: Overview of the UserOperationFeeOptions type in aa-core types +--- + +# UserOperationFeeOptions + +Fee options object type used by the [`SmartAccountProvider`](/packages/aa-core/provider/constructor.md) during the gas fee calculation middlewares when constructing the user operation to send. + +For example, if the below example `UserOperationFeeOptions` is set on the provider upon initialization, the `maxPriorityFeePerGas` field on the user operation will be set as the max value between the 50% buffered `maxPriorityFeePerGas` estimate and the the min `maxPriorityFeePerGas` value specified here, `100_000_000n`. + +```ts +type UserOperationFeeOptions { + maxFeePerGas?: UserOperationFeeOptionsField, + maxPriorityFeePerGas?: UserOperationFeeOptionsField, + callGasLimit?: UserOperationFeeOptionsField, + verificationGasLimit?: UserOperationFeeOptionsField, + preVerificationGas?: UserOperationFeeOptionsField, +} +``` + +## Usage + +::: code-group + +```ts [example.ts] +import { sepolia } from "viem/chains"; +import { type Chain } from "viem"; + +import { + type UserOperationFeeOptions, + type SmartAccountProvider, +} from "@alchemy/aa-core"; + +import { API_KEY } from "./constants.js"; + +const userOperationFeeOptions: UserOperationFeeOptions = { + maxPriorityFeePerGas: { + min: 100_000_000n, + percentage: 50, + }, +}; + +const provider = const provider = new SmartAccountProvider({ + rpcProvider: `${sepolia.rpcUrls.alchemy.http[0]}/${API_KEY}`, + chain: sepolia, + opts: { + feeOptions: userOperationFeeOptions, + }, +}); +``` + +::: diff --git a/site/packages/aa-core/types/userOperationFeeOptionsField.md b/site/packages/aa-core/types/userOperationFeeOptionsField.md new file mode 100644 index 0000000000..f0aea49c8e --- /dev/null +++ b/site/packages/aa-core/types/userOperationFeeOptionsField.md @@ -0,0 +1,45 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: UserOperationFeeOptionsField + - - meta + - name: description + content: Overview of the UserOperationFeeOptionsField type in aa-core types + - - meta + - property: og:description + content: Overview of the UserOperationFeeOptionsField type in aa-core types +--- + +# UserOperationFeeOptionsField + +Merged type of [`BigNumberishRange`](/glossary/types/bigNumberishRange.md) with [`Percentage`](/glossary/types/percentage.md) type that can be used as [`UserOperationFeeOptions`](./userOperationFeeOptions.md) fields for the [`SmartAccountProvider`](/packages/aa-core/provider/constructor.md) to use during the gas fee calculation middlewares when constructing the user operation to send. + +For example, if the below example `UserOperationFeeOptionsField` is set as the fee option for the `maxPriorityFeePerGas` field of [`UserOperationFeeOptions`](./userOperationFeeOptions.md), then the [`SmartAccountProvider`](/packages/aa-core/provider/constructor.md) will apply 50% buffer to the estimated `maxPriorityFeePerGas`, then set the `maxPriorityFeePerGas` on the user operation as the larger value between the buffered `maxPriorityFeePerGas` fee and the min `maxPriorityFeePerGas` which is `100_000_000n` here. + +```ts +/* + * { + * min?: BigNumberish + * max?: BigNumberish + * percentage?: number + * } + */ +type UserOperationFeeOptionsFieldSchema = BigNumberishRange & Percentage; +``` + +## Usage + +::: code-group + +```ts [example.ts] +import { type UserOperationFeeOptionsField } from "@alchemy/aa-core"; + +const userOperationFeeOptionsField: UserOperationFeeOptionsField = { + min: 100_000_000n, + percentage: 50, +}; +``` + +::: diff --git a/site/packages/aa-core/types/userOperationOverrides.md b/site/packages/aa-core/types/userOperationOverrides.md new file mode 100644 index 0000000000..6a479f481d --- /dev/null +++ b/site/packages/aa-core/types/userOperationOverrides.md @@ -0,0 +1,89 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: UserOperationOverrides + - - meta + - name: description + content: Overview of the UserOperationOverrides type in aa-core types + - - meta + - property: og:description + content: Overview of the UserOperationOverrides type in aa-core types +--- + +# UserOperationOverrides + +Contains override values to be applied on the user operation reqeust to be constructed or sent. Available fields include `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` or `paymasterAndData`. + +These override values are available from each middleware of the `SmartAccountProvider`. For example, the default middlewares such as [`gasEstimator`](/packages/aa-core/provider/withGasEstimator.md) or [`feeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) apply the overrides values to the estimated values if the override values are provided. + +Other than the `paymasterAndData` field, the override fields could be either the absolute value or the percentage value. In the default middlewares, if the override value is an absolute value, it simply overrides the estimated value. If the override value is a percentage value, the estimated value is _bumped_ with the indicated percentage value. For example, if the override value is `{ percentage: 10 }` for the `maxPriorityFeePerGas` field, then 10% bump is applied to the estimated `maxPriorityFeePerGas` of the user operation. + +The `paymasterAndData` only allows an absolute value override, and if the override value is provided, then the paymaster middleware is bypassed entirely. Refer to our guide [How to Handle User Operations that are Not Eligible for Gas Sponsorship](/guides/sponsoring-gas/gas-sponsorship-eligibility.md) on the example of using the `paymasterAndData` override to bypass the paymaster middleware to fallback to the user paying the gas fee instead of the gas being subsidized by the paymaster. + +:::tip Note +Note that if you are using your own middleware, for example a custom `feeDataGetter` using [`withFeeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) method on the provider, then the default `feeDataGetter` middleware is overriden. As you are opting out of using the default middleware, you are also responsible for handling the `UserOperationOverrides` appropriately. +::: + +```ts +type BytesLike = Uint8Array | Hex; + +export type UserOperationOverrides = Partial<{ + callGasLimit: UserOperationStruct["callGasLimit"] | Percentage; + maxFeePerGas: UserOperationStruct["maxFeePerGas"] | Percentage; + maxPriorityFeePerGas: + | UserOperationStruct["maxPriorityFeePerGas"] + | Percentage; + preVerificationGas: UserOperationStruct["preVerificationGas"] | Percentage; + verificationGasLimit: + | UserOperationStruct["verificationGasLimit"] + | Percentage; + paymasterAndData: UserOperationStruct["paymasterAndData"]; +}>; +``` + +## Usage + +::: code-group + +```ts [user-operation-override.ts] +import type { UserOperationOverrides } from "@alchemy/aa-core"; +import { provider } from "./provider.ts"; + +// Find your Gas Manager policy id at: +//dashboard.alchemy.com/gas-manager/policy/create +const GAS_MANAGER_POLICY_ID = "YourGasManagerPolicyId"; + +// Link the provider with the Gas Manager. This ensures user operations +// sent with this provider get sponsorship from the Gas Manager. +provider.withAlchemyGasManager({ + policyId: GAS_MANAGER_POLICY_ID, +}); + +// [!code focus:16] +// Use maxFeePerGas, maxPriorityFeePerGas, and paymasterAndData override +// to manually set the tx gas fees and the paymasterAndData field +const overrides: UserOperationOverrides = { + maxFeePerGas: 100000000n, + maxPriorityFeePerGas: 100000000n, + paymasterAndData: "0x", +}; + +const userOperationResult = await provider.sendUserOperation( + { + target: "0xTargetAddress", + data: "0xCallData", + }, + overrides +); + +// Fallback to user paying the gas fee isntead of the paymaster +const txHash = await provider.waitForUserOperationTransaction({ + hash: userOperationResult.hash, +}); +``` + +<<< @/snippets/provider.ts + +::: From 0fb89114bfe4015c1529b0dd0806d1c72cc1e662 Mon Sep 17 00:00:00 2001 From: Michael Moldoveanu Date: Fri, 1 Dec 2023 03:41:00 -0500 Subject: [PATCH 78/79] feat: add a convenience method to make creating an alchemy provider easier (#206) --- packages/accounts/package.json | 1 - packages/accounts/src/index.ts | 6 ++ .../light-account/__tests__/account.test.ts | 25 ++---- .../e2e-tests/light-account.test.ts | 65 ++++++++-------- .../accounts/src/light-account/provider.ts | 31 ++++++++ packages/accounts/src/light-account/schema.ts | 25 ++++++ packages/accounts/src/light-account/types.ts | 6 ++ packages/alchemy/e2e-tests/constants.ts | 3 +- ...-account.test.ts => light-account.test.ts} | 76 +++++-------------- packages/alchemy/package.json | 2 + packages/alchemy/src/index.ts | 6 +- packages/alchemy/src/middleware/gas-fees.ts | 2 +- .../alchemy/src/middleware/gas-manager.ts | 2 +- .../alchemy/src/middleware/simulate-uo.ts | 2 +- .../__snapshots__/light-account.test.ts.snap} | 0 .../__tests__/light-account.test.ts} | 28 ++----- .../src/{provider.ts => provider/base.ts} | 33 ++++---- packages/alchemy/src/provider/index.ts | 2 + .../alchemy/src/provider/light-account.ts | 36 +++++++++ packages/alchemy/src/schema.ts | 4 + packages/alchemy/src/type.ts | 7 +- packages/core/src/index.ts | 5 +- site/.vitepress/config.ts | 8 ++ .../aa-accounts/light-account/constructor.md | 2 +- .../aa-accounts/light-account/provider.md | 65 ++++++++++++++++ .../provider/light-account-factory.md | 69 +++++++++++++++++ site/packages/aa-core/accounts/constructor.md | 2 +- site/smart-accounts/accounts/light-account.md | 2 - .../accounts/modular-account.md | 6 +- .../light-account-alchemy-provider.ts | 9 +++ site/snippets/light-account-provider.ts | 9 +++ 31 files changed, 380 insertions(+), 159 deletions(-) create mode 100644 packages/accounts/src/light-account/provider.ts create mode 100644 packages/accounts/src/light-account/schema.ts create mode 100644 packages/accounts/src/light-account/types.ts rename packages/alchemy/e2e-tests/{simple-account.test.ts => light-account.test.ts} (83%) rename packages/alchemy/src/{__tests__/__snapshots__/provider.test.ts.snap => provider/__tests__/__snapshots__/light-account.test.ts.snap} (100%) rename packages/alchemy/src/{__tests__/provider.test.ts => provider/__tests__/light-account.test.ts} (88%) rename packages/alchemy/src/{provider.ts => provider/base.ts} (82%) create mode 100644 packages/alchemy/src/provider/index.ts create mode 100644 packages/alchemy/src/provider/light-account.ts create mode 100644 site/packages/aa-accounts/light-account/provider.md create mode 100644 site/packages/aa-alchemy/provider/light-account-factory.md create mode 100644 site/snippets/light-account-alchemy-provider.ts create mode 100644 site/snippets/light-account-provider.ts diff --git a/packages/accounts/package.json b/packages/accounts/package.json index 5128b80e51..034179d2c8 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -39,7 +39,6 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { - "@alchemy/aa-alchemy": "^1.2.0", "@alchemy/aa-core": "^1.2.0", "typescript": "^5.0.4", "typescript-template": "*", diff --git a/packages/accounts/src/index.ts b/packages/accounts/src/index.ts index 15e958c25e..d9b48f31d7 100644 --- a/packages/accounts/src/index.ts +++ b/packages/accounts/src/index.ts @@ -19,4 +19,10 @@ export type { KernelBaseValidatorParams } from "./kernel-zerodev/validator/base. //light-account exports export { LightSmartContractAccount } from "./light-account/account.js"; +export { createLightAccountProvider } from "./light-account/provider.js"; +export { + LightAccountFactoryConfigSchema, + LightAccountProviderConfigSchema, +} from "./light-account/schema.js"; +export type { LightAccountProviderConfig } from "./light-account/types.js"; export { getDefaultLightAccountFactoryAddress } from "./light-account/utils.js"; diff --git a/packages/accounts/src/light-account/__tests__/account.test.ts b/packages/accounts/src/light-account/__tests__/account.test.ts index 2abd187774..e972955934 100644 --- a/packages/accounts/src/light-account/__tests__/account.test.ts +++ b/packages/accounts/src/light-account/__tests__/account.test.ts @@ -1,13 +1,12 @@ import { LocalAccountSigner, - SmartAccountProvider, type BatchUserOperationCallData, type SmartAccountSigner, } from "@alchemy/aa-core"; import { polygonMumbai, type Chain } from "viem/chains"; import { describe, it } from "vitest"; import { LightSmartContractAccount } from "../account.js"; -import { getDefaultLightAccountFactoryAddress } from "../utils.js"; +import { createLightAccountProvider } from "../provider.js"; const chain = polygonMumbai; @@ -82,22 +81,10 @@ const givenConnectedProvider = ({ }: { owner: SmartAccountSigner; chain: Chain; -}) => { - return new SmartAccountProvider({ - rpcProvider: `${chain.rpcUrls.alchemy.http[0]}/${"test"}`, +}) => + createLightAccountProvider({ + owner, chain, - }).connect((provider) => { - const account = new LightSmartContractAccount({ - chain, - owner, - factoryAddress: getDefaultLightAccountFactoryAddress(chain), - rpcClient: provider, - }); - - account.getAddress = vi.fn( - async () => "0xb856DBD4fA1A79a46D426f537455e7d3E79ab7c4" - ); - - return account; + rpcProvider: `${chain.rpcUrls.alchemy.http[0]}/${"test"}`, + accountAddress: "0xb856DBD4fA1A79a46D426f537455e7d3E79ab7c4", }); -}; diff --git a/packages/accounts/src/light-account/e2e-tests/light-account.test.ts b/packages/accounts/src/light-account/e2e-tests/light-account.test.ts index 48afbc762a..4a94d0c7cf 100644 --- a/packages/accounts/src/light-account/e2e-tests/light-account.test.ts +++ b/packages/accounts/src/light-account/e2e-tests/light-account.test.ts @@ -1,4 +1,3 @@ -import { AlchemyProvider } from "@alchemy/aa-alchemy"; import { LocalAccountSigner, Logger, @@ -8,6 +7,7 @@ import { } from "@alchemy/aa-core"; import { isAddress, + toHex, type Address, type Chain, type Hash, @@ -16,13 +16,12 @@ import { import { generatePrivateKey } from "viem/accounts"; import { sepolia } from "viem/chains"; import { - getDefaultLightAccountFactoryAddress, + createLightAccountProvider, LightSmartContractAccount, } from "../../index.js"; import { API_KEY, LIGHT_ACCOUNT_OWNER_MNEMONIC, - PAYMASTER_POLICY_ID, UNDEPLOYED_OWNER_MNEMONIC, } from "./constants.js"; @@ -155,6 +154,11 @@ describe("Light Account Tests", () => { }); it("should transfer ownership successfully", async () => { + const provider = givenConnectedProvider({ + owner, + chain, + }); + // create a throwaway address const throwawayOwner = LocalAccountSigner.privateKeyToAccountSigner( generatePrivateKey() @@ -164,24 +168,32 @@ describe("Light Account Tests", () => { chain, }); + const oldOwner = await throwawayOwner.getAddress(); + + // fund the throwaway address + await provider.sendTransaction({ + from: await provider.getAddress(), + to: await throwawayProvider.getAddress(), + data: "0x", + value: toHex(1000000000000000n), + }); + // create new owner and transfer ownership const newThrowawayOwner = LocalAccountSigner.privateKeyToAccountSigner( generatePrivateKey() ); - const result = await LightSmartContractAccount.transferOwnership( + await LightSmartContractAccount.transferOwnership( throwawayProvider, - newThrowawayOwner + newThrowawayOwner, + true ); - const txnHash = throwawayProvider.waitForUserOperationTransaction(result); - await expect(txnHash).resolves.not.toThrowError(); + const newOwnerViaProvider = + await throwawayProvider.account.getOwnerAddress(); + const newOwner = await newThrowawayOwner.getAddress(); - expect(await throwawayProvider.account.getOwnerAddress()).not.toBe( - await throwawayOwner.getAddress() - ); - expect(await throwawayProvider.account.getOwnerAddress()).toBe( - await newThrowawayOwner.getAddress() - ); + expect(newOwnerViaProvider).not.toBe(oldOwner); + expect(newOwnerViaProvider).toBe(newOwner); }, 100000); }); @@ -196,29 +208,16 @@ const givenConnectedProvider = ({ accountAddress?: Address; feeOptions?: UserOperationFeeOptions; }) => { - const provider = new AlchemyProvider({ - apiKey: API_KEY!, + const provider = createLightAccountProvider({ + rpcProvider: `${chain.rpcUrls.alchemy.http[0]}/${API_KEY!}`, chain, + owner, + accountAddress, opts: { - txMaxRetries: 10, - feeOptions: { - maxFeePerGas: { percentage: 100 }, - maxPriorityFeePerGas: { percentage: 100 }, - ...feeOptions, - }, + feeOptions, + txMaxRetries: 100, }, - }).connect( - (rpcClient) => - new LightSmartContractAccount({ - chain, - owner, - factoryAddress: getDefaultLightAccountFactoryAddress(chain), - rpcClient, - accountAddress, - }) - ); - provider.withAlchemyGasManager({ - policyId: PAYMASTER_POLICY_ID, }); + return provider; }; diff --git a/packages/accounts/src/light-account/provider.ts b/packages/accounts/src/light-account/provider.ts new file mode 100644 index 0000000000..9a9788a748 --- /dev/null +++ b/packages/accounts/src/light-account/provider.ts @@ -0,0 +1,31 @@ +import { SmartAccountProvider } from "@alchemy/aa-core"; +import { LightSmartContractAccount } from "./account.js"; +import { LightAccountProviderConfigSchema } from "./schema.js"; +import type { LightAccountProviderConfig } from "./types.js"; +import { getDefaultLightAccountFactoryAddress } from "./utils.js"; + +export const createLightAccountProvider = ( + config_: LightAccountProviderConfig +): SmartAccountProvider & { account: LightSmartContractAccount } => { + const config = LightAccountProviderConfigSchema.parse(config_); + + return new SmartAccountProvider({ + rpcProvider: config.rpcProvider, + chain: config.chain, + entryPointAddress: config.entryPointAddress, + opts: config.opts, + }).connect( + (rpcClient) => + new LightSmartContractAccount({ + rpcClient, + initCode: config.initCode, + owner: config.owner, + chain: config.chain, + entryPointAddress: config.entryPointAddress, + factoryAddress: + config.factoryAddress ?? + getDefaultLightAccountFactoryAddress(config.chain), + accountAddress: config.accountAddress, + }) + ); +}; diff --git a/packages/accounts/src/light-account/schema.ts b/packages/accounts/src/light-account/schema.ts new file mode 100644 index 0000000000..6a7ef76eb4 --- /dev/null +++ b/packages/accounts/src/light-account/schema.ts @@ -0,0 +1,25 @@ +import { + SignerSchema, + createSmartAccountProviderConfigSchema, +} from "@alchemy/aa-core"; +import { Address } from "abitype/zod"; +import { isHex } from "viem"; +import { z } from "zod"; + +export const LightAccountFactoryConfigSchema = z.object({ + owner: SignerSchema, + accountAddress: Address.optional().describe( + "Optional override for the account address." + ), + initCode: z + .string() + .refine(isHex, "initCode must be a valid hex.") + .optional() + .describe("Optional override for the account init code."), + factoryAddress: Address.optional().describe( + "Optional override for the factory address which deploys the smart account." + ), +}); + +export const LightAccountProviderConfigSchema = + createSmartAccountProviderConfigSchema().and(LightAccountFactoryConfigSchema); diff --git a/packages/accounts/src/light-account/types.ts b/packages/accounts/src/light-account/types.ts new file mode 100644 index 0000000000..a116f4ed11 --- /dev/null +++ b/packages/accounts/src/light-account/types.ts @@ -0,0 +1,6 @@ +import { z } from "zod"; +import { LightAccountProviderConfigSchema } from "./schema.js"; + +export type LightAccountProviderConfig = z.input< + typeof LightAccountProviderConfigSchema +>; diff --git a/packages/alchemy/e2e-tests/constants.ts b/packages/alchemy/e2e-tests/constants.ts index bd350fcd31..c82fcd13b4 100644 --- a/packages/alchemy/e2e-tests/constants.ts +++ b/packages/alchemy/e2e-tests/constants.ts @@ -1,3 +1,4 @@ export const API_KEY = process.env.API_KEY!; -export const OWNER_MNEMONIC = process.env.OWNER_MNEMONIC!; export const PAYMASTER_POLICY_ID = process.env.PAYMASTER_POLICY_ID!; +export const LIGHT_ACCOUNT_OWNER_MNEMONIC = + process.env.LIGHT_ACCOUNT_OWNER_MNEMONIC!; diff --git a/packages/alchemy/e2e-tests/simple-account.test.ts b/packages/alchemy/e2e-tests/light-account.test.ts similarity index 83% rename from packages/alchemy/e2e-tests/simple-account.test.ts rename to packages/alchemy/e2e-tests/light-account.test.ts index 651d770cb9..84524d1369 100644 --- a/packages/alchemy/e2e-tests/simple-account.test.ts +++ b/packages/alchemy/e2e-tests/light-account.test.ts @@ -1,33 +1,26 @@ import type { UserOperationOverrides } from "@alchemy/aa-core"; import { - LogLevel, - Logger, - SimpleSmartContractAccount, - getDefaultSimpleAccountFactoryAddress, type SmartAccountSigner, type UserOperationFeeOptions, } from "@alchemy/aa-core"; import { Alchemy, Network } from "alchemy-sdk"; -import { - toHex, - type Address, - type Chain, - type HDAccount, - type Hash, -} from "viem"; +import { toHex, type Address, type Chain, type Hash } from "viem"; import { mnemonicToAccount } from "viem/accounts"; import { sepolia } from "viem/chains"; -import { AlchemyProvider } from "../src/provider.js"; -import { API_KEY, OWNER_MNEMONIC, PAYMASTER_POLICY_ID } from "./constants.js"; +import { createLightAccountAlchemyProvider } from "../src/index.js"; +import { + API_KEY, + LIGHT_ACCOUNT_OWNER_MNEMONIC, + PAYMASTER_POLICY_ID, +} from "./constants.js"; const chain = sepolia; const network = Network.ETH_SEPOLIA; -Logger.setLogLevel(LogLevel.DEBUG); - -describe("Simple Account Tests", () => { - const ownerAccount = mnemonicToAccount(OWNER_MNEMONIC); - const owner: SmartAccountSigner = { +describe("Light Account Tests", () => { + const ownerAccount = mnemonicToAccount(LIGHT_ACCOUNT_OWNER_MNEMONIC); + const owner: SmartAccountSigner = { + inner: ownerAccount, signMessage: async (msg) => ownerAccount.signMessage({ message: { raw: toHex(msg) }, @@ -35,13 +28,12 @@ describe("Simple Account Tests", () => { signTypedData: async () => "0xHash", getAddress: async () => ownerAccount.address, signerType: "aa-sdk-tests", - inner: ownerAccount, }; it("should successfully get counterfactual address", async () => { const provider = givenConnectedProvider({ owner, chain }); expect(await provider.getAddress()).toMatchInlineSnapshot( - `"0xb856DBD4fA1A79a46D426f537455e7d3E79ab7c4"` + `"0x1a3a89cd46f124EF40848966c2D7074a575dbC27"` ); }); @@ -222,8 +214,8 @@ describe("Simple Account Tests", () => { const address = await provider.getAddress(); const balances = await provider.core.getTokenBalances(address); - expect(balances.tokenBalances.length).toMatchInlineSnapshot(`4`); - }, 100000); + expect(balances.tokenBalances.length).toMatchInlineSnapshot("1"); + }, 50000); it("should get owned nfts for the smart account", async () => { const alchemy = new Alchemy({ @@ -257,29 +249,8 @@ describe("Simple Account Tests", () => { value: 1n, }); - expect(simulatedAssetChanges.changes.length).toEqual(2); - expect( - simulatedAssetChanges.changes.map((change) => ({ - assertType: change.assetType, - changeType: change.changeType, - from: change.from.toLowerCase(), - to: change.to.toLowerCase(), - })) - ).toEqual([ - { - assertType: "NATIVE", - changeType: "TRANSFER", - from: (await provider.getAddress()).toLowerCase(), - to: provider.getEntryPointAddress().toLowerCase(), - }, - { - assertType: "NATIVE", - changeType: "TRANSFER", - from: (await provider.getAddress()).toLowerCase(), - to: provider.getEntryPointAddress().toLowerCase(), - }, - ]); - }, 100000); + expect(simulatedAssetChanges.changes.length).toMatchInlineSnapshot("2"); + }, 50000); it("should simulate as part of middleware stack when added to provider", async () => { const provider = givenConnectedProvider({ @@ -310,9 +281,10 @@ const givenConnectedProvider = ({ accountAddress?: Address; feeOptions?: UserOperationFeeOptions; }) => - new AlchemyProvider({ + createLightAccountAlchemyProvider({ apiKey: API_KEY!, chain, + owner, opts: { txMaxRetries: 10, feeOptions: { @@ -321,13 +293,5 @@ const givenConnectedProvider = ({ maxPriorityFeePerGas: { percentage: 50 }, }, }, - }).connect( - (provider) => - new SimpleSmartContractAccount({ - chain, - owner, - factoryAddress: getDefaultSimpleAccountFactoryAddress(chain), - rpcClient: provider, - accountAddress, - }) - ); + accountAddress, + }); diff --git a/packages/alchemy/package.json b/packages/alchemy/package.json index 3dc9f8037b..3b4f76d501 100644 --- a/packages/alchemy/package.json +++ b/packages/alchemy/package.json @@ -39,6 +39,7 @@ "test:run-e2e": "vitest run --config vitest.config.e2e.ts" }, "devDependencies": { + "@alchemy/aa-accounts": "^1.2.0", "@alchemy/aa-core": "^1.2.0", "typescript": "^5.0.4", "typescript-template": "*", @@ -62,6 +63,7 @@ "homepage": "https://github.com/alchemyplatform/aa-sdk#readme", "gitHead": "ee46e8bb857de3b631044fa70714ea706d9e317d", "optionalDependencies": { + "@alchemy/aa-accounts": "^1.2.0", "alchemy-sdk": "^3.0.0" } } diff --git a/packages/alchemy/src/index.ts b/packages/alchemy/src/index.ts index c722ae0cc7..59a030dbe9 100644 --- a/packages/alchemy/src/index.ts +++ b/packages/alchemy/src/index.ts @@ -3,5 +3,9 @@ export { withAlchemyGasManager } from "./middleware/gas-manager.js"; export { SupportedChains } from "./chains.js"; -export { AlchemyProvider } from "./provider.js"; +export { + AlchemyProvider, + createLightAccountAlchemyProvider, +} from "./provider/index.js"; +export { AlchemyProviderConfigSchema } from "./schema.js"; export type { AlchemyProviderConfig } from "./type.js"; diff --git a/packages/alchemy/src/middleware/gas-fees.ts b/packages/alchemy/src/middleware/gas-fees.ts index 92992dbd91..34affb3137 100644 --- a/packages/alchemy/src/middleware/gas-fees.ts +++ b/packages/alchemy/src/middleware/gas-fees.ts @@ -1,5 +1,5 @@ import { applyUserOpOverrideOrFeeOption } from "@alchemy/aa-core"; -import type { AlchemyProvider } from "../provider.js"; +import type { AlchemyProvider } from "../provider/base.js"; import type { ClientWithAlchemyMethods } from "./client.js"; export const withAlchemyGasFeeEstimator = ( diff --git a/packages/alchemy/src/middleware/gas-manager.ts b/packages/alchemy/src/middleware/gas-manager.ts index b1fc6eabb1..b21a55e3d4 100644 --- a/packages/alchemy/src/middleware/gas-manager.ts +++ b/packages/alchemy/src/middleware/gas-manager.ts @@ -11,7 +11,7 @@ import { type UserOperationRequest, } from "@alchemy/aa-core"; import { fromHex } from "viem"; -import type { AlchemyProvider } from "../provider.js"; +import type { AlchemyProvider } from "../provider/base.js"; import type { ClientWithAlchemyMethods } from "./client.js"; import type { RequestGasAndPaymasterAndDataOverrides } from "./types/index.js"; diff --git a/packages/alchemy/src/middleware/simulate-uo.ts b/packages/alchemy/src/middleware/simulate-uo.ts index 0f50a64a7a..a4e7ee34f7 100644 --- a/packages/alchemy/src/middleware/simulate-uo.ts +++ b/packages/alchemy/src/middleware/simulate-uo.ts @@ -3,7 +3,7 @@ import { resolveProperties, type UserOperationStruct, } from "@alchemy/aa-core"; -import type { AlchemyProvider } from "../provider.js"; +import type { AlchemyProvider } from "../provider/index.js"; import type { ClientWithAlchemyMethods } from "./client.js"; export const withAlchemyUserOpSimulation =

( diff --git a/packages/alchemy/src/__tests__/__snapshots__/provider.test.ts.snap b/packages/alchemy/src/provider/__tests__/__snapshots__/light-account.test.ts.snap similarity index 100% rename from packages/alchemy/src/__tests__/__snapshots__/provider.test.ts.snap rename to packages/alchemy/src/provider/__tests__/__snapshots__/light-account.test.ts.snap diff --git a/packages/alchemy/src/__tests__/provider.test.ts b/packages/alchemy/src/provider/__tests__/light-account.test.ts similarity index 88% rename from packages/alchemy/src/__tests__/provider.test.ts rename to packages/alchemy/src/provider/__tests__/light-account.test.ts index f37e1a79fe..f396995bbc 100644 --- a/packages/alchemy/src/__tests__/provider.test.ts +++ b/packages/alchemy/src/provider/__tests__/light-account.test.ts @@ -1,6 +1,5 @@ import * as AACoreModule from "@alchemy/aa-core"; import { - SimpleSmartContractAccount, getDefaultEntryPointAddress, type BatchUserOperationCallData, type SmartAccountSigner, @@ -9,7 +8,8 @@ import { Alchemy, Network } from "alchemy-sdk"; import { toHex, type Address, type Chain, type HDAccount } from "viem"; import { mnemonicToAccount } from "viem/accounts"; import { polygonMumbai } from "viem/chains"; -import { AlchemyProvider } from "../provider.js"; +import { AlchemyProvider } from "../base.js"; +import { createLightAccountAlchemyProvider } from "../light-account.js"; describe("Alchemy Provider Tests", () => { const dummyMnemonic = @@ -140,27 +140,9 @@ const givenConnectedProvider = ({ }: { owner: SmartAccountSigner; chain: Chain; -}) => { - const dummyEntryPointAddress = - "0x1234567890123456789012345678901234567890" as Address; - - return new AlchemyProvider({ - rpcUrl: chain.rpcUrls.alchemy.http[0], +}) => + createLightAccountAlchemyProvider({ jwt: "test", + owner, chain, - }).connect((provider) => { - const account = new SimpleSmartContractAccount({ - entryPointAddress: dummyEntryPointAddress, - chain, - owner, - factoryAddress: AACoreModule.getDefaultSimpleAccountFactoryAddress(chain), - rpcClient: provider, - }); - - account.getAddress = vi.fn( - async () => "0xb856DBD4fA1A79a46D426f537455e7d3E79ab7c4" - ); - - return account; }); -}; diff --git a/packages/alchemy/src/provider.ts b/packages/alchemy/src/provider/base.ts similarity index 82% rename from packages/alchemy/src/provider.ts rename to packages/alchemy/src/provider/base.ts index 607e54572c..48f284dbce 100644 --- a/packages/alchemy/src/provider.ts +++ b/packages/alchemy/src/provider/base.ts @@ -8,20 +8,20 @@ import { } from "@alchemy/aa-core"; import { Alchemy } from "alchemy-sdk"; import { type HttpTransport } from "viem"; -import { SupportedChains } from "./chains.js"; -import { getDefaultUserOperationFeeOptions } from "./defaults.js"; -import type { ClientWithAlchemyMethods } from "./middleware/client.js"; -import { withAlchemyGasFeeEstimator } from "./middleware/gas-fees.js"; +import { SupportedChains } from "../chains.js"; +import { getDefaultUserOperationFeeOptions } from "../defaults.js"; +import type { ClientWithAlchemyMethods } from "../middleware/client.js"; +import { withAlchemyGasFeeEstimator } from "../middleware/gas-fees.js"; import { withAlchemyGasManager, type AlchemyGasManagerConfig, -} from "./middleware/gas-manager.js"; -import { withAlchemyUserOpSimulation } from "./middleware/simulate-uo.js"; +} from "../middleware/gas-manager.js"; +import { withAlchemyUserOpSimulation } from "../middleware/simulate-uo.js"; import { AlchemyProviderConfigSchema, AlchemySdkClientSchema, -} from "./schema.js"; -import type { AlchemyProviderConfig } from "./type.js"; +} from "../schema.js"; +import type { AlchemyProviderConfig } from "../type.js"; export class AlchemyProvider extends SmartAccountProvider { private rpcUrl: string; @@ -109,9 +109,9 @@ export class AlchemyProvider extends SmartAccountProvider { } /** - * This methods adds the Alchemy UserOperation Simulation middleware to the provider. + * This method adds the Alchemy UserOperation Simulation middleware to the provider. * - * @returns {AlchemyProvider} - a new AlchemyProvider with the UserOperation Simulation middleware + * @returns {AlchemyProvider} - a new AlchemyProvider with UserOperation Simulation middleware */ withAlchemyUserOpSimulation(): this { if (!this.isConnected()) { @@ -124,14 +124,17 @@ export class AlchemyProvider extends SmartAccountProvider { } /** - * This methods adds Alchemy Enhanced APIs to the provider, via an optional dependency on `alchemy-sdk`. + * This method adds Alchemy Enhanced APIs to the provider, via an optional dependency on + * `alchemy-sdk`. * @see: https://github.com/alchemyplatform/alchemy-sdk-js * - * The Alchemy SDK client must be configured with the same API key and network as the AlchemyProvider. - * This method validates such at runtime. + * The Alchemy SDK client must be configured with the same API key and network as the + * AlchemyProvider. This method validates such at runtime. + * + * Additionally, since the Alchemy SDK client does not yet support JWT authentication, + * AlchemyProvider initialized with JWTs cannot use this method. They must be initialized with an + * API key or RPC URL. * - * Additionally, since the Alchemy SDK client does not yet support JWT authentication, AlchemyProviders initialized with JWTs cannot use this method. - * They must be initialized with an API key or RPC URL. * There is an open issue on the Alchemy SDK repo to add JWT support in the meantime. * @see: https://github.com/alchemyplatform/alchemy-sdk-js/issues/386 * diff --git a/packages/alchemy/src/provider/index.ts b/packages/alchemy/src/provider/index.ts new file mode 100644 index 0000000000..1919a474c0 --- /dev/null +++ b/packages/alchemy/src/provider/index.ts @@ -0,0 +1,2 @@ +export { AlchemyProvider } from "./base.js"; +export { createLightAccountAlchemyProvider } from "./light-account.js"; diff --git a/packages/alchemy/src/provider/light-account.ts b/packages/alchemy/src/provider/light-account.ts new file mode 100644 index 0000000000..3c89ab9d4d --- /dev/null +++ b/packages/alchemy/src/provider/light-account.ts @@ -0,0 +1,36 @@ +import { + getDefaultLightAccountFactoryAddress, + LightSmartContractAccount, +} from "@alchemy/aa-accounts"; +import { LightAccountAlchemyProviderConfigSchema } from "../schema.js"; +import type { LightAccountAlchemyProviderConfig } from "../type.js"; +import { AlchemyProvider } from "./base.js"; + +/** + * This method improves the developer experience of connecting a Light Account to an + * AlchemyProvider via an optional dependency on the `@alchemy/aa-accounts` package. + * @see: https://github.com/alchemyplatform/aa-sdk/tree/development/packages/accounts + * + * @param config_ - the AlchemyProvider configuration with additional pamaeters for Light Account + * @returns - a new AlchemyProvider connected to a Light Account + */ +export const createLightAccountAlchemyProvider = ( + config_: LightAccountAlchemyProviderConfig +): AlchemyProvider & { account: LightSmartContractAccount } => { + const config = LightAccountAlchemyProviderConfigSchema.parse(config_); + + return new AlchemyProvider(config).connect( + (rpcClient) => + new LightSmartContractAccount({ + rpcClient, + initCode: config.initCode, + owner: config.owner, + chain: config.chain, + entryPointAddress: config.entryPointAddress, + factoryAddress: + config.factoryAddress ?? + getDefaultLightAccountFactoryAddress(config.chain), + accountAddress: config.accountAddress, + }) + ); +}; diff --git a/packages/alchemy/src/schema.ts b/packages/alchemy/src/schema.ts index a36c4e30e7..108725df6f 100644 --- a/packages/alchemy/src/schema.ts +++ b/packages/alchemy/src/schema.ts @@ -1,3 +1,4 @@ +import { LightAccountFactoryConfigSchema } from "@alchemy/aa-accounts"; import { createSmartAccountProviderConfigSchema } from "@alchemy/aa-core"; import { Alchemy } from "alchemy-sdk"; import z from "zod"; @@ -31,3 +32,6 @@ export const AlchemyProviderConfigSchema = .and(ConnectionConfigSchema); export const AlchemySdkClientSchema = z.instanceof(Alchemy); + +export const LightAccountAlchemyProviderConfigSchema = + AlchemyProviderConfigSchema.and(LightAccountFactoryConfigSchema); diff --git a/packages/alchemy/src/type.ts b/packages/alchemy/src/type.ts index 306ef79aeb..7d038537d1 100644 --- a/packages/alchemy/src/type.ts +++ b/packages/alchemy/src/type.ts @@ -2,8 +2,13 @@ import { z } from "zod"; import type { AlchemyProviderConfigSchema, ConnectionConfigSchema, -} from "./schema"; + LightAccountAlchemyProviderConfigSchema, +} from "./schema.js"; export type ConnectionConfig = z.infer; export type AlchemyProviderConfig = z.infer; + +export type LightAccountAlchemyProviderConfig = z.infer< + typeof LightAccountAlchemyProviderConfigSchema +>; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c6dada652f..73b2c0d985 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,7 +7,10 @@ export { SimpleAccountAbi } from "./abis/SimpleAccountAbi.js"; export { SimpleAccountFactoryAbi } from "./abis/SimpleAccountFactoryAbi.js"; export { BaseSmartContractAccount } from "./account/base.js"; -export { createBaseSmartAccountParamsSchema } from "./account/schema.js"; +export { + SimpleSmartAccountParamsSchema, + createBaseSmartAccountParamsSchema, +} from "./account/schema.js"; export { SimpleSmartContractAccount } from "./account/simple.js"; export type * from "./account/types.js"; export type { BaseSmartAccountParams } from "./account/types.js"; diff --git a/site/.vitepress/config.ts b/site/.vitepress/config.ts index d66b359e9e..8578075996 100644 --- a/site/.vitepress/config.ts +++ b/site/.vitepress/config.ts @@ -530,6 +530,10 @@ export default defineConfig({ text: "constructor", link: "/constructor", }, + { + text: "factory", + link: "/light-account-factory", + }, { text: "gasEstimator", link: "/gasEstimator" }, { text: "simulateUserOperationAssetChanges", @@ -608,6 +612,10 @@ export default defineConfig({ text: "constructor", link: "/constructor", }, + { + text: "provider", + link: "/provider", + }, { text: "signMessageWith6492", link: "/signMessageWith6492", diff --git a/site/packages/aa-accounts/light-account/constructor.md b/site/packages/aa-accounts/light-account/constructor.md index f4034bfdc1..cb67fcad4e 100644 --- a/site/packages/aa-accounts/light-account/constructor.md +++ b/site/packages/aa-accounts/light-account/constructor.md @@ -73,6 +73,6 @@ A new instance of a `LightSmartContractAccount`. - `entryPointAddress: Address | undefined` -- [optional] entry point contract address. If not provided, the entry point contract address for the provider is the connected account's entry point contract, or if not connected, falls back to the default entry point contract for the chain. See [getDefaultEntryPointAddress](/packages/aa-core/utils/getDefaultEntryPointAddress.html#getdefaultentrypointaddress). -- `accountAddress: Address | undefined` -- the owner EOA address responsible for signing user operations on behalf of the smart account. +- `accountAddress: Address | undefined` -- [optional] a smart account address override that this object will manage instead of generating its own. - `index: bigint | undefined` -- [optional] additional salt value used when creating the smart account. diff --git a/site/packages/aa-accounts/light-account/provider.md b/site/packages/aa-accounts/light-account/provider.md new file mode 100644 index 0000000000..10f9a23fc2 --- /dev/null +++ b/site/packages/aa-accounts/light-account/provider.md @@ -0,0 +1,65 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: LightSmartContractAccount • createLightAccountProvider + - - meta + - name: description + content: Overview of the createLightAccountProvider factory in aa-accounts + - - meta + - property: og:description + content: Overview of the createLightAccountProvider factory in aa-accounts +--- + +# createLightAccountProvider + +`createLightAccountProvider` is a factory that improves the developer experience of connecting a Light Account to a `SmartAccountProvider`. You can use this to directly instantiate a `SmartAccountProvider` already connected to a Light Account in one line of code. + +## Usage + +::: code-group + +<<< @/snippets/light-account-provider.ts +::: + +## Returns + +### `Promise` + +A Promise containing a new `SmartAccountProvider` connected to a Light Account. + +## Parameters + +### `config: LightAccountProviderConfig` + +- `rpcProvider: string | PublicErc4337Client` -- a JSON-RPC URL, or a viem Client that supports ERC-4337 methods and Viem public actions. See [createPublicErc4337Client](/packages/aa-core/client/createPublicErc4337Client.md). + +- `chain: Chain` -- the chain on which to create the provider. + +- `owner: SmartAccountSigner` -- the owner EOA address responsible for signing user operations on behalf of the smart account. + +- `entryPointAddress: Address | undefined` -- [optional] the entry point contract address. If not provided, the entry point contract address for the provider is the connected account's entry point contract, or if not connected, falls back to the default entry point contract for the chain. See [getDefaultEntryPointAddress](/packages/aa-core/utils/getDefaultEntryPointAddress.html#getdefaultentrypointaddress). + +- `opts: SmartAccountProviderOpts | undefined` -- [optional] overrides on provider config variables having to do with fetching transaction receipts and fee computation. + + - `txMaxRetries: string | undefined` -- [optional] the maximum number of times to try fetching a transaction receipt before giving up (default: 5). + + - `txRetryIntervalMs: string | undefined` -- [optional] the interval in milliseconds to wait between retries while waiting for transaction receipts (default: 2_000). + + - `txRetryMulitplier: string | undefined` -- [optional] the mulitplier on interval length to wait between retries while waiting for transaction receipts (default: 1.5). + + - `feeOptions:` [`UserOperationFeeOptions`](/packages/aa-core/types/userOperationFeeOptions.md) `| undefined` --[optional] user operation fee options to be used for gas estimation, set at the global level on the provider. + If not set, default fee options for the chain are used. Available fields in `feeOptions` include `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` where each field is of type [`UserOperationFeeOptionsField`](/packages/aa-core/types/userOperationFeeOptionsField.md). + + - `maxFeePerGas`: `UserOperationFeeOptionsField` + - `maxPriorityFeePerGas`: `UserOperationFeeOptionsField` + - `callGasLimit`: `UserOperationFeeOptionsField` + - `verificationGasLimit`: `UserOperationFeeOptionsField` + - `preVerificationGas`: `UserOperationFeeOptionsField` + +- `factoryAddress: Address | undefined` -- [optional] the factory address for the smart account implementation, which is required for creating the account if not already deployed. Defaults to the [getDefaultLightAccountFactoryAddress](/packages/aa-accounts/utils/getDefaultLightAccountFactoryAddress.md) + +- `initCode: Hex | undefined` -- [optional] the initCode for deploying the smart account with which the provider will connect. + +- `accountAddress: Address | undefined` -- [optional] a smart account address override that this object will manage instead of generating its own. diff --git a/site/packages/aa-alchemy/provider/light-account-factory.md b/site/packages/aa-alchemy/provider/light-account-factory.md new file mode 100644 index 0000000000..c9fbd12996 --- /dev/null +++ b/site/packages/aa-alchemy/provider/light-account-factory.md @@ -0,0 +1,69 @@ +--- +outline: deep +head: + - - meta + - property: og:title + content: AlchemyProvider • createLightAccountAlchemyProvider + - - meta + - name: description + content: Overview of the createLightAccountAlchemyProvider factory in aa-alchemy + - - meta + - property: og:description + content: Overview of the createLightAccountAlchemyProvider factory in aa-alchemy +--- + +# createLightAccountAlchemyProvider + +`createLightAccountAlchemyProvider` is a factory that improves the developer experience of connecting a Light Account to an `AlchemyProvider` via an optional dependency on the [`@alchemy/aa-accounts`](https://github.com/alchemyplatform/aa-sdk/tree/development/packages/accounts) package. You can use this to directly instantiate an `AlchemyProvider` already connected to a Light Account in one line of code. + +## Usage + +::: code-group + +<<< @/snippets/light-account-alchemy-provider.ts +::: + +## Returns + +### `Promise` + +A Promise containing a new `AlchemyProvider` connected to a Light Account. + +## Parameters + +### `config: AlchemyProviderConfig` + +- `rpcUrl: string | undefined | never` -- a JSON-RPC URL. This is required if there is no `apiKey`. + +- `apiKey: string | undefined | never` -- an Alchemy API Key. This is required if there is no `rpcUrl` or `jwt`. + +- `jwt: string | undefined | never` -- an Alchemy JWT (JSON web token). This is required if there is no `apiKey`. + +- `chain: Chain` -- the chain on which to create the provider. + +- `owner: SmartAccountSigner` -- the owner EOA address responsible for signing user operations on behalf of the smart account. + +- `entryPointAddress: Address | undefined` -- [optional] the entry point contract address. If not provided, the entry point contract address for the provider is the connected account's entry point contract, or if not connected, falls back to the default entry point contract for the chain. See [getDefaultEntryPointAddress](/packages/aa-core/utils/getDefaultEntryPointAddress.html#getdefaultentrypointaddress). + +- `opts: SmartAccountProviderOpts | undefined` -- [optional] overrides on provider config variables having to do with fetching transaction receipts and fee computation. + + - `txMaxRetries: string | undefined` -- [optional] the maximum number of times to try fetching a transaction receipt before giving up (default: 5). + + - `txRetryIntervalMs: string | undefined` -- [optional] the interval in milliseconds to wait between retries while waiting for transaction receipts (default: 2_000). + + - `txRetryMulitplier: string | undefined` -- [optional] the mulitplier on interval length to wait between retries while waiting for transaction receipts (default: 1.5). + + - `feeOptions:` [`UserOperationFeeOptions`](/packages/aa-core/types/userOperationFeeOptions.md) `| undefined` --[optional] user operation fee options to be used for gas estimation, set at the global level on the provider. + If not set, default fee options for the chain are used. Available fields in `feeOptions` include `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` where each field is of type [`UserOperationFeeOptionsField`](/packages/aa-core/types/userOperationFeeOptionsField.md). + + - `maxFeePerGas`: `UserOperationFeeOptionsField` + - `maxPriorityFeePerGas`: `UserOperationFeeOptionsField` + - `callGasLimit`: `UserOperationFeeOptionsField` + - `verificationGasLimit`: `UserOperationFeeOptionsField` + - `preVerificationGas`: `UserOperationFeeOptionsField` + +- `factoryAddress: Address | undefined` -- [optional] the factory address for the smart account implementation, which is required for creating the account if not already deployed. Defaults to the [getDefaultLightAccountFactoryAddress](/packages/aa-accounts/utils/getDefaultLightAccountFactoryAddress.md) + +- `initCode: Hex | undefined` -- [optional] the initCode for deploying the smart account with which the provider will connect. + +- `accountAddress: Address | undefined` -- [optional] [optional] a smart account address override that this object will manage instead of generating its own. diff --git a/site/packages/aa-core/accounts/constructor.md b/site/packages/aa-core/accounts/constructor.md index deaef158d6..5221a3e718 100644 --- a/site/packages/aa-core/accounts/constructor.md +++ b/site/packages/aa-core/accounts/constructor.md @@ -72,6 +72,6 @@ A new instance of a `SimpleSmartContractAccount`. - `entryPointAddress: Address | undefined` -- [optional] entry point contract address. If not provided, the entry point contract address for the provider is the connected account's entry point contract, or if not connected, falls back to the default entry point contract for the chain. See [getDefaultEntryPointAddress](/packages/aa-core/utils/getDefaultEntryPointAddress.html#getdefaultentrypointaddress). -- `accountAddress: Address | undefined` -- the owner EOA address responsible for signing user operations on behalf of the smart account. +- `accountAddress: Address | undefined` -- [optional] a smart account address override that this object will manage instead of generating its own. - `index: bigint | undefined` -- [optional] additional salt value used when creating the smart account. Allows for a one-to-many creation from one owner address to many smart account addresses. diff --git a/site/smart-accounts/accounts/light-account.md b/site/smart-accounts/accounts/light-account.md index f56a818902..31fe22ea42 100644 --- a/site/smart-accounts/accounts/light-account.md +++ b/site/smart-accounts/accounts/light-account.md @@ -20,8 +20,6 @@ head: # Light Account -**Secure, optimized, and extendable** - ## Overview Light Account is an [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) smart account. We started with the Ethereum Foundation’s canonical [SimpleAccount](https://github.com/eth-infinitism/account-abstraction/blob/develop/contracts/samples/SimpleAccount.sol) and added key improvements. It's fully production-ready with a security [audit](https://github.com/alchemyplatform/light-account/blob/main/Quantstamp-Audit.pdf), gas optimizations, and [ERC-1271](https://eips.ethereum.org/EIPS/eip-1271) signature support. Additionally, Light Account supports ownership transfer to ensure you and your user don't get locked into a particular Signer. diff --git a/site/smart-accounts/accounts/modular-account.md b/site/smart-accounts/accounts/modular-account.md index 85d2864f2d..d969a1ceb2 100644 --- a/site/smart-accounts/accounts/modular-account.md +++ b/site/smart-accounts/accounts/modular-account.md @@ -20,12 +20,16 @@ head: # Modular Account +## Introduction + Soon after the first stable version of [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900), we will release an ERC-6900 compatible Modular Account in Account Kit. It will support new use cases like session keys, account recovery, spending limits, and any ERC-6900 plugin you can imagine. The Light Account is forward-compatible with ERC-6900 so you can optionally upgrade it to the Modular Account once released. Read on to learn more about ERC-6900 and modular accounts. :::tip Note -We are working towards the first stable version of [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900) with [the community](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885). If you're developing a plugin or modular account, we'd love to chat! Join the Modular Accounts [Telegram group](https://t.me/+KfB9WuhKDgk5YzIx) or [say hello](mailto:account-abstraction@alchemy.com) to us! +We are working towards the first stable version of [ERC-6900](https://eips.ethereum.org/EIPS/eip-6900) with [the community](https://ethereum-magicians.org/t/erc-6900-modular-smart-contract-accounts-and-plugins/13885). If you're developing a plugin or modular account, we'd love to chat! + +Please join the waitlist [here](https://docs.google.com/forms/d/1Z3wFRiMoEKoo8FJFrymVEOzrbKQXjSnYhm_hKKDnooE/edit). You can also join the modular accounts [Telegram group](https://t.me/+KfB9WuhKDgk5YzIx) or [email](mailto:account-abstraction@alchemy.com) us! ::: ## Motivation diff --git a/site/snippets/light-account-alchemy-provider.ts b/site/snippets/light-account-alchemy-provider.ts new file mode 100644 index 0000000000..f0dc2aa429 --- /dev/null +++ b/site/snippets/light-account-alchemy-provider.ts @@ -0,0 +1,9 @@ +import { createLightAccountAlchemyProvider } from "@alchemy/aa-alchemy"; +import { LocalAccountSigner } from "@alchemy/aa-core"; +import { sepolia } from "viem/chains"; + +export const provider = createLightAccountAlchemyProvider({ + apiKey: "YOUR_API_KEY", + chain: sepolia, + owner: LocalAccountSigner.mnemonicToAccountSigner("OWNER_MNEMONIC"), +}); diff --git a/site/snippets/light-account-provider.ts b/site/snippets/light-account-provider.ts new file mode 100644 index 0000000000..9d3b3b9c32 --- /dev/null +++ b/site/snippets/light-account-provider.ts @@ -0,0 +1,9 @@ +import { createLightAccountProvider } from "@alchemy/aa-accounts"; +import { LocalAccountSigner } from "@alchemy/aa-core"; +import { sepolia } from "viem/chains"; + +export const provider = createLightAccountProvider({ + rpcProvider: `${sepolia.rpcUrls.alchemy.http[0]}/${"YOUR_API_KEY"}`, + chain: sepolia, + owner: LocalAccountSigner.mnemonicToAccountSigner("OWNER_MNEMONIC"), +}); From 77ada09af807df532e20e3bbf7002fc2e7fbfb05 Mon Sep 17 00:00:00 2001 From: Dennis Won Date: Fri, 1 Dec 2023 09:32:15 -0800 Subject: [PATCH 79/79] docs: update alchemy provider constructor doc with updated config (#293) --- .../aa-alchemy/provider/constructor.md | 21 ++++++++++++------- site/packages/aa-core/provider/constructor.md | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/site/packages/aa-alchemy/provider/constructor.md b/site/packages/aa-alchemy/provider/constructor.md index efefaf1074..4d3e1df70d 100644 --- a/site/packages/aa-alchemy/provider/constructor.md +++ b/site/packages/aa-alchemy/provider/constructor.md @@ -66,7 +66,7 @@ A new instance of an `AlchemyProvider`. - `entryPointAddress: Address | undefined` -- [optional] the entry point contract address. If not provided, the entry point contract address for the provider is the connected account's entry point contract, or if not connected, falls back to the default entry point contract for the chain. See [getDefaultEntryPointAddress](/packages/aa-core/utils/getDefaultEntryPointAddress.html#getdefaultentrypointaddress). -- `opts: Object | undefined` -- [optional] overrides on provider config variables having to do with fetching transaction receipts and fee computation. +- `opts: SmartAccountProviderOpts | undefined` -- [optional] overrides on provider config variables having to do with fetching transaction receipts and fee computation. - `txMaxRetries: string | undefined` -- [optional] the maximum number of times to try fetching a transaction receipt before giving up (default: 5). @@ -74,12 +74,19 @@ A new instance of an `AlchemyProvider`. - `txRetryMulitplier: string | undefined` -- [optional] the mulitplier on interval length to wait between retries while waiting for transaction receipts (default: 1.5). - - `minPriorityFeePerBid: string | undefined` --[optional] used when computing the fees for a user operation (default: 100_000_000). + - `feeOptions:` [`UserOperationFeeOptions`](/packages/aa-core/types/userOperationFeeOptions.md) `| undefined` --[optional] user operation fee options to be used for gas estimation, set at the global level on the provider. + If not set, default fee options for the chain are used. Available fields in `feeOptions` include `maxFeePerGas`, `maxPriorityFeePerGas`, `callGasLimit`, `preVerificationGas`, `verificationGasLimit` where each field is of type [`UserOperationFeeOptionsField`](/packages/aa-core/types/userOperationFeeOptionsField.md). -- `feeOpts: Object | undefined` -- [optional] overrides on provider config variables having to do with gas and fee estimation. + - `maxFeePerGas`: `UserOperationFeeOptionsField` + - `maxPriorityFeePerGas`: `UserOperationFeeOptionsField` + - `callGasLimit`: `UserOperationFeeOptionsField` + - `verificationGasLimit`: `UserOperationFeeOptionsField` + - `preVerificationGas`: `UserOperationFeeOptionsField` - - `baseFeeBufferPercent: bigint | undefined` -- [optional] a percent buffer on top of the base fee estimated (default 50%). This is only applied if the default fee estimator is used. - - - `maxPriorityFeeBufferPercent: bigint | undefined` -- [optional] a percent buffer on top of the priority fee estimated (default 5%). This is only applied if the default fee estimator is used. +:::tip Note +The fee options set upon the provider initialization are available from each middleware of the `SmartAccountProvider`. For example, the default middlewares such as [`gasEstimator`](/packages/aa-core/provider/withGasEstimator.md) or [`feeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) apply the fee options to the estimated values if the fee options are set. +::: - - `preVerificationGasBufferPercent: bigint | undefined` -- [optional] a percent buffer on top of the preVerificationGas estimated (default 5% on Arbitrum and Optimism, 0% elsewhere). This is only useful on Arbitrum and Optimism, where the preVerificationGas is dependent on the gas fee during the time of estimation. To improve chances of the `UserOperation` being mined, users can increase the preVerificationGas by a buffer. This buffer will always be charged, regardless of price at time of mine. This is only applied if the default gas estimator is used. +:::tip Note +If you are using your own middleware, for example a custom `feeDataGetter` using [`withFeeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) method on the provider, then the default `feeDataGetter` middleware is overriden. As you are opting out of using the default middleware, you are also responsible for handling the fee options appropriately for the fee options set upon provider initialization. +::: diff --git a/site/packages/aa-core/provider/constructor.md b/site/packages/aa-core/provider/constructor.md index 3019a8f6af..bee8a93198 100644 --- a/site/packages/aa-core/provider/constructor.md +++ b/site/packages/aa-core/provider/constructor.md @@ -79,5 +79,5 @@ The fee options set upon the provider initialization are available from each mid ::: :::tip Note -Note that if you are using your own middleware, for example a custom `feeDataGetter` using [`withFeeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) method on the provider, then the default `feeDataGetter` middleware is overriden. As you are opting out of using the default middleware, you are also responsible for handling the fee options appropriately for the fee options set upon provider initialization. +If you are using your own middleware, for example a custom `feeDataGetter` using [`withFeeDataGetter`](/packages/aa-core/provider/withFeeDataGetter.md) method on the provider, then the default `feeDataGetter` middleware is overriden. As you are opting out of using the default middleware, you are also responsible for handling the fee options appropriately for the fee options set upon provider initialization. :::

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%0AcfK=SQ0&MjPA2e9#s(>z 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�jx=peS;P{xs&--DSeW>jqou$S{1_lfoJPBeUVT%?#cRCJkjIS+e@qlaQhDg3g z=*u7;Lg?@f{)D9rk*9pHIqQaAgGpx#buy9>u~118n~g|*R#G4`BTwDyDK%}Je>Ie} zC;w%AlGyZ1E#@M%j6REmc@E1tvxhVO#kB#R(++erV-*$*sZUdN2CD&0MseT2?7 z&V7U0Uq3z-j3>K`=p5YXiGL2epXX5O^vtDOjqK9O@^QDlf|$J*iq(MtBPixPkIt|O zL!r^UYj&*}-`ILJmX0n=wE#bHO?4M>HOk+YTvbfI=XGOAAA|z$y<$HYHm<*HAAGp} z2bRgT&~1ES#KqvA(hpl@4qU%djY@*6!6%RMx`!w>ZDs6^o2sIfp8r&c+Rx5|?zI-+ zTf@|Ab1p3XXW2HSXrkVlWB;Dn4>6RNu=vl{_9o=mw#W;YEtby@N&j^-DZOMnA5RVk z^H+TSv&w~>3Vm+y?ym?n_FTxMp)~$uPA%OQ#|Ai7zuL6zxbW>yE}vQ_G*7{YJJSCt zsws!pH+zgPVoxLCmy^(rYzes8LyKR_incS>Y;oA*P@{$gVoNlWe2+9}lomUJHF`p2 zZnsVEit1o1CB*lzCt&$)!_%SzC0drg6DULOx}&35Fr)6e1#&RyR?yzZxC9nk@ie&o zMo8YVDg{*f=$|_(6E<&0 z?Y7ka5x%V%MCdax+=O6U?os3s~o&fk3JU0>Ad8P&UEa-n)biE1Wzn4f@>!74!@ln+4)m6Eyc5b#6c>Y*Gyu1^ zArJE6HVt=MZmDP(qQlYJ*UL>$*;lgBPQB&aFFpsMoz7%YHW_G_q7OUN_c|RQ@zU(xt&194 z8J}ShAwd6wCbR36N|}@3JoukKqB2VQFnX{%*Xn=6ubpsmZ{!(yHTO+a7gZ$q7qu{K zo-X+gJs{l0(D>%H=Jk(LxU{6uG5;Mw!nJ8ekC*I`d^%@20@v_BZ$^Yc&X zQ+EIORcuDxe@tX&>&<+baL`|pwT;{xXxdSvX#t-CSNL~_xcvwDH;e1k{e^rk1Uy22 z`<_yF{G>C~XnG}JY|PjHUH&ylG$iCjNI6PR-K?3?eYYKoN_3kNVZORx8XH0{0$v3G zm$XiM*!ff7jmmo++I`C}XQ|g+7})ER)@5y%GT$~?^6EeteGpatA0mN|xV(P)y|(&7 zu~w_!bU{TnY)^qkdOVaBWSqKpfzAWmvs%u$dWHk#&{ZA%c$l;CFSC>Gwz&11HKjVf zd){iQe3wz{^>Yk&v?Y(4!SlQL>$=9Y3LGp8`)5dxlTHg;Qh{%1Mn4j2TD0Aoh&C-) z{3zE!y@9m3B`BF&Z3AQ;mIO2WWrRi0T|$VUOV+_NDK1|r%o-OpWSg1K#9Zy=yVJF9b679Ti#E*%d z_8I9K=kh65A*7*sS+W+!qPPk|Xv@zyA2x%(o|5lQz{Q#&6mMPY@`nMhXfi@xv{=?( zE=%4tXurhevUL6?$7R@rb`tH>yi8sci8yGc*iz*Fc9lm!>3xx@DoauO8lP{D1>&eP zTgTF(C>bm*S&G~XNjH9%3Z-k#ML;erK4G$65n=lX61sEr6IJA(ui}DTq%mF_nA{-_#g}3_)HYXp6KbvQGToN0$gb z8w%A7Wq-O8Din6%*3~L@_`w;b6;Gc0J0 z@S2u9u8TQDZoK@c$m!9vB1rdx7b$1!gezDKUCX5SRu!L$850cKKkQJv@_(~Go!j%F z<<%q0i04#4JEPG%uuaGUv9Gs>=c*uMO1hKSV^dVFnIn_^S<#^`MJ*{sMCJAm0x556 zOy36y5WjDuV7#Ly#7FNhI%2qE2Z&rTMNAcJ`{TO{f%Qdqm8uNvCIL=CGR&IoNT1vl zy9)ZiF0Bzps1tF7cj?GfLa`5E&FUypF$3~2Yh7Tqw^7t#l-PE5z7qeM=;MZLmfKjsVaB6zRjM&>~ z7;E_98w2-eIFqymz2B;>{5}cMv3*c9t)N`Jcwq{^6#Ie69Q@L(YkxSQ4yok}t~J%Z zIkE|QNXD!Dx}F%pe|)JYoct_|>dP^HWZ}kZ{U&0S?u3g=m4BAHQ=Xxeelc4-aq+TT zY|$f7&>sONKxnK^`#lVE)VU0gAep1{Sj#?BO@~*6{_X0b#`ScuMrHATP_idi0;&3z zEFIPBu$X6s{phe@8;-)PbQJ6^PRKrpk7>lL_-3sWJ{hn+Dr7)1nD#J#swK$%aTqdz zDe1^eL5u<CvLhG2Z(r203#j zz)e*f+XzZ)hArb$ZSKh_gU1|rzsW!I-HO+b?6!n{uYoxxZ*_JzS~T` zyW!9jwwHN%`0~6!yRMtz)v7fYr3WuBRyuo0kFbFMye_s;{i%aHsFK><=;XTDX5z*z zDYMcr@;H}Y8lnk2GuN9&f0*4=o-WBpJEr#M->Ja`S~ciBdo6vVZ9}^3N*H+V0=#Af z!%M#?J-e@iY|7tj{!@VX;b}%G{@f*5{Ax!jTI$kgdk{-i-SR#1#crDqI<3Pp+MIQU zg(~3%2nHN+5+(J9ur+K=;W}7%_KF_!RMX!=he~fQbsRwt3|fBptE-H3 z8;KqLpbbx{uV90C{E~03j?sI<4{L0WtA)|k>JERmo8|02)a}j$EWV%h$vzsui7K@O ztOkGe`&}Lub_K=;+Xe;Ff{`c;9~f%sQQD_ZYcEr;7*tP1eSTz0<(DE02qt`Wj|=?e zoC==4w!0*CT@j9Wbv)vB0HnSU$e9GdFAQSJ)c^k2AC!F2aa+bO>V21ajq}@4?bLPA zE&#lCa~uF%gxyYw683=Mi&DO`0UQQbMf~y4*T8*<@-7h1O;ldjoo04}h0=HO1ougm z+;SxY=ryqX&uW>ccWcGxMjC}weQ1fzvP@6@s*mqW%%E$^lSP1E0+u7dKJ?kQdMELA zMWljrQBBnr&v#;@=_)hpQmf@o-Ld`8R98~)kKW;?yLkc(l5yP!-^;-ZLZ^5=sgAX# zZxoV81ZGRJG1*AYiGq_=0XUb-6+K7kmcKv8E|4uxI79)f6|Mi(0)}xk)#E7{6=ar~rLgg{6AB!C&}Utt zh)Ub@2A$J!k}o(Du3Q#LespWo_UmpIyuL5!u;rT&&P-pfsN*>&_QfxmN4*Y&X&(AC z_pP;h|7H1{C;Q-iJh;Mn9x1Od`o?eR|ojWmcN zllTpYcFpp$H2Xu{QuUoi;R+4I7+)&i<{CF-ElJvJUy?Y)S{kO|8Oe^x-f zU)^*;k8FzL$}iZ+YZ2N$e2IFIV{IQA3~xVfNBcL?nthUqN|h&>zbA{x-h!27`#mw+ zya;)zgwuWCeN6R}is^lOSh$mA3}nKKWSWa19wDv%y{qRH#MivIqwrzFNBzW6EYO0s zXacVb+<%TBjc~ccHfr5FKvQ4gJA1H%b@>i!Iil;d^U6N zZkvtG5K_5#lS(+7B?Oq#mbh{G?n%sQWKc8Fq44Haydd*`;P zqles=kcSjJPrK`w_7gum%ko7aeeD`((NIJ+rr)Pg2A=#|o~yZ8-wpOceJkQmRSVVJrrzht$AoMwR@X++(i-7#D|M z6la$UgYFo=XB@WC1I7WvBOztEHtRtmGIo3c-PexEkY8YYh^0@TT>+s3)5A7+f&)P= zfTlKkd^-iwIczJmzrNy;p!0W}&R()zPY2m3eL%k3u*VgPcL}dqjP7$vmZR334z62F zE%%|zZ>9YtrS{|Z8#yivaBY4}&aoc|VFY6`uS*G*(G;3Pd2II=W(<{=$$h8ZU8OXLD5m6sn z$NXO{y2-6!=szd2&$$kDoN6i1`>uc*nzh0Y2WOH;t#_$f7E3r#k=ew5f?DmFuu zi*Q4iDf(oPszh=l-Yh^fbCVA>h7~e0dm)71Q=d?CHf38aL_U2cejfhUHOGP%d?RyTvGVBuIC~L%7`x=4D;oT_+R&MRI%_xja~Cr_ z1w;!cdXcRKW+;wpuqP4qZ1&9-?n;h<+(onz#5S|SJ^tlbLBMv8-~&1^UOZE6Wm)43 zrN<-w8_>^gnsPL%+|+P;x4(KS#R{#keUsOIPx-|hX!uSp-q-f*xAqWIw4VV<>mj^h zat>6*g>j@BJvGVA-i%npkn9uGg&*b3pBxT{ua6_Bqf;Kd4KV(?gZe|cAC+0$exF9F zcV#POB8yPQ_UW=xLCw3%Q#Gjz&IZ-OIyMK+YI#sH@-!+xVxxTQ;?&SVz}}O*l_SCv zj=mA!`H#?#v~t2cK|vKqAg;W$@#!zF9yH<`Dr>Me*u(r&e!7Y&H})=Ct>2BD%EOBx z{e=#4QRj=XcGxcXWSfN>%D#EAUf7Qiruj~v^U?9j6{RTG44ZftH$t%{Hf7e8?1lvM z%sCnWygH~7u$_#wm1I8XtV)*~o%F|N+4lq$uF(4_ZpiLAY)v=-F8%t#-0Vv$deVX2 z)#W$qT07DJYP2c5W$N}*8eA^-+;4ovezd~Tt7{`hNv7 z3=$gT=sBF+cb8_dhLwP@-A?%ovxo>GyJ0SS$f(2;CH9AY!$mzIqM7>E{D!~X3Tm<- za9>~6qgOlD?*n|j;7WJ%;ElJcq*d(VrgG zP=|vD&LPSEdyCmp6`22ruJa6M^AF#C=|HR0Dr$A8w58PEqD57WP_0d>_DoSEM$%SW zRlBw#RaDj9E5r`9i^N{BLx~6x36KBt9M8Mo|Mj38I%SG}+q`jc;V^04LntBW>x;O%Q@D$PFvxlD|2W5+JZlQ;m1>Co zfW=l=aNfXf{Clqzu-_Xge&iPF;ODT9b0EQ5IU{6K_4#A6wyj`9u_D5Od=1L*b znqx}xM9k+@P_~=Yq;Me0-E+@qcft6;XWYn0aMxsLqMp5q%`vkX&#FhwZ=OACZ2HN) zjcYL0b*Jf)rWs^=ypUa{Phf%-AeGMF96xGQQJk@dn6cB8YTOoK9XJp!0tw>a|D@8G z*d`9VSnt-MUm>~)Oh)zDfsf`#tA%LucKy2ka@HVUd@eSp)JBqU+XBP}Xr|UMu#dI? zH1_#IW@koNwitw@|KRwozXq3nUP_mF*nDv%TWy#v>qh!E%-1&Sp8haoR+CLG?0}xV z5O{4pte>u9#gb=YU0ZbaZ8_S9L4!U=C`ZBhWV18vaoN9u1=B2fU>=IzgbFbSX$aRH z?czrD(BCO&pCEc&v?q4Bly`C$xFNAR%@jMly7;u>PVEiW`>1zJ>Hqj0y2|Zq;CpP6 zR3SpoM|iO0^D%BM-4$#4u#0;4;3xb$bMI$bJ%GFWKKsM}Aop8sj!MQ3et}+<9FD1> zUDnh=!Ch3U?X|$EGDSySTovKP3~LZt>VDlhpz`-PWy?eu`=i8y46l$ zNfs+EI{?tTk$wNuO!0A|A1WNk=(eSl<@vb7Upwf?U)U%E*Fm{0p4x}|vKi!?$0EDR zud_p%>Ger=BFTw-7J=U}L+vS4(hNDWkb8tnh~d(MDX4VM5;-r#Q@YCXsWAhp*~`Do zku4@@s3rALzh9-R7x@DNGhF$}((AiT@J^WmWntK>P4<73-U+$+P60jlBM5ALd0WI{ znlZtE)nZz@Ksoe122*1lX3=D&q}*o|>Y2He2Vh%=G+f`@lLv{WjW#FNUQr@MDcxvDWrX9hr=QOt>Sk-z5j{7BK}il*xoLMX~n5Rf@c~ z>f2kF*jnZbB1T~a^-$!3bo`q5g|}1P=MdM>}$Kmf|XWxAixMcO?)U ze(uvN>=?#h>w%MWK>B>Gi2QbgoYWgeWp-7A=A|S?miSv_rQJ+ohCid;7v;&LY8B(^ z@xVGtCh0O5r@unS#3Fa7hbia}f6nhP@1(zqh1WiSc#|J zz9%L1;{JIu%Bl-gA-G&YOm5YOjLsK=kEKGlAn3Wa6Fc-S_gp|UWY<1dc(tlfcs$le z63zQB2Pl#fC0Q=9HUpW**)`H0o5b4{zw9hzxb<#cX)Q?A%qyrWECRT*qs!57a(K6cPpUQ_y_3s3B43fX}E zGyX6~l;{-Uzixb7>afyu>(~VN=9p#*7d-24%`P5Z5`0Y+UF{zD&@B96>)OXi=F9_Ph4oE<`i+q^Cbz6r zlVS*k0mkb5rf4*P=Z9MEk0n@%ZiZl(|9h@-mdlHUa+ld*M{_s-ne+GEZsMu?k3;#N zmVsq|ztR8qboXqIa91t;fqG5kS}S(;$*iA8sYUSKW)joFnN8`BsT%dr6t}junWSSE zK&pD9@@*2~Qsr_qT%qfy`0`{}xLW<6CxY8^oeu7fbkcTaIVmRA^lqf$^%Wnjxs~%1 zi=t1bNu#y4FYnblT3ipCEpUQItgrl1J!SKgYu*E*%{78YhJ_ybkIx$}h($*Jn}X35 z5aeRnj|@Sgr9)79hVAo+L0GwEp6Tj~n%^7vhBFTrMkZbrO9x%gY>v9SpKo_P#!phh zn(#oTzg%V5eCF!)W$OwR(d(CG31looshPsj0w01aDwQ!i7TDW+D1mS+M?BpAa9uE@ z;zsNKtFjI^p=zf3QC$of-pvfqyORIY$2OKJfU61SF`>5Z*<&|3(ls@r;q^eus{vUf)-B) zE~hD~Db+n}F~LqrRkyGvv_G8bQa30#3ezQ>Q=7Of8ofI}R!S|A9_iDRHJYIFC>(uD zw20Dqgag=4t$cVZ6z3CGTUPF2i%+f%=?4rh{!xtUU})iJj_T!TFJ1eva3;2DiAW5I z-=;22Uw6%bEMW&6!34Q%t^<$r^{D@9AZi&;s>FwixpGp4=G_P5`SVSs#~V`A{PSa_ zRhqV@Kp&dlH9u?$9}+m4#SfaHjvV%TXXDbL`@cnh(SH#uhv`nUY8O)u%I7Pyt4}~} zut@Jv8jR#}(v{-()?*(f%xpu;xtbai#w}w7zy+**W=l&6R=eyGg893i@pbKeOrXisGq{}K!}gr4kFHn%n9=%xHyGS`Fz`-6@6eRA zJBsu_3n5FE(Gw%c<=+%%T1Cjx@D*LYn1j9m8%;mK<7aP*w|@UADP1JYF(e_%-yA!) zc+gq3Rs+|=p@g2NPk9|1-1i$M0&FVT&Livck?}cT82dJcs7lcs_3U1OCGhda) ztJ8CUFej%QR`OI!P-M!ZKYKR7XHj#(nU3^3;pKsJHF_pxMMyfrWhMP9UA;=wH-?E^ zudx$xP{98CD(PBn@Iy=`X=74KH3&?;onzz?c2q-Z zssvosJK+YJRbn`E$RNZMcdWiKqLZflvPK42*&(MD@4*D-mZb&LRp-#WCzhy64Wq@r zjzVevh2Hep!yBSuc4TP3fC<_SMhp%iBPd>3sBxZbIQ3i%BK0s6`hyEde5SilWFYFG|3X(R%FOmgR=cMbeU!4nB;EmZ!n%fz=$vdY2|Fq5@ zyGTvY6-Mn)^+*^rzStB<+YJl{`VRwFanPl8Xo0}zE{86OLD+b)AsBWINMuvH%F&Z9 z!b18C-}yVWeO5y_!vkD=aXT?veKR`2%yr{a?X#Pw{o+pADqXmkde+~TBLBq(x|Mo0 z6b2V#UkNkQFb*b{Jy>~#Rh%YnK@EkpJ+6!k^!_C5!Tw8Ao z<1=*Ma3PCq)3HoN$AeEWpj%HHqIL*EAG|Yq5Itb24X5V+xHsx}D1aC5yi?%jf0@Q- zv!YWOoIxuvscePriEU{oC`lv77ju zf`IZE6^?=cEY3yj_0HOeov)v*5L^&w==T6!{^J_lj@Hxf@OKISTmM{+--0y>KE|U-u)1DBRNfXoz9J#`X8}PvsHk$ zpby+G&_Ja(s0iF(ve2pI50LpWNR?Uv3~1I zXg~Fe^4xv^staP~LSu)9ec=vosAtg#2^bFmiVj64U`yXkj#YH+KGph6k0_n1DTQ{K z&zZ?>Q0-d)0nY^oaE~5a(SBdzO(+)-xv^xw!+)i0S@Ew@tiQ1f3Pk6;>k>9bAE#D) zf7p;!tvgP9e5z^yfU0TG)yS4AH?bJHZ@eaZ3H#J>c z1=9`;sBN2KZw2#>Fv-um0XVLY8BEW=3Y_M;)%>~S)Au$ZAEs-6OJQP7!gCU?XJ_~S z3&WYs58A%-P8cXQmF-Fv0$c5Q0+msvFOK$ALtDm>$1u5)gCx$IM=_tbpR5>uood{d zeHECw!1L&}cbs!%o~AIW!kCbO;gU1oXXX`;Z|I7j58h&sAi4Ucd_LkHY=?>` zh*}nDQJ=z1t1iFI>&LC+e6nz!r{~75YEqFQejRt;r%M-_XAuWm=}P-~W~(3} zCU>)PxohHDVLwO6Ze%j6uV;vyHTwQ_>xp7R$b$KgwU7IZ8EQAmnohF@H-$ex2|C%O zU&oLnjvD41(7WFQ>lVUwFOL0H>sY>nZeVXR*rRGOxhWbW?t{b7{nn)BAg#Lo`Tke7GYTCd|cFYXANIY z%4ZS%%6kU!OSF$cs6EUh#gSEl%cpE<8kSmc5=>XaGF7Mg6UgCD?69hr{cp?7+IJVd zXPPG7#5GZ?io;sFo`d@fjXV}VnVfBP7$i^-Zg#4#t7+EkC@SN3!)}%bQW^3e#684p zeL*Rua&u4idkx8}I)5Z!-v2rt zlRO#b)%92bw*nVK7q^K`^!9YfwFKol9z`jhf|$budJ)00mYq!W@QppG-Ec#!xGW~e zf<$2<{Vo$MS9;TQPe)V2gqdvAUficZ0_EM6;ph32WQ8m+H6Fg}qtFbIC+)q7DCm>$ z6R54Me{t{kzBS1kUsK<-n%fXRT~_5#YJsN5nY6|}YNf^8TiTt7l4@9T1K`K-rtfQ( zi~iLDomqu?-O-_9ii`h6?uuKGKNvj|noqqdu))6=%me@J{670gL_n9E1S&qrWZYAD zd$@U}bQ9NU!l}#@_T$K$OztdZsyZJgewDs*Ay+GR%@q&m3H8Y91#YiKM>qSNz6a_n z^@8tmR}`6}UcGt_B&zF|KI5mFFw1WIwAtypMch)V+Pdha9vM-jAIX59por20` z)8fXQW?>|{z|unY!)-G_v#7&CfJjr~wDr8k(>>xgT~w7pK=nh37VITo)=PocutlNP z7GmHt>17-GeyRT_2Wg%+ElVat76)&EU4yhHijJK^@EhSgoA&opdfzkD@N(bB`}cN% zxU^QOqkCbbmv2N4S(1tb5;HQJysiyLIHX`?_9M(yw?wi0L8;toLCPxeUbl^3wT-hThYxhTxQ5w`q#KJurT?l68zAW zsctVnhgoLsU(q2!rsuLXECzPobAB0(7tIRc4mUo9+Pt?!+()K%`I6~>p3fhR=95M( z{{*HjX+5q-2_4E0$`>XaWCQ85$I&AJ(bmWLa|M6~CkARqolK!T|F0Jqc7B6%&>daE znEL+UPCk7PNY0;Awet}N*%`v;W$?Gai-WF_v3+Td9*CM>bL4YL6!iF zY~QHb*ls6v@k|Ry(!{-oI247H>a6TyHhRjz|EEFw)2pBFp?0Ooy}YXEa;#Q?p281`tO1$ zep~CYdiBd!sP&losJ&;cSlQaW+WTz5G3BnY+jK}K7XCcopR8awB$=jrB#URp4!jLfahAN-EN3L^l>jtsie_dVB~O(_Q&&B($5$f0kqD z#f3`^cc|I(QCCrD=P8jI*T1UmXE#r?=@EQZ?}%{zl51B z@d6Q7b85L>TZhx$IS-5~-lrC7e`)o{NIxoP-N4edKk9j}GgVM+2QBwDVmt3ek*chIlUoWu{*cs)58}__%J8r+6oH*Bp--I}eL0zHH1!F{b{K5t zkhr%bK6u%Y==<9t8hEc0MU6yl*{*7&hWd)W>6F~3FK6KVQ74{`6Ov2iNE}5RsQ488~Oc|7$yD;`a;fgPP06Yh%!PCGDYfJIx|1pN;T(ced$K>LZgE0BbxT7~kjI#lh3v+*|1KnCHRFs*=HdOBjSTDz z=JZS6<;}G(fgXNop+4}?@BDSOFOOZ~{^d-Jz>o!W@%u-Au1jmzBD}u0hKbm8o3lbs zZqCpS-QTrcxZ4!5IGS;?W}?)*^s)8E@Y>qTkkGYfi4SYu&BJ>e*a@G@d37|l{O~Hz zq#Zk&Sn8CO*ypBWKM!?Qd#(ze#AWvOr=TyWxiyh2ewB9XVocABvl+04GyV$yqA71|$DI-nYpD zpV|L*SgH2Qr#DnP+vwWU*!Sek8o58O7Dj=a!@b?SK3xzzK+^EAFz91My5>)UZ&c7g ziSG5VrwJ;`@07yKIX~^^o*OQ5vJtKZ(fJ+&&rYGDJ;ysuO^afe_O|~I{K$AB;W2ohY#fZw`5+s;9$LQ;)b#u%ua3bs?Vk`N+ zTB96yyhTVzcbRaWos&(hpCnN>{hRolMrtar>_$JqGSX-6`d?zFFd9%!NN0<*X5YeL0_f46*_jwcPFAQ*g@m)X_ zF3q#UU9mRw2?aahHrHoQ_XLi~)=(Ym!@HUo*kt`%DRhrW2CpvuGN^Dw<+*pHMr^#= zwal)+{_-eSKjJjdpz9VT32@B+w!fx=nQnXK#b#Gd@~Qjs#u6;S5g|nA)eg8_aJa<9 zp5*?T30NKtwubg#*y~qr{-Z7RL%chh>3lcT*7DE0j8~b?Q5as>e)dRwJ0g2Orc*Uy z{9P8MVbL_QU3Snc?TLEU%L&UD^Y&AR+WJv4<;M+w7brhIh=mdMu=&pd({=)#4 zRmGH>FI~VTb<^U+%T}r#r&9G=!SyHhhLqfhbDwkU;(diRW(-=Ws8*D^0%1RBzzfQ0 z66(uaMYR3nZv4v8CXBKU_#I_*;-RaJ9adyAZ*7-#*Gdy~cq^Bk8hi;qcVyW0zQq!g z+Bs}zC4=uyvm@^fL-ggyv7>&~-w;E#isyrx1$1Z*fqe0M@Hh{)^>KC9p5U2oXVh+` zhA);&ZOuhJ4ZxBrV#WAOn@Q#)2sR>X(UqC>EFvJTqNACh6$c$M6WJ;#y?_wn9Ioh2TN{tsUI>rS(=u0Raeq;ojrJ-_lBQw`%VZe7V)w!tp_f8HsaFu$QVZNLm!TXktgKJA`$i5TIL9ND*Yq6^}G>9GN=C0 zSvd&tbF|h3Y5uVn$;OWZ*v!A{5C^>bQ)!>K!T&}|)JzAbuVd!2t%)m*aBhqDi24Cr zbaI1uU}wr{H$*GThH`~>ed3$Z>0}=n`15v@`MZZxq^9tLwHx{3ZwvM!B#&}N7Kkhm z6`t?7cNW=<+r=%vWD=s&(zy-4QLCOB=`czN7G`lICcpnV?qCSN-n&dJt4@{fxX}7o zhk9X^_0~JSC6N$X=}GSijY-z7;lCE7tlw>0Fl=QHc#XQGjn3XTTjn~#!nQq~0_&Km zh%+NP2hS@&;G=$)uS|Na{=mj*F}|bF?X2?-rI&P_I@ZK&^xl@^es1X%`x%S>86Jt5 zpR4;3N)grM!bQp7@pu^>&88?HH8#+Qn%0fK@+NfheQkR)@7scA1^pY!1?Mi+JC(i4 z>N;Q6d@T87(^{liz27#>0>D1~oSl#RZJBVF@1&cD_9>;XSXe~@NKa-$e!=T9 zy9<3Ar5)5&wl|D6Sl|yn_bq@I{(M+)rg)pecz3jz1c8T#l70n_*Jj0;idKMf@V zaA!!NFP&)hCbC=s?nu zd@9Hq8Ee1PZ&@rJ8$vuJor0eStW>QlK>2F7y( zo4xZ?eVPM0xAy|!*D?^^Ute}mcvb^wp+xzU*LS0EisrJCZoiy#Ss8t1O&kp+#ua`( zx$Ez^x4w$n^3dSyhULTggK2{#;?{dqy}JmZll@;@u#z+qs{$*M{lxh3T50dcFELf! zqO5Pfv=4S!6iC;f>2n(h(Ha6wh{Yt4{fvhw6C5r~17{7Jv|=XN;ml)>8jG@`M8T|L zRf|Z9iq}~Vs_=hPj9Nx?DI;<-&p6Y%5OiIn4*0U@O5}b*wf~g+M}uVY&%vr6+;KvR z)OW2Aywy zh*vw)$ec@lGh<`M=J4($A%l5X%u z4y^QSY?kywF5bp#xJn~QX7?i!R*1ry%*&z|$KKlS(t5G$cA0m(!^x)qqmqUuVNLDLS{M#|vJF7-`Qw_}q< z^2rVxLU^+yW4MD&%^^%AOB5UQ;3jKuCbQhNKu29!@5et*wt`TwcI=@(s!8K(&V$i2 z$9ivmzVIdQ`~vR7l*b2?Q{bHfKRPd^<}i%j#$!t5swyki=Ua8%ZeGAZ!4Uy_Y30z6w@F0}Z!N>_*T$Tt; zd^axK2eX5vKW3Bl)`ow-EgXst^N^g68KEla%yL}#Y#gyYZnuPoZ1jmRFUGl?68KE= zMo0f3N=X{OHB6(Nn-G|jHV{(dt_rU=r968v`@5EAxuEgV7#f?}pM8+07BaMOzw`&?n1Ro}>7#gr zRiJn!PbSmjCiAx}!g0%%5wXaV0EH_;XJ_ap&b-ziDvV`jkg9;-IIu4h(zaffpWt1G zZfk`#=rV*}dpY;PURy$bX6KIiH<@>l!QR-kfCK>v3WYjFN4x2Qzt zCEN`K8LtG6XU60+1B*rORv2B$i?k|MDUzzKh=v~m_rBE73{;QZ;E{pLTW=IOnuHtC z!Q&D__v%!lsEmx9bmoAp?tNX5{j1nNt3uiV!Ow-(P$7?B4>7*Z1ETD~E?O9kGz4BjAbP}w`yZ?Uq?kdK7i%qk?9{3KHpJUE42WpV`t;X%jjXdrXWJ;$>U)xN&PaTmZu}?k*|gps2x^^;soA zAA*zpy0yV(ZPjRiDp#W`KHFnz~AGvwD9Usll1#st}6AowV{;aJ++}qvhiH}vB zM1v7m_$uOdYpOpOry0INnflVs9gO;>tL45xLY;91FYnTVo*chB$Mp9XQET5``PlUt zZ=hJmKB(%@*~#B)mzVu{FkI_oX27s`D^P#w!v8|;xL(YU-zpC$&6=-gJG)RcnscT8 znX3K~p77S71dDt@qm~t&f&llzTNmB!dN=OsAtrmamZH)@p32Ea-Y(}RI<|{;@Hp!TaGWEf4QVvHI)q2(C=|5oR+>z{<;)-u>V0R z?FAsBbt@ICkyZHH=U(7t#B1@UNN zJ8&OEoP?R4wW`L4@er*;dY%>$XW%S-y747QpFta3~@We#0ug`@&Jo!r!YnaHy0 za#Q%Tkky&tB_PRkmiy%$R~5wV-zVK<%r-{k*c;JS7=t>KpymRre+dO22IIo?2BUqF z1-K{~NXe#}V0)+IO)%R2rCsD;q~nU^q)jv@<_waCw}9*-cI zt52M>>VMp)*(`9&!^CKP`LlZMbE6x~SOTgvu-b;JVYcjOk*N2Lc5Q$8pb{>J4_pad z(QPKN-FmzwG9gw%kodEVYj|T>BS{L(ebyMoq!?qXOKps4%o@h)K#D7g$2#a>YxJdu z&wh8z%`=97C?QO}UdO8V$+R^jjd3Sj#zzM4Fn8AXvV43^VpH_hY`+Cmof?=naOP7^ z1V5{~fsl>zw`$~@uWp>;S8N_3zj^UE?K)AmoAvtD*z>zO`6u20U8a;a*;_&<&$ffk zi>wP|TC;ODVg7rFRIGWgOyP~Sr&~kx@9BMgD!AGs)&@PzluFM#h$5d$pnH}#FNpgc zWL+=py^usNDT>VZRSHEvciai;b$>q|7m+}3R@p3Na#RP5(nZs$6VHx2;S*5;tv!x) z9nq&!#_ewl*p2M?MYV&Tu>A`nKpH@nX<6*7;Ply-5*0=!@CD(=GfpDaMB%+VA*y1N z^TjDSR_p@x;oQbG!px{Nm6p2TZHVq$Dukr$E!#a*%a>5AE#xiH;q#-@_2$=y0>Nro z&-~duZ8rb?QEiVu8I`#5yCGIF=YHMLsR{Zk`{(P(08*4n5N-IW%ibZj|Vqau-zh}1eHg8Xd^VNNL>2?0cs9_xU&i{rXt(m)sKcJT3ed`gnhTz zLocX{S$=^WlsRb2Ew$(%`W*iHv#n#@3Z`MPOn=n9bIsK+mg$&%ZOsnf>XFuV5CO7x zG7P!c`q@qfaahL8T)-Cs8DB{8>;X@9Qs^y(4`z87yq)yqL`Lim8?ia;VmQTi2Mrl? zHEPAHe?ynPj)_$M3@Dkbmb`Fq8|Cw3jSK&$zRvWK^q&FtTf&Uym5Z@hXipV#0d%yE zIMrJOq82k&JKn8oq3#q1;#$=%uBroK^#Qd%Ib!y`O7}+(WHy2%N};?5X~=be(Hx6O z$d^bt-o`ln`*vVQ$20{uBNP{J`-h2uAo1CGz}60aL8)G;iRiq`u6LoWhHk(OEaHE- zc*wMP;gt=bD5x~WCJKNb>K3+iY35Ts`G%kiN%O9x{t^ME%d1FKQny4dmP%QF;T!^>$<saja$*aFx7cXF|oGv1-^&JU}p~`jQN>l!skSra(8oo#{g^0B(5Hc z34Rd!9jeO)+y{WJh#ym=PEoy;$s453lO$haY!fjUJj8Cu)&1O*Z4Pa~D6{+Gcm;Ui zpb*Q-E_`k`0u6E2t1$y$H;#v^_trMbJK^lI07zU#$_}Op)i#na?^Xc2oFcdG_$J zeCtd8&W{6x5^*G+Ut7Uhd2%KzNBAJU?^30_G`Zinpy%(@me$5FC1J98YeAOevLw^5 zn}@xG4uiJvTD)gduYjn!Fu-YQ#ZI*UgVm-ATeN zRLJoe!4aZ&gOu zU*QR+B7~)&o|a+%I%n9d2RvSgyPHWvu_;p5pxnTH#pZw==hLP@>SXGqG-lOA6o?V1 zPpVEe$WTj~f4^pyZW9-``;`Cu)yAOIOQp=d^ZthkQ|&{ediN-Bawf~?+Ici|6J)WRBKrPHjurqBY4o6P|J(O|F#@-ln?(q%Y?-&G zL;7|;v@WwGEPHjvs!u8inK-<&^sSr{jv?MWV|0fzbg3Yu{~HQrm$8t>G%LglU6QA* zV?;J+ci28>$+fdHy08!0wM)~t|Hg?`XGn*p2zn3w_uvSqbv}k3f8Yi7KrR{P1&pn( zd^Mby?tOiCT=nlmL(_-Ff%#8gueX$wb9K^+0e|m|Br~#}TB4G8(G$O{T&~CoRN^~w zj;4EFrz+r$KSK@#Pd5y2hsTZsZW4z}+FLdYdq03;M+7qY)qEa?X#PmOF{=1mSy4JN zV-G2{C#$$hzYVvKJv7tT#dOyxXS#)=v;AZb?p>2nBOauw-GW<5ML7g?XABvipHzWF zij<);MXkq7x3CGGG~VtYowWTb)qiJ^a>ith{<5@MV}gXXLx>G;#(>MMnC3Dj{L^AA z+e(B=G19tbKdlwZ9**nbIRAFlB(r`SN3K|DBisl8y;-$APnv`tmg;w$st?{G391T| zF#yuc2O5fWzvo2CasNwcxDq)bY`ckV$UCy(Ek}&1Mmtu}@*Q}M^q@@|qjwWu)(;Bx zV?mN(A=dV5^r4&m)#udAvSXmX)e)Xvr3`K&Oi@vqFeB6_-n;8t`1|V1emV|^7K8ICykR2meo|_Bl~^d@ zXAcN+#c%d`k%amutKlW*!I{zFQbr<^Jc9v}j8j0jJHmec9hG}sJ^yHX1QtIAWCL3a zQG+I7DXYHNxBOy=nCx|Q_-%Ay6&mKMUWiX^5V=!?z_O5_fy+e9N9}DKfo|`4U@4UN-u`x0uuQqq4iHAp|<$DUcBfYSaa8k z5~s~_l@->Y)5Z=EaLDfkz--ai{suMG1+NK7$o6UJmp%c!V~}j7IRv*!AXKeffRTI{ zsgegF=$v*MoPWCefBEUhTzrEV-DmIqt=dupxP3JEZz>087vJQ35XE_dm21Ht|;nRtn?D5 zSuZrWN6km|q*tn(lrBjx5~-IF5+u8{@o63E(En%;Nuk;Tnjn%cg5A5K2&DdymSf^yo6@Ac1<(k)f(_@)J6ey6+bP4SC%YA79ggi zFt=J(?ly0ok^}fQr9w?}P%XfA5LMC;)5P0l!<&ek=a2tuBU2h{liI1T{?{N<@MHU0 ztTuf&kbYy0fi(-f43MX3#jRKWhO(%CIEw_?-DY>@xP9v*^F2`5vTIpx7O?SS2_7sv z|3SJVpCIA5^okSgu`YQ;EAu>^39&Te*Isp1 z2{$}+QO`fK9~9q*yH`Yu`eHXDIIi`o{-#At+1H0b!>>Nu3{*E?n76M-9$LajS{tQj zYf2>%xOs5s8^!-LA1H3wF4R1DJTXhxK+e6pXKQVnU{}CS~ib5JL4`BEkjwR&r&+WULm5<#~!S2m@=kaPGU8b{@rHwL~yZq zmoC>n;cE>4iM_J53yUR;IzC_YkL`8}^5?YAVeO9y)|w(baBMdH_>h(1a(i^Q@-<^? z@IALA- zL+J01$YVXq(!;NzsYu$6_Nkv)Y5sBnf+%@M$Z3Tz@k}AnV+-Y>Vig!n{VwwH8m&IV z!nE4sv+rsrGs9)k_esk4)rF=n^t{o13@GMqf}sA~RjaefUpq5;GK}W}z3%vnuJuQ0IJRji2g{9&G%nB4&9GrFsMQLLlg53?|^n zt1h_f?pZ4^sw;>1lgw^X_=$imR^g{o#;no`%D>4CNZE;h7DIwalhz= z=56Rm`1T4;;Lp452h`k&SQ6WH*N}O3qg?T*!%N2ch70*q378uXkB>h&PYEQ_GSZd0 zF1BAOs7A{ZmiY9kMwvhz&N;VD#m)cjj74l1YAj;a7kai0r7qq$w^=jsV~I9-e4{Kg zm?eA@Oo%Pm|E7eeIl<=ggo~u!?xhrfZ$cQi!P1hpNZP zQ0V(4Ei&G*2o~TOR6sCMoa2Z+PdHjrdue^3c@;D?&`NTCp4iNQ*0-9gdgW#F)Sc1& z7Hx;3@x_syl&u?K7lVZ$TA~w}T=i~4-}&b@toy|5kLr&2h{&?pP0s}jfZ zz;+<1)}qVK0?1I!naBY8(?0B9MU?OOXZ5R*SiSn<*)bJi0n~*@2%L<5B>kCYI2ra| zKa)-3Ywz9bl7j`SZ~2e-6H_4%3lCZn>R=jRsd=AgnWx^aK^vI0z68{ouNp3%;az9Z zal|zF_whRN3X=G9Hdr`vlLioXbGbPM_kjb7m*?bC5EsEGY!1W$RNzbzF_q~qzr56{ z_|Bw?u_@uwQ4bP!E3Bh*dL2TWBb?wC zzYX%@m9uTx!3H+vOT9WbCjh=BU+*}8p}micdUaZh$RhL+1Re?hjot3x3S;Gpy|>D^ z7=H2SqT=Cz+MV@2%)0}ck^^a(d@CcoiFmvsdeXJ?w5RD}Vy$yYs zs?UTXEQQXzY?mpXeU zcAB!kZmZV9lop3_@0a9oW4&2E*8Q$5#~+ZYr0?+=uNXRS9Enwk zDGnuYe7Wu~oUwg04*KH5gbVh;KS1xAoDsf0K+kR%rouJ1r&=7~nO4v5`c9o`7i8fC z7d#q?X9{x+4SllqU8x}_hMrye(sc7@@LFDZks5Fea`beeC25dk@_v#Xr@K2gRiCdU zR3cy3A5wV4=;?Ft8v4|lWDBvdxnbl0D4PRjwmfI>#y)Ah5>F0yPq=SoRUX(3NuC4`UYc^T_p7>RJl00QS>>Mf) z%J_Vb=AUkE&;2?50KRvvhV1Kq^QQZwdp6i`&lvN0_CY2)ZMunKIB^PN9rP!{_eW`{ zdDv{F@R5Lv2_i%2Cp_#?y=1 zB!qT`<%r?bgQ<0tY>2=Yf+D{-bb8GAOIIKr9qN?oxngZ&yB$9Cl-Ytd6P7C2E+)J` zNAv_~WPg%ZAIP8Ky$a3v0$RCzQG9VtsQ*hxCIye8e+d--6fSsjL#%H_Wco`WqRnXg5^(o+8huMTUjQ@ZZ^Qz}@yUN1#LB+lfFWN}p zL(p>VX0Q;v_pKuKzb^q~E~96610cO=PO--zxSPzveBR)i3Q|DZtEy>i&+jJd_-!aM zQZ3k-Gls8QIjeToPQd8QoXnMX+t&r5uF9vw)AO9qDz@FCgfb51NiQQ&3zvmlVya@e zI{#*3$CbHC!}NsbGd_Zzs7$&@aQ39+_yk$Mj2_cDKTN&cD%wv!BTHEc3z9YNTO+Ml zGVK%~r$2KfnYg<~{8hSQFcAt z+ICs@Tc*T#`NdB5W`a*Xz*C-(D`vr-d8YH-C&hdqIk+S2nTQ zC~q{Lycn~58pZtPg2Otr0p7M-E<80@RifThQC&+@z47?Lr|Xg1R12z4(QKGl3onkz zfC+*(JfeKy%>|y&QuGvJV68RR-B&-RzOy;B#)jpsLB6NwhqObnz(~1dd0=H(+!pZu zt^ksEwXd=0m`wwk6Y4(^fL|y$9@~ATLH|E=oo6_k@%#3xw5lz-)TXK^YS&(^QPfCv z*t4{h5_=~pimFxAs*$3K8nL&88lm=#9mI|mBtjy2{Ql4J9LN8~?>X*w_xt;Meed(U z&d>QZzjigk7H0!KkFW5c`yg?!AZ?t2&Tc^8x@e~&yxr6`#L~toUb%sV*&G&Q^h=iKsZ%lTgBWfhfv6*qy+37cz!_q(s$bXRL;iGU58zT(j=*5dsb9K zy|*0;JQ+|fQ~gdP8u~|br;U^>A#cQRvtr66}w_*LXh(49Tu;*%`s_LIR)W}n~WG)}<^WhBzdLAv+ z4>HVT-K$?^=zaHSH0lIj$SR$|bS9viE~Jjx>=j-k5X1k6sNusBuot>;fHE>8Y3zv$ z?dndm>emyZL}AN2wepEooK+rrS)d)V@E>ma>m*||_Cg^X@g)^0n%e5L1JtG|}FH!Vr#WeSvi^w`iA`MBQLkArrB^~INw>g zFb>P|LX_i;g3w6M_AjD8ijDUm3O6D>{kdXBa*yKzW=*?`K%KSPS!{ee9-l=~Hw#5( zZv;V?xoIH`DZA!p#X%_52T<-Qb+>Q)1Txok==$jU7_)>DRAR(Po8wZ;gFjtt~mdD$k z>Y-|Q1Fz|;Ob4?iRQRs6?uTpA-#?A3E$n)gMk!`6Oz(KyspI`jVZ3*nTk{|sLD+I7 z{|(Ch{3Jk3arb=Uur>x>bU*HAoC{W2jGs=sqjlu85dPp{#Ew*3zyO`E#y41|n%I0M?{U6xUVkVQ0JNMZ1 zp{7LI@jZp$39g+3%Mw3#4Q5Ol8Pd1MjjXz5!F=hy2zNiJv?L}CLP+ACK^XJ0pH3j^t4Kjgq(!>rFUwWQDk^38w$tF{9_`J zW@U(38!OK%f##R`HS@M&rfzQg5Z@ThwlK8A9BXWE@%*F{4(FGN#`eDKp7QT%xFb0H z0p6JMPn}e5@wB+eF=ZxMxMj_oh63iDCH`qD6}U%)X`Mbw5H zabZ*&%>}Fur>Y+FB+FtQHL3_LK-V^oy+LzKsOySJ&s_$=%>AqlwxP70-1c`ohqZiBdWK=zJST-$O zVKV&N^%O*E-%@@=fAdQxf5LFu@%Rcj^j^4#%>4$%_sP6DOEUAJoA)@n-MqrPdLmP| zcbYC&s72rYe5Cnv(&MU0NK^D{s~3Z;L)pdwk=mz~2276K?Zdxa1M{xU=S(E!3AYdq zR-WlrWCg==F((1E);U*~SDn`rnRh=a zO)B?W07gW2r#={{Ql^SMG43`e>4aV^zWV}Ktjay|M-`L37XE+wzm%kNtP`9^3e$o* z83soEc?xh+@iC|>qikd)ERdWB*NPs;SEFqEQX8!A#-L7KR7*@~22JxYx3FCZegBXr zh%}{J95Ex^%7vo1ZH;wJG}Z6C_V+Y_2KJKQ`HgJndz1estPuK@%E|jIZ)mmSoT>D8 z#>=L}!nnH0yrdKcPBtS}B5<|g@}fdP;jq?&|1kw<1pi|S;HUJq|9L*eh8$f?4f@J= zwbDR!$E0PZay`r}fb2z+LL1Iug>wt$!)tda{Hs21i6@VEFR7l1G?%ZKL(Y>5N#~11 z0dM>v@n1t;#(tQ%Lv=afv{2u)#k4(FlgZZ`*}c8D54ckmfGoLOo(9b!6H#Y+(1$?C zf+wA=`pwkDZx@k+u!aq{{2Gn%BwucDbzt`M$Q&YniKvbgAQS(U`}=_^syZcjWw6KZ zgaq_ndeH2#>XcQj#Z^xRUlHU&2qw0G>Ubq_K0Hf@Du5h~ByX4Y^s#!#{HJ*E@sp`H z>*~|FEqk8-g(u@7y3eb9X@LZ-Cr`w*QB0d(?8u;a5?dd5PD8w$9d=Zmgxz~ zwYQT)I(A;T)D@mBUO9?}!jrr)0$bY%%!sNgn~IPOTA+tAm(f+E>N7QsKmHZNt{ z_u0}1CQN)?^ZFt?^6L7`B@XOY5gaR(BU^aTaSfNBw>G(yo3oV!YT?9zP3bUg>~&NWEmY! zrafLP6ViLt>}wJ=_mk7sfylIJ@b|ko_C@`)x6BW|pA3}thLgzhLD3TxB*)szQvt4;8Jt^&54_DP^(4q)=%{H+o$U4}kuj`S7`GU**uEy(F} z@<{dlWAn>L8yZB2FxCy{Nbs`pP8HzslM!pxRrJX43o?-aJ%HkXip;fV`Md`a;#bcI zA$e_`If;`_^#IT>?!85~^d@P)3{w?f3pFf~X|b3!^aBQZbcZ#s08-AZQBH3I7iKak zT@20w`2buSVp<76Td32Hxxya%)we^KY82l7yW#Ah#=gAw>q}Kz&j#^YIJL^dW#-*J zBGHY6z9Z4mUlJDL^PtRMwVUmWBtX$d>in!HyaaxZFm)R0VB;JLe^xYBH-=d-TN*poO#8^ap;Z5s=q6d2q;i0uZsZ?hCh<&bTuEI*@C$dXV0(! zpuLGTTs{5jj;t>+qYR776>{9F2ES0>Xp1W)k zU|TGNzJc{X_)F62b}Qe-TDn<3>?Zc^;$DJaq(gYNusB z=u9ViCU=6^j`Ax&u3ssk&vp~UZ5 zG1>HzeB}aztu}&RC$wNI%PJ9Ay1V)(DDn^O(?QIQos+m_n6-K-KT>qBX4U#U!Tde( zv#KuZ^YZ$Mth2_gMb2s)4IP`D`W|zw{yfK__cL&hW;&-2>AebwDJFHtQWtX;rX|)9tBD~-%j8Eae-l``#d?vN8w6`6H}E zl=u5=9p;~$Y$n@~|6M>jFm9?N;sI_FCd!CGnwF5a`iwrODB^2rgdr!VNfF(VywSA- zEbQSIP+9fQaHRaouP_J4TJyrZtU{Mr_n)}03IP_YQM_DS4~%#d@zPrpl?GhRmql`M zD~?p?8yRq1-n;Onm$JVOggV=92H(5*-2KfXZGkL=@t};(qLJG@(N=yZ+V0)qt>bpv ztX_df{rp+Iq+YjLBd3-v_!|*>j9n92eb?Q1=WF^k~zn}eYMA{Z2&lLb2 zd4E~>>K5W1TCKO*Os#$JgNtdFzF<;>H(jk9+b}Fs_Xc**`z_b2y%cBl6|6MF7}w*G zgLKL*Zi1KMQ+@|Ni&C?O;s$)cU!)%%MIlT2TH_Y||5@;;|Xmwkqgt9c4R%dA#OJOo&;}Sr=eA%Su8&;^h>>E?4Cfe6ZwIj{d zM^hdA9w!qoe{U>B6cXyev&TVmo)gui105;)8j{@+%(o?Ow?NJEQS~=BF=}-0wj*gvveNS}Q0$w8gGgK>k@?#auP2b5-O2 zWA#V=P^C)w$NB~fYgFnbt|xsP`NRgJ&o}q=gUCEBajKr8<-Uz~=#Ibm!~1^w-0?Wa z5GOz8>XDcD@gHBHP5uopykR6JGU}oYkUxJY(eI@7sE;a7HloTfmHfU5XB%RAs+iLR zmjco=M9qIpDICD+-0f}6-7_5sbugC5(PZ8|CT3HF)G%Y${*bwM^wo985Dp~ut-P9BB&W)$Eb^3;I1wTwWvSehwMIWfh;BBd$rTDL9mEhMrVtHH^ zL|x{kP@*8zJt~^ihP7lNcQ^i*b!wsuiyiRL);ZyDb0p4G-fw;sbd`ch`N%gdBDhVL zHg_h(fzIsNTLN6H)#pgym-6cz8LQf}X2TD0Z(n2@B-tRW<$zzb=NZqJZ;VPcv!wb# z@q7c5W;Q-Vua{X#)_X|eLhOZkwJ2Mr?REj;0KD_*&uG%(&9`<|a@yCwk+}L2RZmy! ze`lHS7^R1l060zXWl?dCgZxaY!78_rx<;!t^0BS1)dsW|*`m6qhvpp*O}DY##9yN% zf7c9yId&7Gp}Gp3CdtDFV$fzkq75%>7N)MC&IR8$3&SE& zOFK=tYi}w>LSFwr7C^`zz(zK102-1VkMUQzGN62zar6g}>B*@?+$y;SsoCG=*%IKJ%As2qQq=Dz-Gg$VAs&F zOk9k}yvNS*VFmI$T{?I6pjI9GlnuSFvq#oJ}zaIjUx6Gkp zh4t)-qAYKw7fdGaZ}&Wwb!&NS$$p%e2IXsab9Ph)zLVxWA18`4=)cJy&*q+)sW|lO zexc3T8?EUS2G2ZnI96!ad$drdEyPaMtb@F(?W*6AU#{z-np{)cROW0S+hSI|+2uKE z?C&_!3&uF8?jwmd;6m!q>C-VCOsbR4{xQ>(5u&#{cL5$2s$FA zT>Hqrfb0foL6MEPYj7vNk5`k#&Gc{OWq-WPDiXWVe!ZMH`B!Z6yi$clopLvg9IN+x zgA-MXj|zKuDxKV%nEj#YRnpD6?aPs^IA>q#jk_JI;+f$9pH9;^bpTHv57@=*6C zJL6U(#6{6x(g|36CP;W1Mt}^?1IGqJQ_o5%61;vrr!Wa0R|z0}`0^i_1?|@w>y-^% z3l5eQ-kkD3rm{OEf1nCi?6Q)g7m`jt-~@*}-#}*L5*sWOiq27vPWi6UnW|+@=Rjs| za-FgRSAYJYLVjhYpcHxck+NgtWX`8g`L<#z(xmYRvycMNkf*#ijLu=JJ5xRlV)CVT0u}1}a-t6XpTf zys*@$gN^wmTP;QC-BB`nlzHfeL{4R)*}lQAu5jAZ9pF`{Syfs;SqOL<# z#wGv)^j7VZyxr8}>yN&lWiN)p3He-GYS_f}WTEAR>W=TgY~B;j)mX@~`E5#WE}$a! zh8^gw!^&Y4-99PVq;8J0+GSX9!nd^Udcq3ZviFZ ztC@k*c(dz#N%J2Jl=W`fPj7yDzLP_QSgEvrf5U|;^t^A7HFIk^I+j~qy_F|WciaH( zo?SfeLM^RD5>?4gi7WX_{~}^^PlV8~mmI*wcgC935Z_gl20NhFegtv=da_TXc>W^D zBP(Ab@S^~=vup$M1#4xuWfde%xVlq8l)U;DFi4;&ybKkN$}rRzYQ7ClB3FamG@gfn ztqSp@*i&VTeH&B<{oLTz4I%JLSr*!O|D;e(*0wdx$t9c^KS!LNG)w&LnhR#gSN^}W zt2}?IF!M-^a*4L%f@c}UY}}f?)SKRs+;`B_GYF;QTrQ+^F;kJ$6Uf;<`mCNh;NOS& z|HTh1McQ)KY+Znd%rlq}g(il>H6xQ5UZ53vRBMHUpJ%gLc<_Slut}`1^y(H4|sCeHi zH({LgR$=3@gGu&#sEu5q(T1_z!m*^9v^c!on>n1nHq+>_;!tb6`^mA8B1c7rp8JO$ z`*Ro-<1cI8p;l3@I~$X=ciw+{Vsj)T^iC?!==mdoX)=zjI^^UZU+JDbV}kYDy;d>z z7S065u~K=SJLUJyc}W%t1Z5&pJ*FWj&Y`Rz+;)EQ7r<d>|>>X{%ua$)jpxMhK-x z+KinKhkCRSIpYGO>P?i8N2DFBu-ExKzw?23sT;1AJ4OeVfFR#A#g~vBB+5)ze|2i* z`0D$HZ7brBzt6U8$sIOri5O{=zX3L{Y&o_1%y%v_NCx7EeEG*#n(zn4S+zFGsa?Dz zU|C^&=2NN3lzJ=+W1X2|KCMn0=%Z@W4(cGSp7z7sAOywW7c3O(qKF&Uf;Pm|XA2MS z*{CODgb<@11*xGvYZl+m@klBx=oU3_#vjU~uQnBvqOOn4f9Qa-L4aK zEAs@T%>Q;!3K^p1Se}yMx?`UYAa|X1-dD;GtpZp2+`Cmj z#Q^(q4d?%;?;QM1KV?CiK-gakO3Y@5DAv4@T2|XHR9CbAPJbs828NF|?K4ycRv4K} zoUR8B6HC}<_cpw{??Ss3?FE@()#ku`Hl$Ekg$(~dPhl5DTe;UwDB$<13q2H5+RAGv z{3_=K?w1JrM+k@f?wU?^R^dzpj60xjq{14T1jC$}okx2TM|-30JJfo$-w9N?{NadO zR=7}$ko>uQ-P_VOq`*H#E=R$2NGUY&TtZX0Q`j9pDds@?C`P(P)#imnY;0vzE};L5 z`IYD-t@Y}+7umFaqX?mC!XeT1poF71i8X$sMCa@(3Yf6 z#f|~VYhz>3mk5bAUim+>Be(b>3rc>wS0@puum*^+)^<;V1?1M3I%Vwd#V##cAR3!i^m zcGxSiR~pPtWh(Qd={KvId}du|b!?e6N467GiYS(qS8rM{0i|Ex%)GEM!ZPC>5+{6#ZTOEO0zmEk{>^QiLlA@`__JX(G*6KR!>5fOpdMDj&%w{S!Y*juQ|$@IxaCg1sHf&D(KRxo$%@g2?_eG|XfkD~x{x0N)R@6h z(k~zRy)XFwf-_$?HH&F~y2|Ep(VUyh4GRW~7q#XRNr9k;7wb)f|9uL{hIFfW*{iAr zAj#9G#a3=|f7;1LYv-O}0E@;o$g$e=0tWD#rW%PTBT~1}Z3m@Q& zQu@<))E6HmyX?@vrhv>D`79G~gG=lqhT#gf#_Y^c9H#GZ(II>FL21KT9&WOLSvx?&z=tXH5G4%3bZj-P{*1i$%fVsC|w9LLiLQF zy03n86h+QLzxwhcWyv*?80ZqIZzM9=OMinzfs*^fYvT8oBj;TgPS6LTdlz+ugnZ zx_!Bxe>d%Az&RjV`qB2$9ng2MW+6VR^YL~XucOiLBOEQS%cDqgDDLLSbKdO|lFAy*0^zoBtGTg4Rnjg=NZgUJB+1A_$E=V=W@#|x>^)n^0 zn2>pjWT6glRNwQ?9~l&fRxJb~RMwO6hRp+OomE4NQ3F1k)$BkU?BUCV6-_%urLl7| z+x`r_h5q-X8-DWiQ|!r-7#HOnjk(jkGPUeZ>ysmCQ@A0>*f+=dcy!_0ATA%YPTB$v z?eVL{K3Y)(u~p#A^MkXPp$`|#@ui+R==`4qnZZUdrVrWMQ3|Z~|1?W!J&QX#kjIpg zdu^VsE&2-H;-S2L0l&Hvw49YctvAr$u;?Ikf(p#DSF;O^f?_7Xb@zohx9L>y2@O2O zed?XXi&Z6{*)47uEzYT!3xWCGdg!9kQNLXjej|45EmRCEa9$!15GyYk=tiPto+~Y- zZ7YPH>SwkxZj%GSL6~06$1ANC*x5w1(1bgwh!0}|gyB(4=%dqY^vQf7`ZNcKQIl< zUz5&f3a9k`>0V;nBL(GJB3X{Co@dRfDUv=hT~*$cQGsZh=y}w^^{4-MPZ_YTXF*w= z3Kj}RXX&d-&`^W+$6|4e(BNB_wd{D%m#ZvymKVGr57XLsu6gah{S?jU22as9QhW9e zz}?CYu&#$+y;m&%bEzgf?%8LntyjD7j|E@3E>Imz^RB3;=&C-+=E#{^vz)OHE z9^UTPZ=dD9IA&v1xkYG)K3arYewredEabmhIZ@k}<&s|yvY;_we5KF+xFQkiz)A{Z z#a)8b0+pCX6pn8ho(R=F9)T&Qcs$q|I5odBW}F-dxYuXG&Ho-nvb(~60H>{|wa%4X zz{xveq ztEVMMvzk6}uWM9|uF-I9Tx)+dBJUUX zs_ZWHe7_1eeD_vBtoH>>)K4zHexMzI8D5oryNTO)bgE1kFqWL{#Xlb*loNDcbvvgl#YdzUe0-WQ< ztMtu@W-hGxBEpO%VCP$~AtmNb_K>LM+BVLL8u-pbC-^@%H;K2GY?OfbGpv(w!jQ<+ zP+lI?_8WAAW4~4qMO+v?Z4E=O;G13@AmwjFK3A}dv?`Gvq|IepQR3kfc`;496UmzI zohTtitfbdM&2E`N5w~r)-HvY8KEvzu0qRx(9b#p&Y<$1Ihu7*NeX;Fel?F-!!PA$p+xkLRit9KCZ6`N;@ERC?l>@MtLB_>vujv}cMY8X z&_-?ae}~{uzOX`(xhpe11@3nnJIaH&X zS2}-U@?`L#VhQ4(pmw9Kvr;#9w0pI{<@pLz z_>7D45>Cumx`P+>0{*#GlTyAXlABFiEzQ{ndenyVzU|7H+OiPm$)M&L3_yJ~+g?yI zQ1RN%!MF2b!9o1zBK#L}DXQ+1D0ZVK_>pB=mn+hq0KT}XqV!BSNG;mx=iuQF>J49T zGhB&U3!C@0Y2jsV3Hk}b+Z|H&NTLxow=bFFwuHOAdx4aiL1rvyhk;w&b0w|8?q#1fXq*g>pwy{;RW63 zXbj?hzG?{xcVF6kxcerFy(3=?Yao_h^kDT+skV=wXFE~h!a&r?lfbjl?%!Z886ssz zj=ucO@5x-Yo_mnDsJUVJD-2(vf3ECo_9A}sL7L0HOO^#5XG&H`%7T}#Ui}JR;$T>~ z0Tbijmb(ARc`Q5SeeJiJj}6j+GjQ@HK~6yDVs_u+E5pk}axHIx@gtMm9o-@SE)$l1 z$b7jxN9fS@3~mzLpEg~r#SmproS^&JZAwwck59`5><#A%r~S(&O55A}vj z-O$}<*;|ORG5F6qfd*jTNw#1>G6=>(>|Foh`r+;a(;ub!Xb$IotHUAfR_*Pzx5}tq z?+MXHSm^w}PPg)}?GCAis#IaRXXMMQCpDJ%3UjlML2ok8yFFeTFg?ouoHA8k|FBfG zsZo5lRh*txW4&pY?*??#VYBn{sEj_S1kRRx#0!LIwr>T-UQCXBa2hif8FR5N|#bIgL=O&6DH+=YWf zeh~kl!5f}3ROlBTJbdY)5l=Jd`X#B;=Ijj=N9JR76bOD17MRcz6%6ogH^eC3KEVuMz!&avgJ*(6{ zk1;Zn=)3zQ2|8v&UwBTW5X+hYiOssXRUlBgAK9-=;zY|em_b+pw@!V?|8|(PD%y1o z5O*u;_%2P;fz3g?JXV|fNPSV!WEgP0z&P{VYTC(%fLia^=FF(t7Owe*5zF|i5Z9v~ zdNIZi=&pNTnP06x-x#q`jrIsn0)G3JmOZ~CWJzxm*;@H#?;5Taz0r$2FLrjHL8QlhcLvkBc`{_`EJp-G|W8P&yX4xOd^Ga@Xj4m^|7LJ+#~ zSU+c^Dkgb7D5=I;mu_E|fLmjUOEmt{{W9lm5JW5l$t)h@MO+qqOBPDE_-gn({=ucL+U$a+}~CAMopyqPM0yTQxe5)Q0C zDck8ZzXX{^$NM!0qeAtI+Vmons^7H^uM6$j1yuCFO!o`>FVm-%JE*_A zU>@;x7<%PE9?ta@A6*y_81d=#5o0MYZs76hy4+>((4NYr+_Lp|=-M#P@WP3N>(7*% z*v@eoVZycp6Xkd>=cj(b*J}^zgzBmiX5@a>@ye#po>+$_*oLB*B2X*5>dVSuL%A10 zZqB5-baSBHp6_wp^ZC=}i%^|Q3qIRWBq`G)Ap_1#7$Jnmq5WL-2=*keJ$KQf#Xsqmjz>E2)QZ5WUc@(1$Iq#Oj8M622~^nSt5r)%gthMn%%SfK z%FXh{!d2ovZmws(Sj=i-jqLAM^W%7Vp-7O2i_VsHqsuA|`~+Ku;DPkJ)5GnC`vY3vXZSWDZ@O!J%93UROIk zaNx};3E};D|1n_MXO6>3vEu42PmG+x>jebdU2wP(Vg*?3VzFFrZg?Qlb%CJtwFvtm z69K*3wEtf2+edeEV9Uy3aq9$!hKztBOq8k?_kbB-Rz{Z&$XQ&SI9M4?9(> zA;X-2B(<-cLZeH8&V3TsNVs;RGyG6sG*am0>}ED!%V;=;&ML$*9-9>qPCGOe0B2c= z(!32_nH;K*SOoR*oDlTWF{U?_jE*|%ZTZ3q;XTYDhqZGS2mSTYR!+Ts`nCi$_4W?= zFQ<&fJtG~%Rc5UBLKXdS4{$WM$+QE#k zOVE-V7i2-k1}FUM3cVBmYU!1uH3?lujx;3Mf^{wN%qPY=B)PQkY9ubX*fq-qgyZ{! zVsKP3xE*jk8=C#-7ScgknI$zfu0cq=Ip*~U{b-#>rgKz_lH}N|BUq4H72(n9DOW2fJcWo#(0J|iy~lL746F&G!7l~w`F6VD4bbs`hgG_NRh3V4Y`p_kNN=z zN=bW&GUTh4>y;a>|KnM-f_?QZeLGKj_`ZV=eBP*g;3ku-`-~Ia$Eq7mdf^uNczRpe z`jPhpxD^pp#aXPdtj%vb#J{SM#g;go`@^hC$JjJK6)e7RY5!e)=-c0`LGa^1gC^&E zV3?m`igG}t2w%pHf`Eu)M#%l7Ifb{HxMkh9E6Qy@`^{rQWBc#&#TW1J29ydBqub*A z#>aBCY+C!2RpOMu(iS6WLVPrOEiSCxNy+aVV$~1q=G^X&dK?S>()b-md18HJI%IiC zP0B_L8WH~FiTqgkic0)>q53`zWFnK=7C{svGdBBi-1cR96%^bY|4nBZl;T!4@e?Bm zyxFW!nr_CpQ;r=E=qXLV%(tE|l4ik80V)~?HGh#Fwpmqk^3?ZJ{Pymem#fhSQqDcH z>ul5u zF?Uc+i8Q@9+2{cu8O9~XX)6Z0?UdP8pN(LX@i+y|Xqd5@O9o=9c-<)RxsEmB)4+X3 z53Kjaq}H9VW0Bfj8X~WT9PvS zs#Wb-ILF+|G^bDOAMp-;&_}t(v$Y+NhL~)m2!+2}cdpOAZy3<40Sd0{ZypRj{GEbs znZA=p`BNxfDje6>Vqw7hi%7Bn(m{UNLhY2dr6eVsc?cWoe6BLsT&J@nQe!!QwBPgZ z!p-XvPFCujF2X;Af^?_5nW6CtXF+h&7YC{hA^$G!I7VB6Kcb_|-rslj`B>#Ngo1yp zzw>W%zqxZ$frmb?vO_jT@vqqDWx0+gR;+we&rx!ttq|LjI`SvgbukF+5{X8$(R!XG z0DZNk?xSroLV|ky75EKSi!M3LBs-XV5{9VY{n$hL8{ErUq>&aw22r5g>aN<5ZCuN1Cut4qu&KN`d8?wPjFTvIZwacSPU*MJPC z%pGL^t}sQ#vJMJHs|zvRSQ56}g+08CcKrgdj3wDv%GAiV|6x_b2TXMpJ;4TCmgC8b zkM{5|d#plk-}c!1K{XeDk;YtO>g4R}L+*nwXBaY) zfduTf4HnU(t^kPJ1)EKQW~{9URIsrPbNB4^4xer{m4j!7zc!nKMG?#1J{X9ZJk=F9 z8)KKlTE#!qYK^5PwdA}-Nvo8@21&kWi>6tB+VM}B5AG}$(5rs$Uzfdi`* z$Q@HVw&qgo3XbECoBK5RZmY87)=D>!(GL~0gRk1p1|B~DbMdEZYdKc?Kx*zFKyS%W z?X*0(XVrhQJ(a#;b>B|?px3_);EGsaZn1bc^J_aJKkRmwstKQ3bdY3me-bN3O5NJU zjT`2atbK!ArM%L$KG4}O69gNqOol$9lu5wdaBif(d*N?Fx>W1B#%`fm$0o~9<)^I= zG8>@NC-cY{l?EnIgz9o&CIVke?(S`e zoI1=0^vmZT>G8(}hh0KWcdv)eu&6s6EryJKzyhvTw!8&kgGSXlJu7A4elE3&=Qf0z zDl><&QJlRMP7DO!Oxb&-XRFxSJ*yBe_pu$O(CWS)EA;Z8C+#Zg2QxM3i4POwQb=@YYqs4WXw2)w=J00~&nEMp;n&pnMDw_2X1j`D@xR0)I;?#- z*>&Pf^h7qk7YML^<#mR2D~}ZtD(4@YfJ^%lKzU!D>TN-EKb`-U%$Klr=hlzUd@t!K zO1pgyJ93zE{A1T>_y5T@M=zpc6GS;L5=XOzZs?&$EnHr4S;1Xn`*M=0S}ge zXpvKGGpPde{VsVw3i8*YY^yS0qrYyluSexP#~@Y0*p3NtuOphF_YVdFVpAS@KKK)> z%2f>bbC=FHp^%BUK`pzWnxZ8wQEg!Ldnec0kJ)PT(EYu%)s>QW+NH>)I zN6aR2i4J2Zl^~QA8Ekf5mtd=2>tsL;nO5~ZUwaBX{8-XF+k6qNcd6+D?|FNw1_hMV zkFT;K28{YXkk>ett%f~A;oir>T<2#)`LJ?-tima z2)@~VfJVaP`1?EHJK^Q{KYg3F=>mXnG7>%dHx{}u7xh>xU9U+WJAOlYjYow9JX04g z6igpz+LV94kV&m2ib4rx_>BH@gXot^&U(IDPR$!8Ly6?4+Ewqk835+r65!aD1P+wo#mmMaFTP_`*E9*5fu24 zzn$d#K8Kas5pq$iu;Y7=OJb#3d^&)9AAP4~Mx z%Y8vbfcur`eoc{hF?w0#bPz2o4aYdctJ9L~XMYn(RWR=NmWjy`-Dkf|x8FjRBb}F& zf5-WgyLLrYpPu}+4fl_zM?C$T$@(g9!LN@O|1(E~;|gQ^q&aeMbcfdpd+QGHMW77J z^;1Htnq`zGoNU;tBqx!qV8u%M{4nTXx%Vbi>+3Mqz^@xd ztgZsXM((e38lMQ>Mf*IS-FJCwjU3nhJEE*s9KgKy`i$O2z?UgK)*3x${|90obyTo! zs`xhcS;HYC>@al>`@HN-Zn`)>xxV#b3xlbe?=+V zSq{lCe>yxmGxUzES`SagBsOE}7*}P38;tsULC1SnLoio;j9Y7*5mK8`GX1zb=8y6E zw!&B?1=D^jnJUAifs{&^dO>g3sz#ZsxxQqVuKJi(|Gi83D7Bx?zcR5_>OQzG-z#DC zfnou>`Cd^!rM$J74+#$LJ7J8;@BU76zc^(Mj=7}pl3QZbPFKw8Nr*Qivrg}@#OSs9 zn|1Y}ir(hXD<*73?E??WGN*5a9ziv~QA8zU@yRxXyO%%k`joM&1nHF1q0sjW zWpd^vQG;Hw?F^gG44M*XY*&3a#}96gHombxdQuVGb0JaHF^$rwzB&esjpCjks17y_ zWXw4Ezu3H_Y!*doxeyJFH z0C+T|Dk0Pp9W|NX+DG2248E9Q8y*8*iRpB_S!Wq6Q(;77$uRBn=GgbO9_7Jng=cgX+cMn+@_ouL;7!nGo`5&~yGl`$-&z)`1O1C$Y0+Qxee9~-rii~^6lpBfJZN1g+ zy%esZ5V7tsdwj&Dw>pFi#FbJa6biO9dGJ+_TYDBYGVqFsA`dX_C&6paJ;;S;8kg?# z)|NVz1n71~A-`1<%hKjm91mcccPMU1?Vbu0#40mnng6=_QRYO!i*07#u*}p%)(qK& zz?>r^d^+M`G;1}lYZ{T9w;l!R?Kp9zj~ytB`&bzv+V~~*4%>zjkJia=M)!N<8USh9 z-EgJaaFL0eX|h=B>w01t9}e6)44+Y5+n;GT0JOT{IM)4T#fR1x2%qOv;Hy)xYk%<5 zYRWhnR{SB&4E%HL*%U6siK6TTn>aM4>cz?~wYK@H@CH39EJFzyC-CQVPY|Tw|ImeE zNTEruDab~d+AO?;dK<90w^QCmU)T22~?Z zEse(6Ds=sZwoLGzedR5?yiQ+pySLK;>t76DgH9k0u}%83zLG80I{Ip%ZjH;{7wL+r z`Nu7mKfTECZ2vA*aBn6X>RcGC5ICT_0;(4#2)(9X`yf*!+xL3_OkiYF(6SXh|1gr$hAgM#+RyZ% zl7H{)@UDKu!*U0Rzh6=%UC&rbq#(_)=k-h9o=r%_pCG$c8u$2WJEHu+x67Sf64Zq4 z-eui(&Z}e95(}9X_gpy!9`-(TvKtG35pac=q2mb};Z@=NWFadf?hJFVrkUcE`=o;Q z2wlo$M42m29%dF|v48IqmL^FWFfJ8&k?Xc7PpeoTQ^o7F-=_iNp8EdRbXE;Jm!u$v8|112g`MvI%`z zt_B8gWlf;6ntl>w+sdKxuYpMLksjg%Z51r!?)`9!S^tFhv~^^PyQI5ae%E5%@z+&I zPa-q#r${VRfSSU2Xr4Az75^}Zs_GioxG}y2jd^c$*D#1z*%?%Nz|s^pKq$`0ZsC` z2~p4Qk;e2VJ7nT*y(E`Es>+6cX?+fMc|J8Dl-~JiyqH&RdCQcNqWZm1{5k7ZgU`vg z!O)zQFjEiB33oPn(lZ0vJ2ym%%`jm-mGo3|oDGnMLkE-82|%E9PfYnkDh|8mt7hCU zi0`d@crSiU>s?xbIX~AMF6-AS#ls!InW3@yJ-6t0pb6kW#1t9*9kJ(r8VgqDMP!N6 zPKB*T`82up^B!A3%egDqm-Xf!&!0xdv$lm*JMFDC-GAt2r5o|Xc> zoc2%H&eh_`&OYi0KBuhMjFXx#qF#bd27%$2{@q$@NG<%0ylv}&sVh)niX@=)M(;DHJW<$B7NDm7v6Q|&L;l)j)%F2P!-PgT!CT^HC^C0U1;eg=5VhFSTshC*DW=rxjQ6P#cKza1ErC- zQoWU4ji%0W4@3d2$F&O)xp8$-*n<$SLF)<-_PxO9lwrigjm**_NncBM zQn-AQ>FJGLVFRbw&g#6GKT%*0M=X;~;DN#PS5GEE{vQ^j>$a%Z#a&{+?^|@Ls6pi` zocX!Oz#n@s?aI4BhB9X(dV-h$r6rzFoEz~X9K_lEQR*m9KTyr&#UC`E2ukz(%<0CZ zH^-9K0=!4*UXPqeoiz@ zI1h%(POTO^G$WuOyz->9dFZy^2~IrX*(t*u z5?>u|zSEcl;(Js2ZUwNk8ff#Mp{db63uE zw47tvS&t{46QkgNK)DPlBaV*b=ZNC&u6I{$uU~SR?WrG9lTnda?h6$-S;@Z@yZ$i~ z;~=1h6c?YGIeilI-Rr1hH{X(&%w2Cjt5IJw58~;?NE~rP%NX~WVE3-2pWJF3H%vtw z{Ag7-;QI=W1!e!~8Uwk0l}`=FoLo!?8uVmW?KquegN4?YNA=GpqzsIo_sMLGIYTxk zo+f~1Us|oMvj2dT0iS1|_&V3{uN@4LXhs0dFRv3hX88l>WnljI6E{BjPA-`X-#}@9 z$|K8%_QYKKfj(GtS~<`!-i``l4Zdrkn)6J{>jY$Rv)!b{T3gyrM%aO{b=}$kt!Mep zJ#qOda8$iRA@c}0`U)Ct>o;WKGp5#ZyY0hn$A5NkKn<x(`aGj*t`+y6ltH-r zxBiXO>DwhFvF+Cy+4NRTsDHqpc2RE3|^`#y(@em$i=fZJ72yXxCI<0BQlj|SoM z>~|iR{A!#PvWTmUTYuJb94Z4OX!iwrI&~+~tVPhY?1=Io$LM^1Tu)3=(!=YbZ#r*h zlQv?UlXW{n6X|Q?JQ4;rrWOW#BG;xI%cTZbyB($r$(BUn?YA(Jj&67g% zq3{9e2xkOzd@xWAO-qX^JJPjgtMjc8@o&DXRk=&O!)|n5*{p*m2$ek$+Z6l~#T`4^ ztiZbN3;--Ny!nUzv$LnA;&WP(8gbqv6)P=ckLOV6Iw-;HXeQpiwk*28K~r`}-{e#G z{y6wivB!#d`J?P$?%7_{r4yQac185p%?J_EF%5=@=vA65h*Pw@~r^nC1KgX#RPGz43r)@RJVkMpB{CXi}N?FXQR{V1?* zH@K-C5VWw`BPHyO+wp!c2-LxlELDS1!KK-A%!Ij3+kpeil|d+?Wd-Q}c|7-~eO5N6 z>-gKqqnzxe(qCJ1LPy99V+=zJSupstdCysfv^uhAlz06Sx*9Zx)wj1-+M12&Dc9*O z_}DKaw8iPdc>j6ZZEbYkd|s3!`<9A^H#~%}e$xY@WB++^G@A`3=4MK+4I=*75L$WB zS&g4%1;98}dZni$Ed1_B3%iy8kU@L3ubo<}-X!|kLC0lD{q272iOuWN(O4v1H1|-%C5ztU6maJY;4^wq<=f90 zsp{z6v;Rf~_KZOZ0?{ImZdP%p_(`I4xp?SYX=F3KNm2m2+`F2xQzM1XGL?6}NU0hAu4WuF zxWj1q7EQzzpY|Jcljlko>>RA5-1)yXtsZLS-?zEbpk}o}i=JViyE4<>T=qxgnO8~( zP*>7S0~~uxXi`zkbrOE{E{|)o(A5MDQ(WcK`^TKyQMn4{y!;VQB<7}Zx4G?J z$@dc=F2tHULXT5GlkRbV_WXe%#%vC$wv1l?vEWeRNe(^3C8UK6OX9^|bFV7tHjqbj zMqp?OON-+4i)<>c{`s6E*T392hAy9iF8pgmtncAxYFov`{S4iXfy0L#`LIr+N(3Hsd=eE(|a54l*3vR1vQe4#qlo>B!eHo0LB zJ2V2hIthL~-@jmklWvnr7ta}rFTXRk6mR}SffPCuZ8;DVuOPDaK+- z-Cg|`4Wt;!tzu23iXa|7f0F9+AyX;JrYoehsi6;0q0zXX!_lh@s4;o~MS_PuI&H3N zZvAr{a@p}6-x3)9QYUshm@$9x+l^? z6*VqrY<5VHW1hemX>t#tm9*`qeruWE z{+HY5RANk9#gFwyo;qLq<^^B2HXi0^#Pr3-5$u!UE;ct>MydQ5kAs^|w3;^~j7;d( zzLd=pM3>_om%7B9QGIG3`cjW}%xyi~MtO$eP5SV;)o=9E8YT3t=L4_VKxHE=>EPY~ z-~SA(>=m@?+vrxwE<7P-C^Rq7yvLI|RMw@J2`ygmM6N&-UVB6lqzW{~9F1bsTP619 zxdJ_85n@mfBVbfhIme|G+hwQ`3MiQ=b9?@24r^*1wJz~ePYhX?tSzi|MhwREIX5&7 zVa9forCL}T`eSoX#uv4|$M$_#ASbnVaC~!rAz~64>Sb>@bqy7?JWEaxr|j+jTK^4j zQ^0OZFMGj3G&g#7H1&G66u&<1QV+8Qa6}gA6JN)4lwJG+uLA5J7-l;`+zol&?gG`i zC90XN1~QOeqZTgyyS1P z^Ug63I;!`&U%-Y4Uq?PjQP%TJR61tVqC|O$r?=vGBw0dX?b$iFG>}q{LTJ2$mX=5c z(A?C7MNUf1_3joPb_Z9rT(q~wmy6%j1?RtfAD`Tk2QqI8`6f3&kw7SvGFlZbfc{<2{}4KBB8sTPwp$D3ZdP1$Yg_s_cX4~_he3Lj zm0nn?-r;*dZ%c^MKAbg6g2n*nK)DNdN!VNfrxcTWxEvp*!ZayajKbV;vejhhb9?9N!go+>xzVCn!9tt% zi$=n+WvBHD8>yx55?yJw@52XFR6L?4?O%uJJMbufLb>(!Y4OeRwsXA3o00+)+V);y zm=-h{F}xS!eA_V9<>|{G%K#fJXU$`&{7s%~|33?0`i%Amr2kmxzv$lHki=g@C-aP8 zHkZ?(Y0%(*p+1N+*GAAH_1>grU9EN0iOvitZ1E0Ym~W%Cj0U!UI$j-VYZ+hOC%SHV zuJa9`3aWjS!7tT6E6e#x4z_-)UdcN9e34TfGjCTT_^;7_?RA!o_o!0|6OZr>qKz%>v1rOwam~>hez#UUDC*5mkXo36 zu?*jNcu#}2{kK&MMGq*OH8t^vzAQ*ceQDg)j>iHevU&(#xf+<8|He`IU*10Qt@mYT zcb4nt8@jcLD97vVX^CC^;KUhz%BXajnRx8_*F!k9#`?*sT=AUG$G!sn9ZvfbZ)Y%p zt&2G2p{A+DC>^S}TreW^gaER%UY2QiTctO^E^<~5JNP+7HI8>;avw`St`9t0NUJ@0pGh zeLqAw_G)bQWz>Oi>c2n3s`T&P5b7Pogv_+nv<2N=@mhg#8(!_;D7V9y$B^r8834u^lFEuuJV#7-=Ya zF=yQW(=CI92%!0zL2A;;AO^m~p@F{+G7d!RJ~*{1x65>1az0YAo%*~zAN$%7oETK`k*{9ZvWgh#_|_Ie^qLzy)W=Q1Ck!i;I}RIVR?eG84;Y)R>tZ2eC+ zus8mI?^`}Wtf#>N5^yx`zs(MqLlx`B>feC|w&h=pn1ZSie$-iNrmc`{I2I!jSQ?Of zW0Aso>D^lzE$Wd2ZX_MkmaDCX0tnjGF*xqX&M)I~)m z2z&Y>JOx|F?|43{lR@p#RF^TzKSVtpkg+7R4kPtc?3PfCr5<}5X@M%p43-T0C7EL; zZ(#74>kE_EkzlR?AMY1#k9gnh^gZ%!dVT4hX?6_%3FrIn-Y=YLv>?Y#%^l-q0XE(X zA1e^UhQFy)h( z&vSrkQ3CfPS4}b5NY$204|jJ|!lO>uFpmUpj66j~ml$>?O-Sc-*{#?BP`R+nkeJJ({QIh2YP|3qz^zvFw!4z;r_((K9+QdLjs zLao0I`APJS4Bt@8dt1R?Y>L%OHdsl$wlxy23d&mlDBAmkMvsot#sEYPb*7*5pNNbz zg-nZ+jT0kN-3xPeN_8G<{kVY8RWJLj;m^Ip&?cYF4grF{+t)G(8Fy;Y&)eh%!^Wf5 zL_>@W{RO6)sI|nqd;+AYmkex;OptqJ^XB(LdP0^=A$4v?>9Q|4^mmFZ59+Kw;?Lt@ zkN;GXhaPW*7!5c*V+R^Z077Wr%O7m=h1!=Z zn}xM=b8@49Z2%djdJ1JvhXnU4%G&1fIP7NMWGn#Px~W*#8E$x9bja$%z5RP6Dnhg? z=`DLAZ1HO6QjCz$bEdeVfS9;3n$n=X*t9E2!Y_3}MrlMy;?>cj@a@>@gN270ke`f8 zD~YDEIh?sr`~ZY8x^W$r#@OFI3tEZer5U#u@1Ck~9stS^1s#Tj2(iG@HAP78s`Q*a zWT@c|e7IslpY7Vn3cw<#2X{oDwsiGi3FddDvGh(kL5l8Ylu%c>NY@KS9yR~#ffmh! zDqout1nU+rO|!KL87Hv4zd5W??R&n9z1vb25`--~er9NFF#=wGVUFXjIQ>*(<;Z(` z$JX_JFyN6ekC0sQ@u;B|yaxvsy$2o7Zu``&4Sd|cyf#QDo!Xxm>z{cebJqU%*|TwB z>DMpv#SHK%Puf%Tz-C5fGMPhq%Be!CE4?re{n@>zyAjvEtY`zucBq}KiFD^FbGpG#Yy1-kFCgJgVz-Tc)}k%LUv<+1N<*1xDdD>qy& zn0sCI`dB1^cz*pr!iQM&eOXe>9 z#LZ2`^NO}J0+KQceBTWw)hs?S1&zML5QmS(q3|=YQx6V_#LE{Z{%_#wxBrjD0MlaF z#m}tE=mx|EFqCsGNDiLB*8`b-8Cq?Pvf-;C5&dP05g%k%LK-d&si~?rL6!O@tD(x1shE1NsYj$d_U%Wc&}k{F!1sdN zm|D6Iv6khr?4zDhb&@QQ?e=zZS+(Y5-Z;non~NWQ7L~_w#EIrz5KX8bi(>7S8U12gpMM9VRAp<& zj_d_+yn|{%!!j9`^3DBbIwS>oY-TI^W@QK3PhLfJg&w3i9#|%@UiSLhoA$b4N)^WX zHEvw@Q4|kikc*rPn`k?wQ1T$+%{K}5g0i-1`V$r4wrPl6^hDh;xK{MbrR=()4>K8U0|kDl9uv?? ztkdGgW6)?yqIk(&mRebNa=vwvq=AN zQ20BrZz4dsUvr=N=QcN@(T>H6$1L|Nt|vswIBLKH*Aefkx|y%1Gg^uGYWVuUPf6w| zQvmb@oK|7~@>4Mzt1%wtuEMWe2g$}W`_rwlbGk=3J15{pF}7ai)`8n6`SqMv zb%y%5t?aG9Eu8G3)w9HzI`y5ZOzzHn zL-5#luMQ*^76Z!Gd#4qiegz)IuKv~H49Qs+v_3;(0-vlZ&rYP=;s>|?OyHMg3Ys5y zJ3iHv+1H)?x0g-tgh1juYU#KQ+Jnqx2Mp)-(x>3Vww3%K?{{RIBI*o~YHU`4(o@JmyVe!th<5F2}Ju+o*?FZ^$K#9V)iG zx29(y5Aq}~_zks`#}vZLR@wSrtWL0UqLETYkAi$(SV)Xjaj}w-Uax%w+NZ#w9tA9Q zm|(_R@D%r)jzN97;T;>7*LqP`)3>KP$4I68^S=7+Rm~&FTJ9Fd{+A?;r-a=1j|8A6 zNz(oYT2{Wx;H;I^4>H%pWV&`_7B@|S-=iEIYIm(~m2Ti&EUOKA+6xG9iHpfb^LnAT zCgLNtf&3Vu4dS#w^wKz`&>BnM0G~g9MkMDemsN=f6i8c$yF!f@3=Ez&*1+f3wd~6vIB50(Sv^CQ7U0_}ctG!)-slDKDsj%GB_MzNDM@OT|+8ecVgF~>? z^mP2&JkOK1->8$vQry%5%d=4a+#g8z)iG|{`|!&Q_z`ZutcbQ*$Y`hem%jLURcofA z+B=BKMa=E*p+S_-6`{+aL)K^9)~BT(5khH*3-OQZGQ4+`BmKcF*B;K$0exWOeeMYZ zis;yrj)c^Lvv~4WMN3pJ_HGbmDouL|ADFHXPAuPSZWgacJinX@D&7hoV0=@7$#pBOHIXB(Dr%R!rN5ZwBK9DY2lu;Wpce za$PBs8Y{;cR8;~iA(Jagkz$3Y~7 zq{|fjG(?`yb@Vm=I<(HAFRFSZtirxI)O6x1r-~{%cQpMV9M+MaWlM~iv_#@IGTGnF zZ!CThH``)Ug484k(%zm9&2O9gN~*mq_xhTwJ@A$s>2?2)&zf<2Dr5s-P?TzR_pbCg z$r?(Uus&hTYbAgFQ{Cb3$y!B1!bv*Ksms3G72vGBTe3AJqmRG|n{%?5|Kkann|>=o z!a*YB{8pww7YV33!SZv-@r@XRV#y3K6ved2@koZG!-%vpYYFC8??BM&YLJ8=|O{{8jedp33x zPjzC-VjVqwGG&+s5E1&(Ou({9=Uk=>GG}__<7gA8v?|oB)l!tVcb5OE_VLIy@eMlg z`@$<=Y+?1;sKtw8nvXiE8fm6^`<}BmkT(kqEC|iL>~9$(-Th`^ca<@3Zm|Vg6g+%_ zgkU99Lw`!^PE;N{S8l3!x$*7O!^iRnB8iaMiJc|y^>A(%Bs&=q-#|Fh6{->RAKo>P z&R8Amy?ewR^w`8OYF>v~qqo;>U4;u*)d`y%o*ag@vnc!#juG%*8hCC;w94g22a6I$1b z%*9D@CO)b2`r9kjG8nHi;|d#vkMSH&C%h4zIye&Tht^YP>k7FK=6=ce=y84h*`wFf zWgt;!pkrutf{;ib`F)yDU3|u;&L*|tpTFK$|0+yv-l$3Fac!SnaKkm6|HnC zwcH=BsNtCDw_cw1S0TCq8$LO;h-E$y2iCu4p;UQ1sOU9o)>dD32-pb7K@oW~t(_2D zxIN+eIaieZ*Q!V6M#0zbooWkNXiI&>R&~;Wbe1bb7r}kaZztn{uGfVMF2YQWo;_F- zHiIPAZIho%a6Z3eeZ`FZE=_cFA}_P1ouFV{HRQlfPPEg*(8RT`ycnD z4NuTH-vAQ3E9#UK|47JAt8*`ob1RqMq1og zEw#9_miNg0r95~Ld+Fq7Pm`rBEvLKd+$STmf|}c9mb~2VW#M82Q@G&Ba#B{FKYxDS zKzrFIb?CK|{m6BD77?)jK9nsK zS5XF9ii1#zLsMN5#e*UPBG86{^^Uzo z#StH1&K}G8Tg?9A^2^#-Ym%|nN)4M3VC9AKZOxoa(@~almO70BT<~Fs#OOy32s?XQ z{EU*ndw*c!j4ryVPO7YZ(v#J_4DC3F2;`>>pAyA$-OcqY4u%8J<@M#_pZUStHJ%A_ zY?Z_r>5764us`DEgU>$4DGmqJRG)RyQj^-=qrC}JYX##I&W8Igo9YzKtq!#+nwBpK zC;clrsdSP3j$32l*8Wl8=^!o;*u;-KrAHdmke*DT=9*Sl3{;V_q$TvEJ{shXBCqkk zSuKIBnVsnRHLfW7nfu?j@?Tl!{^*t)3!6}cnilfKv6Z=9wgx`1VbBh$7$R(-U(+BQ4b>H$Yo5Epyd@zQaH0l~?h z;8^IN8q^!kk$5j+Mk8!G?VLxRVKd)*=sQ+hB} zJTm&^XwdopuDSsX z8ugb6ag#?L`>+Z|_51M9?47c<|CB;}g=XS$O(>?c5>ZbzO0>{g272(f|M%x=Iorfh zC}S1p_0S$O;_p{Mq=D5wMN6s2q4LEg-^%`A&n$lM-N>cjPVHMQligksG7eIikNrHh zO2Fj?$?UlmW-;16_~J8H0-|k{`EMi3v4i4+)rxt=pyZk%IxrZk-v`x)y&xyJO*HtY%idLubY#q!h&FFnm4QmLuH^JRZoQrN6aKHFUDv>Izy1b- zSMwr6Mu#*udOuXA(0$`^a}i=}I~;!Kh@F4d;Tm&d0Zj*8Nq{6bf8go%92CFj>UV8Y zzo7i=O671EF8%`0EXq7j$oQ!!+tP(kj_9tj(Y2V5u1}if37u?f18qS+QFP-9bH##* zvj7F47u?17p6jbqEnInQ)gg-r`^(QHVs`d zQArOiy4nzaY8TqY{MzFkc1Ng)1*WYYm<)+yWD<|68Cs&@C0Cc6jZ&XuF6Uz8Sc-d+ z(%*H>=h%W@!F76e{la%tbOj15OFcHf-e7Q%h+`c zl|G@dWc_Dk|IQ^?p;$8MYkeI5b)O!y?xol zHFhnKDszo4gNoXgBE7BT6VTl&b61`-*FC1lr@127&W0p|0IJ#Hv>6vF#Ivqh1rp8Q zTq;ZvGK4=)g#@xyM7`q%-BBE&>-<39{V&2r4sP9VsItj;v`)!B zKik9*QRj_CZRcZ{0HHx#rHs(8;OR(2SFrgq?spBj^qa|gv$rtgk?`BCt`BQj(ltn3 z@LG3Z0Uzzg+sFJb9eV!r3jOzE(-^v(vyPxDEL&!KRc8p`KA3LOd4s98BT;8tByv^A1t>HSE4!U9rgY1luNnd`O{#Fk6nMlO~Xe`#XeFcV^ zytXFplKifgL8g-!hJoyfE?BJqpe)suSr;c{a*cx)1>Z% zWdP+h9cMv61|O*LA{n3_e`gT56Ri1w#C?L~48f~rM8IV3Q7LmXBABec0?a?cO$JP! z%Y)BUPF>56OLbLznH;tfDMHVB<^IYFIk!kCz+tHK!YLo-~35{r=cu)Uh>8FBm(o zfY+w~)1B8mY`?y4xntdnBMY60Cfqyxe(mK_f9G%Q{Y=eh<;zMx<8TJDBq7m6VuJFW z%tQ4Z3>stPcj6l#;w*k@6l&@zSDlg?2Fp0^`>feCj&zYI{sWsC_4N@(IaoJGP5Mva zRky}_rOKH0YN83n{CRyJ0D17`+eZnJM2kg_iv5GAvxVnvdsE37pFLWR5yo@OFz z;eh5m7r5Z+y#x((H)=BMu~733z1bsEyomn(gY0mP^R~zWkku z%#DL=M*idO*wpDI_O=$UO_1FXuE{fJ?fAQ>o`;-Y&l-Px?6V{A&$}aoa9~@YYDz!; zSH-zw`gA#T5NlCECB7Nu{H6o7`>4IpAP>{dPhdg5L4y4-Yk{v8OK#iNz_U3FWpfO6 z4udRj!YD7Tjz|9hV`muZeXcQR*Jr>iR?d;X`~Q*X&HCH4X}Hk)&i zNAi@J`cT%W7F_B4$42VCD~~EO7I|DqTpobZ?2JHg>-x}DX(~__N14O;DyX;mAY!83 zvZu$*PzH(WD4acG)^LwS*wUgqI%6iWIH{`=|8WtyKZ{T?xCv ziWsr`3vaXrrL?!R2ROS0h!{6kkp_FMR0^EMjyz%$(l9VGstYOKMqSd9Ecq-Lvy}0@ zw&4V6g|`mYk&nV8A~uk=VazG5?K<*OWlnrkq3DM=^lW$f*hFIOCK z)ax6p2VWEQtT4Y-)Dk*;2VxWd5H=;;%?@PXaylUpq2(7Xx&2rH zb8)UoDiZm6_nQ!A-k`Y|yT|vQnsfWa0rmya7zrY=>_C!2uj?EElYMwC-S3xUi^ItN zk=s50Dn=M=!MZxJl;Vm?i(3Ygmtr&@ak{{P)4~dOByDn89MxzgN>f?_hXFlx@)|VJ zR`8lYJiVj;1Lejz0Pzw7WGuMt%r4slT~xo%-8`co3xo|T0Z!ulW=4V2dtdge`5)`S z)WVZL+0Us}{hm{i^mHs?YoWrK6ntRnn<0NN+u;UUb#EGTL4V|qBJM}*8++|slvc*Y zo}eu?D+kl|N!`zLKI$;|c&3~H#J1MM#wUatMQeW&hR;f+5x0yI>;q>L)U?yslWS|F zUgkuFP=fjG_uO5_=mup9&I!Qtx+35~6x1P}ZWwY;e{@SaHyj^qT}BKV1+R+Zc>4Ry zBwG_lz1g-2%UKVipLrTx2*ge2s$9(ZozNj#^cJ}G_9UW)4fj8I3sqCpVhHY4N9W~Q zxiT$wL)eAqzWn!)Bhwmx!+n`iIK-=sLHwN10s0=JUrTmk+D@tW>a=3*(*BG zl{U4+?ZHz!a(>v_&FxvB7%6yB>x2Qd#s}GF2)I$}SCr-neHDcFt9r=y^AHlVaa&;# zJjY+My*h@P2wx#(vE9YRRlW2#N5$&f>@^AA$0prLT(aSdTYlB%v8vf(R^-E?|8CzF zcFJv7f#dM&aKoI;KC z<8HTic<CUu{=ZBV29F9o{mvdO`SkJF#linpnv0r1THEfZVRs|1+~C}3jY`|X$~0_@-lMjM3Jgzm*w1c4ZarifCOwCr8JnB@Ft5=ukA(E6D+&7C8C#re zeB+t%(4ZcBvouVX^Vcz_h_^@IRAPIbGj!pGz?B2?`=_*o3aa_z!1p9F9X9oB_`W8f zTJ2fHq9?FX#cM%E_ns2)>fsBWPVj0kDJNe&`wwxUXy}E`E;my@{$)v5f+GFGMAn(J z2ax2TXwR_sXIGT$=8to=wlGK8FZEcPkj6!MmC6UuQmR`q2#WH26xA_UL_M8N))A3M z9!H6R^K$zqUwchM&uZ&(meYtqzW0Ly=bl=%i6|6k8uq5|uLs%a`)(1)YQk)1)|4iV zb@1yD;Pj?=Qgp0ed~R#j%2785;DUKaJKOl*EuC!qzp331N*!l0uu{dO2-6#9pB3-3 z7n!zSDLs6amHHdV`Z3q#=DWnaR|~tC)~zP@QuT!G=T9MAwtI3$Y}Tj8^rU6eE6=zP zxuZLZt=o(rKE3Kb-s4St8$5uOCO;zO(QVtX0JcId~~>4?L7Rn;*|?6{aYernm{AaX6jEQMNaw zx3X|J@?l$jxoJ*yg)kr`ou$8tGJfOIQIksdPe$3Z=+OS|y3k!W?fFyYg|k@G1wrr* zap=}8utbf_ce=zSE?5e_}`ZtkL`CgZ%_)cYeq3s>{Z%28LzwRdA0z^4{pSE>nvA<~k zEMWi5)n_+!G_KcVgKv~B)|wTGwruU3hjS^0c^ZCc^Qz%`!CVE&sQe2GF5$4qPJDV$TOrgQZFvFo?Lrkx4c_F3k+4mqzjc>NW8keQ-9lm~%$;2tSUUn$K z8YJ7->oYdFKlk$gzt#?Es9ChO~>o^3vy8j<@ObCos^D1RT9|K8Qw&<;mN}y zDRJ1-+9KZ#-kPWBV8V+}JC5Kj>rT^iDSzo{wBD@-U+`{V{c`Nl_kh5<5=y?u(X(re z$t@aCo2eztPB#Zs?K<|^Li-R&9i{862d$=41jB`zNmvrCJ@g;r?%9<2eL|GlM|<&K zT`gPu7=KmjQ^?QsMNa}SWT5;=n;p8XcltcZ1A>?B^?YCk>B-p3uzz*(I0?c2r-I!c zRB)BuJBW&L_uEZG;kiYclbdQz$vSHnT00aW!WKx00FXUi!9n&NQJr z^>$cUd<=Zj^u+Hh;+~Yre*m-ph79nXR^2yur~VLKV}=F|2B81b`}a1fVx%7$#5e7t z55$!pHU9z)grKR|CTb?cxq=oF__^Z!&T$RZ=U8;U3#2gXd0Osle$Z9Eo2-dSN#1D| zF21Bw7d_rP1fwNn#?+QcXHdXT83K{G>EYe8-4()f;*NVoD_ z`N=187~N&MA_}#H0d?NgadY&Spl9_^yxBt?$5qX@@v;KtG-Za020Zz5<=I`Dc1o(Z zT%!H7FYs`n)i#*NtLksK_8+>@FwT9pU*t^oIzvD6f7jwqhVgGsoWdhkW*K8NJXTqa z{_SJ)ILshwKDWY6F$yVEPI-itv03ie-7}+uUp&dqS`wb}hRV9nM9ft-_NjrZe{n*} z{K|pZhp5FR-iJ7@vQO4Eqw5cse1Y_r-kX#}7I$ZW&SS!#G6KVy0v8K`^-g{QXT9~@ zCGt4Y&6Y$Ml2Hi(L?7mVTH;e-HTd5X?#v4KwJ0>%x=Kmn;h%~~DOLO!tPE>o+R+yy zlvmcVGKY=GHT|qEnKs-Olz1Zl{5q1Xx-bmtoWZLyV95cY6A&1t7f-EwVW%twuKLA* z!hL)vKmE2uO;p2L94{uQB#2;hGtIgl1rSv+ldb{f;t#1YD>03J|I6t;VqFl1_gKTQ zdoM^|$Xeq?vCE^-G{^MU=`6Z8eP@XC6BG|33HQB(is|?%Gzh!UY^A}}Xcw6B)hI?I z5Antfq|S%b5Em4d#E=}I$)?mMS$r4G{^_kIvOD;U8>UvT;itas#Bi^JQW_%lZ%P-pOt^rnVe_w3w7AzJf>SK+^YwB$dCUP4s&eZ50ieXHAB^dN z&&+LulJzvy6K^qJ)u76#f@Nyyz!OV<%9F7LqB9pLyuda&P-7gPcd~}wSA+{dcRKe1 z>7!+ig1aVD)#S(@(?@JqU-~^q1#6J(m}x5fh}#Hjz#{=e^R)fsU79Lwq#2vfCy zGj4dS^>#l-`YE`{-6Q4H(D}_zPq)w!#pZj8L4^B@#YG6cvwh~+%Hi&lXwy%`sff1|pU>&D~x3>}3jQH{>?5efo`C*a7Z=hO$)`S$UlaPtx? z<{lzKUvhY967a97u#59YyNM&q=vKL zTpNv8wZU4<5t`Jn^M8-Jzn6(SsTZZ&PR&4dlg&T=m(>DUhWU;@JW`@evT1nG3YC%v zD#$CFZNz}{QbQaTicKoXbhGt&7ShTeee0Mv1=rLvUTJ#P+DSNk|JnVbU#RM%2IJs& zuP*{GUk%6C1%=sfxYb-tNC3q9CTfN%OmmExO31LbyNG!1rmtMi_AXxyNxWe3Z97Cz z@59tX8KCPPwqcVoPuJtH%T)Tpl@J^I9vXmW6y0M=!5>GO8po{9x`?k)j!S1v>IoscR`&&T)hv`>YBza_6w1;-XtBMSI8R=xI<~JmP9tzha zzggT+@eWL4ET__EkH`J=HP%Xn!Y042i-(1rB~14Tr%h~_-7D7>^w#QCb1^x& zE~L!nRAQl}J7^fXiVRF*mGEa=9oVc*7P=HQ_5_-YGW*DH9rSj)%lE6>JMp#SZ_DKo zas1~OTu@~v%m`<>hCTM(+soDO$^A#2K6Q*=B_Xg11jphFl{SS`g@gys*DZi0uP)2@ z1SA|rSp3XA7P~ejHJd+j(D4-h^*Ey#VK4jcZY8J0tV~8vJ6G@Zc#EtHsa?Sf4mkz= zE}hOeFL-_E{jzFv%=5pHKcshNYT8LBoA=aR`K!38Sc3O*Z}BK^6BoJR6N5N7^E}Dk z{nS1Vl4~l7+WiXxuX->TDuS-8#5NG1bxe2mZ`R8Nqx~FR6-k!t{2t96z7HPbEdbIf z=5>bzs~WUBKRf#^xMAgJT;2jAetcPIKErZ{3Q#5zOQYD? z*YSsdHd5V!XPq^12r#RXCm)_ z9dLV$aW)2ePI!c(HnF##%0|CFHaVw>cN}?L_Bo!h0+4MC^_e~Uf9E+xE~ODQTxTEe z9jD@ehnS52KL6*y-^Uz<;#Dyd1n|Lm&9Ooo+}+F{6(n6_@ujNcY0P8f#mt0HpDOd| zs;}&7c3rw6*!1)weVX&w67-uEhp=#_nB*-Zh2H9jj4m_dl>sch!Au?POQ{7 zpg8-dGuO+DyD<{Jz^@_S1AX-q?jD=JKY0`Qp7ikyMew`EH{JJhCA{ZVIn`f!S z*LJZd^6$JUddVy0x{wzA2mAjKb)Hd8Mcvj`5fM>PQRzidP-!C4OF%?Kg>Am-o z1Vky)RHT=nG^wF?5_*TwI|K+lKnM^>Bl&pmc)xppo^!@HKh8LN%)QoL^O;sU`02y` zttDG-OBCs0gV+?Q?$Gb+`$VCU+rGh;SlNiMT>N+CRCjOB$zF8w>qIFLmG)_%+r&@< z|L}?}==EN}X2W-=jwxG|wu-uxDP>!P%ArEklI>uj@G`oGqbht>qySonP~7?Q8L|Lm zCYvFI_YoC&WX|{nG`xhKA!>rsnV&eTKD|SN!Jw@^i$W^?mAwD%(kl?un(#FadZ!&` z?vAdDgV>3HiM#H?y8$=0xAZtm-~WhtI@Ix@!k3u#j)m`)Nn1DNXxI)z+-|y-N#~ph zUjN{MQ%-&$its;w&h_`|7=lo9W8{?jHkuDnv*>`X&s{yB1`6?u-i6 z>d$?ERG&L`O|MZJNlWw-*7oC?BH)YOSt$`irXF&N3ypEGq1%TTCw`3Iotz^X<8OT; zj^`<}vP9xXm_AN;^PD%8In9}}%b4xRM7=0P&@Qo2`bN_HG5NBc-T!_+ja3y=CnE`| zh;!qDk(yDCG?O`GUg)w$7_}naF?0DKL-8L5}-LTM3>jaf1zqG6E^(h z7NGGy^CSMoiBh7LLryFG7tiWgLzXK_Vxxq3PyMcBgFt^G7EFZ%5Ch?d3Z~Qo$nx3h zz|5g$y*qaEowA>mBIDiXd^R5yy(!QphtD*KLKicCNMxMGfU(VbOU)Osw+VtDvusOi zps62_F<9FMV9C4!wfO=n`pVI?GX}$(>*EUe?R*O4ZaADjxcY%&-$=fFxJbSAF^dVN zro^V>4OkOBp#g?#gDFJXkvNh3tIZDX2&jw=Exy*J)vm-F!gUy?JEuP6Yw{!sjY}H6Z{k6peehIj!Za;O~3M zZSf=~bMBO*w7uK?VVbaVTlr55RO9T^S*P6u$=jA!@98YzmA@`^j{DxUqqFd!ml)8g zho%ph^PtgUX4sfIDqGUP`De%4%1z?ugaI=nh902_C-3a^O6#s9ZavR>@~%O~hr7i) z9N>{J7qBz>nj`VN^I7WRGj}Tm8QF0E*;fnQ#S%R{nQ-V@u=H!-m1$p%?^;pvk>Xjq zBWyxOR2CrK-T;-xo9SE&?%1@(t~WidiaAx8$Vz+%w>cjc1HG@q_@>6;DR!df8u=KO zd1rS8+wf1h%X)+T3uY$3jf&?3IINaN#Xg}o4zO_KBGW;NGteASBXUw>S0?ryYE7BLPYaV+&Jd-v1D&2223aFwe9G?+zIf*GU{-!S#{@l_ zLgrD;$DK(%&l+D-CvMLqpx;D@d=BTcpNne+?J_yM;14rnRU2o%waP}5!}W>pRk%9n z@fdBK;WlE7)*-X!2%em~tJoul%O8xYy65h(Osh(;2Pz7206VXp3?S9uL}-(3(-`e$ zT+pKzX!Y-tm#`P7MVnbBto3(&SIiE{^Uwh~7Kp!`RdStv<+P&leg147|FyHe8Ln3Z zDzdGoSkfLAzCxz|syk!*)MqZ-*rgl1!i5B1*U@uk0BmhWpW}oLz2720v4dX4otb~oxk}!kc_x|36zV&*q&;JC)XfgImA3OfRIfBT z(hZDE&7T@3Xak876~u`#8avo3f~q3(s|ZzzBrDbAnff<AR$q17nBivo)$k7Q z5iK!kEXn5fymCDiGxL5m%J|JbD{zJ<0pFp!)nRYbLLr_IjxCw0# zLP5Pr0@}@Na^|{;T5eCuyv`kjNX^F_H!}v3P5m;?t@iLVxx&b0O!|@7li8l+q=mn? zhwQE*0VBC@*OOicZuFn(yY%fRO5eYm0Z%hvXDm{%@*YL;rndNS$N z!I>ZOt(!Q_ukfSw2X=N`EAx+mo7xv6bXL4->OepQzxHznJmg@eX;nCM9(X3BwY;{i z$7#%=Fx0fnyUmAL_B3>&f)&IQc}vgXTc zf6nDTW{K?;Ok7nF!)=_3xPBP^ZUk`8%fhfe`KMm*-=mLnRg| zvW`a0Es^g9N7DnF;O^7q0Q&lU&vR9#{@3d^6JjeyAP9!Fj@8I3U!r&)kfu*ah043~ zrd_nv{9B+`#e3_%@@uUU*%!yWM=6#P9gW+P3i@bQYCEd+zArsJz4{L($N;oN62b&H z*2b7>WOYg(d$V6VOJV^F?pTB5lBNhsrOog?Z+~ZFx4hUm@5n_1rplL_?mG=x-SQae zm9oM`Q<)afm7m);v>ew1~mJNp_{Z`oP0#@#xBW=ch(`u zV@VcsSNTeLo^oCSh}opsZ>Cj0%y>s=DQiYo+H`^auKX-+msVhz!c-sXZHciuxIzb0)=Ql~BCV7WB` zq3ky6ieWW?B6h+JslO+aP*ZfGKS`Jez3pqh%DiGInQ5l3u$R=tF2S+is>`eY(!PkF zeu~_Te|VP9c|32ZFZtSnexo_aL$y>fXOqcBjP@%Tv-(;s{Tj-+>w^TLdM}+lz-Dc2 z4M9NDCi+o?PBRcOiM9(lUYmmKVmDjays2A@#)ps2e=_RV0L@i7p2|B;`nhDcQiF;X z2j~h)dDE&>PmceigMP3U$J?76IlDaF9Q1QDixSv_K>EeAmS(7HKG91Q-)@$bLdEAHiH&}p%}Uck%)x{IR8g8sOIu@lB}*Je@|I^W%xqG$NX$UUb^H}h4c&~kzgrR!$%PKeX) zzqfJa$J<2}@aJDXT0c$G*HbgMbjxq1T)q8j<&Iu{Pq>xHVg0^f^WIa`$a3IvEy-$L zO|(CMAAQJ48?BY>kwOew?`$3_=ilO4ay})1It=)p6%BWxPx?qdL7lg+>bXwp)#>%te_z>e$j8qvK0Taqn@c6?=~KVO;@C4qAk!bMLsmfP$qd8mv_9O6)*6by zU%4$&@v#b1sf1sX1`;B6CpH-M2|s)z`=_G5F){x>e!0Y=<}&3MuSOEWaqH0f}q(xfHjrL0-13 zo$4pNrCx`r$Or3jdOsQxWgoEz1+Vf!+Z;6+3f;=ue~T^y0*Rgg8k;GV@6-eaSwj&8 z!~tYa#O|6cgzWmECq|f>Uq1NQ3L!Jen8tEmB=KZKdh*#~;PFcrlexcQA z|A-;0a0^GSZG5JEK%zZ4@;7$>zY+=4&Dux^Bp0?1x}6jSg_?9^&WZK;F4w-K-($); zAm_k{Ynj+a2)R)lb*g|0Bm$`mPzVu%muWoCcy*=A~Uhw7HX%$k8-h#k7 z^RMgmSo;~R;D$80^}D~k+V9oYM-5*4RqtL8OFY6>lyBk>b*Qfqr95Uav5yJX%; z*Kj|b!6%|8gP7J>^gSTBN|sX|cLvmz9;)rXbcLbHJP&h}sBM`dGu!rfSXP$z9=>V6 zqu#rcuRcX+Q7k6R36aq9;|$tR|0fA{%P}w9_RJaMKH=*G0>BWrxB|P?4ZpwXYmYB~ zXn44P?p2uL7f;Fa`g)et3+~0eemx2V_u3Z#A9~Z{{qZkslL^7rk8i-IRm(&RGDeQr zBA3fi(XzE7%vvUcP}n4PVuO- zC{uw%q2m>ytHjQ10gH5^%CuxnblTC4HQ7?QFZ-XedvQdx{;qA(O1=oP+Jaa2jKyUlWx0Td3 z{#;K{NeXzBgm39*6VqQ1%FC5H4WBE%>hp?l z=q@iICvCgiU03nXMQ2R2kx`+~@Qu~^P&6oqPw4JO(Q*8Wy|Iuo!#AlUoG!%GQ~%7h z!Lsa#RINv!T_PM5ui4n_rgsyKK2+?;s_L3zat~qN?ToTQ-o)}){f*LW<<|RhY|Pna zm;uJkZ0D--MAqlQQ+{P?3X<<{<$~V^5J}0f;ZJoPYM6M4u+k}q& z1|dVg6N4i44rr7$S@mDN!{|w;oo>$rnNL?%0$djs`g(CX}#3@3kf!6+h z8eWe&+mASLrG|?`R#Aj@amc0_MaUG4*8>l-AV`L5zrl}vQ@WWmtmFOvb;XZn&pV5x zx&}|WRh55o0i>pUdK7g*uXll=VD^9Iv-yHt=nmGCVjGg`LZ05r29@gOcM7 zTgiLlWov+@del{MDqN*+??lgx{Yz27Rj1bid8cB9k?v`kC=J=Y zWgTQ#;>iO)nS4{}g(uT38SHyeEc)yv5%Bid^O0ILp+fryi9ka({eTAeOo#Z@z_@#) zRba-t(xuR)H;YviK75-x0LS$?3&T4V@Cg5s&b{U=%$41Wq=a~!MYsmDUUQHkwj3y*=P^`)J#p{x zsOe(y2)m&W7%u8FD;1ljd~Y(;tWTI_G#m86nS9&30$^BbItRzcT)!rT`X}&U{mPq| zF)>A+x%{W!#DaFX0PZa0T;=RIw(%mFScQa#R%~H-$1qA%}D(SAC;@06_e-h0gs?v#q z_bz$=3`%0k$3n7=egB<{9vK4p9N4M;x_rGk;T$X1#0S?d>Dq~M`p+M;K<|YfJ$j(s zCSr_`AK~AdSex|19fqp!b@%q4Y_>CKn`}~|`sV}REc*+XqU%0Q9)~}n`iO-1e{>}; zw}ic$i!hOS#~rI`4P*B;p3&B~P>?7{7(RcmS*oHyGWGA=U(0^jCUa-2W%i}L(DUNDh5PUB$@8y)=?R9tVDP$&8t8UQan5uQkL$UyHODGQ`_Xj)cfB z$kQ?wvrQCDHU9D;N|J{BI0iltXKi>~Xm>6*tO21Via%{!tro=YT--i%nwwoa(QRo^z!E*=5A94n8kB`(to43ffx>< zVSDLdVT4>WQf?A})D1ReX`;UT^kSH0Tojd95>yMchQmq5WS{fce@6TaRK7~q6L(2$>|JwLHGJuiU|q^6cZ7+?h|Mq zDG_0)1Efynm#?M zXEQL%NXkSKfCfEn>xa<>&5#Ri<2aFgv-IYE5T&80F8F|Rh$BDC5 zyWMApb)(h0(tW5|k8xIpnfe8q@n_UA7qafj{Zy=gu;oenk7V4TP<=6?OX_rU@Rt07 zE2|#INbHb5(y#bFC4-&h-aB`09=+cD^+niKo?n+EcCY1+7o_sk@>AY#Se%8IONJHF zdsCYlpYL=iRJ#2t|16cUyY)J6EGV(U+}e6SqWU(1f3M|-s^H1rlNL;^Xx)3F)Za5~GDrzo=+Ca#XxL_J6sbQ?nvDu@nOW2$fBGVj8bgz%{+$epS^2ra ziFw*9|nOHCe7I*FcsWB zBR(Ks7R;yF)Qy1HQH?iE!$N;h$~e1^)^zq$qRKK$lv`Gai=6>kTm7{yx|F?lR;4yO^BSJ~6^B`y#U z*`?jykAe^O=?nN7%Vo#xU-lUU$MiC}6fa}>)g-Nk*8Un$6hJ$_ViBhk(^b*!$BeOj zsbzf@py@9OKed9pB4l~Nyh)VSY`kw;A9po3r z^%R0QK8T``#hWR75GoB!1kg4R>p)L;v#xa`8K(M;HRjS2_xYw>atDr`XVb1~N{#<8 z0*MUmQxv-+6R?*Z884%}F*GU@H)4v_$QZ+A6;vsly!Z?)w&EDZmweL9H$AQYbWA5f zO+Oxj$Zqgh9mZlgi`Sylfj8@~uztq^L+b6R+}glJnbC6xU4)Bn{P{oq)&=Tk;~6Z_#lXU! zaptoVyoDot!oh9tbe*+?&6<-L${rTwTW5RBSm2ssY*OyqUiqb>6x=E7yuVsm%gW{a zERJMY+xbD_qn+=ONkk0ql2o?m z%~$dD(+uZ}Xg1*JJF8u6T&qf0XOLA}jeqHJ3F@j|5Z>M_j(pHY2Mb3mcU~0ixwv=5 zz5r!iV#gOy=%z=Q5;g<4|M5=^@_4M2bnr829VS#^e0_lO8bJw~TqLD;vH)g6nOza& z+W(}D-Ef2K7-UYcp=wAqXLXa7X=kk{e0R%NPHG&G|28AX6xMGY)CrvXU@*rrc_=^u z=iu}il)<(^0x-n~x~EY{c-lbm$L`4!g;`((wBxaRte(Zj6n9wOdevJW%-8yI7Yj)sP>M1>Lnz(AF(Ap1yYDDW0ov`F_!w0&ol3*KfE=! zN4$8MMem$4<)%J_^{v##kcyAP`ddbee-DflzvnVg*ZRdz@d)BUKZFGFC-PB`%$|7< zR}`r6$qw+uHAoEKe9m7AQA+bUc8QS~T@HoT3?bo%S(AT`1CqTjj}$VR3VOY~D}SO< zR+^bn9Lmf|bE^C5oIW87AB1`*7#f&k&ECf9JXkjXu=m8Ctd$-L*21GflHqa^Vngi4*Dq>NG2*zWhtw za0patS)Xg38bNm9+`%w+aN$W8b}^owU|6RHpbl_h>Lou`Kbw?(s|4Ur8tVU3Wu_L` zWfE@7pwp?Q(5`$C*!7{-JDtxjY4;vb33^khEAYs5*=S!4-r;YN)Hf!O-VRYQy}DMi zBJ<9LnzZJ}2kf3W#?+wDr-GCHAC5x^CWvoJ@kUq~;+@u8i=TJ*NP4TceSK~I^qKRB z^C3^(x%cAkLc8KiHY$Nmo{j98ivXgxTicC0eR0daau**Ae#=Jz zCgiQ6<%m!$!=nrsSBX|81{Cq9t_vu#eqw$|SkLg7NWN>T6TWoyYp?vw+u`HBKu1;N z#AfS_z*5JcM!`<$u@9x%-4hxIHUsBanWWesl>mP3(nWqK&2Edd&3h_){pia_mv+5p ze_i?Lest(QTTncQ(_@f+W^=mVpF@1D+U~}EI#PJu(O=<)++Q6Y_$tdA$JiyD&W{45 z>=V%DX)mWmX^G#X9y%qJ!y*9qj)bA~;|uESvdc}&uwd%k=KEVplkcJ@b$rT?Pla#& zYg=Blc{*9-Z0?uCohXl!irL3~ zSurL%7*O)Rba4N6x%XY)h)}NYf8JkeBL*FH#4gsWQLfv*9F`q&%GK8_k@N}N`wUj5 zPChs$1kcZXdd@ePty~jtUzu)tkWLJ5SB!FcCP`y094gHq#^KTbJeZKjwKiKqtiV+E zNs{6Cc|Yc*&5O~7T2(IqJJ~GXm87p%f`4A=jvhRmqyIc%2=s>lnKNu#6A}JZ0^K8Q zHKWzMwEfK8^^k`~{*M{>$S=(o-ghAs^E@47d;(l8Ag-DmKl`085DbzHv?g%&a1z z3#o$3Cd?;hA9r}(4CqH{5Lo?yO zh0I^o(|%&_XC`75wI4>Wst1s_tlk;_4p+Rg|3wr*5=Sgi>_wD{`-I8~4z0u&lS!mP zRi$B)F@#kZIy{}O; zO7F~bm7UB7aJ$dnY~=TR1Jv^VSLu_6gN+9Rj`X>F!PmpJjO|6vJC>Amr)uvcFK}6Z zf0EjJG;9L89hEw8Np1a2LzjNlwrmn>iL&KOsm7pDt>;uWr}{ngT_YNJ>iVtVZ}1({ zxNP6S7XzUQ-hYH{{kfL!>Lh-B++hd$!EQch9lx${%D#uk6#V(7cr5;6O#*lQmoYaq4?`l6~6;2Zs5D}F+=;@gLI{f63lfw|6 zRKH(J7jPk6;VGjl6IVT-!&QS%1byjo93H*t6S>D z-Z}ZP6%cdbjK;F-D|yRpU-rxD`l%ttDwYECc)yEBHZKsHlrz^QE=#@c!;LOH?KQ(} zq`RlPYgJ;tXc>j`F?Md}9;)@!`6%-j?Hm^rA0})-902I%;<*AD+ZuB(BRLq0sixlP znROv>$`P#;e+DK(6ZZ)){OCDw&Y`*duVLxIR9c^@2G}G6-_g*}Oa9g(ux<4%8N`O- zDnZYb*1yNtjdht_o_i;)t=raX77=R1PxVT4a`a&?-gC&Ww4yiy*0ELXRt7CmrrGSL z>et|N_H}E%z`&SFcom+{1QwrY$V18P3VH2fB6gPI8U)uy!T$Y=q|`@u;|{;5vFm+tJemqH=M%}1{RvR;>v zfmaJY`8C0K-!hRhYmUCn- zb!`7`_EgQ`v&PoHM7xV;%YXFF~#K}{>`?JR+m0_fz>rW88##DhCmmx^l9uqsGqf@5` z0i^`k6kR+EzA)P6pu)>ieWyF?#Wv;>M*3O4= zDMWkY`jpRdUfCO0gORGwgj!y|l!#Z;cGW*Wl8tz~e95kcpoWO#c+Y-gi4p_tj5DwA zEU$dNEy|oDp8r)*piwITSL!)&8tX`ANP;mF;xBS3PSbh9@1}{Kb{BGN(&R z1wcJlSoOgAYd}+6fe2MMQMvsn6k7;oFbHbq_ntQDTEpdk?H@1vqtBb-HX+Qpo}ql( z3e!0v?@PS*X1ZFr3nqlSJ48Cq)(O6m(U1l@l=(A%akb2+Hn$LOrd*)wt zu|R|xR&x?T^*^VdYSi7j&2-Cg$xGDKRezW>yw;LA?x9V?0H4kIoSl>Jp1k^IGqIW% zO-Mf~GJ6NjmM_&M?^tc!L=GNk)06Q>7|(k#4a6PAm!WOdblRUfAF%g*gACK zPr6S3lb_m0tAYua41*q4nE7AD{)H;OUax^nHIW z?hUh#aX9{@T)aWuAa*}WyebWFAjg2SiNq}lydWw4r`T1trF-aW+=qpgIjvY$oA z4I=DsudxsYKF0#&o*=c=8uLpo7b9vw&A`A8M^lG_g}x$UP!>HOqC2S6-}KO2u{fjB zgz+sEhaihk2qNl zDfE-BK)=Xp&-QO2a1+OhR>x|z$)geq;0kK{VcU`(HL)5)7+-6eJ%k$FddA&p5<{lnQ7cPYS&Np*Z20r#cB0PJk(3XL zYoEjTuVEf1!1lqSzbDlHO4$&`>ozbeo6&j}p)CUZWv16J#3>>Cq`*s03VJu)Uy1qi zJ+Du0-)q%5SJS%e#InKqVdtTZ@lc5Dvd}-Q=UeLw(e46$9j~;L!{(Dsiu?u^m8YN5 zsU^K<@$|;^ObZsN7DqoY8#$lTRes&RaDCe3lXF#@gBtZqbz-z8Hs2tlh z|7y{ohhqJ&nClmH(nf{K@ZV)ivZKNSRi|byRrRSq`t@2XBYfNBrg(&oLgq01r76Q@ z>L{aaa{)(V)zDqW=S5sqv9nTU0bp@R*H3@m9HNp$ZGO+P|UGRU+)1DcD~QYxwc zzMKX5$X@;9zM0hHoYQ^k%rh-sI<)XKq3#37`X;cXOvi|=8QfO zW8@xw=+=9~H_O2za7daRe22zAKd`r|Nt=iEoLNWIoiZ2NYu3}iw~OgWPF|_}0kHg% zT04-tN8J(-G`VG}(Z&pDO2P=$D-}c6^lQm>wx>&&YaY(blBYjQ;vQL@S1&RCHMv0! z(c{s-9}SzE(U@W@_6>ZzpJoCbqH~^H1BI3PD_3>_se9Z4@26ZZi3ZnA76tCZTR;}J zJU@rGp!fwg903~S8+7R+qkAYs$~3GV9TR<+V%n4FUTmbii)+-oy1VGq{Erg`X3GX% z!0|Rm!KIprxB3U+9p&5RUs=$t;)nw+vYUY0w7LB0!MP%{N3y#l`Bug871b$Ql97Q^ z{OF#PhLOgg{AR?>vdMo+u%`n7y#YTyH)l<{T4?tuV&&ZZ&0W|zocU%H(c%fGb__mi zZ2A}litGieH{qBMW=GNns?(HDj__8(4L)RUL8M1nb!75~Jx;S9nX`b%W>vgXqCDwf|Gt0KXe8`H6nL`iA|mDS zEiRGzpjYCr(=Q&yKd!!MBAgx5!@S~h6r*5vy<|AQIl>@I{;&&IF;yGk|xL0*v4OuvdPeVRmkGoE9sK}D;L`i#^5x|q@Qd@WydNvL;0`Ky1fM;h}5 zE(?bfY2GS$^M zS)6$~d_jxkDJXMv!E9*M^qMVULMA6(SM;u%9_BqT?P<>wpQ(y_FT$x_1K&h^USVZ> zneQm!q>;jeNV;)&<)w6>w@W3{o(}hdOq^8mOHkRsFCkSj1YavB3=NqM9ZQ_I? z5OBt_M?1^~q3rm!U);IB;UpN@j^O+?CA}#X+vlhliu(-X{l#C<%>g?tt}d1zo=CIP z)N^(MEP@2U4s*rZdcb|un@^6P* zGpNU*6nj(sYLo3Nku6L>2JV2C=h6^WN~eD|G>*23$ZUhe>HPc5&dtD*Vb)A z78ikRMau{C@LDPx!-k9qYXFSh{1heI_N{^I_qi{Q=T_&vr}4&t#C9&~lH}KB_zQjN z?R44bNcRpGaPJ6QNm+rp0^L|Fe8^4df}0@prpCr;@Jx2r8-Me4+W~ab7{=z`rs7L< zoAQOI-)f3#I@F;+|4wyZT(n8yOc?6sgr?~nXW)?yr`7d9kf7_7UOf!xC#4#kcieV! zB(O-6YBTwV!EZgb0GMg;qEbaE&EUF7dDgv+GH!r~X-PP$hkN`bPsyFGHgNq}digMYJC4zOcG9Uqa6 zS&At#<)lwvs>B2QCJ+g^$8(fHk!s1EiR1VerZm<;^GEs8-G?5UV%erC)}~oe86SFQ z$89N2_2=>|CB$`a9+M*A6SPMr}57EUR+p{NUqA9z;{}vhjt63a>2D z4j8faow)Dy>+M@6?4qvXUC&n3>)@1fptjFKqt;U;IF{GWL&3rl zI-Hr;sv)x)YX3zTwzc|@A1a7`Wj)#wDRV5)U6E#U>H|Bcog-IqYsU&sxC&_UI98t< zxa)75rGZg!@DqAaZTeizvN@@J-8x1V#ss}+cMA}C> ze$`^7{pV_Z@Y3eSw)}GInqc<0$%UUETo?r^T`a|y_MlCki@)buw$CQH?A8b=7xN=6 z7lisWq+E&j8)K43np)@l?Tj|p|E)XKR)eboi)vD1V0q3WayI%k>NTQ!)yLJZkf%k? zX>{~kt22|5h1GOM5o6c(wT5u4i87~{shSXBGeZec15m^UHyl4|K${L2>_dpwfhci* zA{AoKL9fG_oMDtWVpHNqW2Qd{HZ|4E+~9&d_K>xE%`1~(FSnS!bJ`LZ7CR&sP88$I z%MM)I;D#bj3#K?8H0(+3`#GPcJ2A_{Zo$J82nzeH0s#@>v_ls&|55?@T$uvn0amTw zs|ld7VEXtfI^Wolu4m-rnNScfsQ9tb&f=T|dJB$ypn96S*s^HHFxQBaiZzL^gwMiB zgV)PcH)A4<0Uvp`&pIwnfsO~;^Ld%zs|idj zjW>DBUd_hZVKP}x2G}x2zGEb0*(f;^$&}hu4kH-yL&5E?a{6l-=@aJC#h1$q%4}md z2d3u_*eXKaY%t1=`p$!R?Hq>5sflhaTxO?sKJAoBIqB1077*?Em-8W7NfK6C)sswU ziIlKsO>iek-vACXn{ICosrp=I;Wq|7j4JnRApa!n>3(7SP6}^8GrEmrJ9frxz(3J| z3jQYz>n`of^_Nm;3cQYgUI(o0UNFW*Tg(J!X7JoE%ABlhJov^L*9iA_eH<`w6}?9c z(Q&)ZFA&}AW&5Tu_9=nT3u?uHNyZfW_`XqeWlVqPOs*O9 zOWLR_Xl+A$s&%e7?n?|tjx5WMDkh%|hH5##*|8O|kTrZBd;c!Yy+_)|Va@#(;%H6v z543%6@7Gp@>fk4oY%K-DHrYJHpzW!0Z!kbVK>pSMS9z}8`M61kAxjyBm995GzO=6t zvUSyIK#r0Ly&-G7ziKr!xhstEbT!lwkF&U(PiC>xGFMI$Z#GZY*tJ%Do|s}y1Ak0D zJ9x^#CdWLd9-INk`w_?8)YbnP$ZAqr3P0B z;<9o64hU>12)^&rBp|%DVx;+Jxf3iR)6y_q1ftxDzQ9LsNCGZxbgW@lrGec2V+{4> z@igT@j(R~^))ka|-GGL;o0YFzRgp=_Sa^@wng#=U)BkqL^4j^B!Y#irza%DSIK)(C zd(R`@x+XeQrCFUZA0K?-RX3Z7Rhf;YzVy(36p&xRV*9#ja^}7$O`z#VCPR$C;rY#T zH*GpPW@{1)IO7(+HOIXem{iNtVg_Z;i#NSDM_&Fn6KrSWXz)Dq(DR*!F3X`Rl92-);($C$S%Vb0%kk+0B>m5&DarLYc* zekZw}@@&X>^>kmVFAM7nHR2inyJ&QOpcmqu9-2F*dc`X+P-o!W*C#)=hvi;{1-om@ zED0qTQ)^&;_;XUcTKQEz>wPo@H5wF+QLVzVNwic9ZriGSx>9-IW~A%BOz zQ@X*2i%S)90e;L!nTF>dM~;PVf55R^G_{XG9pAv?QXOCBA5BcR|L{iPp~q-X(%Au9 z40f!GC~-9nC+hXi84{GOoRap=I{{F-+q6#c%s6{Z5YMg>)zJeV=iE)h*JfaAXB~B2 z?<%Rs)*iqy7+A3X{tDZLF}(P?uM``jcL`twBbpi3ny=}U|+En22Vrn zM18t|aaYF*+fTLOTD*=y!oQDftK2%|1I(73Gf!Kxr;UUa5uZ=!Pk^Zq$lBle`2G<5 zxgJgV8BgatYR8)+XH?ztk4OEE^6L`s&h^X|Ys-+|5tJ>&{4O;Jn}3TRTKj3>2GkY2 zdC7kBP8%mVF8B1y?tnM+DhYwH`0S?$JeOU`G_o@~^~R}P%{41ugYwnvFcYQ^czJgy zLqE{w_KkYn8wVzF9!lpovp`EOXL~x+6~9rD#G|0No~Ed?9(i2pVC$X@zqo&ZYMcMz z-8Uh=-`XG-2CWDDitcm(euT}**9~zUEf(jOvO0FDx}jjL4CXx7V=q|DvS>cgmnh*( zM;M!Nh-Y6ItS}M%N{;dBbT;4&M_)JH7-a~*nY18?awXMma^0`)PFK|WNaq}#7x#>O z^=rVjKDEPhY<|e0PW(N)mTt}xOv0xdPg`zhOT1b0H=P+RxJy z?3_XfAGM;+`RMA`RO6?T&QG5Iagtjw(}i4s;XZe?jkWmC$j^|K5|;bJFMyB68{ zZi{P-?*GIe13h{jiPx0T3j27jz_?;0{!<8a%k?wpY}D=ONfgi)CsUrcc2|%0jDl$S zj>+`N(VQ*u{+)wyyIFW^GoMIZi-+f3b$9tCQ;=bt+Vl`a+aiVTcmzuXz86Av2fOCil!(SMW*waJe*}NNE0n`>gn4LHe?gZ_HcTGaLAYCmyU1*g0-q z{d$ha~9oGGwrG+L0ohulmnya??MXiuCYGT9J|86cd5qSM98Yo)5+|r zE2MoG{VM}is3ph&P_)tsq^rBL@2_0yF3IFEK)e1`yu(b^!OFqA3Qj|?%kqsU9;b53O7_ng6N`WRM znLK4_2>U5$GC5)oT>Z?Wz2KZ*t8`B*)3Wt&Rb`R-Y9Z6H+=X^Lniqy=sFPHg^R8ca zobP|X61Zx8#+=<4C_p;$!UAn>=^@suU;0VGHuFh4;w{^sAB0zB^k#etv zLmFd=onhVGE*Y6N682&z-qg}ROr@9k^e(sS5Z@{=YI9iapH~&G<#OQ>XNa5n?dA*v z>%se%ZNa;FF$kNbztC}4|M^3b`I;n*8Q^cfwti8<|C91fL*{XVv_s(3^KOCL7@7T2 zrn^=rXF1n~8u!YY1>?Lg-@9QxXvS(llq#=5SMIFI8kvi`U95?7lwxWN6Xh0xPHeS8UZa&b4&H)3j?23Ov`(GXpQ*&W0^%McF9VXvT`G+=SV-l|P; z%2c<2?oRJJYoF4a3T=OGJ)<-35ncigpA@1nfjiPX>SD1U*JH@ufCB~pZL4?oDS z>>%|lmwFDC_d{Gvq95%=Bp>Q!%_19y8DTJQ%{xz<*6a_qTzCCqEgtX_S2R|~WH>-X zbzUFy10~=)woJxrx#EW_Z(axTSpHTNM9g6QB2!Db15*6NxX*DZ5^Y68kp{(Hn!+9yxk=!A99&L}F>v;0W{i$?wy!7~n z$L9rd8(tdpd2dM>j_g$Z!mj$#9{2e9#X+1Vzw$X>#h~@3p8gxAPOrBLa9*r60UUR* zS$>mCc{t_(>3T9`zF?CV?HFPz`Uh6o+hJ-EMYxO*gHxmSW$h#@^!~yztLjl3xEc-X^Z){7lT4*&51qV6G$ z5Dok5_;3J{v(v>dre!}w^Iv(co~K0rQ}~0w-JaVvpYu?+JeUZN6)~>f0v2<<}}GANw`^k&`5Qg73EaYIZ$? zJMGKQrfsLU{B*Q^-cMrjz)F4p9V}Wtf#t6j%qO%y?{6Eqps;5vb7kisrS-)YWPOeD zsGTm8V7XuzTLJprV)wrDS(DnU$L8_{mBp>QqeByWQaiA8eg2`NAHRapj$SS6G;;Ns zUmFHzyLRSp{y6#*HgYd6z$<@o#KBja;WM~2Iq|~dd3I7k#svjl_)Z=MvB$F3x z;hHWjPokVD9MfYW=Ru%)iQ#CmtE+H|ETZN=(XBVX{3!(f9yMbpp4XuRk6sw(NPZCO zhX(gUwqYswO*@PZ;np=GUFJSySwxN`H8CGp@ zvYU2m2sm`^C)Z%uXCCb*x~8~d+b_8F8f6>-^gl$CQYr&iu5pHKn#*g()YOi)hYxw+ zNB$Gv;2<1!C0Rpo#D}FkcPmM!c43Kq_v_czd~1F@3wGJ|Mxe#s8Qh#F;#u_5?wXRL z+}9i`SoA{H;C72M><)jmC)`CLEs^<~e;9=2%>(`z?y^TorX(|dkuI_wNF1UKvx^n4 z>?RFYFA##TwT*P&XGWOs#M}7zZQgj6t?e;D1Mc{HyoYo)k)dAu>a7*%Njz8vzv5^v zoP8(w(n2&2(=s<`+9G)516vE_!h@4hJ_p8sGJNo#To>P6p3E=&v+}aPAZ|L88 z;)llnV81DPT&=p-KJCRW-5ftDWM#0o<6+6W|tX6z%tsg0{9WC9Q_0s0OoJ9$MY251{kv09F;i`pmP-# z@(}I|sx+Gb`Qj~4w< zq?z%emV&XNS(|jd7a2E!WM6`i65}y`BXiGXjR&CzZ)(w8?uYFjT<_6H(i;0E9Qnjf zlCTn_d>J>YZ0(dcBkKC;G{g#3@eC@wZidY|`gNSa*Ny0907lwyx{}k{Wk3t`bgZQbK|tlRd0 zX`f}v(KyJCWJA{T=D(~1!5-I#l-6tTr9n02t$$89%4F7?8~XtUkG~adMlYQ=)}O}V z1V)8Pg>^IY**Y9v16~QOG%>`RHuig+is-s~;P=GCH2fNP@vG+Qw^J!23!B4@u zUP`;y6a3mlZvGkImEYwEt^q`peBxi;J+6>;T;rTT$DZ+rCy3UqQpTU$&~<&Td3SxJ zpE5bVKDzqwH@rY3)j@V)SgRD?W!0`z@tac*ABdh}EgQ{87U3)r=I_j}^H%({Suhz# zmsWrCBg;th@3SUWmZw_Di86j;Uw$Jmzv6HD;@cMAcE!2*7vHw{wx{1^d=vk*ajx-o zoO7rx{K%^=lKHy8^&m@MDY(8~a2{yc#se*VTB}=61>vc7OS!Pf(TBCuxHKp{-!ks$ zS!sD4c>ZH=+KVUCCOpmu|I)*cKK4!s-N z^ZCs8x(YKukRkBAH#c0RXFaX}ld$!Kvfs9QeT=^Y!*85{!pA9Llj|Zk&5$}zvg`^` zEN`-}LFGts4#cco3VR8M)={Qo)beM1!Ysg0EFL=Hji1DclXZqQcDty{R~3*ST7I%# zgeE4b6AObkE^u`t<2y4c?V!vV`@&5JU)$xV4q7(W^FBYJn2b6H1%_O9yjUG`mpb$q z;PSdL21G{5TC`q!$2O<%9#eF%=EB9sh0A#aBVonJ-)lkuMvjbq*wwMxVbU{apyU@C za2_)qU7Y*Pd-|*vQ!86;GPIF5{}NYHYe!gZS?{!w8^QBsd-ZCS@6hTd(xcFRHWR2` z%!mF_yKH-|kQp+T{rV9UxyLeciHF9lUKFv%oPBa#z!G*Sl1oM}a~c)-Zn(PxZPqa> zIvs3htCaDdp=&B7*sh(91CRBvl8Jj_21C|Dbi@LwYBj*lQwIL|3KZDuRZ z8u;)Jfl75=}$)PA>&V;Z*3V#5L4j_H@D5RdmA#totVkp)`DlD`n-ifdgs3E z!_|Vh4bGOqO}Xq}eR&Ld;2YjHwL7|m#<5)$82f_NZ?#0rYCJJ#e?c#u_+4krnO{(M z;cec`STSwy9FfoXAU_=Yp5?;U ze%llOsr_{ZkYnr7_EWi@Mi);%rndbq}c)mig)%bLqd^!NDu?FGm{(+(a?Q6$H&@(@v zr9`ka?8|gT7$(v=PtG+#w9QerUMu+8ha6(F*Fku6cRYNRg!9m@ToXAsVesXr*Dc(; z;I%9!Czt5V2Z{CJN9^TqAV8k`Ti$c^mmH#ZYu z(|*R-_dN*Oj5crX3XmI zMdQvGGXv3iJjAY>S}gfnb$DfUE%N}~IOaI3aXsUGC3Kw>+g}X`Q#r?1aYoYXT%7fqyhdFt>DsRu8Xo~0un zGdEwj)O$!@a!X{QFn07j~VI8d- zcHr`xa)}XL|KNAvj4imjuQ-B-N_!F5o1F$=y(28NJG~*w&=ZyYOr)0PJej~(b@924 zBEmoQTIUDc^sg7J(6ru8!wNvj1{*!%S>tuZ*d)bq0K}8dAX&$uer?hB!3AJmsL7Fs zxIAD92l?eeVq-X-o#i#_h*(~~YMqK>V?SgE9)%5>y}^0?$uae%^9VOlD2a46mtB7H4|j+1eyK9DK0s6EgV4egZ8bmC|rf%zu+X;W)dtDLrrUH zymo8+#sr5iJ*daC@X=f?j~Llqud9D?Z4Xj+t#_fW{1{PtO6Xgm9k7Qj%KJDUU~h~N zEHSQGJZi3^dyEjx)h`nJx4o}kpgY*M=-%2M8BTPq=#tHDgDWD|NLd$m(MsYBA&JJ@o{)3{%H9b?=}Bc^R*1$3iV<3%~~FOzUtO^ z^{@P_E#}kOGS#c{kD@K-wf@nv-QW8ci)4`9*T+q!adE?(XA_%m0`PU;n^(EdHIJ1> zCy{ks+&CUs=u-P!#_#YNodWv}%jR-Mw=M?iKzc-)XzGn^;_y0_dlw-B5`+$GOALZX zlB!9J9!*_hl{5vZe*4xvvjZOQ;+#X2jyo&c2&XC_xsbi1BGZjxR3ux*F^;^|W3K{H z<6ZX=Jr1S+Y@XWe`Dab3qMaB*EV^_^$GzckDbW#61IZd*Aa$4_->6+uZ)MzijErrC zlaDs>CAWyN8eB!w+i`7ym2pT&+QHN3moJG!(Oo0OP}i*3r*5u|A3vEqTAIAibns-o{tP+LP6J`UUO z9w+v_K4XtoA?paM<6~#k6NlWqEe}~^uZ4EkHPXGVVXG|>kUX8GmfZ7Z;wugS*}V?I zsW7A*z4|x1&&S4jFb)trTzkB+7vJ&M$;an~rTk%7^E(db`f^4eSU+7~o@S`0Q0O^-txtG4knCT){9p~q z_z6rCxkIbG0q=H}!;il{U1YoR>1C<))VG&r=dttivHs8TdwkF1ZTo}29kxB^9_2f) z798u&e&j4flrX6o|KcliP?+@) zd3v4f`0K^Zb0QDyXZ{IGNwg`hTDm#OipP9JO$Onk#xp*FzmSt}s>}e7HrdS+N%#^E zfAa^V&HU=G`J8-hu|Bx2mvQqv19djqSD;&^%a1@d0rZS`Kg|BE&qj{#6ZPXv->knbOdz1?rZ0@41qlBEN_cAn2321 z_v+&;lP}t#$h^%!#;AtlXEyidxG5(O{v3e(3{cCQI*?STr6)G~eq!o#;mOaw>@84- zt_No;!z2i;aLL~eNLGSyP0$Q3>(^?m(r0{oohP58N^_H*K7b?P}AQI3cTP-RiAi0A9O9d|DYC=TIwl@2 zSA3;2%d6kEw3jxhlkZWJJg$CM2}Jzv^Ye%cTlcR;t9=!yh1v%9y1rIDZ+5?KNSCvV z*d}1}YTj*G*SU%!uQ2BTMB2m6$0_WN=5XqV67*W`JLD$?tOgCv+adXl-@*h(O0gzVQw#Wkophv0&Mem3HRI^%Pmuhb{!<-=Yw<9*aj{tRM_^2HoQdOHB>0uAzRYj*Eq zT?M*mw?I#!vf9-zjazojBPOmY!6egdgC@Qus0c>7T>P%NMrWk%ZMMheIERYekvx|2 zj&_YNHTCQHILBvv6~{|yLc~Vw$#2HV-x@Pe>K#{3%~J93>YCjap>fd8IgG*U0G-YF z>Kc8^%^G{}6{-yz7H#8Kow=-ECP4bf2J386po>0Zvc>vi zj3^yrjas7m9M|Kp?!ArG&c}c1oUuvAjivR_iGPm!zTV=xcpz>8INm&G(ot9aC!Np4 zm$aPl=rM%f{=~yA>ImbXVU zGro?0!WkDUEZ1Iqcj}cph>eDOZ}4O_qK)Mk!3Dd$g6ugW`b5a<-DZM-r8XWatrQ*D z(YoZ8ulB7M#oZ38!xCiTm|tUbo3MS~2!HFFK;z5VG(G`w#V!((;psk!R~>p zH+DMib~koIO&MVD>fhE|oD=%wzv>~Ht#KsMoh4qYTXW*vOD=7eeaCo2Smc!j7Pz|MU_qmgnsM*T5jWUFfRTkFuwZYV_$KXUvPK+Bi!b1 zZfbGQ7NTqY$LeO=w^OQ>d6c~aqAOBf+i2JB$@*CjypjYt@^5cvAMMqeF>Um_{p+sJ zwf4;QJ%b=RkI$^wykOiZQc87m;ZOiA%E-CS5aYYUy%O zSC#Xu;8vLCA{kYtYm7L!>)GD!QCbFYpqFksdp%U4_Ttg?VSPa-$@ zTpl7xrN|bSVdkBonT~xa9Rphq zBz%$hr=H1C$nLR$8>PB6OPOsHZonV<)ki16L$q>gW<7>+a=X3gG4?eZ3l~h+LFNXU zB-jeXe{!lXq0T;u0o2b$eMp$uIz<+$l(4%qH}xGt?CFvVz3pMH+s@brNXD^e^yXw% zAFX14a5ng?3yNlYuIDMZ6VAFeaR%UZuk5Bxqi7wVS|8VkoZ(90VYekXU?*`c$59^V zr=t6f5JA1wPlDYiov}`wCApKT(Cvr`^0;Mot`#Q6$8XODv>D#EPLvIoB6(i&xBbZf zf|rYBc3{-zgyycjq-ra`;IFN{an(OwN4%aEPkHSv5NK`F(9-QR(XuVrfiv=f*V)-2 zJdSR@*LetlRof@Eie>!Awr}u{=^S_R-zm8_<7G~f{YKSF8ddb_W$Sppg53D0>&j2c z+T9+YOUMzbTk|;hrLTO)m-l9`y8cVPDQ@CgM+;xxwy(r5&xi7-C}5cdZ-;FCN62-p z{|_g3JzUpI*AMH($Eh-QYx(i`TRAWYwl`bOxquY&NxS3Z{9sVmt=lWVYk9=0?3Nhm zsGW`*IV?TS5}Xt*xjo-71x-B)twY=RGL9g2%WLG8>OZ8o$!M0fkTMgPVrT}HF(?wG zY;7YsTH@_&3~D_?I%qYb4}P~XN^5R*{N#y3v+Ky)I-2qEUZWmnC!i=0I4CgaA5!#LWp zu1Oiy)ST;Re(%uS7g{k8E$*f!wrfSYTo=%3jv;?Ix!-vw|Hq?PmaKq*JGdG4sg;touK> z0GhD=XK+8f_`?sI~NP8>DKY4!_Pd)l>5#?DyT*1gIsjIPg_j;r0uTbv=<>wPj` zaVCE2<~Y=0wkEPF0)N;4S%-RTI}Fvfu8EFz_rN7}y>Pljl_SzV~Dr@Z;BY zdR=eeg|VN>g4#eO2PT1>ulGEZJJ7Z>xUZeN`fBoye*7HMshIbO} zk$JBhl>^zjm3QmQGoC3k8IyK~t1;luFOXawc)2)ountwfLR=#zlXgQo!!5_1c=)8?AM#ed|xn$zOfi z>!G}Do2Mfg+lVX6S&s{UgLl1Nr&alsXRT-PPnnp5jTg`_1hFqY=?Isv0#t>YK=qdA z6lPv_t+u<7qMjEcsU#nl;nJ65fYU5cN*yUw7b z889%`S5A#4T%qZdCi4uvG^%;l1F1weF==GFW50oIG9@&#sInZNuzd3!YDzvc*c*)K8Toljbwb^L+GBNCx?K`#adCahyoBW<2L z*B_MZQ3vHZ_9&KFIJ{Sg!pDa>O$7F0vtDCyTkz-+k57UzV*6+}sX3mN%ckg!6~mYl z&tC(g41mm(oTyFgI!K&<BxGi~0a2UJJ(J>M$WT07usx6f4ppY78&T-Jze7rV5Qq1%3vP%M9q zj|nUA;=gg~*~g={KfBq+z2eEAK()k&5RY2|!|z-l0oF9V2XoW8wQDUd{d8n7*8m=I z6JZLM<3t{dr}kUh#EPrK3J}1#_Q|8LH8E3!bG*it|Dg@CVcR~yZi@16?s~SpIlL;K zO!#g_T*}t=RhlkL19IFlQ&+Z+^Db)pw%4|Z-D0`t_&OTDqMx_VwL9KpuNgdR*XmeR zdONpA_77_sx5&zE&zWuXwx>_~KU~}Tm8J5>ws*hEzt!81tU41MlR4FShc~XXBG; zQjXOsODg~_c=m2W-5*F}+JGE`#KIJB02 zP&lUA&2JbrSOm@+UQBBfII_mzfkpCOzGrRX$qj;zINQPkmLY)lHcu~8wWT!z$i}B{ zAMr7dW&ooBcDQi&wxn;M8|Q*8i+uCXeql0o`Dqh-a-ufHaqeME&ZF9~Q=`GgU-rY5 zz8Q};F~dX7u`@p9d-^shw_`AQVz~YZU`j{woH^L&mdSM@O5-J1>?*RseYZ{S5PL0Z$wPP>RpbkPel6V188bsk*U_H(lDnvBY zyQ}@GH;e0;aYTlSjVAcjv%a<^IJOv=$13SiXm7H4AxWryTB}*NH@k<_iJElD|G5FW~iYsen+7HG1?91=_L6*N# za2{Sg>wo^G{x+7^<}msN2nhS(-LeG3vle~)@7zvQTVte}4QQG3c`mk3jS1K{W&Ig$}Zk^=g>YSk1K z%t1x}GQW$xoOi^ovvtgkfV?8{W$KKr_n$@+zc+?(*bT&IM5|<&SDfq*avG>7gp@oh z_5}*R`M{YS;>Tq^54zm$o+af5qfN6nxHA33c{dp3dUZXmf$buZUn1lUuH=&6$)g6K zQ>ysHu46>mGe=mwFXeEj0<8Xik3{xnV2TRPjYEi&vf|rLPaLej&YzHMZjLNc**nh@ zbm)YUoji!12V@C6)S;tOPpAnfg(YMCpaRfuib{_U&AF*oNpk0%OalRvzqS`Aj;`7G z?9G?d8oN$nbu4AO+|BGw>j7qpnXb)2kE)#05n*V||aNd&#YiwThgU1d?U(G%B zNzHrifP$89w;fc0joI>#7Iat`ORGs8w;8D$YcQVJK~b~V4=b8TaE^o`;;v1M#2h|x zXB2OFxS8KY%idZ2z-D_a{{%nI8fCvZqH#7>Iepf2a+!{V97erW)o&6V#9qp1al$)J z9FKJTK99y{=6GYugD$9ApX|jQOf;{Q$6lW4z0nS5F2}oCGvUi;18R_sd?s9)t1mr$ z%Jj((qhiSK;38N5xvyV)`3z5cUsKt0BK9>+{k2?~So4jvc|<+?k;J;Pi${lA7!6k) z?N1zsXFQ(LD-G71Pn_jhsr1M1j9$Gfhb84g2hZa=A?fea8mVlRZ~l(&*%W{0cyxbs zbVonymAKC=h;TH2G~TPzk9$5aq=jYY;cN73J~^N2@!lsE`mkv?Xi%?R3BTx{{BEAtm%%&) zA4Xm$`9W+sk^Q_g`Ciiwt-^3`ojKq6Ik7u*#(sbinlB)kfc<$K_x|<^l!>JX^W$}p z$wz(hqf9M$fclF+c>*Z&aWErt*mVFR*VIL`W-vM@|>XdI{;L%!WQ zpqgndW6i6Vf^qU7B}H*;)l@h5ym8>#cx}VwU?zZnVw(l~SqoIumR9Y?9sj&Z(V5X3 z?0W@dO$Hp8j)R$n&U4jh4QBSDm*1(OG!@KO zj>DawH%yR)yOL4bU(T$f#-@>lSUFS5wR^&VmRz?KQzzA6#ZsL)dCd5`HK^-q%*ht{C{tO4X!S0FHUx!rw<%^M!wJuuD`4(Rr09a=PgQoQw#NzjdGtA zCk5<4n2~v5@=%AwLmpTysJ7wpYB!(tSdfAUdo&!A(=Z59`yr1e{u(#o0r*-+gmLu# zNyu=mz7FY&-+)yZuY4y?*7gKwyu>;AOqi31=X-c+f8AZJOZ1aC;U=-J*<^p|gQ&gy z;21ZKf1bfQPW{Uhl#UK5D;p|~?stFA{>z1~c=3CGrpGUF9QY#-{(Vlm*jta-(8qr88AS_gNAY;$pM6o(-hJe4V14Y}$M-(P_3?(6jc-$IDJITLnoQ@}O7UjJx&0J@`GB>e&NOWnDIZYtdt+ z#lH0+u3GG!6>?ifr#|=}JNhub@>F~2HDp@x=7tRKCqGtNScQ-o#EEb7=#}r>^m+fl zU%Uey{yYQ;KO2b7znM1=)8$Vz9SKU)K61+X^p%%n>XnY{ZFP>o`w6UQVPgbYG>x+t zb(0F^9%LrqUM`-7&&50*d0Pv@-!S(Y4!!j}Q0gbno*TYU^*8@WPA%bxC!2ug=eff7 z$MS_wO|Cg0ix=5g&ErZ33FI7E3=xrlz*!UJ8OKyW&YT;+){ZCRA@N9w|4u^UNj_6W z2|kaUBNNbigtj^n?CQEDkI0jneZAjIjJB=6eaZg9 zQ*4w%t$AeJDAH$Qsilp|%J~j5NlK8Cbz<&}X?oIkZ5hw}W?KS9ncj12Z9D7X5UM_S zxDl#@RWX}Q=EX;P?;HHW>uFJg3FB($H&R__XehXQjZw4A{2P4i15o#?H*qkNk~{WP z_HX#?-yf)4{N?-I@5Bg8oYK3lH!G$KF!11U%5Qnzb-U0{qBki>^J^G3(n)pcY1OxX zqp`x2VQ(|oX6L8~tVS+G64cVv)_jK6vXZ-d& zdGXu0t51fddn@D%?%h81Q(R``YpW=Gp1t<<-)cPODF(|_v-5iOQJKvj zIc`R~ym69t=p18@K2-F!Na@AMzTPCA*#xA}iIUdz~i>w8_#&UNjzE-KZ`=j&cRd~N+BpY`}z zx%01I<$r7aYyMx!)&E@o^?Fbzae1S4{VJ#LdO!QR>5R4i&(-_e`H1UVr=8O3{`@2T zeSUtu@9z1Wdi3>|6xu$ebK8TfrVO|C$xQ3UVDK#&uQvrl+>cl5yKj5NM4oBg$1bMD<5(|a^GhF72`o= zL5EAp(B7Ah8(lN)#w>SUpDaD_Xhhq!nyEJz+xE~`H53zPY$?x8yfbp0;Is9DRF~M2 z*aPsSkA()Z0a2Laa|pE;XEk!Sv{fN`@=7?Xrw$K1`@$yfTNfVccSBN@-L zT5!ZAhJH=bbk3uA9z2bcA0+zXy(N0O@G6$(ldKXq(BUs^dfaeK{mi0q32hP=v9O)> zwM_o_>bUzrI6w2Dq}fmXo0U6<_KRo+Xut(bG&$*JTJT`cAJ=B z6cfWG=t*IM*mvDYVTl#Jd}na%;t3y#F3|R)hfjo7&=FwT#+msTcI=G!zF^j5M+E2N z#hITqwyqPWc7a__?@J2-%&=uisWLbCpL(Z|gZJ&>*|}N8A(_MBraX4csCmd3{jo;# zGLNVC)aCXm&%{g6JwEFg3>kgWm*LJB9nl_mYKvl;OFc4JpTCkNovq!TnU$f0cdS#L}M~40j@~KZ9v~0N)%YkmHO47e8+qZN{UQu7v8Nm-8kXJN&^F zUwvg9PP5c_R>%HCVLOehblL_^_JNd!%YlJ~4vVnEWpL(Z^JK z^aETxRta0X8bXlAKUM=?fXyZ)TKj6D5#`CB;qNmR8lE7%VbiJJ`fscMRM$25$ zvVdH%XO3{0Trw9)2c(-fbdYx+u0T@Y<5~)O*T{O}L`I~MVh$N>Y(zD?F(9V?%_UvJ zj`BhUMz`wqH?K6j!P9X94Ws!4aB}qep62s}@dnR;x%D?jGEu!_P(K;{pd~);#d)o9 zWcA4k4mIP2ow)hon2_ZODo|dKcvC}8ec{I6HI6!b1oQQPnlQ#?d{{r;8L^Y%cn+9j zXWe-NEUmr*p_2`7oIDqj>AOj|6lMrWDf2ZsjLsd0X~S)>)Ei!Aqu@ZFkE}>XFf}^Q zhhBp1_-8JYEehl81)&G@6f-+;_F z3{}1LcRgJ9MQEP-SDlwsHfJePcu8-6!%%YfnTkl-O+ z)pFOuD%Xbn?EFk@Af#%LCVPf4b3`Z@9Nr_p@>>sC?2H(?XRL-L*`7MtFg{M>@(2^h z!yA0K-n4cIK5>HUvA(Z;b4_rD|)>QLghUJBuR{(#%p zqHLs7meNi^y!YPt6m#q|r7z^m(eZ(yBh~cl|6!22Cs6ifJOlmOzfo`W2l}5-mGO?5 z8FW4=evdEIOyO$OzUQ}1I-GhahLu;W7ysBrSiP@R5J!h>mvVX9-+q4!@8N-kWYcdwTi2_1rk;neA9~MJ`qPKHe*YYO=j&{C-tYDJN7)U#I{1`Lc4^ch4TRufYr^{2S{jGLqPSk*mvBqSTJipO)O!zwwqV~0V~5YQ!!$-}ST zQg%($wqOHlPNJl zE}R2OPVm7SGKtV(-@GymuS~m7z|1GQ@Mn*Y&xDjrmFMShB`|Sj+few`mEax=pYwn^ z&poaAoV*Wx)n7{HUL(3!- zA{^(!PSVytVZ~?MOPvfpsR1_dS zvHA@I*^yY$WFtO5d(tNt-q;!svpF7$iA=qnv+-!Bp+1t7R*Xhteet*)4Lya}9reHUFNxsqiM3~bqSZWIOY_V=d%=lp`4SgD@$gL(K6@3Flp%i129RkT%z^9b zzUi4PlsexYW{WTxlTX6o>Vg^=+dI`K9B#G#&2MJp7d zgvROqd+Z0mOpLDy>^Hltm(BXvy<8@oIL6C;{GA@PojiiS`5`5r_!}?TS`J%ah)0il z#ygJ}P0--OpE`1^1vc8$Y5ZI7coBX_#!?WcWnX!ZJ^N1H*S;}?xogmU*L_vm)*OjM&`Eb;wF^1 zpUnE5{}YS{uLrtHGU-WTtqPXewF zzkLKR*l8U>dCxklRqKG&ow~)Nmfa^)*ZplWud{d@cz&A;r&<3qr&*uUV#m$04t_T# zyTtArN0M;ackoZn!%tpla??r`V$b|0k8ugF5ctf-^oz>mK=-To(OHFqMvO}ly^*%M zUJ{$uC?{X(XP(y2IJxCU^}GmXZo7*K=>M}Tf9}Hko^!I<47Jw8@Ec9eLl*4=-)Pg# z8#8$Mj^BSjgjrEjVTog-20RgrJvu4aOX!KCe|~JhY5n|ra575)pK}ae$KlSW!*DV0 z)Slqhc|kD2p|1j+Wa6S{MDt!C9#76uow)W%deHdc0H^tlJJuaY(`*6!XIhAW!SQjr z=F|N-j{ZNs2Ir7E@SYjY$nlj_{9u0@d7wgTM19*NPDLk4?Fj3_+QeN#NchfS;)V#d zJ;p8Ch03Fb^c<^UKwe;y%kgV0hrNAB$OLwlC2gjwIm*M3)W6p;1(9AW&&J1p`tHj; zKWBf1HCcEL)=TU7Gb>Uc9PzqGs@OL+SzB;`@Yna%`*q%cL?r9o+fn(58{db(f<(wp z>y_=HwNOp!ay*`+u1417vL*PX$nc%@Xh3wjPe(8pp@!ZA?k`gz?lER|y+NncF6IOG z^mjJ0x5r~cUw$1v>=mvWH%}NJKE~b$tYGX>ChLM~og#g8EUNuixJ1j;z@FT03*Kc) zUn`dSv`6>e>Je0T)9K$mzNKk>=wEY--!tD=u6nh<7DTi>txACC(Iv-j=RILTZ~6=8;0Iktu|4HT-xBW9wUMcS#GmNUTWmFQF5>3TKXPe&hrtTm=*JZ zqaMr)JwzIjXJ6mv9?vEKO*x80))KqGBi+!-Ky)O&&jc9SN%|t@8F%!~8c0IP0YS{YpM|b=_3*W9 z)zbrFO&TS=4B{bg%lxcLH{xEq0^@q+X|gzYGgC7aQ+RlC`wr)>f@1?n?I9fSa1Wz# z$s-2zuW2}lCj?(`Jre(L5kCy9S)`f&g2b*l@Q+{Yqj$4g#yJ)T3mM%l{%FjOL+d zaLa0SB#wSw@<}*4+lNoJiCs+6H+`o%xCAD5DW==74euViGGq=9J!wvyC72nMkHXM~ z2Z`^}U}~d6tph3D4IBSnJ)e9}`%`+dAz{yf!D-)$bDS~*@-$D~ojA&wNsZeNI}kiq zpW*Z8!tZvk6|w9WdxuTIy-l`6{c(7djE;m$G!H!j({@w#%=OxTxUfH>zU)>+zYFh8 zDa`CEXk5CKRlMd~U_j*E#Y@*ORs)1DIgXo9bF<3D>G z{L^m9MJNX~c;Ov;^v8(&c*Bdu;fIsdlj)?J{!jUzsvfyv(w`IDH>~nWtY7#<*1UPu zKRL+%p*6{?%LX3Bqk}UiC+e>I=g|`pnw%InKKf|bs*X^lBcNS9A$2v_$fRRHG&$i> zg0q|Z+}uUZO=|3Wo#6+Jy-$Gu#or3?MSt^ataHNrqIBbGg}+)dts|Nw74wzgI7C0r zz-J=YjH7$yZ$P`;XaQZIi@EgfW4Fgc-!QQ|kIU|%4!#7IAE@JVP^%#Ool%M?`&|}0 z^l+o^ai&6fX{VCTBDqMi?2r85Sy&SbGX(BP%>Fu1 zli3$sM6-Xu3)B5!eW3V(%L`LruPKnnWB*xjb_zG#No;`6+6_{+tOwzne{8sA<}^JYw61FCO)19YJAJBa>c5tfp!Vmk(SzBuG%(I5gz1$)*xy;sC}Px;7)7Shdc zlqoSa>1F|n5kL7b=C#Z>Mk5s^$2TA}y%7pjT<_q!*aC11!`peoy-< zFQaep{DToGJ8jnvxeEAlD~KyNN3dDvh58K16no-FsWGY39)8H+a6Wi5KsKsjl;YVO z&#D1x?8_AW1A37?^p0%JldHR}V9tS;HVWb}%QRiomE3JK`uaAzGEWZYQv>eYqU=?=uduEVDtM%E3C5UIvu%J2p)ANr> zjnV#{-W9B48>LcNB6Jszmlu} zUf=v%4`jyKjX&16vj2$wb>DrGpLu+m$rFLp`L};Z1Vg;E_de%Y^@pM7U;AU}NS05= zrK+)guNJdD!qrm7@AiESf13|X1it%IA9!Q!J`qk|xn$#$wxh=jj-Z2e4--HL+r}PI zf`I;XJHXz5j03K2SGs#&2o^nWIPB}16yhsQdgj4ZJ@B)>JV)LBx+xM*@=x#BLvPaS zh9;lT8fJJ-fCh3}`9F|IOL@R=(&Tx5!znJ9GQX0+o4c9Lpue1y`X;O?Lp+t^&#YUk zxaEQ&XH$Ql&j{f>3m0o9Vy+h)?=iZj&a<3Xeat95{8@Y>&F?tkqc-9t(w#@9&iW9O zeFjhB=ROCEz2aC2KEtr7P6H{@HVbfuPe3=*%a$q*jbjKWBIZHsT%52qF_0IdWwjep z9mC-_@QQSC2I5)_fm|}(;Ve#OH%>8Ai*rKwmmTo~KtGRBDZOUPz5$E*;&TL?#^|9B zhJv0!`n;>kZ3ew-LKY7TEu*j~jvL9^YpgHT*wJa{@L-UYN3byOSz)YiW zAf`_9o4O1}(fzf{Fu2DhOV^TGoz z^!RIR0#o|XpI3OEmz^}z#IM$R?mS|YKK6spC|X!MibLyl@a2!azi>J9o)cquK-SKj z+&Y;4eSZ!A;wJL=?>fo;6~FZ}kL6eJ;6v0pxQ>$=-O&&Khy4`(INkMm#4YEnZ^hnE zFe~Fftp6AUP!3~vCx`B{=oP*EL%96Xv*jLdc##CkE~XP`W=+UeER&!|IRxL-|Fr*+ z`u*~o-kkEE5!4%3`UKW5|N39{4XnPAl{d9yXD4*!yACRU&yB3Wy`EXwp7i*i)dClL z^UfB3`akg?8|C=tBGFSE#CzPJG_UL2($j=SW+<`lP5%xtFQhA>IJufMy?YxXa$-HLW;X%$+?UCW=t$`g#Ef$x} zlaeY~aLmI;DdSyxqo0tqH_z5S>!YIpU~2c$kODvO=4%KN--%$g6Fz;h-Th%c{dU~= ztB{7n!>G88gWU$hoQr1zp4hA-aR7}I8jn$}v$ft2kTl=!hpq2S7;1Ybh{p0)&cF93 z^|}lGO}Xtu8}$4Z8VYh#XDZ=17a9)(bL{`A75z8})&1q4_rnPpUn29HV4kPy=Xn!D z48$@N9(^05IACNCXVlAwHfCd7r{N(#zvw&HqyVomgn*xUspCiYJ2&P93O~DXB%*YB zD5eg-IX}5iZ(lekHj|039d+6{ssM@7{Un6}y}1)C%{egyFQxdb8h}4lCoA!W*;p6R zZi$mmlEoB)1s;Fy*4OeobrEg~KW8?T_X(q@1M@Kn3;LDkJ_g`@~yVpMWPnmWFUi;7UdPP-k zK8^b-SN~Q2im&|dy>Go*hsrH>m5<{v-iKs4VSSG#x=Yv_6*|^r&Pdxd*XNy;V`Ff_3_civBj|~T3zpJ;OWik2n zmfQy5?z$e=Z!#l~Kse&ZvAr#NNu1t#&n`|gMD2F>^E&MN2kTAjwGUP~N$=}%W9|*! z+~`T)$QwiR>eS$|-HKe<=kdsf;=o{~Hl#u|Tr=Kjz^L!7y`9V|LmFsTMYiB@$m%Al z%(D3&l?eJ&Q*fR*pmG(`GT@C&^nMe7&tc97evSj9>RCxg3=1+PYOOJHw=_(PcmSE42NgAev%^{1U%3B9vh>?i4I@BpZF)ErvO0B78H^f z#h?V}#}1%nH-2%-;DJB>(F3_KdRzvoc%^r&-Uc&I)2V5}?l-EHwPHrJk$&jBpr_KK^?HGi)1f z&GM)_XBz~PJq7D;`>hXd`NyyRy_4}CUViy3|K(8onAPnlsOQ{odyt^gmi1bL+S&(w zj=ZQH2B9n*P0vI0Xj7&UAZ@I1i5PqE!$0=rUwj9UsY!ffRQ{L@NhULV=&K9oeXM2I zcNG)=!Gn&4Nw+DiIs@w|NU<~Q|Bd9i?7liTxZNL_hnz~m@Ub7bp^y%H$P&sjnjHX8 z6Ik&!Ul3Lu+>8b;Nr2^%)^;6|hT_`}JiK{19hpuIf0rR*IA-iFg|hzq@LiS!(cqC) zJW;uJiRd>|{WcVO9QF1OZ+gK!b2N+dJ#P%fEI^DnPqg_>ycP=xn8D>Svr3{l%&d<= zqlimVN*$>AnOi*ju#2Z}3T9uJsl}UI^2SnPLzTa;PTrOvaL|-TdXd~~$eIO`Jo_S> za~Vnc(0jU|V0Id&78?qch`hs+V;p5Pj!&K`wo6HNjwDCv1ov;pxiHDxhGByqMzfYW z0P9kc#wHIu)V#j&Of-$hpDwc-h2@Mn#ysY94=K9BT$^&X$p?PpUbgXSI^@qVBdswMln?tNG{_)Y}H;OULCU5C&lq=!Y#;^DP`^E?c$Bl1zsW}AFc}|+m<|~`?1(3L& z*YM|!7%YlTo?$YOvF}x-|FwTDAkd&R3E$_-G56U5^5^&Nc;IQyOWpDV0@|E4Zldrm zE;&8^B85G5ND<8vHvIhbpk54)nL6Rpk<)V#&`usbKNl5;lt~!g*fW|jqkMKL#gz)3 z^2r>E!C~fSeq?>qHNO86l`z();!dH-0(KG(F#Jp7fuRjK{J4=+Dv2?KHmfd==V^m; zpn5^(*hqX@4h?T@IZMCOmlznB&t$KjQh+W;?1=ffk+QD#fd=U zyQ=XD4;I>Ow<5{t7&~d)fucoIdo>4%MRfz2^yh)CWI%w@VzWVk{3TpkA-bUd_%IRK5mvEGWKLH`dI7a?o_; zPhk5hTGG;Ba8gi1?|X1#?{zhImDSjThbQ*KGkL(T=6RII8tlU(dD7T= z?fTnd2OnCG+PQ8#TM*GRj$NVM-qu4C#I`J6ck)d}uluX}FM8%Y{1afW3sbo6hv&Xx z>OaZf{3pLwtn=IaJ)0~4Gcz-^eyvYu{#AW;oribVd3ayfA3G_szo^l^;gt(5;SxF< z%t)$%$DjR69sH*P^$9HAyvnDtcq2=n$kLlzN5@!twQhYzk-NMWwIHc;tg}KX& z?pd4!$G-gI-w7Q27^druTf;W+;ydAcDknXS691b03o`bmQ{!Ho?4KKw+UO7d3w{6& z`W1iJUM`JI_wawUpW?24ApU#J63(YPB;7aNCujf7Bo+@C{HtD-aPeipMiY+xr%p{u z?6V+sw~2#6L0ad($z7t_=?CLp<0dkF&5hNYuU_-|iLME_bd`4>kwimj;P)M@Yfdrd zZ-+;R=A8Euv>gE8_Fe!0KmbWZK~(ldYv>-{O<(*jO^t(9=M-GBv7JAEFlSnV3YWXr zmcx0N6c%`rZ>}ek<@g5S-#?rEFj)EbKSO5!v4wooE%W^KkGSfHjSz{W!R$AdJ)vg; zOh#Y*VBBbp|E&)Q<@1zWL;{E33!!X0QGn=0sD}Hm`qfL;#5eCKH*9LW3uzbTC%|$k zmho^noDZDiz1e82?x((CR=IXU(@LGewUI&-odxv&#V9+cL2OD$IMQRDR6qCUCetshh$?(WLmyaiMJ%-?N@C2iC7^xj_>q= z%EsKA+Y`oq<{#Ri99L3%<8@fS*`Jkrb7&V1r5Of)0uuk~XCE84PJj!TU=}r2JkPD> ziSLhAlEm=6zaCEl!;|ay73R((VWtXlAmFU81b;p9b=*7oGd{1sfI@Xy!*vw1<`*z- zi))%&pVmpep@RpPJrwfY4~vh!`GI%)Za?Qn3BQByIoESyqU?MscU~-yTY0;IR?eX3 z?Hjy`FZ#(|wOYb2kWue8n>;$7Y-})}d5&KYJFm{?WB*L0%#@M&@5{TyQ`JNB z8t%B?n*eQP`j1R6dVJD~ChF{p?Th(-{~8~Uob?>DANT<>Ek_T3@^GRsI?`3KOJDNh zB1cLN$I=l!-&2XcUX^P5gU{%7PRE`)gpW$lYAxMEUSS66j#qf<*FKd#DDL@Ja zz7NCsbXGvPPFd-puGPApAoqcYZau4U0O=kv1xbb7G0GC@EasY7x=3Ma7c_udC5 z1KIUp?fDW?nx(~Pn4 zea*Jwz|75@^v@{Ub#R}#`sYpL;JMSwIomaP(UEY8Ci^ND&QWr0`?yXusz1;(LU~Ce zWQD>v1OrOVaGHYE85K|`^t7YTzO9{}FZOT!q@w|*jXgr-jtyy?QKGABR1oN!8r_bh z?WX8sH=xr2kAoA7f9=uBcG)SzQ-AEA_z7)y@!O7qR-Q;Yg5rDdD_Ld9>r?US%`e|q zd)Ny62k|S+BkmM4!i#L^pC*Be*+39R{~ z7H@3j1;E8giF|xNoZ232P^@Brk*~3#jeeBCW{?Th*V}J159lu8)Y0vNeY$A4y)T4lE3G}Qxy0old6Mt%p zNP*(xqbG5&*uyir+66|RAM#olN^Vaztx&oIHVmYCr_Q1Li=V-iCHO0Y6j_wP4Z0y_ z7g?MG^UqsNi+w3c*s(qh#y?aqJarkr-k3YJ+fO*(6uMU!{J0UH`_ueMKj~&p%o%)3 z4V4>;d1ZsbwOONlYWGjp$H)7tGqYC$J7@HtYOBP6y48n1V|)0-%5V7v226o_{2!k3vw$DpDvKOv@cF~|fwHBCQ22Gz9PP^Gs^<+RiChHb2LbjP{xF=DW z!aZ3zBEhqL8o56N3S0J%{PY!^XfX9pS2p1E;K6w|;9O67h8%`S9Xy_&^!t!@>m3OE z;2@!yS2_#hK*Wi4SJ9B`aL~gww$6U-Yi_j&nwX5vE@!6mb-;nQ>L>O?UNVW0)69Lj#1H-un~`YXPJ6C6HoqHrsBM4oPzd0dSOi*ec)= zO{<5c?O>~+N1K&9-nacZro!RQDAqE!FKeuOx;&_eMr+^9qdmv3^E=TFx})a#+!5dM zsOMLCG|%+ODn6fCi-`3pomgLup7|5=o=GFN|B5C0X5c+K`{TBp87D@fot0^n_TP?H z>$6_f{%C*CpZ#{rKg#hf9CPVBgG+?ext8`f(_Mv*U;7*X_4whXP?bM=__{$p(^key z`ftjC#4}O2{!rEGDu+$A82eYUi|17t9;ZePr;Utc-3PhoKWcBq-u#BM8~3|K@sJxDra`c?<*UhkV)V^8Nn7@X9#uldqzk>qGL39GFq_`uZXJ zFH$-28J+dcE5hq}{pmI93*r~`iDQFnUx+i8(7yWCm)T6~#3UMRdF7+2) z^V13hU^vbWKTrG_m+?`P0kyZf#FSmtL3ajCZ{_WxZoV|=J(@{vP} zLk?=r%j#f*(|GMBN-{V&AFu>h?;=zNFq~Eq!CyD87DU2LFBX zlYT1VLW3ipW5&&J!9J0E8Zbf59yhMzmn%!r@8<4J86zG9O3isapFFRM}1)K z`fRyq!vM(B>*1vOLASVS0{s(?o&fMkW2hx6!_{k$@a~I2aDDM;m=S(cGhqlW*goqdnuuZ}!K=xy}ow{`!VW&l|4ypX?+Yy_}s$6dNaLi8%I@ zLs`D;(-ViRP2_Ht$@ADaM(hlV#!+K@=@U5n&#E~D@wzYLb=NEYt>;D~3AN>Kf@L3j zekLO9*hjtBvq@963-kN_3*qBuE5u!Xa-gj7Z~k74$%StD8SA_IVezgL$h6ikvj_je z-^3R``Aar`*Lm!FJt}_e@AoSu5KD+i{_IzUVd}l_$o~4)K3WGyh7$jM!>b7pEmN2b zEdj^U0z|g*-->Dn-YCi zjKPZ@5IFSOVq?z_W6{SxD?U88KKAmTn*?#m1Rc$JOFro#pid+3%dBxM<1Q(qgFho! zYTtT{fAk#dAHTz2eeyW^%9Fu_TmFV0-Z}R*=P?vNSCgtcTy+t;Y9vy$mPa9(gsqU-~P{x8r_cOQ)1wUeEwR@u%7joJ`mWi1?e_LJ{j`oGp<~ucXP*DP6qtdT#!vVD90nIbvp~9WW~FNI3POS@cPeS z!0dP$%tD;?zz=Z#%!kLQc)YXEr}<8u@T5$RH37(9!MfYmK4uqKV^0&E2HwwXdy*VJ zu8WRudvNfEPdV~J%+ZN6G(>-T-N73UT1SWf+kc(-3^Bi>}l^=9EO8x4T666 zxslH?wWPIwT9fB%yJeC1p>mD})E{#*N3zOUr!+c$3I*Z$T1 zqjGV7ufBP;p6RpQcs+XRpYnNKd9G)->EE+|=9T=O{N3MI@9q66%XjuOTZI-m8%Hzr z>tpVEcCsU#MtY(W{nCwM^*b2M_vD#RBXZ43 zU2s&E^>?4F{VE~3y^%WjS;&8S0b%CLqQ158+E2Cz!a`oh{c1ACrRktfl^tVhX5GXu z|KcZ^@ym>&!#irgJQ2{xG5T<#>H6F`N`2-c5PT;KtZFL$;%xc5eQ}7Xaha>lmKt z@vE6QcOH;#MIZl98hNHJxX?hl=~8X_@P09k~!O^$uUqt_jaJ`h?ZE z*zDvPNogd#CmE%6ibhdmpBW)U<33SGWfM6-hM?x5P~(^RRj>Js-31ibH6<=%{O9PQ z<`MQ(s)*RmF@BK`#(}JiE-{W*BDuax08+Rl|H$O&w+@#Y9WgqSE1uyeGZPycAD=f3 zn*z-~m3{Wll&EEM@7mc<+zmH8eLasK_8Mk-6Q_0vosIN9Z#)wnEH^B+1oD)Ok*?UC zSTsj3z$Ms2a#I?but;A!idhQ#n_>>{dK)GVBwpE(FCt7N(}IoLX!ka!$q)xf%Nu=k zwcHh`1zhw$Tdz&X3`G7GKj+u0{ViW_lxC~GfSJs5|83ZH@P3#Av}_b)d4|7*I(lL3 zr+^Rq1g5k8%z61IjUbO5`Ia))F<*hdfLxz(+Pz)8^%WqWYL1@$j;5!}Zpig}-)ERS zZ9FCH8(z-K)$wHpaT@T`_M*9}|Alt_e^#Ao zHt{e>vL^n<-!{gvKee}Xn2H{n2U}1&mabM`WiOAhyF@O$6kP!IM=zht{#mcOl)rJ8 z|5B8{IhA(<-}7y*_*buS#GT%(V8PQT=8Na-nhR=x4*60a4-ky9el?;TdsP-I#9o!8 zkPLbBK8`;2Py1<52WPSz*0wq{voBY72Eo62&G~a+JGzk>XVDllqHz)2=OJrQ>Nn)L zrWvTiIMCVCH{j@nQDL9^2tR%@p3Z^BzdZaV+i%<~n}Wm8s`sT-gn5%-Yz~_^v7?}I zq2|Hjj2XF&&fKd2&9{x}=r7s0ISeHBywQNlpWAb7BCY=xQu?VKUcV`ZS7`Z?H8*ek ztAB3pB1lod3ephqOQsde-Q#g;cVP`cUjF;3b)pA{wwob4ujaqPd` z;3$&x-XG-bPiQ62;xlQj5b?;1KJQRkM0Snpz^0{vV`vdSDP~N!XEAyj9c6W!_0c%k z!Pp<&)PKx z+!|Q>aHzkiF70CPLFp1Lnbqg!DSh)|Ezex#QK#v>bjrg^Nj@)jJ6o^AWp_C(%VGDw z6x|DNJZIWBPk&%?-&gp2|HA)0U*>n>CVx5O-`2b(Gvx5t4wropa?dr$D{s3!%lM&B z!drJSG==sboQ!GsLDaO?-73|})g%h$f1&jqfwe6PLiB`Wl_f3=Sc6GQf%`}*~o zSK>Fh!0Cst+T|;6`vSDES+n=vkn;V({>%82N2f*aYJQ_{KE*|z%58p?|Lnb!df|Di z&uoBi)Vp&p8|Tp{!tD65g#Yn+cO~1bp7cj5<0H%p;3j|dz8{e0*5-BSW;x@j zgdo*jo?WMn)e8Rm8S=KpoB&6~gcp5;+I`Sp3wzq=;t)I*V-c#|fR%+5!t zZ84rIq+w%9X@F`Ox=paP8Xll_s&{*$#^PyS)LwtXQj3}bpSZ3IW5r9SvF^g9A4F^u zZfhlNekD?aJcJrY0rT@CiE6m@&(2#RQu2bkZhOCMJZq51`9zw%rU;C6hrf1-K$!zg z{g@E+J^Mw&8#X5A0giYQQ=a>r*ctN?Ej?$&$7l{}pl^KEfO7h(J4FO`nYGMILrEc!zJqEqw%cq zZ(UgYL|QxH!-sP8_%M0NwhN-sv0K(*@~TKb8E?h#i;h5d6S-UZ)Su%Mclg2+dwn4& z`{@n=RWnTve!I*c@pS$+_sXhDUIMlv*7^a5~PsNfGbtCF)eNP-b0jg)(L*X~wDu5XK`@V@&uHOOeKy*1p#ZGVtkBuccr8%^1Ah zd~iCmfaQnI`ho3rVG7Xe=Y$nF8GN<>&i+b)KkqMSVqgB3_qmYz!0SGh9et!t(AKx@J_+qbBUc||Ie0UR(-%<`WA~=DxD&>ji=Oosg^&Hh#7Ebu{Hrgp{TfU$j_U9x z;OuRzxTrn$mm#^$&-x1=5#->dV`P1K==-Di#Ny%#&OCNV{0;rG&zsMAdazS(!5upX z?U^A?M#nUnS>dpkEs z6iNzgeEa|2+V?vI#L;r*ip%a-9L%N6srC552O4wi>3jX^i5oj_JZfYfbvO=>>jMXa ze3_RAL4bR`frxq08P7q@0zKHwnTem@sHA=}%x~oV>VU~5Gl;Ki5H+mkOYfuSp4c1# z5?J5)N^GFiC=t~kLchqPAy4}G&BELyKr-2w*AzN{Z!Cwh?u_suA2rR{uNjUnktjBe zy*Praz1>U^XIfY#@8Z;Q`U!Is6AqTm$yQ}@@#GJ|ki;_{P&DzU?}&{u`4U6lcw;VY zWFJ9}F+)#lR58hsS`Yo5+q!CUyiR*5W*<`D?vdi?%d_bYZ)DblJOr$M_WjBR2qG9{ z=3`8=GQ*`|ui{ac%?g}^o9NUN;gYpw-JAMWY45|yNdE{+~SS9)R%osi*&tRJ=J}P zw(bY~<*4iU>>Kd4f2RR4tMFpHEw703W{$PCe=uv#MUktWaR{y7bU0_thM?F3i+4c|mswgSjRSoD@tu*bw z!hP14`Ews_t|T)d(KJ%}r}R0>k7~J2m6iV6GyfLr6z&ZY*3Z112~P6&i^Y@YL>8^C9FY?uaTOVq|3C>0G_-NF$42af=#2r&v?wKSD?x?n@GGvQk?qk>(qUy zZBJb11ChgwZe-%ECTUZzlM}2ogNlH~0J_9iNmLnc+3?NeT>}>}STxnMg zu>)g2IP5!-xgd~^>t+0HcQD}<@rtwlWB#jD%S(ZsS_V9#$iXp+; z>)bzfLS1Kuv14_YRC0{|MH7O>?)sNx?5?THD8-aB`$@o-ckI=7J082{0nr1WvRU2z zSAcMi+gx0*Bt%6@Q*-Ks{#g<1$19^~s=uXo`#XQ}x25ZV|7m8^;bcCFVap)=J4E#=QuC5(Q(W+Dn&KN z=ZwH~W8K>N5?uP7(C7--qTl%r)dF8I=7toG>v z%V`nvOB*NjJ3@29`DN`4rEecMkj{Il-slnvp~W~#s3 z9IgDNnI2>9$s;*(d}IXwOc^~t@VxC|xqUl6figOETZC1`p$+EX(T!cEPBpqwRBxDa zyVp|=-43R{=wirkilH{AI9fjA=U1?J&_K_F34Bh8o_gqC|3*A|`^$nkdK{@332Kai zA>Zz1pmAR0B4>|MYcoA;AZs^?4`6w6!oM;5vPlY!gKyq23oRcTs)4kv@eftN2I ztTOG)iRiiUm7N@}bN^bFP{Dzp8~bWPS4EGKxmuUCOf97)m4q1U-~roh{519mJO+Oe z*q|J3)Y(XlyYb?6KCS)1R`WT(ar+Q4_}Ys`hh(0_4}%CR_&j-J6bHS5$l(}^}Tbr z$Ibh-Z=6<~{^|G3>qzzdG4%24Y)&<6`^@y5XY;(H7g7KA<$aHc$ISquEMN6u`O)LO zKXYBk3ZYMHo!|S~pZ&Of(cQCoon2>C*JkilU)-aAC3zSn{H*;2&voclRo;1x{hwWK zS(<<4$K+7nll>&G;|yN$KVbiAeXECJ>!~pzUS%*p*P7`2zUB<*y?Wul}^yrggE{vZ@Pj;p9P7s*FN?^szZOZRSRzyA@@X*(eQAE z_wp5P|Ef4@!OnUG_l&FO63qj)XBJHYip1hs15j`rGa5CWv1lD*&53A0ZR+zRNc>|t zoO$K&1Qf^l71#Sl-Mjfb@|#8=l4rnh)}g~+^?W#YNSF*aGhlHAUnZU_%HSHz8cdYA z_qV5U&P5Kb?{C8UCmH6o!70_B_@1Q|jOIyhWv8V$Qjm!HqzKows6Oe=f-@|&{TlMf3988ynYFTH_gumDnn~Y z$juI3C{{XIp7J*)M!Zy1tNi=U27&|2wdpCzuaWAFCc^`C^^ z_u24|z5WyS@I$SbjbDBNnu+`6mlS;L-9J|WgKr@9#!rFE3QP3mc~<7sZ#=XCNU5l< z^H_Hu-22J+lwZ@=05BaqvyTpb_!lqG10Vl`uRZ$xgxCJ?Mv>s64NruXCz7?o`cDYz zjjFzh^^oV2TIhcNAIlKt9+zHmi75Rf(42e{Ss#1loL%6Psfz=_09-tahu7JUy*%;9 zF|Bdqg>K?bWqQ&iU+OjdB<`=7z^tTC3iP#4AHDo%hp<`6$(z=A@j?atLtj~$SRc9k z(51!S<&na9mrwHM?I6e)tH&Cm>Yaq_Jq7Atd&5?5GULm8G>i^D_G4|_YGS8swDM0G z#WVb~4^&X&7C#HkI+JVHyX%}HUh`W2%T=$(wQBXweu#k(8(GAZW9iYj6DG&i;+YMX(?Kio`m0lZa*4dEpbs z#EFI}`v!b=9&yMU{iJM$?6Zl3hF_&}$l$V%q?`TZ3Cn)=CGp3uj)x4N+q2)GG!wL* z3z{_a@t%5m-D1nbhjNAwddJXM|ECwR@#El6FqL=q#b5YM!g)i(IAYI_GrI5k*AcM) z#tnY=F$&>LPB-oBGnr-gC$AJQ|A&}BO44p~BNp4C+_;mU(Jk%lR`K9*Ia#JMrt>4DY_S@AqVqY~%l4S2&t?Mr2Y=^M2O%Ai~pkJ zQ29eV+ppl2r*HUGYtYLPix&PL?>mh@+HXEr9?j=_y*JtAcjw=Hes(_pEcn;_E7P|w zuk)||NBWzuJbz37y}I4;oS(KRXZ-8>FRoiy^EL1xYyZ#XV&h)+y%#~(dTDs#c@#|( z0IT-OH(?$r#QR*wiwOfENt$-zRFT4G9pzq874ehvDxv#(d zl$|E-*NrW}0Mr%V9t$<@?am+?M!ga8Q_nDm%YKIEIb?LjZyw1Dispa3HR?tftKB!Q zZlDoKC}_c{tRp1=jk`U-rn{g_Pbgrcj01K7zYFocT7lMsA;~Du)f4@b$c7)Q2AZ z?Uix8&J^OmERK_36~A?dIok3(F&hsx#rOUWCj05&YtMcQ+>0zopRLb6S3LGt!$xF+ z(tDyqkS>1JOJ|&b-q-X5;Y$aa`4|sjd8IMJSb(&wNRDG4p0EwioLIXD<7#B+FVY!K zTJJ#%g<5Sn-}D6}%PrWbT|@crKJ9#mXQy3!qFqN1U4e`y&IreCD=Q1yWqwpDZn57U z@u`)o%I>TvUov>*ceIABhl=KXG4dlVIrv&NX|i9a@pB)ckn`|*4K92f;&x!q z_|Xdvul3_^x%%|xtzP7&m24hC5^%y=t|me@>=>?Yn52R6v?HAnm|KbvjgL(xg5Wt( z*6GEbAMOd9FRxi$qkQ_;J$RjfzM$D7i4V^awqTpW>kQ+4aSY%&(_{ZM!sX~oAPws? zq6ba~{rA>+7Pje6pXm;-X_O@a9=O=}8 zILxu|!_>ndl!Xh`SW=&dVS zGSC$}-zegH#*Cir$$m>ror_^gAOT|))&r2v`mrPWl@^(wd~;g~AfoRwjkiXJ?$h{t z|H+L%ABUSS#!6sMLoJZ=g0BF6bRUAKQ zOkW-lBEG3@U(Z@@ZO1oB9AH8_GaHuTm-HL)iU~Jtjq=U{7A>osxQLIr$6V6FFIntP zxV`BXN6mfyb@1qg9sa5}e&g0KeL7`pyAF$c#yxrgNWhMXch1ijf0^AbII`fstLx7); z-$={*Rrc=NTdtee{${SBx{or-$#56+MIOKMm!|Sn;6z%$1pWguE`9y{)SG#Do5zp# z&A0f<|9|ga=Ue$ld+PHu>+<)m=jPdM^|Jowg7mU~ANzZp>BfIGD`(Jn*kR1Y)dLQf zJXEjePp^D-KH)YD6#AZQ)ejKv9oK559CW`l9(iTzb?NXA@=&beIcOg3aY#NdF>kj6 z7IuWWM@aS;;P#vGgW0b?F*vS`VewktV8@89>Oo#n8aw@YJrk0}9LK!w%FVLojQL{e zeJ$qrc_jP*>BQ%!F=#EPw+n0#j^Qum(S+(<;Fij_jwQJU}VLpv1}DZPt4s&LK7NP;|?xaUxZ-UOWQW7&~DS zpkZ#Ky=?$};UwlYQAZWdb9DhHj_iJujx5YC-zjib5Ow&N79&5GvAAx`o0w{2j}RG4 z{cV>bJmfRT`b*qgH12#M&K#7#eEiFG<2o5h!ce=TMrYgvqWD*=r5InwX--hkER!^2 zS5HG?@s*!9xI7QMJq0K}bvJ%$X=?27ry%TXut^w%$|L z*G`|D*KbmCTu6+6D8nNaCYt9tBebkRTduM~S{0Al4=U(X;f$Zx@gIxlbTyeqg01^* z<1tz5({~?t&BrXi*mr-;o~ZroOW{PGI2w2F480fSikF|?It3p#PAl3tvTn{nK928o z%=#PTRrutMwTWSWt{0a6d?3-K+4BWowb_SG(`F`*Uf=5bda*pSPm8aA`}{m4{?zt; zpK`vkf3G+WMKJIa*o#1X8P(3dL^|^vvvsx5zwbAZyS0z!k+RPkC+i`r5&+XUUEkVw z{Y#{|89xQ;em(nafG_sP{!_f}zgPaok6v6;poZW5?To)wCuYPfIx`o?m1PvYXJW(h zdv-zK-}PRW?x%_WSZAlpLHu5S4=jJ)XMZ_wcx7Y!^2>kzfBxey|M~y^znqjkClCtJ zy|ieuSOgvOOJ8nkY14~+9aj&pHpb$|Fr6m@q5sIV(YSkCBrX zBid6snkT!VJ{v?>X3R^KK_!G-W*a*bhGb-9}?g zww}uH*YM)58A+2_Vw!0Tif;HXO||r=K2N~mdFMa2GQD1667>_m*TwT1-V2Y4`ql_!l6h^_3HdPx@?=y%&9;aqw;ZF2L$DnDy5z zyU>?D!{J~10Lt(GvrD?U_-2ER45l~k;|2}G{>R8nn+P%Mn0wsSo!JFte+_3=L~vuj zu-Zpo#`KP$9P=U;ERI-_xV}}6b`r4-4alGkWGt6_Vkf?_hlNbICiMJrU9=ZqpqX7p zmldVnt!ar3DCNJ(he<&Mu6jU_U>kjEgD~~E^k+YY!t*Jgd&PlZ_#6hAfjX9#_d9>h z-(x(vPCi_}fZKn3GI^AGw3Ba61>_<0D1P{N?}G1s%yo|6f}B9|iN6OPQii>rS=ebv zpWiohZsP5A({I8OryG>CB)gWI-^|IjvD2x!e(vE=n}y~-2v01Ola@y*%9aKj`g>Z4 zzIb4%LH!J^tvcQ?%xDePU51hIW}i>nLHrvr=K-_30QFJ-)XEFTFPcqtnCoC2SnDa7 zy}i6Q7v~Bx{_b^n$k9XlNpC;)g6uwZ7N^0**VpxL@-!}v%X7um&~0!)3}gZ(w&LU| z5h$(wA&&l7g1Gn8(=iFLud`~2zQheMy=&pXthAKY%jeN6o0`;{(e^9hhdgVA`Jw*` z4}Z>}-uHZ!Z}pjF_%g%MJgy5@JPqBNkA%lOb|FE9@$|3NH`5Otl2y;5^grY{pqbSN zmrmrh{{Veaz0VFnBYo;$2qeBneU;xmUNwzV{Zp=#{*TwM>_6K-dd)XVw1!<#MsKh9L&y;2>;x8n|O;X4?&mG953M3(ukt0z_1uNQgpU;V_17ykkWH?#`ZmX<1__k==oqab zgl%J=2Z_y7P^QA|P!K5ets4zjOh#kJjxKnOgfaL0;$-}==LXN$V-e^7_zExSUca9i z|4kq<5efdxhkKdP6mLrMBmX!UVMX(txQA_t^F|DI`Pz#1SUG z?|jLG8tSW8%!L7+mj7RF@(Mf_#w6;NIqZF_be;qJGGlw-1w|9{10m%(NNLee_P99;j)8fIQ?{gcn+tqv6!$-Y5#=dbb9DJ;u zfiTc!X3Q`yor_R1CPFOWW!PP8DOm5nY8U!9aN zeIa&2byOd{2aifYm&$3dc;&GAce`(L#@>sB`J1D5tNks1nh(xxAp-TOMc>2@;-Jrn zVpzIWX!1o7LQuQ)HOe$YPBwj=!=<;nMit((vs`@oJMV_IuMWPZBmye6$veUvLwX-? z^V6dVOv(lx-Gd)B<(&A=EeYAnHPT7(+(&X6zsEj`hbI&sXa)2Ii9VtyJpQ$R05<#91WLe?AFUpt%25_zgs;IM&=0_dG!Sx zxE%}>U+q!QcA>fcLNSYIDt*6Sw9WT|JolDTXmJc6s7;f@Jy5ho*%@eeH_6yNS)bW#= zMW`-1M*(L1;1~}jy&crKcRUTz+en}0{H4pA1G9hX?~k?Nq3o};thp4Xec>%T2{=zF zoOkCo@keXvQRB5Iv)IbuHDloe2IH= z-?5(_#b&)5seQ4DXlsVfg?s;Y&>o3vm@@wAiU+t2;Zpt&i zg*cAQd-2IPMZl@@mgPaedDs7^d+|?Wl-)47S|58+?d$Wm^z77JpFa2Zj2pM-(`(;) zRbTn*zL}S~^1t`~wH}o}_pSHWJ@u@Waj!RD_gS<1#KP~7wb!hh%e~LR-15&vdgp)c zIRA{cAc*&TPE-Xx4z@pKn*}Y5%f;gYP?_GX!A@UO`s2W=aQ=O(9hT>adZk@_TyXtc zRI(hk^X+AB^Iv;;n#CF}euht6c%)mnW`ijC?p=Q~0SwE{wC=Xe^}a7m03GOfKJkR_ z-Y#npRJId04HRx=2)iCxVc8FC~vuZ2lr5)nRoE0uK!tpQYS z&c~h-PNk_$JSSB$C($<=5C53e`3drJ**u61Y-*4->s-d)n=xb7A?=Xm zXLra)N5q*zxN&lgCbBxFX2}N$Ygha$rsGY1zfPY}%63i+XAA{g@VbWwrF2%z@T@|> z>o;+M<8!q$Z*g3FK+d_7asT2-qk#$Cwf?6%nAN&lBE^GzD$m3oxffOM@StTK+nlbG zjs<<~ixS8Y21k0ZYyyzrH+}B?Y8SGJq7rUDp)wBnzpK!jW{L8w4e`wH;sNO#)W^@v zs81e@_1$=xS8xYy4-UrC-zyP4X!MErY7ZuM1APFS3TD3*r8r7BKku0e-_uLNo`ZjG zpc-|*w+z1SbOP#Y-#8S+`t;#Z{EZ{Mo47U1&nH%89Ej{X^l{wz473#s8`hc6*r@<5 z+AtzV8~$jcDSt6#>pqBG$L<4wG-{+SdX2_D+iTZ9dgdJF_x*V)UpD9EW5#y)MxBC>|AZfwcyfH>?|K)ajo@`1xz{=NhxHz4oar)wBsX&R6KMt? z`@s+Y;$we4PrmRwmk^p?GVcFDuLb|%U;gD^{!fa`_h0||*I)kk|LyK-z94D^r%{;hKUEQmHO<_Yiqj%|Oo~Y`3NkC3J`8_?J64+?o_2v0&`LX$&3ca#W zV=q+a4WMxK-t7M$duO*LS&}Q|nSp!Yu+B@s;sN0O-{!F3cFqOe*k>m5pB)jIRoy)U zEXJ#H%O#mia=Ayuj*QHzbyCpfw!JtEv7d3KoA?`_ICz3j{F#2)OIUt|>=A;m_j#i` zBPwIh&~I&9UhR#3@7dPOxT^dg=HK|ul#FNI&A9PJ-IgZ{{o;xF>%M)#?`O%wKk2Y| z%mG>aXE_4B-S=e|_ziwP(I~_Cb1u@G-`+O1159-=$k1{+C}r`4dA$5w|^ z$SUmgciza!GrUP&4ExZVa*ijtOxn>+FdLW?#?9 zGS_?hQb}1(Pi*d&L7q*6w!v8DGj2w$549iB}+GBwW&o zrR(u|^u%G(-J)bo-en*TKS);JYr(g~&j{{oxsf@+(eEofw1H=pa-WFW*w@UFMC`Ae zS)zi$(>Sc}2L9mo>>cj6+IkL?1(sd!IZyU?b%SS|a&y4HyIM>le(rj%AD&a+Oz*AR z|7mu{l|9(jd`jl;zs~i(uDcvCcm7Vk=e~1(#ewhZajy4khA8!_m<|C8+F3EB1d{>y-PeNW~n@X9Pw_v84%L3lk{*rOY4R! zH-uEBvHlqflIY_nKVhZ^E&={2lv_*JB7Xm-8M^(k7nc_%Iqi4xZqt+%KE;{V^)wy{ zUV)N?qXIF^b}03v+rOeS=K z8ig)KY^G)O> z;^*Yu$k)7ZzGk|}q?kp}UBT`h*yh`a-37BZjTvN_%~^c)kK{bf@!RFKOot0tz-8a& zEGxJdzV&$7{5V2Xe)>dQE=)3Z^q$p++$(``S|*gtuK z`{dtIdv@n<9{f37cOOpvcb@nDu)SMP>bR?E4PEDJo{b;oIrz&y=49k~REE+VGUw*i zZ@6%Y^W=)hfAYPYzg0+Z=IOGUU;2ja8L(U1mRCDI@b5j_x@W;V?6|~#qqh6E^Z)v% z|M1WMZvT^po09&~iH>ug-k#TaSOvUZxF*I8-SPQ`j+W9FGW(;tPwRV=owbMe**R(9Q#dJ+7&!Qbp8k^z68u(Qf~;t%4UPu4LW$<0@+q=EQn9k{H0Jc!B&-z4>*i--T3vzMR-47 zp-P{qIS2hI!~C`vmARYdcGprYHLt=%lX6EUhv{wCE=XSIY~foYrO4=plrMF1%b74wnbhSYJcnQSg|Dn{&B;qAs4F1MXJ7Y@!Ud)n>Z`~-p3u%!2jLn(Od z#gP&dD86cE>cLtwS;9CpPq@s!)PzrC;i5jSi37E9_pEg#5ZrBf5Sk~ftrGr`&fpj<$dJSntIQ=_o}msUC%Ri>nF>`@7YFvnw<>oXXCegqR{KT zncpE_5m?^G-`Kl9J%8y`3rYdRof&ls8ZJud*zSs(wqnjd;o;%kW-y z{q~CDJ!-f}@zr?xUv$_pM*4N~jlLdNdOqTHta_fGst?t~xBiw_-EuMl{jIurzli_N z|3}qB|I!a-bbqT$KKk`ZZ~xm**UqJ{12vex3jSmMZu;zxFjv2=zgj|7I~sG6eUe}@ z8nt>NbIYuJVynNGciz69RKotO>Xql28AK|j&aE*!_D??Fw;A#Nve#Sx!{YMAGxrH@ zMj?dgwc0-6c9nZp*47&dfr%a823+rd34FlJMIPC^Zg@N&x>baAdFC6qEgwI(X}-mP zpRw}bh{^9b#vVL@@+G-$UXkXp0v$ptj(CX!!VZu}7x(%lCa z!i8Y){wwMs8@zv5iYyD?ko>k;;wISDXf6sr1=*QC4S@^lo;h>tauB_4e(K?jJFyh? z#jfaiUjSYGgbFY!bu*pci3@Fg@J?jkX&JEkw)bnQ3EDwn4V5dDZ-)F?H)Ze#)}6^H zsq68EUmy@1r~C^n)@)qt^x)<3lsy@=sk!)vb(0uE^^AmaNMw0Z^tV5N=PEG`u8-Gs z4(7di><)z1tv-?}UVBFl{mJ@XD^r+8t_Ew)8t+km`WMpGi3L3)iAbN9+stTwd@S=3 zrJ%%3J}(Lz_2}Bi&vJJH<7fXquUQwg9!q8tyO<_V&yAZ)1rxZ=&)`Z^+_R7M?{!bU z>GSS(?bPtDe=R$>S&fV{LpUz}9Ip0HsPRubbv}dxFUL9`gf86F;d5x9@i}+ICBFEc z*PSQ+=D7|iu4%A$&-7VGR>_rJr5vtk@kdLUc3gf?H&0lK4`cWeUH;I3PW;;c@;h