@zerodev/sdk 4.0.14 → 4.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.js +13 -4
  2. package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.js.map +1 -1
  3. package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +1 -2
  4. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +16 -16
  5. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  6. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.d.ts +1 -1
  7. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js +3 -2
  8. package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
  9. package/dist/cjs/kernel-zerodev/provider.js +2 -0
  10. package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
  11. package/dist/cjs/kernel-zerodev/validator/base.d.ts +0 -3
  12. package/dist/cjs/kernel-zerodev/validator/base.js +0 -7
  13. package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
  14. package/dist/cjs/kernel-zerodev/validator-provider/base.js +11 -5
  15. package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -1
  16. package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.js +13 -4
  17. package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.js.map +1 -1
  18. package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +1 -2
  19. package/dist/esm/kernel-zerodev/owner/passkey/utils.js +15 -15
  20. package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  21. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.d.ts +1 -1
  22. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js +3 -2
  23. package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js.map +1 -1
  24. package/dist/esm/kernel-zerodev/provider.js +2 -0
  25. package/dist/esm/kernel-zerodev/provider.js.map +1 -1
  26. package/dist/esm/kernel-zerodev/validator/base.d.ts +0 -3
  27. package/dist/esm/kernel-zerodev/validator/base.js +0 -7
  28. package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
  29. package/dist/esm/kernel-zerodev/validator-provider/base.js +11 -5
  30. package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -1
  31. package/dist/types/kernel-zerodev/ethers-provider/ethers-provider.d.ts.map +1 -1
  32. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +1 -2
  33. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -1
  34. package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts +1 -1
  35. package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts.map +1 -1
  36. package/dist/types/kernel-zerodev/provider.d.ts.map +1 -1
  37. package/dist/types/kernel-zerodev/validator/base.d.ts +0 -3
  38. package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
  39. package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -1
  40. package/package.json +1 -1
  41. package/src/kernel-zerodev/ethers-provider/ethers-provider.ts +16 -4
  42. package/src/kernel-zerodev/owner/passkey/utils.ts +31 -28
  43. package/src/kernel-zerodev/paymaster/token-paymaster.ts +5 -2
  44. package/src/kernel-zerodev/provider.ts +3 -0
  45. package/src/kernel-zerodev/validator/base.ts +0 -4
  46. package/src/kernel-zerodev/validator-provider/base.ts +14 -5
@@ -52,15 +52,24 @@ class ZeroDevEthersProvider extends providers_1.JsonRpcProvider {
52
52
  return this;
53
53
  }
54
54
  });
55
- let accountProvider = new index_js_2.ValidatorProviders[validatorType](params);
56
- if (params.usePaymaster === undefined || params.usePaymaster) {
55
+ let bundlerProvider = params.bundlerProvider;
56
+ const shouldUsePaymaster = params.usePaymaster === undefined || params.usePaymaster;
57
+ if (params.opts?.paymasterConfig &&
58
+ params.opts?.paymasterConfig.policy === "TOKEN_PAYMASTER" &&
59
+ shouldUsePaymaster) {
60
+ bundlerProvider = "STACKUP";
61
+ }
62
+ let accountProvider = new index_js_2.ValidatorProviders[validatorType]({
63
+ ...params,
64
+ bundlerProvider,
65
+ });
66
+ if (shouldUsePaymaster) {
57
67
  let paymasterConfig = params.opts?.paymasterConfig ?? {
58
68
  policy: "VERIFYING_PAYMASTER",
59
69
  };
60
70
  paymasterConfig = {
61
71
  ...paymasterConfig,
62
- paymasterProvider: params.opts?.paymasterConfig?.paymasterProvider ??
63
- params.bundlerProvider,
72
+ paymasterProvider: params.opts?.paymasterConfig?.paymasterProvider ?? bundlerProvider,
64
73
  };
65
74
  accountProvider = (0, paymaster_js_1.withZeroDevPaymasterAndData)(accountProvider, paymasterConfig);
66
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ethers-provider.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/ethers-provider/ethers-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { getChainId } from \"../api/index.js\";\nimport {\n getChain,\n BaseSmartContractAccount,\n defineReadOnly,\n type AccountMiddlewareFn,\n type FeeDataMiddleware,\n type GasEstimatorMiddleware,\n type PaymasterAndDataMiddleware,\n type PublicErc4337Client,\n} from \"@alchemy/aa-core\";\nimport { ZeroDevAccountSigner } from \"./account-signer.js\";\nimport { JsonRpcProvider } from \"@ethersproject/providers\";\nimport type { SupportedValidators } from \"../validator/types.js\";\nimport type {\n ValidatorProviderParamsMap,\n ValidatorProviderTypeMap,\n} from \"../validator-provider/types.js\";\nimport { ValidatorProviders } from \"../validator-provider/index.js\";\nimport { withZeroDevPaymasterAndData } from \"../middleware/paymaster.js\";\n\nexport class ZeroDevEthersProvider<\n V extends SupportedValidators\n> extends JsonRpcProvider {\n readonly accountProvider: ValidatorProviderTypeMap[V];\n constructor(validatorType: V, params: ValidatorProviderParamsMap[V]) {\n super();\n let accountProvider = new ValidatorProviders[validatorType](params);\n if (params.usePaymaster === undefined || params.usePaymaster) {\n let paymasterConfig = params.opts?.paymasterConfig ?? {\n policy: \"VERIFYING_PAYMASTER\",\n };\n paymasterConfig = {\n ...paymasterConfig,\n paymasterProvider:\n params.opts?.paymasterConfig?.paymasterProvider ??\n params.bundlerProvider,\n };\n accountProvider = withZeroDevPaymasterAndData(\n accountProvider,\n paymasterConfig\n ) as ValidatorProviderTypeMap[V];\n }\n this.accountProvider = accountProvider;\n }\n\n public static async init<V extends SupportedValidators>(\n validatorType: V,\n params: ValidatorProviderParamsMap[V]\n ): Promise<ZeroDevEthersProvider<V>> {\n const chainId = await getChainId(params.projectId);\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const chain = getChain(chainId);\n const instance = new ZeroDevEthersProvider(validatorType, {\n ...params,\n opts: {\n ...params.opts,\n providerConfig: {\n chain,\n ...params.opts?.providerConfig,\n },\n },\n });\n\n return instance;\n }\n\n getAccountProvider(): ValidatorProviderTypeMap[V] {\n return this.accountProvider;\n }\n\n /**\n * Rewrites the send method to use the account provider's EIP-1193\n * compliant request method\n *\n * @param method - the RPC method to call\n * @param params - the params required by the RPC method\n * @returns the result of the RPC call\n */\n send(method: string, params: any[]): Promise<any> {\n return this.accountProvider.request({ method, params });\n }\n\n /**\n * Connects the Provider to an Account and returns a Signer\n *\n * @param fn - a function that takes the account provider's rpcClient and returns a BaseSmartContractAccount\n * @returns an {@link ZeroDevAccountSigner} that can be used to sign and send user operations\n */\n connectToAccount(\n fn: (rpcClient: PublicErc4337Client) => BaseSmartContractAccount\n ): ZeroDevAccountSigner<V> {\n defineReadOnly(\n this,\n \"accountProvider\",\n this.accountProvider.connect(fn) as ValidatorProviderTypeMap[V]\n );\n return this.getAccountSigner();\n }\n\n /**\n * @returns an {@link ZeroDevAccountSigner} using this as the underlying provider\n */\n getAccountSigner(): ZeroDevAccountSigner<V> {\n return new ZeroDevAccountSigner(this);\n }\n\n withPaymasterMiddleware = (overrides: {\n dummyPaymasterDataMiddleware?: PaymasterAndDataMiddleware;\n paymasterDataMiddleware?: PaymasterAndDataMiddleware;\n }): this => {\n this.accountProvider.withPaymasterMiddleware(overrides);\n return this;\n };\n\n withGasEstimator = (override: GasEstimatorMiddleware): this => {\n this.accountProvider.withGasEstimator(override);\n return this;\n };\n\n withFeeDataGetter = (override: FeeDataMiddleware): this => {\n this.accountProvider.withFeeDataGetter(override);\n return this;\n };\n\n withCustomMiddleware = (override: AccountMiddlewareFn): this => {\n this.accountProvider.withCustomMiddleware(override);\n return this;\n };\n\n getPublicErc4337Client(): PublicErc4337Client {\n return this.accountProvider.rpcClient;\n }\n}\n"]}
1
+ {"version":3,"file":"ethers-provider.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/ethers-provider/ethers-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { getChainId } from \"../api/index.js\";\nimport {\n getChain,\n BaseSmartContractAccount,\n defineReadOnly,\n type AccountMiddlewareFn,\n type FeeDataMiddleware,\n type GasEstimatorMiddleware,\n type PaymasterAndDataMiddleware,\n type PublicErc4337Client,\n} from \"@alchemy/aa-core\";\nimport { ZeroDevAccountSigner } from \"./account-signer.js\";\nimport { JsonRpcProvider } from \"@ethersproject/providers\";\nimport type { SupportedValidators } from \"../validator/types.js\";\nimport type {\n ValidatorProviderParamsMap,\n ValidatorProviderTypeMap,\n} from \"../validator-provider/types.js\";\nimport { ValidatorProviders } from \"../validator-provider/index.js\";\nimport { withZeroDevPaymasterAndData } from \"../middleware/paymaster.js\";\n\nexport class ZeroDevEthersProvider<\n V extends SupportedValidators\n> extends JsonRpcProvider {\n readonly accountProvider: ValidatorProviderTypeMap[V];\n constructor(validatorType: V, params: ValidatorProviderParamsMap[V]) {\n super();\n let bundlerProvider = params.bundlerProvider;\n const shouldUsePaymaster =\n params.usePaymaster === undefined || params.usePaymaster;\n if (\n params.opts?.paymasterConfig &&\n params.opts?.paymasterConfig.policy === \"TOKEN_PAYMASTER\" &&\n shouldUsePaymaster\n ) {\n bundlerProvider = \"STACKUP\";\n }\n let accountProvider = new ValidatorProviders[validatorType]({\n ...params,\n bundlerProvider,\n });\n if (shouldUsePaymaster) {\n let paymasterConfig = params.opts?.paymasterConfig ?? {\n policy: \"VERIFYING_PAYMASTER\",\n };\n paymasterConfig = {\n ...paymasterConfig,\n paymasterProvider:\n params.opts?.paymasterConfig?.paymasterProvider ?? bundlerProvider,\n };\n accountProvider = withZeroDevPaymasterAndData(\n accountProvider,\n paymasterConfig\n ) as ValidatorProviderTypeMap[V];\n }\n this.accountProvider = accountProvider;\n }\n\n public static async init<V extends SupportedValidators>(\n validatorType: V,\n params: ValidatorProviderParamsMap[V]\n ): Promise<ZeroDevEthersProvider<V>> {\n const chainId = await getChainId(params.projectId);\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const chain = getChain(chainId);\n const instance = new ZeroDevEthersProvider(validatorType, {\n ...params,\n opts: {\n ...params.opts,\n providerConfig: {\n chain,\n ...params.opts?.providerConfig,\n },\n },\n });\n\n return instance;\n }\n\n getAccountProvider(): ValidatorProviderTypeMap[V] {\n return this.accountProvider;\n }\n\n /**\n * Rewrites the send method to use the account provider's EIP-1193\n * compliant request method\n *\n * @param method - the RPC method to call\n * @param params - the params required by the RPC method\n * @returns the result of the RPC call\n */\n send(method: string, params: any[]): Promise<any> {\n return this.accountProvider.request({ method, params });\n }\n\n /**\n * Connects the Provider to an Account and returns a Signer\n *\n * @param fn - a function that takes the account provider's rpcClient and returns a BaseSmartContractAccount\n * @returns an {@link ZeroDevAccountSigner} that can be used to sign and send user operations\n */\n connectToAccount(\n fn: (rpcClient: PublicErc4337Client) => BaseSmartContractAccount\n ): ZeroDevAccountSigner<V> {\n defineReadOnly(\n this,\n \"accountProvider\",\n this.accountProvider.connect(fn) as ValidatorProviderTypeMap[V]\n );\n return this.getAccountSigner();\n }\n\n /**\n * @returns an {@link ZeroDevAccountSigner} using this as the underlying provider\n */\n getAccountSigner(): ZeroDevAccountSigner<V> {\n return new ZeroDevAccountSigner(this);\n }\n\n withPaymasterMiddleware = (overrides: {\n dummyPaymasterDataMiddleware?: PaymasterAndDataMiddleware;\n paymasterDataMiddleware?: PaymasterAndDataMiddleware;\n }): this => {\n this.accountProvider.withPaymasterMiddleware(overrides);\n return this;\n };\n\n withGasEstimator = (override: GasEstimatorMiddleware): this => {\n this.accountProvider.withGasEstimator(override);\n return this;\n };\n\n withFeeDataGetter = (override: FeeDataMiddleware): this => {\n this.accountProvider.withFeeDataGetter(override);\n return this;\n };\n\n withCustomMiddleware = (override: AccountMiddlewareFn): this => {\n this.accountProvider.withCustomMiddleware(override);\n return this;\n };\n\n getPublicErc4337Client(): PublicErc4337Client {\n return this.accountProvider.rpcClient;\n }\n}\n"]}
@@ -1,10 +1,9 @@
1
- import type { Hex, Signature } from "./types.js";
2
1
  import type { SignTypedDataParams } from "@alchemy/aa-core";
3
2
  export declare const publicKey = "public-key";
4
3
  export declare const es256 = -7;
5
4
  export declare const generateRandomBuffer: () => ArrayBuffer;
6
5
  export declare const base64UrlEncode: (challenge: ArrayBuffer) => string;
7
- export declare function signatureToHex({ r, s, v }: Signature): Hex;
6
+ export declare const signMessageImplementation: (msg: string, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
8
7
  export declare const signMessage: (msg: string | Uint8Array, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
9
8
  export declare const signTypedData: (params: SignTypedDataParams, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
10
9
  export declare function base64URLStringToBuffer(base64URLString: string): ArrayBuffer;
@@ -3,11 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.base64URLStringToBuffer = exports.signTypedData = exports.signMessage = exports.signatureToHex = exports.base64UrlEncode = exports.generateRandomBuffer = exports.es256 = exports.publicKey = void 0;
6
+ exports.base64URLStringToBuffer = exports.signTypedData = exports.signMessage = exports.signMessageImplementation = exports.base64UrlEncode = exports.generateRandomBuffer = exports.es256 = exports.publicKey = void 0;
7
7
  const http_1 = require("@turnkey/http");
8
8
  const axios_1 = __importDefault(require("axios"));
9
9
  const constants_js_1 = require("../../constants.js");
10
- const ethers_1 = require("ethers");
11
10
  const viem_1 = require("viem");
12
11
  (0, http_1.browserInit)({
13
12
  baseUrl: "https://api.turnkey.com",
@@ -28,22 +27,15 @@ const base64UrlEncode = (challenge) => {
28
27
  .replace(/=/g, "");
29
28
  };
30
29
  exports.base64UrlEncode = base64UrlEncode;
31
- function signatureToHex({ r, s, v }) {
32
- return ethers_1.ethers.utils.joinSignature({
33
- r: `0x${r}`,
34
- s: `0x${s}`,
35
- v: parseInt(v) + 27,
36
- });
37
- }
38
- exports.signatureToHex = signatureToHex;
39
- const signMessage = async (msg, id, walletId, projectId, credentialId, apiUrl = constants_js_1.API_URL) => {
30
+ const signMessageImplementation = async (msg, id, walletId, projectId, credentialId, apiUrl = constants_js_1.API_URL) => {
31
+ console.log("SIGN MESSAGE IMPLEMENTATION");
40
32
  const signedRequest = await http_1.TurnkeyApi.signSignRawPayload({
41
33
  body: {
42
34
  type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD",
43
35
  organizationId: id,
44
36
  parameters: {
45
37
  privateKeyId: walletId,
46
- payload: ethers_1.ethers.utils.hashMessage(msg),
38
+ payload: msg,
47
39
  encoding: "PAYLOAD_ENCODING_HEXADECIMAL",
48
40
  hashFunction: "HASH_FUNCTION_NO_OP",
49
41
  },
@@ -66,18 +58,26 @@ const signMessage = async (msg, id, walletId, projectId, credentialId, apiUrl =
66
58
  if (activity.status === "ACTIVITY_STATUS_COMPLETED") {
67
59
  let result = activity?.result?.signRawPayloadResult;
68
60
  if (result) {
69
- const assembled = signatureToHex(result);
70
- if (assembled) {
71
- return assembled;
61
+ const signatureHex = (0, viem_1.signatureToHex)({
62
+ r: `0x${result.r}`,
63
+ s: `0x${result.s}`,
64
+ v: result.v === "00" ? 27n : 28n,
65
+ });
66
+ if (signatureHex) {
67
+ return signatureHex;
72
68
  }
73
69
  }
74
70
  }
75
71
  return "0x";
76
72
  };
73
+ exports.signMessageImplementation = signMessageImplementation;
74
+ const signMessage = async (msg, id, walletId, projectId, credentialId, apiUrl = constants_js_1.API_URL) => {
75
+ return await (0, exports.signMessageImplementation)((0, viem_1.hashMessage)(typeof msg === 'string' ? msg : { raw: msg }), id, walletId, projectId, credentialId, apiUrl);
76
+ };
77
77
  exports.signMessage = signMessage;
78
78
  const signTypedData = async (params, id, walletId, projectId, credentialId, apiUrl = constants_js_1.API_URL) => {
79
79
  const hashToSign = (0, viem_1.hashTypedData)(params);
80
- return await (0, exports.signMessage)(hashToSign, id, walletId, projectId, credentialId, apiUrl);
80
+ return await (0, exports.signMessageImplementation)(hashToSign, id, walletId, projectId, credentialId, apiUrl);
81
81
  };
82
82
  exports.signTypedData = signTypedData;
83
83
  function base64URLStringToBuffer(base64URLString) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { browserInit, TurnkeyApi } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport { API_URL } from \"../../constants.js\";\nimport type { Hex, Signature } from \"./types.js\";\nimport { ethers } from \"ethers\";\nimport type { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const publicKey = \"public-key\";\n\nexport const es256 = -7;\n\nexport const generateRandomBuffer = (): ArrayBuffer => {\n const arr = new Uint8Array(32);\n //@ts-expect-error\n crypto.getRandomValues(arr);\n return arr.buffer;\n};\n\nexport const base64UrlEncode = (challenge: ArrayBuffer): string => {\n return Buffer.from(challenge)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n};\n\n// VIEM\n// export function signatureToHex({ r, s, v }: Signature): Hex {\n// return `0x${new secp256k1.Signature(\n// hexToBigInt(r),\n// hexToBigInt(s),\n// ).toCompactHex()}${toHex(v).slice(2)}`\n// }\n\n//ETHERS\nexport function signatureToHex({ r, s, v }: Signature): Hex {\n return ethers.utils.joinSignature({\n r: `0x${r}`,\n s: `0x${s}`,\n //@ts-expect-error\n v: parseInt(v) + 27,\n }) as Hex;\n}\n\nexport const signMessage = async (\n msg: string | Uint8Array,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const signedRequest = await TurnkeyApi.signSignRawPayload(\n {\n body: {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD\",\n organizationId: id,\n parameters: {\n privateKeyId: walletId,\n payload: ethers.utils.hashMessage(msg),\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n timestampMs: String(Date.now()),\n },\n },\n {\n publicKey: {\n allowCredentials: [\n {\n id: base64URLStringToBuffer(credentialId),\n type: publicKey,\n },\n ],\n },\n }\n );\n const proxyResponse = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/proxy`,\n {\n signedRequest,\n }\n );\n const { activity } = await proxyResponse.data;\n if (activity.status === \"ACTIVITY_STATUS_COMPLETED\") {\n let result = activity?.result?.signRawPayloadResult;\n\n if (result) {\n const assembled = signatureToHex(result);\n if (assembled) {\n return assembled;\n }\n }\n }\n return \"0x\";\n};\n\nexport const signTypedData = async (\n params: SignTypedDataParams,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const hashToSign = hashTypedData(params);\n return await signMessage(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\n// https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8\nexport function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, \"+\").replace(/_/g, \"/\");\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, \"=\");\n\n // Convert to a binary string\n const binary = atob(padded);\n\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return buffer;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":";;;;;;AAAA,wCAAwD;AACxD,kDAA0B;AAC1B,qDAA6C;AAE7C,+BAAkE;AAElE,IAAA,kBAAW,EAAC;IACV,OAAO,EAAE,yBAAyB;CACnC,CAAC,CAAC;AAEU,QAAA,SAAS,GAAG,YAAY,CAAC;AAEzB,QAAA,KAAK,GAAG,CAAC,CAAC,CAAC;AAEjB,MAAM,oBAAoB,GAAG,GAAgB,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC,CAAC;AALW,QAAA,oBAAoB,wBAK/B;AAEK,MAAM,eAAe,GAAG,CAAC,SAAsB,EAAU,EAAE;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;SAC1B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC;AANW,QAAA,eAAe,mBAM1B;AAEK,MAAM,yBAAyB,GAAG,KAAK,EAC5C,GAAW,EACX,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,sBAAO,EAChB,EAAE;IACF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAC1C,MAAM,aAAa,GAAG,MAAM,iBAAU,CAAC,kBAAkB,CACvD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,gCAAgC;YACtC,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE;gBACV,YAAY,EAAE,QAAQ;gBACtB,OAAO,EAAE,GAAG;gBACZ,QAAQ,EAAE,8BAA8B;gBACxC,YAAY,EAAE,qBAAqB;aACpC;YACD,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;SAChC;KACF,EACD;QACE,SAAS,EAAE;YACT,gBAAgB,EAAE;gBAChB;oBACE,EAAE,EAAE,uBAAuB,CAAC,YAAY,CAAC;oBACzC,IAAI,EAAE,iBAAS;iBAChB;aACF;SACF;KACF,CACF,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,eAAK,CAAC,IAAI,CACpC,GAAG,MAAM,aAAa,SAAS,gBAAgB,EAC/C;QACE,aAAa;KACd,CACF,CAAC;IACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,2BAA2B,EAAE;QACnD,IAAI,MAAM,GAAG,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC;QAEpD,IAAI,MAAM,EAAE;YACV,MAAM,YAAY,GAAG,IAAA,qBAAc,EAAC;gBAClC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE;gBAClB,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE;gBAClB,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;aACjC,CAAC,CAAC;YACH,IAAI,YAAY,EAAE;gBAChB,OAAO,YAAY,CAAC;aACrB;SACF;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAxDW,QAAA,yBAAyB,6BAwDpC;AAEK,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAwB,EACxB,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,sBAAO,EAChB,EAAE;IACF,OAAO,MAAM,IAAA,iCAAyB,EACpC,IAAA,kBAAW,EAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,GAAG,EAAE,GAAG,EAAC,CAAC,EACvD,EAAE,EACF,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,WAAW,eAgBtB;AAEK,MAAM,aAAa,GAAG,KAAK,EAChC,MAA2B,EAC3B,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,sBAAO,EAChB,EAAE;IACF,MAAM,UAAU,GAAG,IAAA,oBAAa,EAAC,MAAM,CAAC,CAAC;IACzC,OAAO,MAAM,IAAA,iCAAyB,EACpC,UAAU,EACV,EAAE,EACF,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,aAAa,iBAiBxB;AAGF,SAAgB,uBAAuB,CAAC,eAAuB;IAE7D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAQrE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAG7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAG5B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACjC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAzBD,0DAyBC","sourcesContent":["import { browserInit, TurnkeyApi } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport { API_URL } from \"../../constants.js\";\nimport type { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData, signatureToHex, hashMessage } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const publicKey = \"public-key\";\n\nexport const es256 = -7;\n\nexport const generateRandomBuffer = (): ArrayBuffer => {\n const arr = new Uint8Array(32);\n //@ts-expect-error\n crypto.getRandomValues(arr);\n return arr.buffer;\n};\n\nexport const base64UrlEncode = (challenge: ArrayBuffer): string => {\n return Buffer.from(challenge)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n};\n\nexport const signMessageImplementation = async (\n msg: string,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n console.log(\"SIGN MESSAGE IMPLEMENTATION\")\n const signedRequest = await TurnkeyApi.signSignRawPayload(\n {\n body: {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD\",\n organizationId: id,\n parameters: {\n privateKeyId: walletId,\n payload: msg,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n timestampMs: String(Date.now()),\n },\n },\n {\n publicKey: {\n allowCredentials: [\n {\n id: base64URLStringToBuffer(credentialId),\n type: publicKey,\n },\n ],\n },\n }\n );\n const proxyResponse = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/proxy`,\n {\n signedRequest,\n }\n );\n const { activity } = await proxyResponse.data;\n if (activity.status === \"ACTIVITY_STATUS_COMPLETED\") {\n let result = activity?.result?.signRawPayloadResult;\n\n if (result) {\n const signatureHex = signatureToHex({\n r: `0x${result.r}`,\n s: `0x${result.s}`,\n v: result.v === \"00\" ? 27n : 28n,\n });\n if (signatureHex) {\n return signatureHex;\n }\n }\n }\n return \"0x\";\n};\n\nexport const signMessage = async (\n msg: string | Uint8Array,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n return await signMessageImplementation(\n hashMessage(typeof msg === 'string' ? msg : {raw: msg}),\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const signTypedData = async (\n params: SignTypedDataParams,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const hashToSign = hashTypedData(params);\n return await signMessageImplementation(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\n// https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8\nexport function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, \"+\").replace(/_/g, \"/\");\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, \"=\");\n\n // Convert to a binary string\n const binary = atob(padded);\n\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return buffer;\n}\n"]}
@@ -7,7 +7,7 @@ import { type PaymasterAndBundlerProviders, type PaymasterConfig } from "./types
7
7
  export declare class TokenPaymaster extends Paymaster {
8
8
  protected paymasterConfig: PaymasterConfig<"TOKEN_PAYMASTER">;
9
9
  constructor(provider: ZeroDevProvider, paymasterConfig: PaymasterConfig<"TOKEN_PAYMASTER">);
10
- getPaymasterAddress(): Promise<Hex | undefined>;
10
+ getPaymasterAddress(paymasterProvider?: PaymasterAndBundlerProviders): Promise<Hex | undefined>;
11
11
  decodeMainCallFromCallData(kernelAddress: PromiseOrValue<string>, callData: PromiseOrValue<BytesLike>): Promise<UserOperationCallDataWithDelegate | undefined>;
12
12
  getERC20UserOp(struct: UserOperationStruct, mainCall: UserOperationCallDataWithDelegate, gasTokenAddress: Hex, paymasterAddress: Hex): Promise<UserOperationStruct | undefined>;
13
13
  getPaymasterResponse(struct: UserOperationStruct, paymasterProvider?: PaymasterAndBundlerProviders, shouldOverrideFee?: boolean): Promise<UserOperationStruct | undefined>;
@@ -24,12 +24,13 @@ class TokenPaymaster extends base_js_1.Paymaster {
24
24
  value: paymasterConfig
25
25
  });
26
26
  }
27
- async getPaymasterAddress() {
27
+ async getPaymasterAddress(paymasterProvider) {
28
28
  const chainId = await (0, index_js_1.getChainId)(this.provider.getProjectId());
29
29
  try {
30
30
  const { data: paymasterResp } = await axios_1.default.post(`${constants_js_1.PAYMASTER_URL}/getPaymasterAddress`, {
31
31
  chainId,
32
32
  entryPointAddress: constants_js_1.ENTRYPOINT_ADDRESS,
33
+ paymasterProvider,
33
34
  }, { headers: { "Content-Type": "application/json" } });
34
35
  return paymasterResp;
35
36
  }
@@ -141,7 +142,7 @@ class TokenPaymaster extends base_js_1.Paymaster {
141
142
  throw new Error("ChainId not found");
142
143
  }
143
144
  const gasTokenAddress = (0, utils_js_1.getGasTokenAddress)(this.paymasterConfig.gasToken, chainId);
144
- let paymasterAddress = await this.getPaymasterAddress();
145
+ let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);
145
146
  if (gasTokenAddress !== undefined && paymasterAddress !== undefined) {
146
147
  const erc20UserOp = await this.getERC20UserOp(struct, mainCall, gasTokenAddress, paymasterAddress);
147
148
  if (!erc20UserOp) {
@@ -1 +1 @@
1
- {"version":3,"file":"token-paymaster.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/token-paymaster.ts"],"names":[],"mappings":";;;;;;AAMA,kDAA0B;AAC1B,+BAA+E;AAC/E,qDAA+C;AAC/C,qEAA+D;AAC/D,6DAAuD;AACvD,kDAKyB;AACzB,4CAGsB;AAEtB,0CAGqB;AACrB,uCAAsC;AAKtC,8CAA6C;AAE7C,MAAa,cAAe,SAAQ,mBAAS;IAC3C,YACE,QAAyB,EACf,eAAmD;QAE7D,KAAK,CAAC,QAAQ,CAAC,CAAC;QAFhB;;;;mBAAU,eAAe;WAAoC;IAG/D,CAAC;IACD,KAAK,CAAC,mBAAmB;QACvB,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAE/D,IAAI;YACF,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,eAAK,CAAC,IAAI,CAC9C,GAAG,4BAAa,sBAAsB,EACtC;gBACE,OAAO;gBACP,iBAAiB,EAAE,iCAAkB;aACtC,EACD,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACpD,CAAC;YACF,OAAO,aAAoB,CAAC;SAC7B;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,SAAS,CAAC;SAClB;IACH,CAAC;IACD,KAAK,CAAC,0BAA0B,CAC9B,aAAqC,EACrC,QAAmC;QAEnC,IAAI,IAAI,GAAQ,IAAI,CAAC;QACrB,IAAI,QAAQ,YAAY,OAAO,EAAE;YAC/B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC;YAC7B,IAAI,KAAK,YAAY,UAAU,EAAE;gBAC/B,IAAI,GAAG,IAAA,YAAK,EAAC,KAAK,CAAC,CAAC;aACrB;iBAAM;gBACL,IAAI,GAAG,KAAY,CAAC;aACrB;SACF;aAAM,IAAI,QAAQ,YAAY,UAAU,EAAE;YACzC,IAAI,GAAG,IAAA,YAAK,EAAC,QAAQ,CAAC,CAAC;SACxB;aAAM;YACL,IAAI,GAAG,QAAe,CAAC;SACxB;QAED,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,IAAA,yBAAkB,EAAC;gBAChD,GAAG,EAAE,sCAAgB;gBACrB,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YACH,IAAI,YAAY,KAAK,SAAS,EAAE;gBAC9B,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;gBACnC,IAAI,aAAa,CAAC;gBAClB,IAAI;oBACF,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAA,yBAAkB,EAAC;wBACpD,GAAG,EAAE,8BAAY;wBACjB,IAAI;qBACL,CAAC,CAAC,CAAC;iBACL;gBAAC,OAAO,KAAK,EAAE,GAAE;gBAClB,IAAI,QAAQ,GAE4B;oBACtC,MAAM;oBACN,KAAK,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI;iBACL,CAAC;gBACF,IAAI,aAAa,KAAK,WAAW,EAAE;oBACjC,QAAQ,GAAG;wBACT,GAAG,QAAQ;wBACX,MAAM,EAAE,6BAAc;wBACtB,YAAY,EAAE,IAAI;wBAClB,IAAI;qBACL,CAAC;iBACH;gBACD,OAAO,QAAQ,CAAC;aACjB;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;gBACL,MAAM,EAAE,CAAC,aAAa,YAAY,OAAO;oBACvC,CAAC,CAAC,MAAM,aAAa;oBACrB,CAAC,CAAC,aAAa,CAAQ;gBACzB,IAAI;gBACJ,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,IAAI;aACnB,CAAC;SACH;QACD,OAAO;IACT,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,MAA2B,EAC3B,QAA2C,EAC3C,eAAoB,EACpB,gBAAqB;QAErB,IAAI;YACF,MAAM,WAAW,GAA0B;gBACzC,MAAM,EAAE,eAAe;gBACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChB,IAAI,EAAE,IAAA,yBAAkB,EAAC;oBACvB,GAAG,EAAE,sBAAQ;oBACb,YAAY,EAAE,SAAS;oBACvB,IAAI,EAAE,CAAC,gBAAgB,EAAE,oCAAqB,CAAC,eAAe,CAAC,CAAC;iBACjE,CAAC;aACH,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC1B,MAAM,+BAAmB,CAAC;aAC3B;YACD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC;gBACnE,WAAW;gBACX,QAAQ;aACT,CAAC,CAAC;YACH,OAAO;gBACL,GAAG,MAAM;gBACT,QAAQ,EAAE,aAAa;gBACvB,YAAY,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC;oBACtD,OAAO,EAAE,iCAAkB;oBAC3B,EAAE,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;oBACpC,IAAI,EAAE,aAAa;iBACpB,CAAC;aACH,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;SACR;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,MAA2B,EAC3B,iBAAgD,EAChD,iBAA2B;QAE3B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,0BAA0B,CACpD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CAChB,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,8CAAkC,CAAC;aAC1C;YACD,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;aACtC;YACD,MAAM,eAAe,GAAG,IAAA,6BAAkB,EACxC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAC7B,OAAO,CACR,CAAC;YACF,IAAI,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACxD,IAAI,eAAe,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS,EAAE;gBACnE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAC3C,MAAM,EACN,QAAQ,EACR,eAAe,EACf,gBAAgB,CACjB,CAAC;gBACF,IAAI,CAAC,WAAW,EAAE;oBAChB,OAAO,MAAM,CAAC;iBACf;gBACD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;oBAC1C,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,eAAe;oBACf,WAAW;oBACX,aAAa,EAAE,WAAW,CAAC,QAAQ;oBACnC,iBAAiB;oBACjB,iBAAiB;iBAClB,CAAC,CAAC;gBACH,IAAI,aAAa,EAAE;oBACjB,OAAO,aAAa,CAAC;iBACtB;aACF;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACpB;QACD,OAAO;IACT,CAAC;CACF;AA9KD,wCA8KC","sourcesContent":["import {\n type PromiseOrValue,\n type BytesLike,\n type UserOperationCallData,\n type UserOperationStruct,\n} from \"@alchemy/aa-core\";\nimport axios from \"axios\";\nimport { type Hex, toHex, decodeFunctionData, encodeFunctionData } from \"viem\";\nimport { ERC20Abi } from \"../abis/ERC20Abi.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MultiSendAbi } from \"../abis/MultiSendAbi.js\";\nimport {\n PAYMASTER_URL,\n ENTRYPOINT_ADDRESS,\n MULTISEND_ADDR,\n ERC20_APPROVAL_AMOUNT,\n} from \"../constants.js\";\nimport {\n AccountNotConnected,\n IncorrectCallDataForTokenPaymaster,\n} from \"../errors.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport {\n getGasTokenAddress,\n type UserOperationCallDataWithDelegate,\n} from \"../utils.js\";\nimport { Paymaster } from \"./base.js\";\nimport {\n type PaymasterAndBundlerProviders,\n type PaymasterConfig,\n} from \"./types.js\";\nimport { getChainId } from \"../api/index.js\";\n\nexport class TokenPaymaster extends Paymaster {\n constructor(\n provider: ZeroDevProvider,\n protected paymasterConfig: PaymasterConfig<\"TOKEN_PAYMASTER\">\n ) {\n super(provider);\n }\n async getPaymasterAddress(): Promise<Hex | undefined> {\n const chainId = await getChainId(this.provider.getProjectId());\n\n try {\n const { data: paymasterResp } = await axios.post(\n `${PAYMASTER_URL}/getPaymasterAddress`,\n {\n chainId,\n entryPointAddress: ENTRYPOINT_ADDRESS,\n },\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n return paymasterResp as Hex;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n }\n async decodeMainCallFromCallData(\n kernelAddress: PromiseOrValue<string>,\n callData: PromiseOrValue<BytesLike>\n ): Promise<UserOperationCallDataWithDelegate | undefined> {\n let data: Hex = \"0x\";\n if (callData instanceof Promise) {\n const _data = await callData;\n if (_data instanceof Uint8Array) {\n data = toHex(_data);\n } else {\n data = _data as Hex;\n }\n } else if (callData instanceof Uint8Array) {\n data = toHex(callData);\n } else {\n data = callData as Hex;\n }\n\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: data,\n });\n if (functionName === \"execute\") {\n const [target, value, data] = args;\n let msFuntionName;\n try {\n ({ functionName: msFuntionName } = decodeFunctionData({\n abi: MultiSendAbi,\n data,\n }));\n } catch (error) {}\n let mainCall:\n | UserOperationCallData\n | UserOperationCallDataWithDelegate = {\n target,\n value: value ?? 0n,\n data,\n };\n if (msFuntionName === \"multiSend\") {\n mainCall = {\n ...mainCall,\n target: MULTISEND_ADDR,\n delegateCall: true,\n data,\n };\n }\n return mainCall;\n }\n } catch (error) {\n return {\n target: (kernelAddress instanceof Promise\n ? await kernelAddress\n : kernelAddress) as Hex,\n data,\n value: 0n,\n delegateCall: true,\n };\n }\n return;\n }\n\n async getERC20UserOp(\n struct: UserOperationStruct,\n mainCall: UserOperationCallDataWithDelegate,\n gasTokenAddress: Hex,\n paymasterAddress: Hex\n ): Promise<UserOperationStruct | undefined> {\n try {\n const approveData: UserOperationCallData = {\n target: gasTokenAddress,\n value: BigInt(0),\n data: encodeFunctionData({\n abi: ERC20Abi,\n functionName: \"approve\",\n args: [paymasterAddress, ERC20_APPROVAL_AMOUNT[gasTokenAddress]],\n }),\n };\n if (!this.provider.account) {\n throw AccountNotConnected;\n }\n const erc20CallData = await this.provider.account.encodeBatchExecute([\n approveData,\n mainCall,\n ]);\n return {\n ...struct,\n callData: erc20CallData,\n callGasLimit: await this.provider.rpcClient.estimateGas({\n account: ENTRYPOINT_ADDRESS,\n to: await this.provider.getAddress(),\n data: erc20CallData,\n }),\n };\n } catch (error) {\n return;\n }\n }\n\n async getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined> {\n try {\n const mainCall = await this.decodeMainCallFromCallData(\n struct.sender,\n struct.callData\n );\n if (!mainCall) {\n throw IncorrectCallDataForTokenPaymaster;\n }\n const chainId = await getChainId(this.provider.getProjectId());\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const gasTokenAddress = getGasTokenAddress(\n this.paymasterConfig.gasToken,\n chainId\n );\n let paymasterAddress = await this.getPaymasterAddress();\n if (gasTokenAddress !== undefined && paymasterAddress !== undefined) {\n const erc20UserOp = await this.getERC20UserOp(\n struct,\n mainCall,\n gasTokenAddress,\n paymasterAddress\n );\n if (!erc20UserOp) {\n return struct;\n }\n const paymasterResp = await this.signUserOp({\n userOp: struct,\n callData: struct.callData,\n gasTokenAddress,\n erc20UserOp,\n erc20CallData: erc20UserOp.callData,\n paymasterProvider,\n shouldOverrideFee,\n });\n if (paymasterResp) {\n return paymasterResp;\n }\n }\n } catch (error) {\n console.log(error);\n }\n return;\n }\n}\n"]}
1
+ {"version":3,"file":"token-paymaster.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/paymaster/token-paymaster.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type PromiseOrValue,\n type BytesLike,\n type UserOperationCallData,\n type UserOperationStruct,\n} from \"@alchemy/aa-core\";\nimport axios from \"axios\";\nimport { type Hex, toHex, decodeFunctionData, encodeFunctionData } from \"viem\";\nimport { ERC20Abi } from \"../abis/ERC20Abi.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MultiSendAbi } from \"../abis/MultiSendAbi.js\";\nimport {\n PAYMASTER_URL,\n ENTRYPOINT_ADDRESS,\n MULTISEND_ADDR,\n ERC20_APPROVAL_AMOUNT,\n} from \"../constants.js\";\nimport {\n AccountNotConnected,\n IncorrectCallDataForTokenPaymaster,\n} from \"../errors.js\";\nimport type { ZeroDevProvider } from \"../provider.js\";\nimport {\n getGasTokenAddress,\n type UserOperationCallDataWithDelegate,\n} from \"../utils.js\";\nimport { Paymaster } from \"./base.js\";\nimport {\n type PaymasterAndBundlerProviders,\n type PaymasterConfig,\n} from \"./types.js\";\nimport { getChainId } from \"../api/index.js\";\n\nexport class TokenPaymaster extends Paymaster {\n constructor(\n provider: ZeroDevProvider,\n protected paymasterConfig: PaymasterConfig<\"TOKEN_PAYMASTER\">\n ) {\n super(provider);\n }\n async getPaymasterAddress(\n paymasterProvider?: PaymasterAndBundlerProviders\n ): Promise<Hex | undefined> {\n const chainId = await getChainId(this.provider.getProjectId());\n\n try {\n const { data: paymasterResp } = await axios.post(\n `${PAYMASTER_URL}/getPaymasterAddress`,\n {\n chainId,\n entryPointAddress: ENTRYPOINT_ADDRESS,\n paymasterProvider,\n },\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n return paymasterResp as Hex;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n }\n async decodeMainCallFromCallData(\n kernelAddress: PromiseOrValue<string>,\n callData: PromiseOrValue<BytesLike>\n ): Promise<UserOperationCallDataWithDelegate | undefined> {\n let data: Hex = \"0x\";\n if (callData instanceof Promise) {\n const _data = await callData;\n if (_data instanceof Uint8Array) {\n data = toHex(_data);\n } else {\n data = _data as Hex;\n }\n } else if (callData instanceof Uint8Array) {\n data = toHex(callData);\n } else {\n data = callData as Hex;\n }\n\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: data,\n });\n if (functionName === \"execute\") {\n const [target, value, data] = args;\n let msFuntionName;\n try {\n ({ functionName: msFuntionName } = decodeFunctionData({\n abi: MultiSendAbi,\n data,\n }));\n } catch (error) {}\n let mainCall:\n | UserOperationCallData\n | UserOperationCallDataWithDelegate = {\n target,\n value: value ?? 0n,\n data,\n };\n if (msFuntionName === \"multiSend\") {\n mainCall = {\n ...mainCall,\n target: MULTISEND_ADDR,\n delegateCall: true,\n data,\n };\n }\n return mainCall;\n }\n } catch (error) {\n return {\n target: (kernelAddress instanceof Promise\n ? await kernelAddress\n : kernelAddress) as Hex,\n data,\n value: 0n,\n delegateCall: true,\n };\n }\n return;\n }\n\n async getERC20UserOp(\n struct: UserOperationStruct,\n mainCall: UserOperationCallDataWithDelegate,\n gasTokenAddress: Hex,\n paymasterAddress: Hex\n ): Promise<UserOperationStruct | undefined> {\n try {\n const approveData: UserOperationCallData = {\n target: gasTokenAddress,\n value: BigInt(0),\n data: encodeFunctionData({\n abi: ERC20Abi,\n functionName: \"approve\",\n args: [paymasterAddress, ERC20_APPROVAL_AMOUNT[gasTokenAddress]],\n }),\n };\n if (!this.provider.account) {\n throw AccountNotConnected;\n }\n const erc20CallData = await this.provider.account.encodeBatchExecute([\n approveData,\n mainCall,\n ]);\n return {\n ...struct,\n callData: erc20CallData,\n callGasLimit: await this.provider.rpcClient.estimateGas({\n account: ENTRYPOINT_ADDRESS,\n to: await this.provider.getAddress(),\n data: erc20CallData,\n }),\n };\n } catch (error) {\n return;\n }\n }\n\n async getPaymasterResponse(\n struct: UserOperationStruct,\n paymasterProvider?: PaymasterAndBundlerProviders,\n shouldOverrideFee?: boolean\n ): Promise<UserOperationStruct | undefined> {\n try {\n const mainCall = await this.decodeMainCallFromCallData(\n struct.sender,\n struct.callData\n );\n if (!mainCall) {\n throw IncorrectCallDataForTokenPaymaster;\n }\n const chainId = await getChainId(this.provider.getProjectId());\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const gasTokenAddress = getGasTokenAddress(\n this.paymasterConfig.gasToken,\n chainId\n );\n let paymasterAddress = await this.getPaymasterAddress(paymasterProvider);\n if (gasTokenAddress !== undefined && paymasterAddress !== undefined) {\n const erc20UserOp = await this.getERC20UserOp(\n struct,\n mainCall,\n gasTokenAddress,\n paymasterAddress\n );\n if (!erc20UserOp) {\n return struct;\n }\n const paymasterResp = await this.signUserOp({\n userOp: struct,\n callData: struct.callData,\n gasTokenAddress,\n erc20UserOp,\n erc20CallData: erc20UserOp.callData,\n paymasterProvider,\n shouldOverrideFee,\n });\n if (paymasterResp) {\n return paymasterResp;\n }\n }\n } catch (error) {\n console.log(error);\n }\n return;\n }\n}\n"]}
@@ -191,6 +191,8 @@ class ZeroDevProvider extends aa_core_1.SmartAccountProvider {
191
191
  case "eth_sendTransaction":
192
192
  const [tx] = params;
193
193
  return this.sendTransaction(tx);
194
+ case "eth_signTypedData_v4":
195
+ return this.signTypedData(JSON.parse(params[1]));
194
196
  case "personal_sign":
195
197
  if (!this.account) {
196
198
  throw new Error("account not connected!");
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n fromHex,\n type Address,\n type Chain,\n type Hash,\n type Hex,\n type HttpTransport,\n type RpcTransactionRequest,\n} from \"viem\";\nimport {\n deepHexlify,\n resolveProperties,\n type SmartAccountProviderOpts,\n getChain,\n type UserOperationCallData,\n type BatchUserOperationCallData,\n type SendUserOperationResult,\n asyncPipe,\n noOpMiddleware,\n type UserOperationStruct,\n type BytesLike,\n SmartAccountProvider,\n type AccountMiddlewareFn,\n type UserOperationOverrides,\n} from \"@alchemy/aa-core\";\nimport {\n BUNDLER_URL,\n DEFAULT_SEND_TX_MAX_RETRIES,\n DEFAULT_SEND_TX_RETRY_INTERVAL_MS,\n ENTRYPOINT_ADDRESS,\n minPriorityFeePerBidDefaults,\n} from \"./constants.js\";\nimport { KernelSmartContractAccount, isKernelAccount } from \"./account.js\";\nimport { withZeroDevGasEstimator } from \"./middleware/gas-estimator.js\";\nimport { isValidRequest } from \"./utils/ERC4337-utils.js\";\nimport { InvalidOperation } from \"./errors.js\";\nimport { withZeroDevPaymasterAndData } from \"./middleware/paymaster.js\";\nimport { createZeroDevPublicErc4337Client } from \"./client/create-client.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"./paymaster/types.js\";\n\nexport type ZeroDevProviderConfig = {\n projectId: string;\n chain: Chain | number;\n entryPointAddress?: Address;\n rpcUrl?: string;\n account?: KernelSmartContractAccount;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: SmartAccountProviderOpts & {\n sendTxMaxRetries?: number;\n sendTxRetryIntervalMs?: number;\n };\n};\n\nexport enum Operation {\n Call = 0,\n DelegateCall = 1,\n}\n\ntype UserOpDataOperationTypes<T> = T extends UserOperationCallData\n ? Operation.Call | Operation.DelegateCall\n : T extends BatchUserOperationCallData\n ? Operation.Call\n : never;\n\nexport class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {\n protected projectId: string;\n protected sendTxMaxRetries: number;\n protected sendTxRetryIntervalMs: number;\n\n constructor({\n projectId,\n chain,\n entryPointAddress = ENTRYPOINT_ADDRESS,\n rpcUrl = BUNDLER_URL,\n account,\n bundlerProvider,\n opts,\n }: ZeroDevProviderConfig) {\n const _chain = typeof chain === \"number\" ? getChain(chain) : chain;\n const rpcClient = createZeroDevPublicErc4337Client({\n chain: _chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n });\n\n super(rpcClient, entryPointAddress, _chain, account, {\n ...opts,\n txMaxRetries: opts?.txMaxRetries ?? 10,\n txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,\n minPriorityFeePerBid:\n opts?.minPriorityFeePerBid ??\n minPriorityFeePerBidDefaults.get(_chain.id),\n });\n\n this.projectId = projectId;\n this.sendTxMaxRetries =\n opts?.sendTxMaxRetries ?? DEFAULT_SEND_TX_MAX_RETRIES;\n this.sendTxRetryIntervalMs =\n opts?.sendTxRetryIntervalMs ?? DEFAULT_SEND_TX_RETRY_INTERVAL_MS;\n\n withZeroDevGasEstimator(this);\n }\n\n getProjectId = (): string => this.projectId;\n\n sendTransaction = async (\n request: RpcTransactionRequest,\n operation: UserOpDataOperationTypes<UserOperationCallData> = Operation.Call\n ): Promise<Hash> => {\n if (!request.to) {\n throw new Error(\"transaction is missing to address\");\n }\n\n const overrides: UserOperationOverrides = {};\n if (request.maxFeePerGas) {\n overrides.maxFeePerGas = request.maxFeePerGas;\n }\n if (request.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = request.maxPriorityFeePerGas;\n }\n\n const { hash } = await this.sendUserOperation(\n {\n target: request.to,\n data: request.data ?? \"0x\",\n value: request.value ? fromHex(request.value, \"bigint\") : 0n,\n },\n overrides,\n operation\n );\n\n return await this.waitForUserOperationTransaction(hash as Hash);\n };\n\n sendUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<SendUserOperationResult> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n let hash: string = \"\";\n let i = 0;\n const nonce = await this.account.getNonce();\n let uoStruct: UserOperationStruct;\n let request: UserOperationStruct;\n let maxFeePerGas, maxPriorityFeePerGas;\n do {\n uoStruct = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )({\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as UserOperationStruct);\n request = deepHexlify(await resolveProperties(uoStruct));\n\n if (!isValidRequest(request)) {\n // this pretty prints the uo\n throw new Error(\n `Request is missing parameters. All properties on UserOperationStruct must be set. uo: ${JSON.stringify(\n request,\n null,\n 2\n )}`\n );\n }\n\n this.account.approvePlugin();\n\n request.signature = await this.account.validator.getSignature(request);\n try {\n hash = await this.rpcClient.sendUserOperation(\n request,\n this.entryPointAddress\n );\n } catch (error: any) {\n if (this.isReplacementOpError(error) && i++ < this.sendTxMaxRetries) {\n maxFeePerGas = (BigInt(request.maxFeePerGas) * 113n) / 100n;\n maxPriorityFeePerGas =\n (BigInt(request.maxPriorityFeePerGas) * 113n) / 100n;\n\n console.log(\n `After ${\n this.sendTxRetryIntervalMs / 60000\n } minutes, resending tx with Increased Gas fees: maxFeePerGas: ${maxFeePerGas}, maxPriorityFeePerGas: ${maxPriorityFeePerGas}`\n );\n await new Promise((resolve) =>\n setTimeout(resolve, this.sendTxRetryIntervalMs)\n );\n continue;\n }\n throw this.unwrapError(error);\n }\n } while (hash === \"\");\n\n return {\n hash,\n request,\n };\n };\n\n isReplacementOpError(errorIn: any): boolean {\n if (errorIn.cause != null) {\n const failedOpMessage: string | undefined = errorIn?.cause?.message;\n return (\n (failedOpMessage?.includes(\n \"replacement op must increase maxFeePerGas and MaxPriorityFeePerGas\"\n ) ||\n failedOpMessage?.match(/.*replacement.*underpriced.*/) !== null) ??\n false\n );\n }\n return false;\n }\n\n unwrapError(errorIn: any): Error {\n if (errorIn?.cause != null) {\n let paymasterInfo: string = \"\";\n let failedOpMessage: string | undefined = errorIn?.cause?.message;\n if (failedOpMessage?.includes(\"FailedOp\") === true) {\n // TODO: better error extraction methods will be needed\n const matched = failedOpMessage.match(/FailedOp\\((.*)\\)/);\n if (matched != null) {\n const split = matched[1].split(\",\");\n paymasterInfo = `(paymaster address: ${split[1]})`;\n failedOpMessage = split[2];\n }\n }\n const error = new Error(\n `The bundler has failed to include UserOperation in a batch: ${failedOpMessage} ${paymasterInfo}`\n );\n error.stack = errorIn.stack;\n return error;\n }\n return errorIn;\n }\n\n getAccount: () => KernelSmartContractAccount = () => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n return this.account;\n };\n\n dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (\n struct: UserOperationStruct\n ): Promise<UserOperationStruct> => {\n struct.paymasterAndData =\n \"0xfe7dbcab8aaee4eb67943c1e6be95b1d065985c6000000000000000000000000000000000000000000000000000001869aa31cf400000000000000000000000000000000000000000000000000000000000000007dfe2190f34af27b265bae608717cdc9368b471fc0c097ab7b4088f255b4961e57b039e7e571b15221081c5dce7bcb93459b27a3ab65d2f8a889f4a40b4022801b\";\n return struct;\n };\n\n withZeroDevPaymasterAndData(config: PaymasterConfig<PaymasterPolicy>) {\n if (!this.isConnected()) {\n throw new Error(\n \"ZeroDevProvider: account is not set, did you call `connect` first?\"\n );\n }\n\n return withZeroDevPaymasterAndData(this, config);\n }\n\n request: (args: { method: string; params?: any[] }) => Promise<any> = async (\n args\n ) => {\n const { method, params } = args;\n switch (method) {\n case \"eth_chainId\":\n return this.chain.id;\n case \"eth_sendTransaction\":\n const [tx] = params as [RpcTransactionRequest];\n return this.sendTransaction(tx);\n case \"personal_sign\":\n if (!this.account) {\n throw new Error(\"account not connected!\");\n }\n const [data, address] = params!;\n if (address !== (await this.getAddress())) {\n throw new Error(\n \"cannot sign for address that is not the current account\"\n );\n }\n // @ts-ignore\n return this.account.signWithEip6492(data);\n default:\n // @ts-ignore\n return this.rpcClient.request(args);\n }\n };\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n fromHex,\n type Address,\n type Chain,\n type Hash,\n type Hex,\n type HttpTransport,\n type RpcTransactionRequest,\n} from \"viem\";\nimport {\n deepHexlify,\n resolveProperties,\n type SmartAccountProviderOpts,\n getChain,\n type UserOperationCallData,\n type BatchUserOperationCallData,\n type SendUserOperationResult,\n asyncPipe,\n noOpMiddleware,\n type UserOperationStruct,\n type BytesLike,\n SmartAccountProvider,\n type AccountMiddlewareFn,\n type UserOperationOverrides,\n} from \"@alchemy/aa-core\";\nimport {\n BUNDLER_URL,\n DEFAULT_SEND_TX_MAX_RETRIES,\n DEFAULT_SEND_TX_RETRY_INTERVAL_MS,\n ENTRYPOINT_ADDRESS,\n minPriorityFeePerBidDefaults,\n} from \"./constants.js\";\nimport { KernelSmartContractAccount, isKernelAccount } from \"./account.js\";\nimport { withZeroDevGasEstimator } from \"./middleware/gas-estimator.js\";\nimport { isValidRequest } from \"./utils/ERC4337-utils.js\";\nimport { InvalidOperation } from \"./errors.js\";\nimport { withZeroDevPaymasterAndData } from \"./middleware/paymaster.js\";\nimport { createZeroDevPublicErc4337Client } from \"./client/create-client.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"./paymaster/types.js\";\n\nexport type ZeroDevProviderConfig = {\n projectId: string;\n chain: Chain | number;\n entryPointAddress?: Address;\n rpcUrl?: string;\n account?: KernelSmartContractAccount;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: SmartAccountProviderOpts & {\n sendTxMaxRetries?: number;\n sendTxRetryIntervalMs?: number;\n };\n};\n\nexport enum Operation {\n Call = 0,\n DelegateCall = 1,\n}\n\ntype UserOpDataOperationTypes<T> = T extends UserOperationCallData\n ? Operation.Call | Operation.DelegateCall\n : T extends BatchUserOperationCallData\n ? Operation.Call\n : never;\n\nexport class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {\n protected projectId: string;\n protected sendTxMaxRetries: number;\n protected sendTxRetryIntervalMs: number;\n\n constructor({\n projectId,\n chain,\n entryPointAddress = ENTRYPOINT_ADDRESS,\n rpcUrl = BUNDLER_URL,\n account,\n bundlerProvider,\n opts,\n }: ZeroDevProviderConfig) {\n const _chain = typeof chain === \"number\" ? getChain(chain) : chain;\n const rpcClient = createZeroDevPublicErc4337Client({\n chain: _chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n });\n\n super(rpcClient, entryPointAddress, _chain, account, {\n ...opts,\n txMaxRetries: opts?.txMaxRetries ?? 10,\n txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,\n minPriorityFeePerBid:\n opts?.minPriorityFeePerBid ??\n minPriorityFeePerBidDefaults.get(_chain.id),\n });\n\n this.projectId = projectId;\n this.sendTxMaxRetries =\n opts?.sendTxMaxRetries ?? DEFAULT_SEND_TX_MAX_RETRIES;\n this.sendTxRetryIntervalMs =\n opts?.sendTxRetryIntervalMs ?? DEFAULT_SEND_TX_RETRY_INTERVAL_MS;\n\n withZeroDevGasEstimator(this);\n }\n\n getProjectId = (): string => this.projectId;\n\n sendTransaction = async (\n request: RpcTransactionRequest,\n operation: UserOpDataOperationTypes<UserOperationCallData> = Operation.Call\n ): Promise<Hash> => {\n if (!request.to) {\n throw new Error(\"transaction is missing to address\");\n }\n\n const overrides: UserOperationOverrides = {};\n if (request.maxFeePerGas) {\n overrides.maxFeePerGas = request.maxFeePerGas;\n }\n if (request.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = request.maxPriorityFeePerGas;\n }\n\n const { hash } = await this.sendUserOperation(\n {\n target: request.to,\n data: request.data ?? \"0x\",\n value: request.value ? fromHex(request.value, \"bigint\") : 0n,\n },\n overrides,\n operation\n );\n\n return await this.waitForUserOperationTransaction(hash as Hash);\n };\n\n sendUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<SendUserOperationResult> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n let hash: string = \"\";\n let i = 0;\n const nonce = await this.account.getNonce();\n let uoStruct: UserOperationStruct;\n let request: UserOperationStruct;\n let maxFeePerGas, maxPriorityFeePerGas;\n do {\n uoStruct = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )({\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as UserOperationStruct);\n request = deepHexlify(await resolveProperties(uoStruct));\n\n if (!isValidRequest(request)) {\n // this pretty prints the uo\n throw new Error(\n `Request is missing parameters. All properties on UserOperationStruct must be set. uo: ${JSON.stringify(\n request,\n null,\n 2\n )}`\n );\n }\n\n this.account.approvePlugin();\n\n request.signature = await this.account.validator.getSignature(request);\n try {\n hash = await this.rpcClient.sendUserOperation(\n request,\n this.entryPointAddress\n );\n } catch (error: any) {\n if (this.isReplacementOpError(error) && i++ < this.sendTxMaxRetries) {\n maxFeePerGas = (BigInt(request.maxFeePerGas) * 113n) / 100n;\n maxPriorityFeePerGas =\n (BigInt(request.maxPriorityFeePerGas) * 113n) / 100n;\n\n console.log(\n `After ${\n this.sendTxRetryIntervalMs / 60000\n } minutes, resending tx with Increased Gas fees: maxFeePerGas: ${maxFeePerGas}, maxPriorityFeePerGas: ${maxPriorityFeePerGas}`\n );\n await new Promise((resolve) =>\n setTimeout(resolve, this.sendTxRetryIntervalMs)\n );\n continue;\n }\n throw this.unwrapError(error);\n }\n } while (hash === \"\");\n\n return {\n hash,\n request,\n };\n };\n\n isReplacementOpError(errorIn: any): boolean {\n if (errorIn.cause != null) {\n const failedOpMessage: string | undefined = errorIn?.cause?.message;\n return (\n (failedOpMessage?.includes(\n \"replacement op must increase maxFeePerGas and MaxPriorityFeePerGas\"\n ) ||\n failedOpMessage?.match(/.*replacement.*underpriced.*/) !== null) ??\n false\n );\n }\n return false;\n }\n\n unwrapError(errorIn: any): Error {\n if (errorIn?.cause != null) {\n let paymasterInfo: string = \"\";\n let failedOpMessage: string | undefined = errorIn?.cause?.message;\n if (failedOpMessage?.includes(\"FailedOp\") === true) {\n // TODO: better error extraction methods will be needed\n const matched = failedOpMessage.match(/FailedOp\\((.*)\\)/);\n if (matched != null) {\n const split = matched[1].split(\",\");\n paymasterInfo = `(paymaster address: ${split[1]})`;\n failedOpMessage = split[2];\n }\n }\n const error = new Error(\n `The bundler has failed to include UserOperation in a batch: ${failedOpMessage} ${paymasterInfo}`\n );\n error.stack = errorIn.stack;\n return error;\n }\n return errorIn;\n }\n\n getAccount: () => KernelSmartContractAccount = () => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n return this.account;\n };\n\n dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (\n struct: UserOperationStruct\n ): Promise<UserOperationStruct> => {\n struct.paymasterAndData =\n \"0xfe7dbcab8aaee4eb67943c1e6be95b1d065985c6000000000000000000000000000000000000000000000000000001869aa31cf400000000000000000000000000000000000000000000000000000000000000007dfe2190f34af27b265bae608717cdc9368b471fc0c097ab7b4088f255b4961e57b039e7e571b15221081c5dce7bcb93459b27a3ab65d2f8a889f4a40b4022801b\";\n return struct;\n };\n\n withZeroDevPaymasterAndData(config: PaymasterConfig<PaymasterPolicy>) {\n if (!this.isConnected()) {\n throw new Error(\n \"ZeroDevProvider: account is not set, did you call `connect` first?\"\n );\n }\n\n return withZeroDevPaymasterAndData(this, config);\n }\n\n request: (args: { method: string; params?: any[] }) => Promise<any> = async (\n args\n ) => {\n const { method, params } = args;\n switch (method) {\n case \"eth_chainId\":\n return this.chain.id;\n case \"eth_sendTransaction\":\n const [tx] = params as [RpcTransactionRequest];\n return this.sendTransaction(tx);\n case \"eth_signTypedData_v4\":\n //@ts-expect-error\n return this.signTypedData(JSON.parse(params[1]))\n case \"personal_sign\":\n if (!this.account) {\n throw new Error(\"account not connected!\");\n }\n const [data, address] = params!;\n if (address !== (await this.getAddress())) {\n throw new Error(\n \"cannot sign for address that is not the current account\"\n );\n }\n // @ts-ignore\n return this.account.signWithEip6492(data);\n default:\n // @ts-ignore\n return this.rpcClient.request(args);\n }\n };\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import { type SignTypedDataParams, type SmartAccountSigner, type UserOperationRequest } from "@alchemy/aa-core";
2
2
  import { type Chain, type Hex, type Address, type PublicClient, type Transport } from "viem";
3
- import type { PaymasterAndBundlerProviders } from "../paymaster/types.js";
4
3
  export declare enum ValidatorMode {
5
4
  sudo = "0x00000000",
6
5
  plugin = "0x00000001",
@@ -18,7 +17,6 @@ export interface KernelBaseValidatorParams {
18
17
  executor?: Address;
19
18
  selector?: Hex;
20
19
  rpcUrl?: string;
21
- bundlerProvider?: PaymasterAndBundlerProviders;
22
20
  }
23
21
  export type ValidatorPluginData = Required<Pick<KernelBaseValidatorParams, "executor" | "selector" | "validAfter" | "validUntil">>;
24
22
  export declare abstract class KernelBaseValidator {
@@ -33,7 +31,6 @@ export declare abstract class KernelBaseValidator {
33
31
  protected executor?: Address;
34
32
  protected selector?: Hex;
35
33
  protected rpcUrl?: string;
36
- protected bundlerProvider?: PaymasterAndBundlerProviders;
37
34
  publicClient?: PublicClient<Transport, Chain>;
38
35
  constructor(params: KernelBaseValidatorParams);
39
36
  abstract encodeEnable(enableData: Hex): Hex;
@@ -79,12 +79,6 @@ class KernelBaseValidator {
79
79
  writable: true,
80
80
  value: void 0
81
81
  });
82
- Object.defineProperty(this, "bundlerProvider", {
83
- enumerable: true,
84
- configurable: true,
85
- writable: true,
86
- value: void 0
87
- });
88
82
  Object.defineProperty(this, "publicClient", {
89
83
  enumerable: true,
90
84
  configurable: true,
@@ -102,7 +96,6 @@ class KernelBaseValidator {
102
96
  this.selector = params.selector;
103
97
  this.chain = params.chain;
104
98
  this.rpcUrl = params.rpcUrl ?? constants_js_1.BUNDLER_URL;
105
- this.bundlerProvider = params.bundlerProvider;
106
99
  this.publicClient = (0, viem_1.createPublicClient)({
107
100
  transport: (0, viem_1.http)(constants_js_1.CHAIN_ID_TO_NODE[this.chain?.id ?? chains_1.polygonMumbai.id]),
108
101
  chain: this.chain ?? chains_1.polygonMumbai,
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/base.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type SignTypedDataParams,\n type SmartAccountSigner,\n type UserOperationRequest,\n} from \"@alchemy/aa-core\";\nimport {\n concat,\n type Chain,\n type Hex,\n pad,\n toHex,\n type Address,\n concatHex,\n hexToBigInt,\n type PublicClient,\n type Transport,\n createPublicClient,\n http,\n} from \"viem\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport {\n BUNDLER_URL,\n CHAIN_ID_TO_NODE,\n ECDSA_VALIDATOR_ADDRESS,\n ENTRYPOINT_ADDRESS,\n} from \"../constants.js\";\nimport type { PaymasterAndBundlerProviders } from \"../paymaster/types.js\";\nimport { polygonMumbai } from \"viem/chains\";\n\nexport enum ValidatorMode {\n sudo = \"0x00000000\",\n plugin = \"0x00000001\",\n enable = \"0x00000002\",\n}\n\nexport interface KernelBaseValidatorParams {\n projectId: string;\n validatorAddress?: Hex;\n mode?: ValidatorMode;\n chain?: Chain;\n entryPointAddress?: Address;\n enableSignature?: Hex;\n validUntil?: number;\n validAfter?: number;\n executor?: Address;\n selector?: Hex;\n rpcUrl?: string;\n bundlerProvider?: PaymasterAndBundlerProviders;\n}\n\nexport type ValidatorPluginData = Required<\n Pick<\n KernelBaseValidatorParams,\n \"executor\" | \"selector\" | \"validAfter\" | \"validUntil\"\n >\n>;\n\n//Kernel wallet implementation separates out validation and execution phase. It allows you to have\n// custom wrapper logic for the validation phase in addition to signature of choice.\nexport abstract class KernelBaseValidator {\n readonly validatorAddress: Hex;\n mode: ValidatorMode;\n protected projectId: string;\n protected chain?: Chain;\n protected entryPointAddress: Address;\n protected enableSignature?: Hex;\n protected validUntil: number;\n protected validAfter: number;\n protected executor?: Address;\n protected selector?: Hex;\n protected rpcUrl?: string;\n protected bundlerProvider?: PaymasterAndBundlerProviders;\n publicClient?: PublicClient<Transport, Chain>;\n\n constructor(params: KernelBaseValidatorParams) {\n this.projectId = params.projectId;\n this.validatorAddress = params.validatorAddress ?? ECDSA_VALIDATOR_ADDRESS;\n this.mode = params.mode ?? ValidatorMode.sudo;\n this.entryPointAddress = params.entryPointAddress ?? ENTRYPOINT_ADDRESS;\n this.enableSignature = params.enableSignature;\n this.validUntil = params.validUntil ?? 0;\n this.validAfter = params.validAfter ?? 0;\n this.executor = params.executor;\n this.selector = params.selector;\n this.chain = params.chain;\n this.rpcUrl = params.rpcUrl ?? BUNDLER_URL;\n this.bundlerProvider = params.bundlerProvider;\n this.publicClient = createPublicClient({\n transport: http(CHAIN_ID_TO_NODE[this.chain?.id ?? polygonMumbai.id]),\n chain: this.chain ?? polygonMumbai,\n });\n }\n\n abstract encodeEnable(enableData: Hex): Hex;\n\n abstract encodeDisable(enableData: Hex): Hex;\n\n abstract getEnableData(): Promise<Hex>;\n\n abstract signMessage(message: Uint8Array | string | Hex): Promise<Hex>;\n\n abstract signTypedData(params: SignTypedDataParams): Promise<Hex>;\n\n abstract signUserOp(userOp: UserOperationRequest): Promise<Hex>;\n\n abstract signer(): Promise<SmartAccountSigner>;\n\n abstract getDummyUserOpSignature(callData?: Hex): Promise<Hex>;\n\n abstract isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean>;\n\n shouldDelegateViaFallback(): boolean {\n return true;\n }\n\n getPluginValidatorData(): ValidatorPluginData {\n if (!this.selector || !this.executor) {\n throw Error(\"Plugin Validator data params uninitialised\");\n }\n return {\n selector: this.selector,\n executor: this.executor,\n validAfter: this.validAfter,\n validUntil: this.validUntil,\n };\n }\n\n async getDynamicDummySignature(\n kernelAccountAddress: Address,\n calldata: Hex\n ): Promise<Hex> {\n const dummyECDSASig =\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\";\n const validatorMode = await this.resolveValidatorMode(\n kernelAccountAddress,\n calldata\n );\n if (validatorMode === ValidatorMode.enable) {\n const enableData = await this.getEnableData();\n const enableDataLength = enableData.length / 2 - 1;\n const enableSigLength = 65;\n const staticDummySig = concatHex([\n \"0x000000000000000000000000\",\n this.getAddress(),\n this.executor!,\n ]);\n\n return concatHex([\n ValidatorMode.enable,\n staticDummySig,\n pad(toHex(enableDataLength), { size: 32 }),\n enableData,\n pad(toHex(enableSigLength), { size: 32 }),\n dummyECDSASig,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n return concatHex([\n validatorMode,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n\n setEnableSignature(enableSignature: Hex) {\n this.enableSignature = enableSignature;\n }\n\n getEnableSignature(): Hex | undefined {\n return this.enableSignature;\n }\n\n getAddress(): Hex {\n return this.validatorAddress;\n }\n\n async approveExecutor(\n kernel: Address,\n selector: Hex,\n executor: Address,\n validUntil: number,\n validAfter: number,\n validator: KernelBaseValidator\n ): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n const sender = kernel;\n const signer = await this.signer();\n const ownerSig = await signer.signTypedData({\n domain: {\n name: \"Kernel\",\n version: \"0.2.1\",\n chainId: this.chain.id,\n verifyingContract: sender,\n },\n types: {\n ValidatorApproved: [\n { name: \"sig\", type: \"bytes4\" },\n { name: \"validatorData\", type: \"uint256\" },\n { name: \"executor\", type: \"address\" },\n { name: \"enableData\", type: \"bytes\" },\n ],\n },\n message: {\n sig: selector as Hex,\n validatorData: hexToBigInt(\n concatHex([\n pad(toHex(validUntil), { size: 6 }),\n pad(toHex(validAfter), { size: 6 }),\n validator.getAddress(),\n ]),\n { size: 32 }\n ),\n executor: executor as Address,\n enableData: await validator.getEnableData(),\n },\n primaryType: \"ValidatorApproved\",\n });\n return ownerSig;\n }\n\n async resolveValidatorMode(\n kernelAccountAddress: Address,\n callData: Hex\n ): Promise<ValidatorMode> {\n if (!this.chain || !this.publicClient) {\n throw new Error(\"Validator uninitialized\");\n }\n\n let mode: ValidatorMode;\n try {\n const defaultValidatorAddress = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getDefaultValidator\",\n });\n if (\n defaultValidatorAddress?.toLowerCase() ===\n this.validatorAddress.toLowerCase() ||\n this.mode === ValidatorMode.sudo\n ) {\n mode = ValidatorMode.sudo;\n } else if (\n await this.isPluginEnabled(\n kernelAccountAddress,\n callData.toString().slice(0, 10) as Hex\n )\n ) {\n mode = ValidatorMode.plugin;\n } else {\n mode = ValidatorMode.enable;\n }\n } catch (error) {\n if (this.mode === ValidatorMode.plugin) {\n mode = ValidatorMode.enable;\n } else {\n mode = this.mode;\n }\n }\n return mode;\n }\n\n async getSignature(userOp: UserOperationRequest): Promise<Hex> {\n const mode = await this.resolveValidatorMode(\n userOp.sender,\n userOp.callData\n );\n if (mode === ValidatorMode.sudo || mode === ValidatorMode.plugin) {\n return concatHex([this.mode, await this.signUserOp(userOp)]);\n } else {\n const enableData = await this.getEnableData();\n const enableDataLength = enableData.length / 2 - 1;\n const enableSignature = this.getEnableSignature();\n if (!enableSignature) {\n throw new Error(\"Enable signature not set\");\n }\n return concat([\n mode, // 4 bytes 0 - 4\n pad(toHex(this.validUntil), { size: 6 }), // 6 bytes 4 - 10\n pad(toHex(this.validAfter), { size: 6 }), // 6 bytes 10 - 16\n pad(this.validatorAddress, { size: 20 }), // 20 bytes 16 - 36\n pad(this.executor!, { size: 20 }), // 20 bytes 36 - 56\n pad(toHex(enableDataLength), { size: 32 }), // 32 bytes 56 - 88\n enableData, // 88 - 88 + enableData.length\n pad(toHex(enableSignature.length / 2 - 1), { size: 32 }), // 32 bytes 88 + enableData.length - 120 + enableData.length\n enableSignature, // 120 + enableData.length - 120 + enableData.length + enableSignature.length\n await this.signUserOp(userOp), // 120 + enableData.length + enableSignature.length - 120 + enableData.length + enableSignature.length + userOperation.length\n ]);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/base.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type SignTypedDataParams,\n type SmartAccountSigner,\n type UserOperationRequest,\n} from \"@alchemy/aa-core\";\nimport {\n concat,\n type Chain,\n type Hex,\n pad,\n toHex,\n type Address,\n concatHex,\n hexToBigInt,\n type PublicClient,\n type Transport,\n createPublicClient,\n http,\n} from \"viem\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport {\n BUNDLER_URL,\n CHAIN_ID_TO_NODE,\n ECDSA_VALIDATOR_ADDRESS,\n ENTRYPOINT_ADDRESS,\n} from \"../constants.js\";\nimport { polygonMumbai } from \"viem/chains\";\n\nexport enum ValidatorMode {\n sudo = \"0x00000000\",\n plugin = \"0x00000001\",\n enable = \"0x00000002\",\n}\n\nexport interface KernelBaseValidatorParams {\n projectId: string;\n validatorAddress?: Hex;\n mode?: ValidatorMode;\n chain?: Chain;\n entryPointAddress?: Address;\n enableSignature?: Hex;\n validUntil?: number;\n validAfter?: number;\n executor?: Address;\n selector?: Hex;\n rpcUrl?: string;\n}\n\nexport type ValidatorPluginData = Required<\n Pick<\n KernelBaseValidatorParams,\n \"executor\" | \"selector\" | \"validAfter\" | \"validUntil\"\n >\n>;\n\n//Kernel wallet implementation separates out validation and execution phase. It allows you to have\n// custom wrapper logic for the validation phase in addition to signature of choice.\nexport abstract class KernelBaseValidator {\n readonly validatorAddress: Hex;\n mode: ValidatorMode;\n protected projectId: string;\n protected chain?: Chain;\n protected entryPointAddress: Address;\n protected enableSignature?: Hex;\n protected validUntil: number;\n protected validAfter: number;\n protected executor?: Address;\n protected selector?: Hex;\n protected rpcUrl?: string;\n publicClient?: PublicClient<Transport, Chain>;\n\n constructor(params: KernelBaseValidatorParams) {\n this.projectId = params.projectId;\n this.validatorAddress = params.validatorAddress ?? ECDSA_VALIDATOR_ADDRESS;\n this.mode = params.mode ?? ValidatorMode.sudo;\n this.entryPointAddress = params.entryPointAddress ?? ENTRYPOINT_ADDRESS;\n this.enableSignature = params.enableSignature;\n this.validUntil = params.validUntil ?? 0;\n this.validAfter = params.validAfter ?? 0;\n this.executor = params.executor;\n this.selector = params.selector;\n this.chain = params.chain;\n this.rpcUrl = params.rpcUrl ?? BUNDLER_URL;\n this.publicClient = createPublicClient({\n transport: http(CHAIN_ID_TO_NODE[this.chain?.id ?? polygonMumbai.id]),\n chain: this.chain ?? polygonMumbai,\n });\n }\n\n abstract encodeEnable(enableData: Hex): Hex;\n\n abstract encodeDisable(enableData: Hex): Hex;\n\n abstract getEnableData(): Promise<Hex>;\n\n abstract signMessage(message: Uint8Array | string | Hex): Promise<Hex>;\n\n abstract signTypedData(params: SignTypedDataParams): Promise<Hex>;\n\n abstract signUserOp(userOp: UserOperationRequest): Promise<Hex>;\n\n abstract signer(): Promise<SmartAccountSigner>;\n\n abstract getDummyUserOpSignature(callData?: Hex): Promise<Hex>;\n\n abstract isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean>;\n\n shouldDelegateViaFallback(): boolean {\n return true;\n }\n\n getPluginValidatorData(): ValidatorPluginData {\n if (!this.selector || !this.executor) {\n throw Error(\"Plugin Validator data params uninitialised\");\n }\n return {\n selector: this.selector,\n executor: this.executor,\n validAfter: this.validAfter,\n validUntil: this.validUntil,\n };\n }\n\n async getDynamicDummySignature(\n kernelAccountAddress: Address,\n calldata: Hex\n ): Promise<Hex> {\n const dummyECDSASig =\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\";\n const validatorMode = await this.resolveValidatorMode(\n kernelAccountAddress,\n calldata\n );\n if (validatorMode === ValidatorMode.enable) {\n const enableData = await this.getEnableData();\n const enableDataLength = enableData.length / 2 - 1;\n const enableSigLength = 65;\n const staticDummySig = concatHex([\n \"0x000000000000000000000000\",\n this.getAddress(),\n this.executor!,\n ]);\n\n return concatHex([\n ValidatorMode.enable,\n staticDummySig,\n pad(toHex(enableDataLength), { size: 32 }),\n enableData,\n pad(toHex(enableSigLength), { size: 32 }),\n dummyECDSASig,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n return concatHex([\n validatorMode,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n\n setEnableSignature(enableSignature: Hex) {\n this.enableSignature = enableSignature;\n }\n\n getEnableSignature(): Hex | undefined {\n return this.enableSignature;\n }\n\n getAddress(): Hex {\n return this.validatorAddress;\n }\n\n async approveExecutor(\n kernel: Address,\n selector: Hex,\n executor: Address,\n validUntil: number,\n validAfter: number,\n validator: KernelBaseValidator\n ): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n const sender = kernel;\n const signer = await this.signer();\n const ownerSig = await signer.signTypedData({\n domain: {\n name: \"Kernel\",\n version: \"0.2.1\",\n chainId: this.chain.id,\n verifyingContract: sender,\n },\n types: {\n ValidatorApproved: [\n { name: \"sig\", type: \"bytes4\" },\n { name: \"validatorData\", type: \"uint256\" },\n { name: \"executor\", type: \"address\" },\n { name: \"enableData\", type: \"bytes\" },\n ],\n },\n message: {\n sig: selector as Hex,\n validatorData: hexToBigInt(\n concatHex([\n pad(toHex(validUntil), { size: 6 }),\n pad(toHex(validAfter), { size: 6 }),\n validator.getAddress(),\n ]),\n { size: 32 }\n ),\n executor: executor as Address,\n enableData: await validator.getEnableData(),\n },\n primaryType: \"ValidatorApproved\",\n });\n return ownerSig;\n }\n\n async resolveValidatorMode(\n kernelAccountAddress: Address,\n callData: Hex\n ): Promise<ValidatorMode> {\n if (!this.chain || !this.publicClient) {\n throw new Error(\"Validator uninitialized\");\n }\n\n let mode: ValidatorMode;\n try {\n const defaultValidatorAddress = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getDefaultValidator\",\n });\n if (\n defaultValidatorAddress?.toLowerCase() ===\n this.validatorAddress.toLowerCase() ||\n this.mode === ValidatorMode.sudo\n ) {\n mode = ValidatorMode.sudo;\n } else if (\n await this.isPluginEnabled(\n kernelAccountAddress,\n callData.toString().slice(0, 10) as Hex\n )\n ) {\n mode = ValidatorMode.plugin;\n } else {\n mode = ValidatorMode.enable;\n }\n } catch (error) {\n if (this.mode === ValidatorMode.plugin) {\n mode = ValidatorMode.enable;\n } else {\n mode = this.mode;\n }\n }\n return mode;\n }\n\n async getSignature(userOp: UserOperationRequest): Promise<Hex> {\n const mode = await this.resolveValidatorMode(\n userOp.sender,\n userOp.callData\n );\n if (mode === ValidatorMode.sudo || mode === ValidatorMode.plugin) {\n return concatHex([this.mode, await this.signUserOp(userOp)]);\n } else {\n const enableData = await this.getEnableData();\n const enableDataLength = enableData.length / 2 - 1;\n const enableSignature = this.getEnableSignature();\n if (!enableSignature) {\n throw new Error(\"Enable signature not set\");\n }\n return concat([\n mode, // 4 bytes 0 - 4\n pad(toHex(this.validUntil), { size: 6 }), // 6 bytes 4 - 10\n pad(toHex(this.validAfter), { size: 6 }), // 6 bytes 10 - 16\n pad(this.validatorAddress, { size: 20 }), // 20 bytes 16 - 36\n pad(this.executor!, { size: 20 }), // 20 bytes 36 - 56\n pad(toHex(enableDataLength), { size: 32 }), // 32 bytes 56 - 88\n enableData, // 88 - 88 + enableData.length\n pad(toHex(enableSignature.length / 2 - 1), { size: 32 }), // 32 bytes 88 + enableData.length - 120 + enableData.length\n enableSignature, // 120 + enableData.length - 120 + enableData.length + enableSignature.length\n await this.signUserOp(userOp), // 120 + enableData.length + enableSignature.length - 120 + enableData.length + enableSignature.length + userOperation.length\n ]);\n }\n }\n}\n"]}
@@ -7,12 +7,19 @@ const chains_1 = require("viem/chains");
7
7
  const paymaster_js_1 = require("../middleware/paymaster.js");
8
8
  class ValidatorProvider extends provider_js_1.ZeroDevProvider {
9
9
  constructor(params, validator) {
10
+ let bundlerProvider = params.bundlerProvider;
11
+ const shouldUsePaymaster = params.usePaymaster === undefined || params.usePaymaster;
12
+ if (params.opts?.paymasterConfig &&
13
+ params.opts?.paymasterConfig.policy === "TOKEN_PAYMASTER" &&
14
+ shouldUsePaymaster) {
15
+ bundlerProvider = "STACKUP";
16
+ }
10
17
  super({
11
18
  ...params.opts?.providerConfig,
12
19
  chain: params.opts?.providerConfig?.chain ?? chains_1.polygonMumbai,
13
20
  rpcUrl: params.opts?.providerConfig?.rpcUrl,
14
21
  projectId: params.projectId,
15
- bundlerProvider: params.bundlerProvider,
22
+ bundlerProvider,
16
23
  });
17
24
  Object.defineProperty(this, "defaultProvider", {
18
25
  enumerable: true,
@@ -88,18 +95,17 @@ class ValidatorProvider extends provider_js_1.ZeroDevProvider {
88
95
  validator,
89
96
  defaultValidator: params.defaultProvider?.getValidator(),
90
97
  rpcClient: this.rpcClient,
91
- bundlerProvider: params.bundlerProvider,
98
+ bundlerProvider,
92
99
  index: params.defaultProvider?.getAccount().getIndex(),
93
100
  ...params.opts?.accountConfig,
94
101
  }));
95
- if (params.usePaymaster === undefined || params.usePaymaster) {
102
+ if (shouldUsePaymaster) {
96
103
  let paymasterConfig = params.opts?.paymasterConfig ?? {
97
104
  policy: "VERIFYING_PAYMASTER",
98
105
  };
99
106
  paymasterConfig = {
100
107
  ...paymasterConfig,
101
- paymasterProvider: params.opts?.paymasterConfig?.paymasterProvider ??
102
- params.bundlerProvider,
108
+ paymasterProvider: params.opts?.paymasterConfig?.paymasterProvider ?? bundlerProvider,
103
109
  };
104
110
  (0, paymaster_js_1.withZeroDevPaymasterAndData)(this, paymasterConfig);
105
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator-provider/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Hex, type SendUserOperationResult } from \"@alchemy/aa-core\";\nimport { ZeroDevProvider, type ZeroDevProviderConfig } from \"../provider.js\";\nimport type {\n KernelBaseValidator,\n KernelBaseValidatorParams,\n} from \"../validator/base.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"../paymaster/types.js\";\nimport {\n KernelSmartContractAccount,\n type KernelSmartAccountParams,\n isKernelAccount,\n} from \"../account.js\";\nimport { polygonMumbai } from \"viem/chains\";\nimport { withZeroDevPaymasterAndData } from \"../middleware/paymaster.js\";\nimport type { RequiredProps } from \"../types.js\";\n\nexport type ValidatorProviderParamsOpts<P extends KernelBaseValidatorParams> = {\n paymasterConfig?: PaymasterConfig<PaymasterPolicy>;\n providerConfig?: Partial<ZeroDevProviderConfig>;\n accountConfig?: Omit<\n KernelSmartAccountParams,\n keyof ExtendedValidatorProviderParams<P>\n >;\n validatorConfig?: Omit<P, keyof ExtendedValidatorProviderParams<P>>;\n};\n\nexport interface ValidatorProviderParams<P extends KernelBaseValidatorParams> {\n projectId: string;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: ValidatorProviderParamsOpts<P>;\n usePaymaster?: boolean;\n defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n}\n\nexport type ExtendedValidatorProviderParams<\n P extends KernelBaseValidatorParams\n> = ValidatorProviderParams<P> & RequiredProps<P>;\n\n// A simple facade abstraction for validator related provider operations\n// Needs to be implemented for each validator plugin\nexport abstract class ValidatorProvider<\n V extends KernelBaseValidator,\n P extends KernelBaseValidatorParams\n> extends ZeroDevProvider {\n protected defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n constructor(\n params: ExtendedValidatorProviderParams<P>,\n validator: KernelBaseValidator\n ) {\n super({\n ...params.opts?.providerConfig,\n chain: params.opts?.providerConfig?.chain ?? polygonMumbai,\n rpcUrl: params.opts?.providerConfig?.rpcUrl,\n projectId: params.projectId,\n bundlerProvider: params.bundlerProvider,\n });\n this.connect(\n () =>\n new KernelSmartContractAccount({\n projectId: params.projectId,\n validator,\n defaultValidator: params.defaultProvider?.getValidator(),\n rpcClient: this.rpcClient,\n bundlerProvider: params.bundlerProvider,\n index: params.defaultProvider?.getAccount().getIndex(),\n ...params.opts?.accountConfig,\n })\n );\n if (params.usePaymaster === undefined || params.usePaymaster) {\n let paymasterConfig = params.opts?.paymasterConfig ?? {\n policy: \"VERIFYING_PAYMASTER\",\n };\n paymasterConfig = {\n ...paymasterConfig,\n paymasterProvider:\n params.opts?.paymasterConfig?.paymasterProvider ??\n params.bundlerProvider,\n };\n withZeroDevPaymasterAndData(this, paymasterConfig);\n }\n }\n\n getValidator = (): V => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return this.account.getValidator() as unknown as V;\n };\n\n getEncodedEnableData = async (enableData: Hex): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeEnable(enableData);\n };\n\n getEncodedDisableData = async (disableData: Hex): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeDisable(disableData);\n };\n\n sendEnableUserOperation = async (\n enableData: Hex\n ): Promise<SendUserOperationResult> => {\n const encodedEnableData = await this.getEncodedEnableData(enableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n\n return await this.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedEnableData,\n });\n };\n\n sendDisableUserOperation = async (\n disableData: Hex\n ): Promise<SendUserOperationResult> => {\n const encodedDisableData = await this.getEncodedDisableData(disableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n\n return await this.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedDisableData,\n });\n };\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator-provider/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Hex, type SendUserOperationResult } from \"@alchemy/aa-core\";\nimport { ZeroDevProvider, type ZeroDevProviderConfig } from \"../provider.js\";\nimport type {\n KernelBaseValidator,\n KernelBaseValidatorParams,\n} from \"../validator/base.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"../paymaster/types.js\";\nimport {\n KernelSmartContractAccount,\n type KernelSmartAccountParams,\n isKernelAccount,\n} from \"../account.js\";\nimport { polygonMumbai } from \"viem/chains\";\nimport { withZeroDevPaymasterAndData } from \"../middleware/paymaster.js\";\nimport type { RequiredProps } from \"../types.js\";\n\nexport type ValidatorProviderParamsOpts<P extends KernelBaseValidatorParams> = {\n paymasterConfig?: PaymasterConfig<PaymasterPolicy>;\n providerConfig?: Partial<ZeroDevProviderConfig>;\n accountConfig?: Omit<\n KernelSmartAccountParams,\n keyof ExtendedValidatorProviderParams<P>\n >;\n validatorConfig?: Omit<P, keyof ExtendedValidatorProviderParams<P>>;\n};\n\nexport interface ValidatorProviderParams<P extends KernelBaseValidatorParams> {\n projectId: string;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: ValidatorProviderParamsOpts<P>;\n usePaymaster?: boolean;\n defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n}\n\nexport type ExtendedValidatorProviderParams<\n P extends KernelBaseValidatorParams\n> = ValidatorProviderParams<P> & RequiredProps<P>;\n\n// A simple facade abstraction for validator related provider operations\n// Needs to be implemented for each validator plugin\nexport abstract class ValidatorProvider<\n V extends KernelBaseValidator,\n P extends KernelBaseValidatorParams\n> extends ZeroDevProvider {\n protected defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n constructor(\n params: ExtendedValidatorProviderParams<P>,\n validator: KernelBaseValidator\n ) {\n let bundlerProvider = params.bundlerProvider;\n const shouldUsePaymaster =\n params.usePaymaster === undefined || params.usePaymaster;\n if (\n params.opts?.paymasterConfig &&\n params.opts?.paymasterConfig.policy === \"TOKEN_PAYMASTER\" &&\n shouldUsePaymaster\n ) {\n bundlerProvider = \"STACKUP\";\n }\n super({\n ...params.opts?.providerConfig,\n chain: params.opts?.providerConfig?.chain ?? polygonMumbai,\n rpcUrl: params.opts?.providerConfig?.rpcUrl,\n projectId: params.projectId,\n bundlerProvider,\n });\n this.connect(\n () =>\n new KernelSmartContractAccount({\n projectId: params.projectId,\n validator,\n defaultValidator: params.defaultProvider?.getValidator(),\n rpcClient: this.rpcClient,\n bundlerProvider,\n index: params.defaultProvider?.getAccount().getIndex(),\n ...params.opts?.accountConfig,\n })\n );\n if (shouldUsePaymaster) {\n let paymasterConfig = params.opts?.paymasterConfig ?? {\n policy: \"VERIFYING_PAYMASTER\",\n };\n paymasterConfig = {\n ...paymasterConfig,\n paymasterProvider:\n params.opts?.paymasterConfig?.paymasterProvider ?? bundlerProvider,\n };\n withZeroDevPaymasterAndData(this, paymasterConfig);\n }\n }\n\n getValidator = (): V => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return this.account.getValidator() as unknown as V;\n };\n\n getEncodedEnableData = async (enableData: Hex): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeEnable(enableData);\n };\n\n getEncodedDisableData = async (disableData: Hex): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeDisable(disableData);\n };\n\n sendEnableUserOperation = async (\n enableData: Hex\n ): Promise<SendUserOperationResult> => {\n const encodedEnableData = await this.getEncodedEnableData(enableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n\n return await this.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedEnableData,\n });\n };\n\n sendDisableUserOperation = async (\n disableData: Hex\n ): Promise<SendUserOperationResult> => {\n const encodedDisableData = await this.getEncodedDisableData(disableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n\n return await this.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedDisableData,\n });\n };\n}\n"]}