@introspectivelabs/x402-evm 0.1.0-beta.16 → 0.1.0-beta.17
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.
- package/dist/cjs/accounts/index.js +1 -1
- package/dist/cjs/accounts/index.js.map +1 -1
- package/dist/cjs/{constants-C31shlNE.d.ts → constants-D7-tmODT.d.ts} +1 -1
- package/dist/cjs/exact/client/index.js.map +1 -1
- package/dist/cjs/factories/index.d.ts +1 -1
- package/dist/cjs/factories/index.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/accounts/index.mjs +3 -3
- package/dist/esm/{chunk-NLXPSIC6.mjs → chunk-CT6H26MT.mjs} +3 -3
- package/dist/esm/{chunk-HZJJGOJY.mjs → chunk-DX5XIR7H.mjs} +2 -2
- package/dist/esm/{chunk-GS55RLFG.mjs → chunk-XA674MVY.mjs} +2 -2
- package/dist/esm/{chunk-ZIYQQWOM.mjs → chunk-YDUGJNSU.mjs} +2 -2
- package/dist/esm/{chunk-ZIYQQWOM.mjs.map → chunk-YDUGJNSU.mjs.map} +1 -1
- package/dist/esm/{constants-C31shlNE.d.mts → constants-D7-tmODT.d.mts} +1 -1
- package/dist/esm/exact/client/index.mjs +3 -3
- package/dist/esm/factories/index.d.mts +1 -1
- package/dist/esm/factories/index.mjs +1 -1
- package/dist/esm/index.d.mts +1 -1
- package/dist/esm/index.mjs +4 -4
- package/package.json +1 -1
- /package/dist/esm/{chunk-NLXPSIC6.mjs.map → chunk-CT6H26MT.mjs.map} +0 -0
- /package/dist/esm/{chunk-HZJJGOJY.mjs.map → chunk-DX5XIR7H.mjs.map} +0 -0
- /package/dist/esm/{chunk-GS55RLFG.mjs.map → chunk-XA674MVY.mjs.map} +0 -0
|
@@ -56,7 +56,7 @@ var import_viem2 = require("viem");
|
|
|
56
56
|
// src/constants.ts
|
|
57
57
|
var import_account_abstraction = require("viem/account-abstraction");
|
|
58
58
|
var SAFE_4337_MODULE_ADDRESS = "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
|
|
59
|
-
var SAFE_WEBAUTHN_SHARED_SIGNER = "
|
|
59
|
+
var SAFE_WEBAUTHN_SHARED_SIGNER = "0x94a4F6affBd8975951142c3999aEAB7ecee555c2";
|
|
60
60
|
|
|
61
61
|
// src/accounts/computeSafeOpHash.ts
|
|
62
62
|
var SAFE_OP_TYPES = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/accounts/index.ts","../../../src/accounts/toSafeSmartAccount.ts","../../../src/accounts/toP256SafeSmartAccount.ts","../../../src/accounts/encodeContractSignature.ts","../../../src/accounts/computeSafeOpHash.ts","../../../src/constants.ts","../../../src/accounts/toWebAuthnSafeSmartAccount.ts","../../../src/accounts/extractPasskeyCoordinates.ts","../../../src/accounts/toP256ExecutorModuleAccount.ts","../../../src/exact/client/utils/userOpHash.ts"],"sourcesContent":["// Unified API\nexport { toSafeSmartAccount } from \"./toSafeSmartAccount\";\n\n// Individual signer functions\nexport { toP256SafeSmartAccount } from \"./toP256SafeSmartAccount\";\nexport { toWebAuthnSafeSmartAccount } from \"./toWebAuthnSafeSmartAccount\";\n\n// Utilities\nexport { encodeContractSignature } from \"./encodeContractSignature\";\nexport { computeSafeOpHash } from \"./computeSafeOpHash\";\n\nexport { extractPasskeyCoordinates } from \"./extractPasskeyCoordinates\";\n\n// P256ExecutorModule adapter\nexport { toP256ExecutorModuleAccount } from \"./toP256ExecutorModuleAccount\";\nexport type { ToP256ExecutorModuleAccountParams } from \"./toP256ExecutorModuleAccount\";\n\n// Types\nexport type { P256Signer, SafeMessageSigner, ToP256SafeSmartAccountParams } from \"./types\";\nexport type { SignerConfig, ToSafeSmartAccountParams } from \"./types\";\nexport type { ToWebAuthnSafeSmartAccountParams } from \"./toWebAuthnSafeSmartAccount\";\nexport type { SafeOpHashParams } from \"./computeSafeOpHash\";\n","import type { Hex, LocalAccount } from \"viem\";\nimport { concat, encodeAbiParameters, pad, toHex } from \"viem\";\nimport type { SmartAccount, WebAuthnAccount } from \"viem/account-abstraction\";\nimport { toSafeSmartAccount as toPermissionlessSafeSmartAccount } from \"permissionless/accounts\";\n\nimport type { P256Signer, ToSafeSmartAccountParams } from \"./types\";\nimport { toP256SafeSmartAccount } from \"./toP256SafeSmartAccount\";\nimport { toWebAuthnSafeSmartAccount } from \"./toWebAuthnSafeSmartAccount\";\nimport { encodeContractSignature } from \"./encodeContractSignature\";\nimport { computeSafeOpHash } from \"./computeSafeOpHash\";\nimport type { SafeOpHashParams } from \"./computeSafeOpHash\";\nimport {\n SAFE_4337_MODULE_ADDRESS,\n SAFE_WEBAUTHN_SHARED_SIGNER,\n entryPoint07Address,\n} from \"../constants\";\n\n/**\n * Creates a Safe SmartAccount with a unified signer configuration.\n *\n * Dispatches to the appropriate implementation based on `signerConfig.type`:\n * - `\"p256\"`: P256 contract owner (existing `toP256SafeSmartAccount`)\n * - `\"webauthn\"`: WebAuthn passkey via permissionless native support\n * - `\"multi\"`: Both P256 and WebAuthn owners on a single Safe\n *\n * @example\n * ```typescript\n * // P256 only\n * const account = await toSafeSmartAccount({\n * client,\n * signerConfig: { type: \"p256\", p256Signer },\n * });\n *\n * // WebAuthn only\n * const account = await toSafeSmartAccount({\n * client,\n * signerConfig: { type: \"webauthn\", webAuthnAccount },\n * });\n *\n * // Multi-signer (threshold 1, P256 signs by default)\n * const account = await toSafeSmartAccount({\n * client,\n * signerConfig: {\n * type: \"multi\",\n * signers: { p256: p256Signer, webAuthn: webAuthnAccount },\n * threshold: 1,\n * },\n * });\n * ```\n */\nexport async function toSafeSmartAccount(\n params: ToSafeSmartAccountParams,\n): Promise<SmartAccount> {\n const { signerConfig } = params;\n\n switch (signerConfig.type) {\n case \"p256\":\n return toP256SafeSmartAccount({\n client: params.client,\n p256Signer: signerConfig.p256Signer,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n });\n\n case \"webauthn\":\n return toWebAuthnSafeSmartAccount({\n client: params.client,\n webAuthnAccount: signerConfig.webAuthnAccount,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n safeWebAuthnSharedSignerAddress: signerConfig.safeWebAuthnSharedSignerAddress,\n });\n\n case \"multi\":\n return buildMultiSignerAccount(params, signerConfig.signers, signerConfig.threshold ?? 1);\n }\n}\n\nfunction createMockLocalAccount(address: Hex): LocalAccount {\n const notImplemented = () => {\n throw new Error(\"Mock owner: use signUserOperation instead\");\n };\n\n return {\n address,\n type: \"local\",\n source: \"custom\",\n publicKey: \"0x\" as Hex,\n signMessage: notImplemented,\n signTypedData: notImplemented,\n signTransaction: notImplemented,\n sign: notImplemented,\n } as unknown as LocalAccount;\n}\n\n/**\n * Encodes a WebAuthn signature from raw sign() output into the ABI format\n * expected by Safe's WebAuthn verifier:\n * `(bytes authenticatorData, string clientDataFields, uint256[2] signature)`\n *\n * permissionless does not export this helper, so we implement it here.\n */\nasync function encodeWebAuthnSignature(\n owner: WebAuthnAccount,\n hash: Hex,\n): Promise<Hex> {\n const { signature: signatureData, webauthn } = await owner.sign({ hash });\n\n // Extract r, s from the DER-encoded P256 signature\n const sigBytes = signatureData.slice(2);\n const r = BigInt(\"0x\" + sigBytes.slice(0, 64));\n const s = BigInt(\"0x\" + sigBytes.slice(64, 128));\n\n // Extract the fields after \"challenge\":\"...\" from clientDataJSON\n const match = webauthn.clientDataJSON.match(\n /^\\{\"type\":\"webauthn.get\",\"challenge\":\"[A-Za-z0-9\\-_]{43}\",(.*)\\}$/,\n );\n const clientDataFields = match ? match[1] : \"\";\n\n return encodeAbiParameters(\n [\n { name: \"authenticatorData\", type: \"bytes\" },\n { name: \"clientDataFields\", type: \"string\" },\n { name: \"signature\", type: \"uint256[2]\" },\n ],\n [webauthn.authenticatorData, clientDataFields, [r, s]],\n );\n}\n\nasync function buildMultiSignerAccount(\n params: ToSafeSmartAccountParams,\n signers: { p256?: P256Signer; webAuthn?: WebAuthnAccount },\n threshold: number,\n): Promise<SmartAccount> {\n if (!signers.p256 && !signers.webAuthn) {\n throw new Error(\"Multi-signer config requires at least one signer\");\n }\n\n // If only one signer is provided, delegate to the single-signer function\n if (signers.p256 && !signers.webAuthn) {\n return toP256SafeSmartAccount({\n client: params.client,\n p256Signer: signers.p256,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n });\n }\n if (signers.webAuthn && !signers.p256) {\n const signerConfig = params.signerConfig;\n const sharedSignerAddr = signerConfig.type === \"multi\"\n ? signerConfig.safeWebAuthnSharedSignerAddress\n : undefined;\n return toWebAuthnSafeSmartAccount({\n client: params.client,\n webAuthnAccount: signers.webAuthn,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n safeWebAuthnSharedSignerAddress: sharedSignerAddr,\n });\n }\n\n // Both signers present\n const p256Signer = signers.p256!;\n const webAuthnAccount = signers.webAuthn!;\n\n const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;\n const entryPointAddress = params.entryPoint?.address ?? entryPoint07Address;\n\n const mockP256Owner = createMockLocalAccount(p256Signer.p256OwnerAddress);\n\n // Build account with both owners: mock LocalAccount for P256 + WebAuthnAccount\n const baseAccount = await toPermissionlessSafeSmartAccount({\n client: params.client,\n owners: [mockP256Owner, webAuthnAccount],\n version: \"1.5.0\",\n threshold: BigInt(threshold),\n ...(params.safeAddress ? { address: params.safeAddress } : {}),\n entryPoint: {\n address: entryPointAddress,\n version: \"0.7\",\n },\n safe4337ModuleAddress,\n });\n\n const chainId = await params.client.getChainId();\n\n if (threshold >= 2) {\n return buildThreshold2Account(\n baseAccount as SmartAccount,\n p256Signer,\n webAuthnAccount,\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n }\n\n // Threshold 1: P256 signs by default (no browser interaction needed)\n return buildThreshold1Account(\n baseAccount as SmartAccount,\n p256Signer,\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n}\n\nfunction buildThreshold1Account(\n baseAccount: SmartAccount,\n p256Signer: P256Signer,\n chainId: number,\n safe4337ModuleAddress: Hex,\n entryPointAddress: Hex,\n): SmartAccount {\n return {\n ...baseAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async signUserOperation(userOp: any) {\n const safeOpHash = computeSafeOpHash(\n extractSafeOpHashParams(userOp),\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n\n const { r, s } = await p256Signer.sign(safeOpHash);\n const rPadded = pad(r as Hex, { size: 32 });\n const sPadded = pad(s as Hex, { size: 32 });\n const p256Signature = concat([rPadded, sPadded]);\n\n const contractSig = encodeContractSignature(\n p256Signer.p256OwnerAddress,\n p256Signature,\n );\n\n const validAfter = pad(toHex(0), { size: 6 });\n const validUntil = pad(toHex(0), { size: 6 });\n\n return concat([validAfter, validUntil, contractSig]);\n },\n } as SmartAccount;\n}\n\nfunction buildThreshold2Account(\n baseAccount: SmartAccount,\n p256Signer: P256Signer,\n webAuthnAccount: WebAuthnAccount,\n chainId: number,\n safe4337ModuleAddress: Hex,\n entryPointAddress: Hex,\n): SmartAccount {\n return {\n ...baseAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async signUserOperation(userOp: any) {\n const safeOpHash = computeSafeOpHash(\n extractSafeOpHashParams(userOp),\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n\n // Sign with P256\n const { r, s } = await p256Signer.sign(safeOpHash);\n const rPadded = pad(r as Hex, { size: 32 });\n const sPadded = pad(s as Hex, { size: 32 });\n const p256SignatureData = concat([rPadded, sPadded]);\n\n // Sign with WebAuthn\n const webAuthnSignatureData = await encodeWebAuthnSignature(\n webAuthnAccount,\n safeOpHash,\n );\n\n // Build sorted multi-signature\n // Safe requires signatures sorted by signer address (ascending)\n const p256SignerAddress = p256Signer.p256OwnerAddress.toLowerCase();\n const webAuthnSignerAddress = SAFE_WEBAUTHN_SHARED_SIGNER.toLowerCase();\n\n type SignerEntry = {\n address: string;\n data: Hex;\n dynamic: boolean;\n contractOwner: boolean;\n };\n\n const signerEntries: SignerEntry[] = [\n {\n address: p256SignerAddress,\n data: p256SignatureData,\n dynamic: true,\n contractOwner: true,\n },\n {\n address: webAuthnSignerAddress,\n data: webAuthnSignatureData,\n dynamic: true,\n contractOwner: false,\n },\n ].sort((a, b) => (a.address < b.address ? -1 : 1));\n\n const concatenatedSig = concatSafeSignatures(signerEntries);\n\n const validAfter = pad(toHex(0), { size: 6 });\n const validUntil = pad(toHex(0), { size: 6 });\n\n return concat([validAfter, validUntil, concatenatedSig]);\n },\n } as SmartAccount;\n}\n\n/**\n * Concatenates multiple Safe signatures with proper static/dynamic layout.\n *\n * Safe's `checkNSignatures` expects:\n * - N x 65-byte static parts (sorted by signer address)\n * - Dynamic data appended after all static parts\n *\n * For dynamic signatures (contract or WebAuthn):\n * Static: r = address padded to 32 bytes, s = offset to dynamic data, v = 0x00\n * Dynamic: 32-byte length prefix + signature data\n *\n * For ECDSA signatures:\n * Static: r (32 bytes) + s (32 bytes) + v (1 byte)\n */\nfunction concatSafeSignatures(\n entries: { address: string; data: Hex; dynamic: boolean; contractOwner: boolean }[],\n): Hex {\n const staticPartSize = 65; // per signer\n const totalStaticSize = staticPartSize * entries.length;\n\n const staticParts: Hex[] = [];\n const dynamicParts: Hex[] = [];\n let dynamicOffset = totalStaticSize;\n\n for (const entry of entries) {\n if (entry.dynamic) {\n // Dynamic signature: static part points to dynamic data\n const r = pad(entry.address as Hex, { size: 32 });\n const s = pad(toHex(dynamicOffset), { size: 32 });\n const v = \"0x00\" as Hex;\n staticParts.push(concat([r, s, v]));\n\n // Dynamic part: length-prefixed data\n const dataBytes = (entry.data.length - 2) / 2;\n const length = pad(toHex(dataBytes), { size: 32 });\n dynamicParts.push(concat([length, entry.data]));\n\n // Advance offset: 32 bytes for length + actual data length\n dynamicOffset += 32 + dataBytes;\n } else {\n // ECDSA: direct 65-byte signature (not used in current multi-signer paths)\n staticParts.push(entry.data);\n }\n }\n\n return concat([...staticParts, ...dynamicParts]);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractSafeOpHashParams(userOp: any): SafeOpHashParams {\n const op = userOp as Record<string, unknown>;\n return {\n sender: op.sender as Hex,\n nonce: BigInt(op.nonce as bigint),\n factory: (op.factory as Hex) ?? null,\n factoryData: (op.factoryData as Hex) ?? null,\n callData: op.callData as Hex,\n verificationGasLimit: BigInt(op.verificationGasLimit as bigint),\n callGasLimit: BigInt(op.callGasLimit as bigint),\n preVerificationGas: BigInt(op.preVerificationGas as bigint),\n maxPriorityFeePerGas: BigInt(op.maxPriorityFeePerGas as bigint),\n maxFeePerGas: BigInt(op.maxFeePerGas as bigint),\n paymaster: (op.paymaster as Hex) ?? null,\n paymasterVerificationGasLimit: op.paymasterVerificationGasLimit\n ? BigInt(op.paymasterVerificationGasLimit as bigint)\n : null,\n paymasterPostOpGasLimit: op.paymasterPostOpGasLimit\n ? BigInt(op.paymasterPostOpGasLimit as bigint)\n : null,\n paymasterData: (op.paymasterData as Hex) ?? null,\n };\n}\n","import type { Hex, LocalAccount } from \"viem\";\nimport { concat, pad, toHex } from \"viem\";\nimport type { SmartAccount } from \"viem/account-abstraction\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\n\nimport type { ToP256SafeSmartAccountParams } from \"./types\";\nimport { encodeContractSignature } from \"./encodeContractSignature\";\nimport type { SafeOpHashParams } from \"./computeSafeOpHash\";\nimport { computeSafeOpHash } from \"./computeSafeOpHash\";\nimport { SAFE_4337_MODULE_ADDRESS, entryPoint07Address } from \"../constants\";\n\n/**\n * Creates a mock LocalAccount that has the P256Owner contract address.\n *\n * This is needed because `toSafeSmartAccount` requires a `LocalAccount` owner,\n * but our actual signer is a P256Owner contract (ERC-1271). The mock provides\n * the correct address so the Safe is configured with the right owner. The\n * signing methods are never called since we override `signUserOperation`.\n */\nfunction createMockLocalAccount(address: Hex): LocalAccount {\n const notImplemented = () => {\n throw new Error(\"P256 contract owner: use signUserOperation instead\");\n };\n\n return {\n address,\n type: \"local\",\n source: \"custom\",\n publicKey: \"0x\" as Hex,\n signMessage: notImplemented,\n signTypedData: notImplemented,\n signTransaction: notImplemented,\n sign: notImplemented,\n } as unknown as LocalAccount;\n}\n\n/**\n * Creates a Safe SmartAccount that signs UserOperations with a P256 contract owner.\n *\n * This wraps permissionless's `toSafeSmartAccount` and overrides `signUserOperation`\n * to produce P256 signatures in Safe's contract signature format (v=0). The resulting\n * account is compatible with `SafeAccountSigner` and `ExactEvmSchemeERC4337`.\n *\n * The caller is responsible for:\n * - Deploying the P256Owner contract (or computing its deterministic address)\n * - Providing the `sign()` function (e.g., using `@noble/curves/p256` with `prehash: false`)\n * - Ensuring the P256Owner is an owner of the Safe\n *\n * @example\n * ```typescript\n * import { toP256SafeSmartAccount } from '@introspectivelabs/x402-evm';\n * import { p256 } from '@noble/curves/p256';\n *\n * const account = await toP256SafeSmartAccount({\n * client: publicClient,\n * p256Signer: {\n * p256OwnerAddress: '0x349c...',\n * sign: async (hash) => {\n * const sig = p256.sign(hash.slice(2), privateKey, { prehash: false, lowS: true });\n * return {\n * r: `0x${sig.r.toString(16).padStart(64, '0')}`,\n * s: `0x${sig.s.toString(16).padStart(64, '0')}`,\n * };\n * },\n * },\n * safeAddress: '0x...',\n * });\n *\n * const scheme = new ExactEvmSchemeERC4337({ account });\n * ```\n */\nexport async function toP256SafeSmartAccount(\n params: ToP256SafeSmartAccountParams,\n): Promise<SmartAccount> {\n const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;\n const entryPointAddress =\n params.entryPoint?.address ?? entryPoint07Address;\n\n const mockOwner = createMockLocalAccount(params.p256Signer.p256OwnerAddress);\n\n const baseAccount = await toSafeSmartAccount({\n client: params.client,\n owners: [mockOwner],\n version: \"1.5.0\",\n ...(params.safeAddress ? { address: params.safeAddress } : {}),\n entryPoint: {\n address: entryPointAddress,\n version: \"0.7\",\n },\n safe4337ModuleAddress,\n });\n\n const chainId = await params.client.getChainId();\n\n return {\n ...baseAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async signUserOperation(userOp: any) {\n const op = userOp as Record<string, unknown>;\n // Compute the SafeOp EIP-712 hash (what Safe4337Module verifies)\n const hashParams: SafeOpHashParams = {\n sender: op.sender as Hex,\n nonce: BigInt(op.nonce as bigint),\n factory: (op.factory as Hex) ?? null,\n factoryData: (op.factoryData as Hex) ?? null,\n callData: op.callData as Hex,\n verificationGasLimit: BigInt(op.verificationGasLimit as bigint),\n callGasLimit: BigInt(op.callGasLimit as bigint),\n preVerificationGas: BigInt(op.preVerificationGas as bigint),\n maxPriorityFeePerGas: BigInt(op.maxPriorityFeePerGas as bigint),\n maxFeePerGas: BigInt(op.maxFeePerGas as bigint),\n paymaster: (op.paymaster as Hex) ?? null,\n paymasterVerificationGasLimit: op.paymasterVerificationGasLimit\n ? BigInt(op.paymasterVerificationGasLimit as bigint)\n : null,\n paymasterPostOpGasLimit: op.paymasterPostOpGasLimit\n ? BigInt(op.paymasterPostOpGasLimit as bigint)\n : null,\n paymasterData: (op.paymasterData as Hex) ?? null,\n };\n const safeOpHash = computeSafeOpHash(\n hashParams,\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n\n // Sign the SafeOp hash with P256\n const { r, s } = await params.p256Signer.sign(safeOpHash);\n\n // Encode r || s as 64-byte signature\n const rPadded = pad(r as Hex, { size: 32 });\n const sPadded = pad(s as Hex, { size: 32 });\n const p256Signature = concat([rPadded, sPadded]);\n\n // Wrap in Safe contract signature format (v=0)\n const contractSig = encodeContractSignature(\n params.p256Signer.p256OwnerAddress,\n p256Signature,\n );\n\n // Safe4337Module expects: validAfter (6 bytes) || validUntil (6 bytes) || signatures\n const validAfter = pad(toHex(0), { size: 6 });\n const validUntil = pad(toHex(0), { size: 6 });\n\n return concat([validAfter, validUntil, contractSig]);\n },\n } as SmartAccount;\n}\n","import { type Hex, concat, pad, toHex } from \"viem\";\n\n/**\n * Encodes a signature in Safe's contract signature format (v=0).\n *\n * Safe's `checkNSignatures` expects this layout for contract owners:\n *\n * Static part (65 bytes):\n * - r (32 bytes): owner address padded to 32 bytes\n * - s (32 bytes): offset to dynamic data (relative to start of signatures)\n * - v (1 byte): 0x00 (indicates contract signature)\n *\n * Dynamic part (at the offset):\n * - length (32 bytes): length of the signature data\n * - data (variable): the actual signature bytes\n *\n * For a single signer, the static part is 65 bytes, so the dynamic data\n * starts at offset 65.\n */\nexport function encodeContractSignature(ownerAddress: Hex, signatureData: Hex): Hex {\n // Static part: r = address padded to 32 bytes\n const r = pad(ownerAddress, { size: 32 });\n\n // For a single signature, dynamic data starts right after the 65-byte static part\n const dynamicOffset = 65;\n const s = pad(toHex(dynamicOffset), { size: 32 });\n\n // v = 0x00 for contract signature\n const v = \"0x00\" as Hex;\n\n // Dynamic part: length-prefixed signature data\n const signatureBytes = (signatureData.length - 2) / 2;\n const length = pad(toHex(signatureBytes), { size: 32 });\n\n return concat([r, s, v, length, signatureData]);\n}\n","import {\n type Hex,\n concat,\n hashTypedData,\n isAddress,\n pad,\n toHex,\n} from \"viem\";\nimport { SAFE_4337_MODULE_ADDRESS, entryPoint07Address } from \"../constants\";\n\nconst SAFE_OP_TYPES = {\n SafeOp: [\n { type: \"address\", name: \"safe\" },\n { type: \"uint256\", name: \"nonce\" },\n { type: \"bytes\", name: \"initCode\" },\n { type: \"bytes\", name: \"callData\" },\n { type: \"uint128\", name: \"verificationGasLimit\" },\n { type: \"uint128\", name: \"callGasLimit\" },\n { type: \"uint256\", name: \"preVerificationGas\" },\n { type: \"uint128\", name: \"maxPriorityFeePerGas\" },\n { type: \"uint128\", name: \"maxFeePerGas\" },\n { type: \"bytes\", name: \"paymasterAndData\" },\n { type: \"uint48\", name: \"validAfter\" },\n { type: \"uint48\", name: \"validUntil\" },\n { type: \"address\", name: \"entryPoint\" },\n ],\n} as const;\n\nexport interface SafeOpHashParams {\n sender: Hex;\n nonce: bigint;\n factory?: Hex | null;\n factoryData?: Hex | null;\n callData: Hex;\n verificationGasLimit: bigint;\n callGasLimit: bigint;\n preVerificationGas: bigint;\n maxPriorityFeePerGas: bigint;\n maxFeePerGas: bigint;\n paymaster?: Hex | null;\n paymasterVerificationGasLimit?: bigint | null;\n paymasterPostOpGasLimit?: bigint | null;\n paymasterData?: Hex | null;\n}\n\n/**\n * Computes the EIP-712 SafeOp hash that Safe4337Module uses for signature verification.\n *\n * The Safe4337Module converts the EntryPoint v0.7 UserOperation into a SafeOp struct,\n * packing initCode and paymasterAndData into their v0.6-style concatenated forms,\n * then hashes the struct using EIP-712.\n */\nexport function computeSafeOpHash(\n userOp: SafeOpHashParams,\n chainId: number,\n safe4337ModuleAddress: Hex = SAFE_4337_MODULE_ADDRESS,\n entryPointAddress: Hex = entryPoint07Address,\n): Hex {\n // Reconstruct initCode: factory || factoryData (v0.7 -> v0.6 style)\n const initCode =\n userOp.factory && isAddress(userOp.factory)\n ? concat([userOp.factory, (userOp.factoryData || \"0x\") as Hex])\n : (\"0x\" as Hex);\n\n // Reconstruct paymasterAndData: paymaster || verificationGasLimit(16) || postOpGasLimit(16) || data\n let paymasterAndData: Hex = \"0x\";\n if (userOp.paymaster && isAddress(userOp.paymaster)) {\n paymasterAndData = concat([\n userOp.paymaster,\n pad(toHex(userOp.paymasterVerificationGasLimit || 0n), { size: 16 }),\n pad(toHex(userOp.paymasterPostOpGasLimit || 0n), { size: 16 }),\n (userOp.paymasterData || \"0x\") as Hex,\n ]);\n }\n\n return hashTypedData({\n domain: {\n chainId,\n verifyingContract: safe4337ModuleAddress,\n },\n types: SAFE_OP_TYPES,\n primaryType: \"SafeOp\",\n message: {\n safe: userOp.sender,\n nonce: userOp.nonce,\n initCode,\n callData: userOp.callData,\n verificationGasLimit: userOp.verificationGasLimit,\n callGasLimit: userOp.callGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n maxFeePerGas: userOp.maxFeePerGas,\n paymasterAndData,\n validAfter: 0,\n validUntil: 0,\n entryPoint: entryPointAddress,\n },\n });\n}\n","import type { Hex } from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\n\nexport { entryPoint07Address };\n\nexport const SAFE_4337_MODULE_ADDRESS =\n \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as const satisfies Hex;\n\nexport const SAFE_WEBAUTHN_SHARED_SIGNER =\n \"0xfD90FAd33ee8b58f32c00aceEad1358e4AFC23f9\" as const satisfies Hex;\n\nexport const FCL_P256_VERIFIER =\n \"0xA86e0054C51E4894D88762a017ECc5E5235f5DBA\" as const satisfies Hex;\n\nexport const P256_OWNER_FACTORY =\n \"0x349c03Eb61e26528cbf79F5D3Ba071FcA2aE82cB\" as const satisfies Hex;\n\nexport const WEBAUTHN_SIGNER_FACTORY =\n \"0xF7488fFbe67327ac9f37D5F722d83Fc900852Fbf\" as const satisfies Hex;\n\nexport const GUARD_FACTORY =\n \"0x35E2B487b682029e363BA7f06fD7392834A83077\" as const satisfies Hex;\n","import type { Hex } from \"viem\";\nimport type { SmartAccount, WebAuthnAccount } from \"viem/account-abstraction\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\nimport type { PublicClient, Transport, Chain } from \"viem\";\nimport { SAFE_4337_MODULE_ADDRESS, entryPoint07Address } from \"../constants\";\n\nexport type ToWebAuthnSafeSmartAccountParams = {\n client: PublicClient<Transport, Chain>;\n webAuthnAccount: WebAuthnAccount;\n safeAddress?: Hex;\n entryPoint?: { address: Hex; version: \"0.7\" };\n safe4337ModuleAddress?: Hex;\n safeWebAuthnSharedSignerAddress?: Hex;\n};\n\n/**\n * Creates a Safe SmartAccount that signs UserOperations with a WebAuthn passkey.\n */\nexport async function toWebAuthnSafeSmartAccount(\n params: ToWebAuthnSafeSmartAccountParams,\n): Promise<SmartAccount> {\n const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;\n const entryPointAddress = params.entryPoint?.address ?? entryPoint07Address;\n\n const baseAccount = await toSafeSmartAccount({\n client: params.client,\n owners: [params.webAuthnAccount],\n version: \"1.5.0\",\n ...(params.safeAddress ? { address: params.safeAddress } : {}),\n entryPoint: {\n address: entryPointAddress,\n version: \"0.7\",\n },\n safe4337ModuleAddress,\n ...(params.safeWebAuthnSharedSignerAddress\n ? { safeWebAuthnSharedSignerAddress: params.safeWebAuthnSharedSignerAddress }\n : {}),\n });\n\n return baseAccount as SmartAccount;\n}\n","/// <reference lib=\"dom\" />\nimport type { Hex } from \"viem\";\n\nfunction bufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction base64urlToHex(base64url: string): string {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = atob(base64);\n return Array.from(binary, (c) => c.charCodeAt(0).toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Extracts P256 public key coordinates from a WebAuthn credential.\n *\n * Replaces `extractPasskeyData` from `@safe-global/protocol-kit`.\n * Uses only the Web Crypto API (no external dependencies).\n */\nexport async function extractPasskeyCoordinates(\n credential: PublicKeyCredential,\n): Promise<{ rawId: string; x: Hex; y: Hex }> {\n const rawId = bufferToHex(credential.rawId);\n const response = credential.response as AuthenticatorAttestationResponse;\n const publicKey = response.getPublicKey();\n if (!publicKey) throw new Error(\"Failed to extract public key from credential\");\n\n const key = await crypto.subtle.importKey(\n \"spki\",\n publicKey,\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n true,\n [\"verify\"],\n );\n const jwk = await crypto.subtle.exportKey(\"jwk\", key);\n if (!jwk.x || !jwk.y) throw new Error(\"Missing coordinates in JWK\");\n\n return {\n rawId,\n x: (\"0x\" + base64urlToHex(jwk.x)) as Hex,\n y: (\"0x\" + base64urlToHex(jwk.y)) as Hex,\n };\n}\n","import {\n concat,\n encodeFunctionData,\n pad,\n type Chain,\n type Hex,\n type PublicClient,\n type Transport,\n} from \"viem\";\nimport { toSmartAccount, type SmartAccount } from \"viem/account-abstraction\";\nimport { entryPoint07Address } from \"../constants\";\nimport { computeUserOpHash, type PackedUserOp } from \"../exact/client/utils/userOpHash\";\n\nconst P256_EXECUTOR_MODULE_ABI = [\n {\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"operation\", type: \"uint8\" },\n ],\n name: \"execute\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\nconst ENTRYPOINT_07_ABI = [\n {\n name: \"getNonce\",\n type: \"function\",\n inputs: [\n { name: \"sender\", type: \"address\" },\n { name: \"key\", type: \"uint192\" },\n ],\n outputs: [{ name: \"nonce\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport interface ToP256ExecutorModuleAccountParams {\n client: PublicClient<Transport, Chain>;\n moduleAddress: Hex;\n sign: (hash: Hex) => Promise<{ r: Hex; s: Hex }>;\n entryPointAddress?: Hex;\n}\n\n/**\n * Creates a viem SmartAccount adapter for P256ExecutorModule.\n *\n * The module is the UserOp sender (not the Safe). CallData encodes\n * `module.execute(to, value, data, 0)` and the signature is raw\n * P256 `r || s` (64 bytes).\n *\n * Use this with `ExactEvmSchemeERC4337` to handle ERC-4337 payments\n * where the P256ExecutorModule is the account.\n */\nexport async function toP256ExecutorModuleAccount(\n params: ToP256ExecutorModuleAccountParams,\n): Promise<SmartAccount> {\n const { client, moduleAddress, sign } = params;\n const entryPoint = params.entryPointAddress ?? entryPoint07Address;\n\n return toSmartAccount({\n client,\n entryPoint: {\n abi: ENTRYPOINT_07_ABI,\n address: entryPoint,\n version: \"0.7\",\n },\n\n async getAddress() {\n return moduleAddress;\n },\n\n async encodeCalls(calls) {\n if (calls.length !== 1) {\n throw new Error(\n \"P256ExecutorModule does not support batch calls. \" +\n `Received ${calls.length} calls, expected 1.`,\n );\n }\n const { to, value, data } = calls[0];\n return encodeFunctionData({\n abi: P256_EXECUTOR_MODULE_ABI,\n functionName: \"execute\",\n args: [to, value ?? 0n, data ?? \"0x\", 0],\n });\n },\n\n async getNonce() {\n return await client.readContract({\n address: entryPoint,\n abi: ENTRYPOINT_07_ABI,\n functionName: \"getNonce\",\n args: [moduleAddress, 0n],\n }) as bigint;\n },\n\n async getFactoryArgs() {\n return { factory: undefined, factoryData: undefined };\n },\n\n async getStubSignature() {\n return (\"0x\" + \"ff\".repeat(64)) as Hex;\n },\n\n async signMessage() {\n throw new Error(\"P256ExecutorModule does not support signMessage\");\n },\n\n async signTypedData() {\n throw new Error(\"P256ExecutorModule does not support signTypedData\");\n },\n\n async signUserOperation(userOperation) {\n const chainId = client.chain.id;\n\n const factory = userOperation.factory as Hex | undefined;\n const packedUserOp: PackedUserOp = {\n sender: userOperation.sender as Hex,\n nonce: userOperation.nonce,\n initCode: factory\n ? concat([factory, (userOperation.factoryData ?? \"0x\") as Hex])\n : \"0x\",\n callData: userOperation.callData,\n accountGasLimits: packAccountGasLimits(\n userOperation.verificationGasLimit,\n userOperation.callGasLimit,\n ),\n preVerificationGas: userOperation.preVerificationGas,\n gasFees: packGasFees(\n userOperation.maxPriorityFeePerGas,\n userOperation.maxFeePerGas,\n ),\n paymasterAndData: buildPaymasterAndData(userOperation),\n };\n\n const hash = computeUserOpHash(packedUserOp, chainId, entryPoint);\n const { r, s } = await sign(hash);\n return concat([pad(r, { size: 32 }), pad(s, { size: 32 })]);\n },\n });\n}\n\nfunction packAccountGasLimits(\n verificationGasLimit: bigint,\n callGasLimit: bigint,\n): Hex {\n const packed = (verificationGasLimit << 128n) | callGasLimit;\n return pad(`0x${packed.toString(16)}` as Hex, { size: 32 });\n}\n\nfunction packGasFees(\n maxPriorityFeePerGas: bigint,\n maxFeePerGas: bigint,\n): Hex {\n const packed = (maxPriorityFeePerGas << 128n) | maxFeePerGas;\n return pad(`0x${packed.toString(16)}` as Hex, { size: 32 });\n}\n\nfunction buildPaymasterAndData(userOp: {\n paymaster?: Hex;\n paymasterData?: Hex;\n paymasterVerificationGasLimit?: bigint;\n paymasterPostOpGasLimit?: bigint;\n}): Hex {\n if (!userOp.paymaster) return \"0x\";\n const pmGas = packAccountGasLimits(\n userOp.paymasterVerificationGasLimit ?? 0n,\n userOp.paymasterPostOpGasLimit ?? 0n,\n );\n return concat([userOp.paymaster, pmGas, userOp.paymasterData ?? \"0x\"]);\n}\n","import { encodeAbiParameters, keccak256, type Hex } from \"viem\";\nimport { entryPoint07Address } from \"../../../constants\";\n\nexport interface PackedUserOp {\n sender: Hex;\n nonce: bigint;\n initCode: Hex;\n callData: Hex;\n accountGasLimits: Hex;\n preVerificationGas: bigint;\n gasFees: Hex;\n paymasterAndData: Hex;\n}\n\n/**\n * Compute the UserOperation hash for EntryPoint v0.7 packed format.\n *\n * The hash is computed as:\n * keccak256(abi.encode(keccak256(pack(userOp)), entryPoint, chainId))\n *\n * where pack(userOp) encodes the UserOp fields with initCode, callData,\n * and paymasterAndData replaced by their keccak256 hashes.\n */\nexport function computeUserOpHash(\n packedUserOp: PackedUserOp,\n chainId: number,\n entrypoint: Hex = entryPoint07Address,\n): Hex {\n const encoded = encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n ],\n [\n packedUserOp.sender,\n packedUserOp.nonce,\n keccak256(packedUserOp.initCode),\n keccak256(packedUserOp.callData),\n packedUserOp.accountGasLimits,\n packedUserOp.preVerificationGas,\n packedUserOp.gasFees,\n keccak256(packedUserOp.paymasterAndData),\n ],\n );\n\n const innerHash = keccak256(encoded);\n\n return keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"address\" }, { type: \"uint256\" }],\n [innerHash, entrypoint, BigInt(chainId)],\n ),\n );\n}\n"],"mappings":"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","names":["toSafeSmartAccount","import_viem","import_accounts","import_viem","import_viem","import_accounts","toSafeSmartAccount","createMockLocalAccount","toPermissionlessSafeSmartAccount","import_viem","import_account_abstraction","import_viem"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/accounts/index.ts","../../../src/accounts/toSafeSmartAccount.ts","../../../src/accounts/toP256SafeSmartAccount.ts","../../../src/accounts/encodeContractSignature.ts","../../../src/accounts/computeSafeOpHash.ts","../../../src/constants.ts","../../../src/accounts/toWebAuthnSafeSmartAccount.ts","../../../src/accounts/extractPasskeyCoordinates.ts","../../../src/accounts/toP256ExecutorModuleAccount.ts","../../../src/exact/client/utils/userOpHash.ts"],"sourcesContent":["// Unified API\nexport { toSafeSmartAccount } from \"./toSafeSmartAccount\";\n\n// Individual signer functions\nexport { toP256SafeSmartAccount } from \"./toP256SafeSmartAccount\";\nexport { toWebAuthnSafeSmartAccount } from \"./toWebAuthnSafeSmartAccount\";\n\n// Utilities\nexport { encodeContractSignature } from \"./encodeContractSignature\";\nexport { computeSafeOpHash } from \"./computeSafeOpHash\";\n\nexport { extractPasskeyCoordinates } from \"./extractPasskeyCoordinates\";\n\n// P256ExecutorModule adapter\nexport { toP256ExecutorModuleAccount } from \"./toP256ExecutorModuleAccount\";\nexport type { ToP256ExecutorModuleAccountParams } from \"./toP256ExecutorModuleAccount\";\n\n// Types\nexport type { P256Signer, SafeMessageSigner, ToP256SafeSmartAccountParams } from \"./types\";\nexport type { SignerConfig, ToSafeSmartAccountParams } from \"./types\";\nexport type { ToWebAuthnSafeSmartAccountParams } from \"./toWebAuthnSafeSmartAccount\";\nexport type { SafeOpHashParams } from \"./computeSafeOpHash\";\n","import type { Hex, LocalAccount } from \"viem\";\nimport { concat, encodeAbiParameters, pad, toHex } from \"viem\";\nimport type { SmartAccount, WebAuthnAccount } from \"viem/account-abstraction\";\nimport { toSafeSmartAccount as toPermissionlessSafeSmartAccount } from \"permissionless/accounts\";\n\nimport type { P256Signer, ToSafeSmartAccountParams } from \"./types\";\nimport { toP256SafeSmartAccount } from \"./toP256SafeSmartAccount\";\nimport { toWebAuthnSafeSmartAccount } from \"./toWebAuthnSafeSmartAccount\";\nimport { encodeContractSignature } from \"./encodeContractSignature\";\nimport { computeSafeOpHash } from \"./computeSafeOpHash\";\nimport type { SafeOpHashParams } from \"./computeSafeOpHash\";\nimport {\n SAFE_4337_MODULE_ADDRESS,\n SAFE_WEBAUTHN_SHARED_SIGNER,\n entryPoint07Address,\n} from \"../constants\";\n\n/**\n * Creates a Safe SmartAccount with a unified signer configuration.\n *\n * Dispatches to the appropriate implementation based on `signerConfig.type`:\n * - `\"p256\"`: P256 contract owner (existing `toP256SafeSmartAccount`)\n * - `\"webauthn\"`: WebAuthn passkey via permissionless native support\n * - `\"multi\"`: Both P256 and WebAuthn owners on a single Safe\n *\n * @example\n * ```typescript\n * // P256 only\n * const account = await toSafeSmartAccount({\n * client,\n * signerConfig: { type: \"p256\", p256Signer },\n * });\n *\n * // WebAuthn only\n * const account = await toSafeSmartAccount({\n * client,\n * signerConfig: { type: \"webauthn\", webAuthnAccount },\n * });\n *\n * // Multi-signer (threshold 1, P256 signs by default)\n * const account = await toSafeSmartAccount({\n * client,\n * signerConfig: {\n * type: \"multi\",\n * signers: { p256: p256Signer, webAuthn: webAuthnAccount },\n * threshold: 1,\n * },\n * });\n * ```\n */\nexport async function toSafeSmartAccount(\n params: ToSafeSmartAccountParams,\n): Promise<SmartAccount> {\n const { signerConfig } = params;\n\n switch (signerConfig.type) {\n case \"p256\":\n return toP256SafeSmartAccount({\n client: params.client,\n p256Signer: signerConfig.p256Signer,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n });\n\n case \"webauthn\":\n return toWebAuthnSafeSmartAccount({\n client: params.client,\n webAuthnAccount: signerConfig.webAuthnAccount,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n safeWebAuthnSharedSignerAddress: signerConfig.safeWebAuthnSharedSignerAddress,\n });\n\n case \"multi\":\n return buildMultiSignerAccount(params, signerConfig.signers, signerConfig.threshold ?? 1);\n }\n}\n\nfunction createMockLocalAccount(address: Hex): LocalAccount {\n const notImplemented = () => {\n throw new Error(\"Mock owner: use signUserOperation instead\");\n };\n\n return {\n address,\n type: \"local\",\n source: \"custom\",\n publicKey: \"0x\" as Hex,\n signMessage: notImplemented,\n signTypedData: notImplemented,\n signTransaction: notImplemented,\n sign: notImplemented,\n } as unknown as LocalAccount;\n}\n\n/**\n * Encodes a WebAuthn signature from raw sign() output into the ABI format\n * expected by Safe's WebAuthn verifier:\n * `(bytes authenticatorData, string clientDataFields, uint256[2] signature)`\n *\n * permissionless does not export this helper, so we implement it here.\n */\nasync function encodeWebAuthnSignature(\n owner: WebAuthnAccount,\n hash: Hex,\n): Promise<Hex> {\n const { signature: signatureData, webauthn } = await owner.sign({ hash });\n\n // Extract r, s from the DER-encoded P256 signature\n const sigBytes = signatureData.slice(2);\n const r = BigInt(\"0x\" + sigBytes.slice(0, 64));\n const s = BigInt(\"0x\" + sigBytes.slice(64, 128));\n\n // Extract the fields after \"challenge\":\"...\" from clientDataJSON\n const match = webauthn.clientDataJSON.match(\n /^\\{\"type\":\"webauthn.get\",\"challenge\":\"[A-Za-z0-9\\-_]{43}\",(.*)\\}$/,\n );\n const clientDataFields = match ? match[1] : \"\";\n\n return encodeAbiParameters(\n [\n { name: \"authenticatorData\", type: \"bytes\" },\n { name: \"clientDataFields\", type: \"string\" },\n { name: \"signature\", type: \"uint256[2]\" },\n ],\n [webauthn.authenticatorData, clientDataFields, [r, s]],\n );\n}\n\nasync function buildMultiSignerAccount(\n params: ToSafeSmartAccountParams,\n signers: { p256?: P256Signer; webAuthn?: WebAuthnAccount },\n threshold: number,\n): Promise<SmartAccount> {\n if (!signers.p256 && !signers.webAuthn) {\n throw new Error(\"Multi-signer config requires at least one signer\");\n }\n\n // If only one signer is provided, delegate to the single-signer function\n if (signers.p256 && !signers.webAuthn) {\n return toP256SafeSmartAccount({\n client: params.client,\n p256Signer: signers.p256,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n });\n }\n if (signers.webAuthn && !signers.p256) {\n const signerConfig = params.signerConfig;\n const sharedSignerAddr = signerConfig.type === \"multi\"\n ? signerConfig.safeWebAuthnSharedSignerAddress\n : undefined;\n return toWebAuthnSafeSmartAccount({\n client: params.client,\n webAuthnAccount: signers.webAuthn,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\n safeWebAuthnSharedSignerAddress: sharedSignerAddr,\n });\n }\n\n // Both signers present\n const p256Signer = signers.p256!;\n const webAuthnAccount = signers.webAuthn!;\n\n const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;\n const entryPointAddress = params.entryPoint?.address ?? entryPoint07Address;\n\n const mockP256Owner = createMockLocalAccount(p256Signer.p256OwnerAddress);\n\n // Build account with both owners: mock LocalAccount for P256 + WebAuthnAccount\n const baseAccount = await toPermissionlessSafeSmartAccount({\n client: params.client,\n owners: [mockP256Owner, webAuthnAccount],\n version: \"1.5.0\",\n threshold: BigInt(threshold),\n ...(params.safeAddress ? { address: params.safeAddress } : {}),\n entryPoint: {\n address: entryPointAddress,\n version: \"0.7\",\n },\n safe4337ModuleAddress,\n });\n\n const chainId = await params.client.getChainId();\n\n if (threshold >= 2) {\n return buildThreshold2Account(\n baseAccount as SmartAccount,\n p256Signer,\n webAuthnAccount,\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n }\n\n // Threshold 1: P256 signs by default (no browser interaction needed)\n return buildThreshold1Account(\n baseAccount as SmartAccount,\n p256Signer,\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n}\n\nfunction buildThreshold1Account(\n baseAccount: SmartAccount,\n p256Signer: P256Signer,\n chainId: number,\n safe4337ModuleAddress: Hex,\n entryPointAddress: Hex,\n): SmartAccount {\n return {\n ...baseAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async signUserOperation(userOp: any) {\n const safeOpHash = computeSafeOpHash(\n extractSafeOpHashParams(userOp),\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n\n const { r, s } = await p256Signer.sign(safeOpHash);\n const rPadded = pad(r as Hex, { size: 32 });\n const sPadded = pad(s as Hex, { size: 32 });\n const p256Signature = concat([rPadded, sPadded]);\n\n const contractSig = encodeContractSignature(\n p256Signer.p256OwnerAddress,\n p256Signature,\n );\n\n const validAfter = pad(toHex(0), { size: 6 });\n const validUntil = pad(toHex(0), { size: 6 });\n\n return concat([validAfter, validUntil, contractSig]);\n },\n } as SmartAccount;\n}\n\nfunction buildThreshold2Account(\n baseAccount: SmartAccount,\n p256Signer: P256Signer,\n webAuthnAccount: WebAuthnAccount,\n chainId: number,\n safe4337ModuleAddress: Hex,\n entryPointAddress: Hex,\n): SmartAccount {\n return {\n ...baseAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async signUserOperation(userOp: any) {\n const safeOpHash = computeSafeOpHash(\n extractSafeOpHashParams(userOp),\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n\n // Sign with P256\n const { r, s } = await p256Signer.sign(safeOpHash);\n const rPadded = pad(r as Hex, { size: 32 });\n const sPadded = pad(s as Hex, { size: 32 });\n const p256SignatureData = concat([rPadded, sPadded]);\n\n // Sign with WebAuthn\n const webAuthnSignatureData = await encodeWebAuthnSignature(\n webAuthnAccount,\n safeOpHash,\n );\n\n // Build sorted multi-signature\n // Safe requires signatures sorted by signer address (ascending)\n const p256SignerAddress = p256Signer.p256OwnerAddress.toLowerCase();\n const webAuthnSignerAddress = SAFE_WEBAUTHN_SHARED_SIGNER.toLowerCase();\n\n type SignerEntry = {\n address: string;\n data: Hex;\n dynamic: boolean;\n contractOwner: boolean;\n };\n\n const signerEntries: SignerEntry[] = [\n {\n address: p256SignerAddress,\n data: p256SignatureData,\n dynamic: true,\n contractOwner: true,\n },\n {\n address: webAuthnSignerAddress,\n data: webAuthnSignatureData,\n dynamic: true,\n contractOwner: false,\n },\n ].sort((a, b) => (a.address < b.address ? -1 : 1));\n\n const concatenatedSig = concatSafeSignatures(signerEntries);\n\n const validAfter = pad(toHex(0), { size: 6 });\n const validUntil = pad(toHex(0), { size: 6 });\n\n return concat([validAfter, validUntil, concatenatedSig]);\n },\n } as SmartAccount;\n}\n\n/**\n * Concatenates multiple Safe signatures with proper static/dynamic layout.\n *\n * Safe's `checkNSignatures` expects:\n * - N x 65-byte static parts (sorted by signer address)\n * - Dynamic data appended after all static parts\n *\n * For dynamic signatures (contract or WebAuthn):\n * Static: r = address padded to 32 bytes, s = offset to dynamic data, v = 0x00\n * Dynamic: 32-byte length prefix + signature data\n *\n * For ECDSA signatures:\n * Static: r (32 bytes) + s (32 bytes) + v (1 byte)\n */\nfunction concatSafeSignatures(\n entries: { address: string; data: Hex; dynamic: boolean; contractOwner: boolean }[],\n): Hex {\n const staticPartSize = 65; // per signer\n const totalStaticSize = staticPartSize * entries.length;\n\n const staticParts: Hex[] = [];\n const dynamicParts: Hex[] = [];\n let dynamicOffset = totalStaticSize;\n\n for (const entry of entries) {\n if (entry.dynamic) {\n // Dynamic signature: static part points to dynamic data\n const r = pad(entry.address as Hex, { size: 32 });\n const s = pad(toHex(dynamicOffset), { size: 32 });\n const v = \"0x00\" as Hex;\n staticParts.push(concat([r, s, v]));\n\n // Dynamic part: length-prefixed data\n const dataBytes = (entry.data.length - 2) / 2;\n const length = pad(toHex(dataBytes), { size: 32 });\n dynamicParts.push(concat([length, entry.data]));\n\n // Advance offset: 32 bytes for length + actual data length\n dynamicOffset += 32 + dataBytes;\n } else {\n // ECDSA: direct 65-byte signature (not used in current multi-signer paths)\n staticParts.push(entry.data);\n }\n }\n\n return concat([...staticParts, ...dynamicParts]);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractSafeOpHashParams(userOp: any): SafeOpHashParams {\n const op = userOp as Record<string, unknown>;\n return {\n sender: op.sender as Hex,\n nonce: BigInt(op.nonce as bigint),\n factory: (op.factory as Hex) ?? null,\n factoryData: (op.factoryData as Hex) ?? null,\n callData: op.callData as Hex,\n verificationGasLimit: BigInt(op.verificationGasLimit as bigint),\n callGasLimit: BigInt(op.callGasLimit as bigint),\n preVerificationGas: BigInt(op.preVerificationGas as bigint),\n maxPriorityFeePerGas: BigInt(op.maxPriorityFeePerGas as bigint),\n maxFeePerGas: BigInt(op.maxFeePerGas as bigint),\n paymaster: (op.paymaster as Hex) ?? null,\n paymasterVerificationGasLimit: op.paymasterVerificationGasLimit\n ? BigInt(op.paymasterVerificationGasLimit as bigint)\n : null,\n paymasterPostOpGasLimit: op.paymasterPostOpGasLimit\n ? BigInt(op.paymasterPostOpGasLimit as bigint)\n : null,\n paymasterData: (op.paymasterData as Hex) ?? null,\n };\n}\n","import type { Hex, LocalAccount } from \"viem\";\nimport { concat, pad, toHex } from \"viem\";\nimport type { SmartAccount } from \"viem/account-abstraction\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\n\nimport type { ToP256SafeSmartAccountParams } from \"./types\";\nimport { encodeContractSignature } from \"./encodeContractSignature\";\nimport type { SafeOpHashParams } from \"./computeSafeOpHash\";\nimport { computeSafeOpHash } from \"./computeSafeOpHash\";\nimport { SAFE_4337_MODULE_ADDRESS, entryPoint07Address } from \"../constants\";\n\n/**\n * Creates a mock LocalAccount that has the P256Owner contract address.\n *\n * This is needed because `toSafeSmartAccount` requires a `LocalAccount` owner,\n * but our actual signer is a P256Owner contract (ERC-1271). The mock provides\n * the correct address so the Safe is configured with the right owner. The\n * signing methods are never called since we override `signUserOperation`.\n */\nfunction createMockLocalAccount(address: Hex): LocalAccount {\n const notImplemented = () => {\n throw new Error(\"P256 contract owner: use signUserOperation instead\");\n };\n\n return {\n address,\n type: \"local\",\n source: \"custom\",\n publicKey: \"0x\" as Hex,\n signMessage: notImplemented,\n signTypedData: notImplemented,\n signTransaction: notImplemented,\n sign: notImplemented,\n } as unknown as LocalAccount;\n}\n\n/**\n * Creates a Safe SmartAccount that signs UserOperations with a P256 contract owner.\n *\n * This wraps permissionless's `toSafeSmartAccount` and overrides `signUserOperation`\n * to produce P256 signatures in Safe's contract signature format (v=0). The resulting\n * account is compatible with `SafeAccountSigner` and `ExactEvmSchemeERC4337`.\n *\n * The caller is responsible for:\n * - Deploying the P256Owner contract (or computing its deterministic address)\n * - Providing the `sign()` function (e.g., using `@noble/curves/p256` with `prehash: false`)\n * - Ensuring the P256Owner is an owner of the Safe\n *\n * @example\n * ```typescript\n * import { toP256SafeSmartAccount } from '@introspectivelabs/x402-evm';\n * import { p256 } from '@noble/curves/p256';\n *\n * const account = await toP256SafeSmartAccount({\n * client: publicClient,\n * p256Signer: {\n * p256OwnerAddress: '0x349c...',\n * sign: async (hash) => {\n * const sig = p256.sign(hash.slice(2), privateKey, { prehash: false, lowS: true });\n * return {\n * r: `0x${sig.r.toString(16).padStart(64, '0')}`,\n * s: `0x${sig.s.toString(16).padStart(64, '0')}`,\n * };\n * },\n * },\n * safeAddress: '0x...',\n * });\n *\n * const scheme = new ExactEvmSchemeERC4337({ account });\n * ```\n */\nexport async function toP256SafeSmartAccount(\n params: ToP256SafeSmartAccountParams,\n): Promise<SmartAccount> {\n const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;\n const entryPointAddress =\n params.entryPoint?.address ?? entryPoint07Address;\n\n const mockOwner = createMockLocalAccount(params.p256Signer.p256OwnerAddress);\n\n const baseAccount = await toSafeSmartAccount({\n client: params.client,\n owners: [mockOwner],\n version: \"1.5.0\",\n ...(params.safeAddress ? { address: params.safeAddress } : {}),\n entryPoint: {\n address: entryPointAddress,\n version: \"0.7\",\n },\n safe4337ModuleAddress,\n });\n\n const chainId = await params.client.getChainId();\n\n return {\n ...baseAccount,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async signUserOperation(userOp: any) {\n const op = userOp as Record<string, unknown>;\n // Compute the SafeOp EIP-712 hash (what Safe4337Module verifies)\n const hashParams: SafeOpHashParams = {\n sender: op.sender as Hex,\n nonce: BigInt(op.nonce as bigint),\n factory: (op.factory as Hex) ?? null,\n factoryData: (op.factoryData as Hex) ?? null,\n callData: op.callData as Hex,\n verificationGasLimit: BigInt(op.verificationGasLimit as bigint),\n callGasLimit: BigInt(op.callGasLimit as bigint),\n preVerificationGas: BigInt(op.preVerificationGas as bigint),\n maxPriorityFeePerGas: BigInt(op.maxPriorityFeePerGas as bigint),\n maxFeePerGas: BigInt(op.maxFeePerGas as bigint),\n paymaster: (op.paymaster as Hex) ?? null,\n paymasterVerificationGasLimit: op.paymasterVerificationGasLimit\n ? BigInt(op.paymasterVerificationGasLimit as bigint)\n : null,\n paymasterPostOpGasLimit: op.paymasterPostOpGasLimit\n ? BigInt(op.paymasterPostOpGasLimit as bigint)\n : null,\n paymasterData: (op.paymasterData as Hex) ?? null,\n };\n const safeOpHash = computeSafeOpHash(\n hashParams,\n chainId,\n safe4337ModuleAddress,\n entryPointAddress,\n );\n\n // Sign the SafeOp hash with P256\n const { r, s } = await params.p256Signer.sign(safeOpHash);\n\n // Encode r || s as 64-byte signature\n const rPadded = pad(r as Hex, { size: 32 });\n const sPadded = pad(s as Hex, { size: 32 });\n const p256Signature = concat([rPadded, sPadded]);\n\n // Wrap in Safe contract signature format (v=0)\n const contractSig = encodeContractSignature(\n params.p256Signer.p256OwnerAddress,\n p256Signature,\n );\n\n // Safe4337Module expects: validAfter (6 bytes) || validUntil (6 bytes) || signatures\n const validAfter = pad(toHex(0), { size: 6 });\n const validUntil = pad(toHex(0), { size: 6 });\n\n return concat([validAfter, validUntil, contractSig]);\n },\n } as SmartAccount;\n}\n","import { type Hex, concat, pad, toHex } from \"viem\";\n\n/**\n * Encodes a signature in Safe's contract signature format (v=0).\n *\n * Safe's `checkNSignatures` expects this layout for contract owners:\n *\n * Static part (65 bytes):\n * - r (32 bytes): owner address padded to 32 bytes\n * - s (32 bytes): offset to dynamic data (relative to start of signatures)\n * - v (1 byte): 0x00 (indicates contract signature)\n *\n * Dynamic part (at the offset):\n * - length (32 bytes): length of the signature data\n * - data (variable): the actual signature bytes\n *\n * For a single signer, the static part is 65 bytes, so the dynamic data\n * starts at offset 65.\n */\nexport function encodeContractSignature(ownerAddress: Hex, signatureData: Hex): Hex {\n // Static part: r = address padded to 32 bytes\n const r = pad(ownerAddress, { size: 32 });\n\n // For a single signature, dynamic data starts right after the 65-byte static part\n const dynamicOffset = 65;\n const s = pad(toHex(dynamicOffset), { size: 32 });\n\n // v = 0x00 for contract signature\n const v = \"0x00\" as Hex;\n\n // Dynamic part: length-prefixed signature data\n const signatureBytes = (signatureData.length - 2) / 2;\n const length = pad(toHex(signatureBytes), { size: 32 });\n\n return concat([r, s, v, length, signatureData]);\n}\n","import {\n type Hex,\n concat,\n hashTypedData,\n isAddress,\n pad,\n toHex,\n} from \"viem\";\nimport { SAFE_4337_MODULE_ADDRESS, entryPoint07Address } from \"../constants\";\n\nconst SAFE_OP_TYPES = {\n SafeOp: [\n { type: \"address\", name: \"safe\" },\n { type: \"uint256\", name: \"nonce\" },\n { type: \"bytes\", name: \"initCode\" },\n { type: \"bytes\", name: \"callData\" },\n { type: \"uint128\", name: \"verificationGasLimit\" },\n { type: \"uint128\", name: \"callGasLimit\" },\n { type: \"uint256\", name: \"preVerificationGas\" },\n { type: \"uint128\", name: \"maxPriorityFeePerGas\" },\n { type: \"uint128\", name: \"maxFeePerGas\" },\n { type: \"bytes\", name: \"paymasterAndData\" },\n { type: \"uint48\", name: \"validAfter\" },\n { type: \"uint48\", name: \"validUntil\" },\n { type: \"address\", name: \"entryPoint\" },\n ],\n} as const;\n\nexport interface SafeOpHashParams {\n sender: Hex;\n nonce: bigint;\n factory?: Hex | null;\n factoryData?: Hex | null;\n callData: Hex;\n verificationGasLimit: bigint;\n callGasLimit: bigint;\n preVerificationGas: bigint;\n maxPriorityFeePerGas: bigint;\n maxFeePerGas: bigint;\n paymaster?: Hex | null;\n paymasterVerificationGasLimit?: bigint | null;\n paymasterPostOpGasLimit?: bigint | null;\n paymasterData?: Hex | null;\n}\n\n/**\n * Computes the EIP-712 SafeOp hash that Safe4337Module uses for signature verification.\n *\n * The Safe4337Module converts the EntryPoint v0.7 UserOperation into a SafeOp struct,\n * packing initCode and paymasterAndData into their v0.6-style concatenated forms,\n * then hashes the struct using EIP-712.\n */\nexport function computeSafeOpHash(\n userOp: SafeOpHashParams,\n chainId: number,\n safe4337ModuleAddress: Hex = SAFE_4337_MODULE_ADDRESS,\n entryPointAddress: Hex = entryPoint07Address,\n): Hex {\n // Reconstruct initCode: factory || factoryData (v0.7 -> v0.6 style)\n const initCode =\n userOp.factory && isAddress(userOp.factory)\n ? concat([userOp.factory, (userOp.factoryData || \"0x\") as Hex])\n : (\"0x\" as Hex);\n\n // Reconstruct paymasterAndData: paymaster || verificationGasLimit(16) || postOpGasLimit(16) || data\n let paymasterAndData: Hex = \"0x\";\n if (userOp.paymaster && isAddress(userOp.paymaster)) {\n paymasterAndData = concat([\n userOp.paymaster,\n pad(toHex(userOp.paymasterVerificationGasLimit || 0n), { size: 16 }),\n pad(toHex(userOp.paymasterPostOpGasLimit || 0n), { size: 16 }),\n (userOp.paymasterData || \"0x\") as Hex,\n ]);\n }\n\n return hashTypedData({\n domain: {\n chainId,\n verifyingContract: safe4337ModuleAddress,\n },\n types: SAFE_OP_TYPES,\n primaryType: \"SafeOp\",\n message: {\n safe: userOp.sender,\n nonce: userOp.nonce,\n initCode,\n callData: userOp.callData,\n verificationGasLimit: userOp.verificationGasLimit,\n callGasLimit: userOp.callGasLimit,\n preVerificationGas: userOp.preVerificationGas,\n maxPriorityFeePerGas: userOp.maxPriorityFeePerGas,\n maxFeePerGas: userOp.maxFeePerGas,\n paymasterAndData,\n validAfter: 0,\n validUntil: 0,\n entryPoint: entryPointAddress,\n },\n });\n}\n","import type { Hex } from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\n\nexport { entryPoint07Address };\n\nexport const SAFE_4337_MODULE_ADDRESS =\n \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as const satisfies Hex;\n\nexport const SAFE_WEBAUTHN_SHARED_SIGNER =\n \"0x94a4F6affBd8975951142c3999aEAB7ecee555c2\" as const satisfies Hex;\n\nexport const FCL_P256_VERIFIER =\n \"0xA86e0054C51E4894D88762a017ECc5E5235f5DBA\" as const satisfies Hex;\n\nexport const P256_OWNER_FACTORY =\n \"0x349c03Eb61e26528cbf79F5D3Ba071FcA2aE82cB\" as const satisfies Hex;\n\nexport const WEBAUTHN_SIGNER_FACTORY =\n \"0xF7488fFbe67327ac9f37D5F722d83Fc900852Fbf\" as const satisfies Hex;\n\nexport const GUARD_FACTORY =\n \"0x35E2B487b682029e363BA7f06fD7392834A83077\" as const satisfies Hex;\n","import type { Hex } from \"viem\";\nimport type { SmartAccount, WebAuthnAccount } from \"viem/account-abstraction\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\nimport type { PublicClient, Transport, Chain } from \"viem\";\nimport { SAFE_4337_MODULE_ADDRESS, entryPoint07Address } from \"../constants\";\n\nexport type ToWebAuthnSafeSmartAccountParams = {\n client: PublicClient<Transport, Chain>;\n webAuthnAccount: WebAuthnAccount;\n safeAddress?: Hex;\n entryPoint?: { address: Hex; version: \"0.7\" };\n safe4337ModuleAddress?: Hex;\n safeWebAuthnSharedSignerAddress?: Hex;\n};\n\n/**\n * Creates a Safe SmartAccount that signs UserOperations with a WebAuthn passkey.\n */\nexport async function toWebAuthnSafeSmartAccount(\n params: ToWebAuthnSafeSmartAccountParams,\n): Promise<SmartAccount> {\n const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;\n const entryPointAddress = params.entryPoint?.address ?? entryPoint07Address;\n\n const baseAccount = await toSafeSmartAccount({\n client: params.client,\n owners: [params.webAuthnAccount],\n version: \"1.5.0\",\n ...(params.safeAddress ? { address: params.safeAddress } : {}),\n entryPoint: {\n address: entryPointAddress,\n version: \"0.7\",\n },\n safe4337ModuleAddress,\n ...(params.safeWebAuthnSharedSignerAddress\n ? { safeWebAuthnSharedSignerAddress: params.safeWebAuthnSharedSignerAddress }\n : {}),\n });\n\n return baseAccount as SmartAccount;\n}\n","/// <reference lib=\"dom\" />\nimport type { Hex } from \"viem\";\n\nfunction bufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction base64urlToHex(base64url: string): string {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = atob(base64);\n return Array.from(binary, (c) => c.charCodeAt(0).toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Extracts P256 public key coordinates from a WebAuthn credential.\n *\n * Replaces `extractPasskeyData` from `@safe-global/protocol-kit`.\n * Uses only the Web Crypto API (no external dependencies).\n */\nexport async function extractPasskeyCoordinates(\n credential: PublicKeyCredential,\n): Promise<{ rawId: string; x: Hex; y: Hex }> {\n const rawId = bufferToHex(credential.rawId);\n const response = credential.response as AuthenticatorAttestationResponse;\n const publicKey = response.getPublicKey();\n if (!publicKey) throw new Error(\"Failed to extract public key from credential\");\n\n const key = await crypto.subtle.importKey(\n \"spki\",\n publicKey,\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n true,\n [\"verify\"],\n );\n const jwk = await crypto.subtle.exportKey(\"jwk\", key);\n if (!jwk.x || !jwk.y) throw new Error(\"Missing coordinates in JWK\");\n\n return {\n rawId,\n x: (\"0x\" + base64urlToHex(jwk.x)) as Hex,\n y: (\"0x\" + base64urlToHex(jwk.y)) as Hex,\n };\n}\n","import {\n concat,\n encodeFunctionData,\n pad,\n type Chain,\n type Hex,\n type PublicClient,\n type Transport,\n} from \"viem\";\nimport { toSmartAccount, type SmartAccount } from \"viem/account-abstraction\";\nimport { entryPoint07Address } from \"../constants\";\nimport { computeUserOpHash, type PackedUserOp } from \"../exact/client/utils/userOpHash\";\n\nconst P256_EXECUTOR_MODULE_ABI = [\n {\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"operation\", type: \"uint8\" },\n ],\n name: \"execute\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\nconst ENTRYPOINT_07_ABI = [\n {\n name: \"getNonce\",\n type: \"function\",\n inputs: [\n { name: \"sender\", type: \"address\" },\n { name: \"key\", type: \"uint192\" },\n ],\n outputs: [{ name: \"nonce\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\nexport interface ToP256ExecutorModuleAccountParams {\n client: PublicClient<Transport, Chain>;\n moduleAddress: Hex;\n sign: (hash: Hex) => Promise<{ r: Hex; s: Hex }>;\n entryPointAddress?: Hex;\n}\n\n/**\n * Creates a viem SmartAccount adapter for P256ExecutorModule.\n *\n * The module is the UserOp sender (not the Safe). CallData encodes\n * `module.execute(to, value, data, 0)` and the signature is raw\n * P256 `r || s` (64 bytes).\n *\n * Use this with `ExactEvmSchemeERC4337` to handle ERC-4337 payments\n * where the P256ExecutorModule is the account.\n */\nexport async function toP256ExecutorModuleAccount(\n params: ToP256ExecutorModuleAccountParams,\n): Promise<SmartAccount> {\n const { client, moduleAddress, sign } = params;\n const entryPoint = params.entryPointAddress ?? entryPoint07Address;\n\n return toSmartAccount({\n client,\n entryPoint: {\n abi: ENTRYPOINT_07_ABI,\n address: entryPoint,\n version: \"0.7\",\n },\n\n async getAddress() {\n return moduleAddress;\n },\n\n async encodeCalls(calls) {\n if (calls.length !== 1) {\n throw new Error(\n \"P256ExecutorModule does not support batch calls. \" +\n `Received ${calls.length} calls, expected 1.`,\n );\n }\n const { to, value, data } = calls[0];\n return encodeFunctionData({\n abi: P256_EXECUTOR_MODULE_ABI,\n functionName: \"execute\",\n args: [to, value ?? 0n, data ?? \"0x\", 0],\n });\n },\n\n async getNonce() {\n return await client.readContract({\n address: entryPoint,\n abi: ENTRYPOINT_07_ABI,\n functionName: \"getNonce\",\n args: [moduleAddress, 0n],\n }) as bigint;\n },\n\n async getFactoryArgs() {\n return { factory: undefined, factoryData: undefined };\n },\n\n async getStubSignature() {\n return (\"0x\" + \"ff\".repeat(64)) as Hex;\n },\n\n async signMessage() {\n throw new Error(\"P256ExecutorModule does not support signMessage\");\n },\n\n async signTypedData() {\n throw new Error(\"P256ExecutorModule does not support signTypedData\");\n },\n\n async signUserOperation(userOperation) {\n const chainId = client.chain.id;\n\n const factory = userOperation.factory as Hex | undefined;\n const packedUserOp: PackedUserOp = {\n sender: userOperation.sender as Hex,\n nonce: userOperation.nonce,\n initCode: factory\n ? concat([factory, (userOperation.factoryData ?? \"0x\") as Hex])\n : \"0x\",\n callData: userOperation.callData,\n accountGasLimits: packAccountGasLimits(\n userOperation.verificationGasLimit,\n userOperation.callGasLimit,\n ),\n preVerificationGas: userOperation.preVerificationGas,\n gasFees: packGasFees(\n userOperation.maxPriorityFeePerGas,\n userOperation.maxFeePerGas,\n ),\n paymasterAndData: buildPaymasterAndData(userOperation),\n };\n\n const hash = computeUserOpHash(packedUserOp, chainId, entryPoint);\n const { r, s } = await sign(hash);\n return concat([pad(r, { size: 32 }), pad(s, { size: 32 })]);\n },\n });\n}\n\nfunction packAccountGasLimits(\n verificationGasLimit: bigint,\n callGasLimit: bigint,\n): Hex {\n const packed = (verificationGasLimit << 128n) | callGasLimit;\n return pad(`0x${packed.toString(16)}` as Hex, { size: 32 });\n}\n\nfunction packGasFees(\n maxPriorityFeePerGas: bigint,\n maxFeePerGas: bigint,\n): Hex {\n const packed = (maxPriorityFeePerGas << 128n) | maxFeePerGas;\n return pad(`0x${packed.toString(16)}` as Hex, { size: 32 });\n}\n\nfunction buildPaymasterAndData(userOp: {\n paymaster?: Hex;\n paymasterData?: Hex;\n paymasterVerificationGasLimit?: bigint;\n paymasterPostOpGasLimit?: bigint;\n}): Hex {\n if (!userOp.paymaster) return \"0x\";\n const pmGas = packAccountGasLimits(\n userOp.paymasterVerificationGasLimit ?? 0n,\n userOp.paymasterPostOpGasLimit ?? 0n,\n );\n return concat([userOp.paymaster, pmGas, userOp.paymasterData ?? \"0x\"]);\n}\n","import { encodeAbiParameters, keccak256, type Hex } from \"viem\";\nimport { entryPoint07Address } from \"../../../constants\";\n\nexport interface PackedUserOp {\n sender: Hex;\n nonce: bigint;\n initCode: Hex;\n callData: Hex;\n accountGasLimits: Hex;\n preVerificationGas: bigint;\n gasFees: Hex;\n paymasterAndData: Hex;\n}\n\n/**\n * Compute the UserOperation hash for EntryPoint v0.7 packed format.\n *\n * The hash is computed as:\n * keccak256(abi.encode(keccak256(pack(userOp)), entryPoint, chainId))\n *\n * where pack(userOp) encodes the UserOp fields with initCode, callData,\n * and paymasterAndData replaced by their keccak256 hashes.\n */\nexport function computeUserOpHash(\n packedUserOp: PackedUserOp,\n chainId: number,\n entrypoint: Hex = entryPoint07Address,\n): Hex {\n const encoded = encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n ],\n [\n packedUserOp.sender,\n packedUserOp.nonce,\n keccak256(packedUserOp.initCode),\n keccak256(packedUserOp.callData),\n packedUserOp.accountGasLimits,\n packedUserOp.preVerificationGas,\n packedUserOp.gasFees,\n keccak256(packedUserOp.paymasterAndData),\n ],\n );\n\n const innerHash = keccak256(encoded);\n\n return keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"address\" }, { type: \"uint256\" }],\n [innerHash, entrypoint, BigInt(chainId)],\n ),\n );\n}\n"],"mappings":"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","names":["toSafeSmartAccount","import_viem","import_accounts","import_viem","import_viem","import_accounts","toSafeSmartAccount","createMockLocalAccount","toPermissionlessSafeSmartAccount","import_viem","import_account_abstraction","import_viem"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
declare const SAFE_4337_MODULE_ADDRESS: "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
|
|
2
|
-
declare const SAFE_WEBAUTHN_SHARED_SIGNER: "
|
|
2
|
+
declare const SAFE_WEBAUTHN_SHARED_SIGNER: "0x94a4F6affBd8975951142c3999aEAB7ecee555c2";
|
|
3
3
|
declare const FCL_P256_VERIFIER: "0xA86e0054C51E4894D88762a017ECc5E5235f5DBA";
|
|
4
4
|
declare const P256_OWNER_FACTORY: "0x349c03Eb61e26528cbf79F5D3Ba071FcA2aE82cB";
|
|
5
5
|
declare const WEBAUTHN_SIGNER_FACTORY: "0xF7488fFbe67327ac9f37D5F722d83Fc900852Fbf";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/exact/client/index.ts","../../../../src/exact/client/schemes/erc4337.ts","../../../../src/exact/client/bundler/viem.ts","../../../../src/exact/client/signers/safeAccountSigner.ts","../../../../src/exact/client/signers/safeMessageSigners.ts","../../../../src/exact/utils.ts","../../../../src/exact/client/utils/callData.ts","../../../../src/exact/client/utils/userOperation.ts","../../../../src/exact/client/errors.ts","../../../../src/networks/registry.ts","../../../../src/networks/helpers.ts","../../../../src/exact/client/schemes/eip3009.ts","../../../../src/accounts/encodeContractSignature.ts","../../../../src/accounts/computeSafeMessageHash.ts","../../../../src/exact/client/utils/userOpHash.ts","../../../../src/constants.ts"],"sourcesContent":["export * from \"./schemes\";\nexport * from \"./signers\";\nexport { PaymentCreationError, parseAAError } from \"./errors\";\nexport type { PaymentCreationPhase } from \"./errors\";\nexport * from \"./bundler\";\nexport * from \"./utils\";\n","import type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@x402/core/types\";\nimport {\n getAddress,\n createPublicClient,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n Hex,\n} from \"viem\";\nimport * as allChains from \"viem/chains\";\nimport { defineChain } from \"viem\";\nimport type { SmartAccount } from \"viem/account-abstraction\";\nimport type { BundlerClient } from \"../bundler\";\nimport { ViemBundlerClient } from \"../bundler/viem\";\nimport type { UserOperationSigner } from \"../signers\";\nimport { SafeAccountSigner } from \"../signers\";\nimport { extractUserOperationCapability } from \"../../utils\";\nimport type { Erc4337Payload } from \"../../facilitator/types\";\nimport { buildERC20TransferCallData } from \"../utils/callData\";\nimport { userOpToJson } from \"../utils/userOperation\";\nimport { PaymentCreationError, parseAAError } from \"../errors\";\nimport { resolveChainId } from \"../../../networks\";\n\n/**\n * Base configuration properties shared by all configuration variants\n */\ninterface ExactEvmSchemeERC4337ConfigBase {\n /**\n * Entry point address (EntryPoint v0.7)\n * Optional - can be provided in payment requirements if not set here\n */\n entrypoint?: Hex;\n\n /**\n * Bundler URL (optional, can be provided in payment requirements)\n */\n bundlerUrl?: string;\n}\n\n/**\n * Configuration variant when bundlerClient is explicitly provided.\n * Account and publicClient are NOT needed when bundlerClient is used.\n * Signer is required when using bundlerClient.\n */\ntype ExactEvmSchemeERC4337ConfigWithBundler = ExactEvmSchemeERC4337ConfigBase & {\n /**\n * Bundler client for preparing and sending user operations.\n */\n bundlerClient: BundlerClient;\n /**\n * Signer for signing user operations (required when bundlerClient is provided).\n */\n signer: UserOperationSigner;\n} & {\n /**\n * Account must not be provided when bundlerClient is used.\n * Using `never` type prevents this property from being set.\n */\n account?: never;\n /**\n * Public client must not be provided when bundlerClient is used.\n * The bundlerClient already has its own publicClient configured.\n */\n publicClient?: never;\n};\n\n/**\n * Configuration variant when bundlerClient is not provided.\n * Account is required for dynamic bundlerClient creation.\n * Signer is optional - will be auto-created from account if not provided.\n * PublicClient is optional - will create a default from network if not provided.\n */\ntype ExactEvmSchemeERC4337ConfigWithAccount = ExactEvmSchemeERC4337ConfigBase & {\n /**\n * Bundler client is not provided - will be created dynamically from PaymentRequirements.\n * Using `never` type prevents this property from being set.\n */\n bundlerClient?: never;\n} & {\n /**\n * Smart account for user operation preparation.\n * Required when bundlerClient is not provided.\n */\n account: SmartAccount;\n /**\n * Signer for signing user operations.\n * Optional - will be auto-created from account using SafeAccountSigner if not provided.\n * The account must support signUserOperation method for auto-creation to work.\n */\n signer?: UserOperationSigner;\n /**\n * Public client for blockchain interactions.\n * Optional - will create a default from network if not provided.\n */\n publicClient?: PublicClient<Transport, Chain>;\n};\n\n/**\n * Configuration for the ERC-4337 client scheme.\n *\n * This is a discriminated union that enforces type-safe combinations:\n * - Either `bundlerClient` is provided (account and publicClient must NOT be provided)\n * - Or `account` is provided when bundlerClient is not (for dynamic creation, publicClient optional)\n *\n * @example\n * ```typescript\n * // Minimal config (just account - signer auto-created)\n * const scheme1 = new ExactEvmSchemeERC4337({\n * account: myAccount,\n * // signer will be auto-created from account\n * // bundlerClient will be created dynamically from PaymentRequirements\n * });\n *\n * // With account and custom signer\n * const scheme2 = new ExactEvmSchemeERC4337({\n * account: myAccount,\n * signer: myCustomSigner,\n * publicClient: myPublicClient, // Optional\n * });\n *\n * // With explicit bundlerClient (backward compatible)\n * const scheme3 = new ExactEvmSchemeERC4337({\n * bundlerClient: myBundlerClient,\n * signer: mySigner, // Required when bundlerClient is provided\n * // account and publicClient must NOT be provided (bundlerClient has its own)\n * });\n * ```\n */\nexport type ExactEvmSchemeERC4337Config =\n | ExactEvmSchemeERC4337ConfigWithBundler\n | ExactEvmSchemeERC4337ConfigWithAccount;\n\n/**\n * Resolves a network string to a Chain object.\n * Handles both CAIP-2 format (\"eip155:84532\") and v1 plain names (\"base-sepolia\").\n *\n * @param network - Network string in CAIP-2 or v1 plain name format\n * @returns The Chain object\n */\nfunction resolveChain(network: string): Chain {\n const chainId = resolveChainId(network);\n\n const known = Object.values(allChains).find((c: Chain) => c.id === chainId);\n if (known) return known;\n\n return defineChain({\n id: chainId,\n name: network,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: { default: { http: [] } },\n });\n}\n\n/**\n * Creates a default public client from a network string.\n *\n * @param network - The network string in CAIP-2 format (e.g., \"eip155:84532\")\n * @returns A PublicClient instance\n */\nfunction createDefaultPublicClient(network: string): PublicClient<Transport, Chain> {\n const chain = resolveChain(network);\n return createPublicClient({\n chain,\n transport: http(),\n });\n}\n\n/**\n * EVM client implementation for the Exact payment scheme using ERC-4337 UserOperations.\n *\n * This implementation creates payment payloads by building and signing UserOperations\n * that execute ERC20 transfers. The UserOperations are prepared using a bundler client\n * and signed using a user operation signer (e.g., Safe account, EOA).\n *\n * Supports minimal configuration: when bundlerClient is not provided and\n * PaymentRequirements.extra.userOperation.supported is true, a ViemBundlerClient\n * will be created dynamically from the payment requirements.\n *\n * @example\n * ```typescript\n * // Minimal config (just account - signer and bundlerClient auto-created)\n * import { ExactEvmSchemeERC4337 } from '@introspectivelabs/x402-evm/exact/client';\n * import { x402Client } from '@x402/core/client';\n *\n * const scheme = new ExactEvmSchemeERC4337({\n * account: safeAccount, // SmartAccount - signer will be auto-created\n * });\n *\n * // With custom signer\n * const scheme2 = new ExactEvmSchemeERC4337({\n * account: safeAccount,\n * signer: customSigner, // Optional - overrides auto-creation\n * });\n *\n * // Explicit config (backward compatible)\n * import { ViemBundlerClient } from '@introspectivelabs/x402-evm/exact/client/bundler';\n *\n * const bundlerClient = new ViemBundlerClient({\n * publicClient,\n * account,\n * chain,\n * bundlerUrl: 'https://bundler.example.com',\n * });\n *\n * const scheme3 = new ExactEvmSchemeERC4337({\n * bundlerClient,\n * signer: account, // Required when bundlerClient is provided\n * });\n *\n * const client = new x402Client();\n * client.register('eip155:84532', scheme);\n * ```\n */\nexport class ExactEvmSchemeERC4337 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n private readonly bundlerClient?: BundlerClient;\n private readonly account?: SmartAccount;\n private readonly publicClient?: PublicClient<Transport, Chain>;\n private readonly signer: UserOperationSigner;\n private readonly entrypoint?: Hex;\n private readonly bundlerUrl?: string;\n\n /**\n * Creates a new ExactEvmSchemeERC4337 instance.\n *\n * @param config - Configuration for the scheme (type-safe: either bundlerClient or account must be provided)\n * @throws Error if bundlerClient is not provided and account is also not provided (runtime safety check)\n * @throws Error if signer is not provided and account doesn't support signUserOperation\n */\n constructor(config: ExactEvmSchemeERC4337Config) {\n this.bundlerClient = config.bundlerClient;\n this.account = config.account;\n this.publicClient = config.publicClient;\n this.entrypoint = config.entrypoint;\n this.bundlerUrl = config.bundlerUrl;\n\n // Validate: if bundlerClient is not provided, account must be provided\n if (!this.bundlerClient && !this.account) {\n throw new Error(\n \"Either bundlerClient or account must be provided. \" +\n \"If bundlerClient is not provided, account (SmartAccount) is required for dynamic bundlerClient creation.\",\n );\n }\n\n // Handle signer: use provided signer or auto-create from account\n if (config.signer) {\n this.signer = config.signer;\n } else if (this.account) {\n // Auto-create signer from account if not provided\n if (!this.account.signUserOperation) {\n throw new Error(\n \"Account does not support signUserOperation. \" +\n \"Either provide a signer explicitly or use an account that supports signUserOperation.\",\n );\n }\n this.signer = new SafeAccountSigner(this.account);\n } else {\n // This should not happen due to type system, but add runtime check for safety\n throw new Error(\n \"Signer is required when bundlerClient is provided. \" +\n \"Either provide a signer explicitly or use account-based configuration.\",\n );\n }\n }\n\n /**\n * Creates a payment payload for the Exact scheme using ERC-4337 UserOperations.\n *\n * This method:\n * 1. Extracts user operation capability from payment requirements\n * 2. Creates bundlerClient dynamically if not provided (when userOperation.supported is true)\n * 3. Builds ERC20 transfer call data\n * 4. Prepares the user operation using the bundler client\n * 5. Signs the user operation\n * 6. Converts to JSON-RPC format\n * 7. Returns the x402 payment payload\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n * @throws Error if user operation capability is not found or required fields are missing\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"x402Version\" | \"payload\">> {\n // Extract user operation capability (optional - config defaults used when missing)\n const capability = extractUserOperationCapability(paymentRequirements);\n\n // Determine which bundlerClient to use\n let bundlerClient: BundlerClient;\n\n if (this.bundlerClient) {\n // Use provided bundlerClient (explicit config, backward compatible)\n bundlerClient = this.bundlerClient;\n } else {\n // Create bundlerClient dynamically from PaymentRequirements\n if (!this.account) {\n throw new Error(\n \"Account (SmartAccount) is required when bundlerClient is not provided. \" +\n \"Either provide bundlerClient in config or account for dynamic creation.\",\n );\n }\n\n // Get bundler URL (prioritize config defaults over PaymentRequirements)\n const bundlerUrl = this.bundlerUrl ?? capability?.bundlerUrl;\n if (!bundlerUrl) {\n throw new PaymentCreationError(\n \"Bundler URL not provided\",\n {\n phase: \"validation\",\n reason: \"Set bundlerUrl in ExactEvmSchemeERC4337Config or in payment requirements extra.userOperation.bundlerUrl\",\n network: paymentRequirements.network,\n },\n );\n }\n\n // Derive chain from network (supports both CAIP-2 and v1 plain names)\n const chain = resolveChain(paymentRequirements.network);\n\n // Use provided publicClient or create default from network\n const publicClient =\n this.publicClient ?? createDefaultPublicClient(paymentRequirements.network);\n\n // Create ViemBundlerClient dynamically\n bundlerClient = new ViemBundlerClient({\n publicClient,\n account: this.account,\n chain,\n bundlerUrl,\n });\n }\n\n // Get entry point (prioritize config defaults over PaymentRequirements)\n const entryPoint = this.entrypoint ?? (capability?.entrypoint as `0x${string}` | undefined);\n\n if (!entryPoint) {\n throw new PaymentCreationError(\n \"Entry point not provided\",\n {\n phase: \"validation\",\n reason: \"Set entrypoint in ExactEvmSchemeERC4337Config or in payment requirements extra.userOperation.entrypoint\",\n network: paymentRequirements.network,\n },\n );\n }\n\n // Get bundler URL (prioritize config defaults over PaymentRequirements)\n const bundlerUrl = this.bundlerUrl ?? capability?.bundlerUrl;\n if (!bundlerUrl) {\n throw new PaymentCreationError(\n \"Bundler URL not provided\",\n {\n phase: \"validation\",\n reason: \"Set bundlerUrl in ExactEvmSchemeERC4337Config or in payment requirements extra.userOperation.bundlerUrl\",\n network: paymentRequirements.network,\n },\n );\n }\n\n // Normalize addresses\n const token = getAddress(paymentRequirements.asset);\n const payTo = getAddress(paymentRequirements.payTo);\n // Handle both v2 (amount) and v1 (maxAmountRequired) fields\n const amountStr =\n paymentRequirements.amount ??\n ((paymentRequirements as Record<string, unknown>).maxAmountRequired as string | undefined);\n if (!amountStr) {\n throw new Error(\"Payment requirements missing amount (v2) or maxAmountRequired (v1)\");\n }\n const amount = BigInt(amountStr);\n\n // Build ERC20 transfer call data\n const callData = buildERC20TransferCallData(token, payTo, amount);\n\n // Prepare user operation (unsigned)\n let unsignedUserOp;\n try {\n unsignedUserOp = await bundlerClient.prepareUserOperation(\n [\n {\n to: token,\n value: BigInt(0), // ERC20 transfers don't send ETH\n data: callData,\n },\n ],\n entryPoint,\n );\n } catch (error) {\n const aaError = parseAAError(error);\n throw new PaymentCreationError(\n aaError\n ? `Payment preparation failed: ${aaError.reason}`\n : `Payment preparation failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n phase: \"preparation\",\n reason: aaError?.reason ?? (error instanceof Error ? error.message : String(error)),\n network: paymentRequirements.network,\n code: aaError?.code,\n cause: error,\n },\n );\n }\n\n // Sign the user operation\n let signature;\n try {\n signature = await this.signer.signUserOperation(unsignedUserOp);\n } catch (error) {\n const aaError = parseAAError(error);\n throw new PaymentCreationError(\n aaError\n ? `Payment signing failed: ${aaError.reason}`\n : `Payment signing failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n phase: \"signing\",\n reason: aaError?.reason ?? (error instanceof Error ? error.message : String(error)),\n network: paymentRequirements.network,\n code: aaError?.code,\n cause: error,\n },\n );\n }\n\n // Create signed user operation\n const signedUserOp = {\n ...unsignedUserOp,\n signature,\n };\n\n // Convert to JSON-RPC format (bigint -> hex)\n const jsonUserOp = userOpToJson(signedUserOp);\n\n // Build the ERC-4337 payload\n const payload: Erc4337Payload = {\n type: \"erc4337\",\n entryPoint,\n bundlerRpcUrl: bundlerUrl,\n userOperation: jsonUserOp,\n };\n\n return {\n x402Version,\n // v1 requires scheme and network at top level\n ...(x402Version === 1\n ? { scheme: this.scheme, network: paymentRequirements.network }\n : {}),\n payload,\n };\n }\n}\n","import type { Chain, PublicClient, Transport } from \"viem\";\nimport { http } from \"viem\";\nimport type { SmartAccount } from \"viem/account-abstraction\";\nimport { createBundlerClient as createViemBundlerClient } from \"viem/account-abstraction\";\nimport type {\n BundlerClient,\n BundlerClientConfig,\n GasEstimate,\n PreparedUserOperation,\n UserOperationCall,\n} from \"./client\";\nimport type { UserOperation07Json } from \"../../facilitator/types\";\n\n/**\n * Configuration for creating a viem-based bundler client\n */\nexport interface ViemBundlerClientConfig extends BundlerClientConfig {\n /**\n * Viem public client for blockchain interactions\n */\n publicClient: PublicClient<Transport, Chain>;\n\n /**\n * Smart account for user operation preparation (must be a SmartAccount, not a regular Account)\n */\n account: SmartAccount;\n\n /**\n * Chain configuration\n */\n chain: Chain;\n\n /**\n * Bundler RPC URL\n */\n bundlerUrl: string;\n}\n\n/**\n * Viem-based implementation of BundlerClient.\n * Uses viem's account-abstraction utilities for user operation handling.\n */\nexport class ViemBundlerClient implements BundlerClient {\n private readonly bundlerClient: ReturnType<typeof createViemBundlerClient>;\n private readonly account: SmartAccount;\n private readonly entryPoint: `0x${string}`;\n\n /**\n * Creates a new ViemBundlerClient instance.\n *\n * @param config - Configuration for the bundler client\n */\n constructor(config: ViemBundlerClientConfig) {\n this.account = config.account;\n this.entryPoint = \"0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789\" as `0x${string}`; // EntryPoint v0.7\n\n // Create viem bundler client with bundler-specific transport\n this.bundlerClient = createViemBundlerClient({\n client: config.publicClient,\n chain: config.chain,\n account: config.account,\n transport: http(config.bundlerUrl),\n });\n }\n\n /**\n * Prepares an unsigned user operation for the given calls.\n *\n * @param calls - Array of calls to execute in the user operation\n * @param _entryPoint - The entry point address (unused, viem uses the configured entry point)\n * @returns Promise resolving to a prepared (unsigned) user operation\n */\n async prepareUserOperation(\n calls: UserOperationCall[],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _entryPoint: `0x${string}`,\n ): Promise<PreparedUserOperation> {\n const prepared = await this.bundlerClient.prepareUserOperation({\n account: this.account,\n calls: calls.map(call => ({\n to: call.to,\n value: call.value,\n data: call.data,\n })),\n });\n\n // viem v2 EntryPoint v0.7 returns separate fields (not v0.6 paymasterAndData)\n const p = prepared as Record<string, unknown>;\n\n return {\n sender: prepared.sender,\n nonce: prepared.nonce,\n callData: prepared.callData,\n callGasLimit: prepared.callGasLimit,\n verificationGasLimit: prepared.verificationGasLimit,\n preVerificationGas: prepared.preVerificationGas,\n maxFeePerGas: prepared.maxFeePerGas,\n maxPriorityFeePerGas: prepared.maxPriorityFeePerGas,\n // v0.7 factory fields (for account deployment)\n ...(p.factory ? { factory: p.factory as `0x${string}` } : {}),\n ...(p.factoryData ? { factoryData: p.factoryData as `0x${string}` } : {}),\n // v0.7 paymaster fields (separate, not paymasterAndData)\n ...(p.paymaster ? { paymaster: p.paymaster as `0x${string}` } : {}),\n ...(p.paymasterData ? { paymasterData: p.paymasterData as `0x${string}` } : {}),\n ...(p.paymasterVerificationGasLimit != null\n ? { paymasterVerificationGasLimit: p.paymasterVerificationGasLimit as bigint }\n : {}),\n ...(p.paymasterPostOpGasLimit != null\n ? { paymasterPostOpGasLimit: p.paymasterPostOpGasLimit as bigint }\n : {}),\n signature: prepared.signature,\n } as PreparedUserOperation;\n }\n\n /**\n * Estimates gas for a user operation.\n * Note: This is typically done as part of prepareUserOperation,\n * but is available as a separate method for flexibility.\n *\n * @param _userOp - The user operation to estimate gas for\n * @param _entryPoint - The entry point address\n * @returns Promise resolving to gas estimates\n */\n async estimateGas(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _userOp: UserOperation07Json,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _entryPoint: `0x${string}`,\n ): Promise<GasEstimate> {\n // Note: Gas estimation is typically done as part of prepareUserOperation\n // This method is provided for flexibility but may not be used in practice\n // The return type from estimateUserOperationGas doesn't include maxFeePerGas/maxPriorityFeePerGas\n // as those are determined by the network, not the bundler\n throw new Error(\n \"estimateGas should be called through prepareUserOperation, which includes gas estimation\",\n );\n }\n\n /**\n * Sends a user operation to the bundler.\n *\n * @param userOp - The signed user operation to send\n * @param _entryPoint - The entry point address (unused, viem uses the configured entry point)\n * @returns Promise resolving to the user operation hash\n */\n async sendUserOperation(\n userOp: UserOperation07Json,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _entryPoint: `0x${string}`,\n ): Promise<string> {\n // Convert JSON user operation to format expected by viem\n // viem's sendUserOperation accepts UserOperation fields directly (not nested)\n const hash = await this.bundlerClient.sendUserOperation({\n account: this.account,\n sender: userOp.sender as `0x${string}`,\n nonce: BigInt(userOp.nonce),\n callData: userOp.callData as `0x${string}`,\n callGasLimit: BigInt(userOp.callGasLimit),\n verificationGasLimit: BigInt(userOp.verificationGasLimit),\n preVerificationGas: BigInt(userOp.preVerificationGas),\n maxFeePerGas: BigInt(userOp.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(userOp.maxPriorityFeePerGas),\n // Combine paymaster and paymasterData into paymasterAndData\n paymasterAndData:\n userOp.paymaster && userOp.paymasterData\n ? ((userOp.paymaster + userOp.paymasterData.slice(2)) as `0x${string}`)\n : userOp.paymaster\n ? (userOp.paymaster as `0x${string}`)\n : (\"0x\" as `0x${string}`),\n signature: userOp.signature as `0x${string}`,\n });\n\n return hash;\n }\n}\n","import type { SmartAccount } from \"viem/account-abstraction\";\nimport type { PreparedUserOperation } from \"../bundler\";\nimport type { UserOperationSigner } from \"./types\";\n\n/**\n * Adapter to make a SmartAccount (e.g., Safe account) work as a UserOperationSigner.\n *\n * This class wraps a SmartAccount that supports `signUserOperation` and adapts it\n * to the UserOperationSigner interface required by the x402 ERC-4337 scheme.\n *\n * @example\n * ```typescript\n * import { SafeAccountSigner } from \"@introspectivelabs/x402-evm/exact/client\";\n * import { toSafeSmartAccount } from \"permissionless/accounts\";\n *\n * const safeAccount = await toSafeSmartAccount({ ... });\n * const signer = new SafeAccountSigner(safeAccount);\n *\n * const scheme = new ExactEvmSchemeERC4337({\n * bundlerClient,\n * signer,\n * });\n * ```\n */\nexport class SafeAccountSigner implements UserOperationSigner {\n readonly address: `0x${string}`;\n\n /**\n * Creates a new SafeAccountSigner instance.\n *\n * @param account - The SmartAccount instance (e.g., from permissionless/accounts)\n * @throws Error if the account is not initialized or missing an address\n */\n constructor(private readonly account: SmartAccount) {\n if (!account?.address) {\n throw new Error(\"Smart account not initialized\");\n }\n this.address = account.address as `0x${string}`;\n }\n\n /**\n * Signs a prepared (unsigned) user operation.\n *\n * @param userOp - The prepared user operation to sign\n * @returns Promise resolving to the signature\n * @throws Error if the account does not support signUserOperation\n */\n async signUserOperation(userOp: PreparedUserOperation): Promise<`0x${string}`> {\n if (!this.account?.signUserOperation) {\n throw new Error(\"Smart account does not support signUserOperation\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await this.account.signUserOperation(userOp as any);\n }\n}\n","import { type Hex, concat, encodeAbiParameters } from \"viem\";\nimport type { WebAuthnAccount } from \"viem/account-abstraction\";\nimport type { P256Signer, SafeMessageSigner } from \"../../../accounts/types\";\n\n/**\n * Creates a SafeMessageSigner from a P256Signer.\n * The sign method returns concat([r, s]) (64 bytes raw P256 signature).\n */\nexport function createP256SafeMessageSigner(\n p256Signer: P256Signer,\n): SafeMessageSigner {\n return {\n ownerAddress: p256Signer.p256OwnerAddress,\n async sign(safeMessageHash: Hex): Promise<Hex> {\n const { r, s } = await p256Signer.sign(safeMessageHash);\n return concat([r, s]);\n },\n };\n}\n\n/**\n * Creates a SafeMessageSigner from a WebAuthnAccount.\n * The sign method triggers navigator.credentials.get() and returns\n * ABI-encoded WebAuthn struct compatible with Safe's verifier.\n *\n * @param webAuthnAccount - viem WebAuthnAccount (wraps credential + getFn)\n * @param deployedSignerAddress - Address of the per-credential signer deployed\n * via SafeWebAuthnSignerFactory (NOT the SharedSigner)\n */\nexport function createWebAuthnSafeMessageSigner(\n webAuthnAccount: WebAuthnAccount,\n deployedSignerAddress: Hex,\n): SafeMessageSigner {\n return {\n ownerAddress: deployedSignerAddress,\n async sign(safeMessageHash: Hex): Promise<Hex> {\n return encodeWebAuthnSignature(webAuthnAccount, safeMessageHash);\n },\n };\n}\n\n/**\n * Encodes a WebAuthn signature from raw sign() output into the ABI format\n * expected by Safe's WebAuthn verifier:\n * `(bytes authenticatorData, string clientDataFields, uint256[2] signature)`\n */\nasync function encodeWebAuthnSignature(\n owner: WebAuthnAccount,\n hash: Hex,\n): Promise<Hex> {\n const { signature: signatureData, webauthn } = await owner.sign({ hash });\n\n const sigBytes = signatureData.slice(2);\n const r = BigInt(\"0x\" + sigBytes.slice(0, 64));\n const s = BigInt(\"0x\" + sigBytes.slice(64, 128));\n\n const match = webauthn.clientDataJSON.match(\n /^\\{\"type\":\"webauthn.get\",\"challenge\":\"[A-Za-z0-9\\-_]{43}\",(.*)\\}$/,\n );\n const clientDataFields = match ? match[1] : \"\";\n\n return encodeAbiParameters(\n [\n { name: \"authenticatorData\", type: \"bytes\" },\n { name: \"clientDataFields\", type: \"string\" },\n { name: \"signature\", type: \"uint256[2]\" },\n ],\n [webauthn.authenticatorData, clientDataFields, [r, s]],\n );\n}\n","import { PaymentRequirements } from \"@x402/core/types\";\nimport { UserOperationCapability } from \"./types\";\n\n/**\n * Extracts the user operation capability from the payment requirements.\n *\n * @param requirements - The payment requirements\n * @returns The user operation capability\n */\nexport function extractUserOperationCapability(\n requirements: PaymentRequirements,\n): UserOperationCapability | undefined {\n const userOpExtra = requirements.extra?.userOperation;\n if (\n userOpExtra &&\n typeof userOpExtra === \"object\" &&\n \"supported\" in userOpExtra &&\n userOpExtra.supported === true\n ) {\n return userOpExtra as UserOperationCapability;\n }\n return undefined;\n}\n","import { encodeFunctionData } from \"viem\";\n\n/**\n * Standard ERC20 transfer function ABI\n */\nexport const ERC20_TRANSFER_ABI = [\n {\n type: \"function\",\n name: \"transfer\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"success\", type: \"bool\" }],\n },\n] as const;\n\n/**\n * Builds ERC20 transfer call data.\n *\n * @param token - The ERC20 token contract address\n * @param to - The recipient address\n * @param amount - The amount to transfer (in token's smallest unit)\n * @returns The encoded call data for the transfer function\n */\nexport function buildERC20TransferCallData(\n token: `0x${string}`,\n to: `0x${string}`,\n amount: bigint,\n): `0x${string}` {\n return encodeFunctionData({\n abi: ERC20_TRANSFER_ABI,\n functionName: \"transfer\",\n args: [to, amount],\n });\n}\n","import type { Hex } from \"viem\";\nimport type { UserOperation07Json } from \"../../facilitator/types\";\n\n/**\n * Converts a bigint value to a hex string in JSON-RPC format.\n *\n * @param value - The bigint value to convert\n * @returns The hex string representation\n */\nfunction toRpcHex(value: bigint): Hex {\n return `0x${value.toString(16)}` as Hex;\n}\n\n/**\n * Converts a user operation with bigint values to JSON-RPC compatible format.\n * This recursively converts all bigint values to hex strings.\n *\n * @param userOp - The user operation object (may contain bigints)\n * @returns The user operation in JSON-RPC format (all bigints converted to hex)\n */\nexport function userOpToJson(userOp: Record<string, unknown>): UserOperation07Json {\n const json: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(userOp)) {\n // Skip internal viem fields that bundlers reject\n if (key === \"account\") continue;\n\n if (typeof value === \"bigint\") {\n json[key] = toRpcHex(value);\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n // Recursively handle nested objects with bigints\n const inner: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n inner[k] = typeof v === \"bigint\" ? toRpcHex(v) : v;\n }\n json[key] = inner;\n } else {\n json[key] = value;\n }\n }\n\n return json as UserOperation07Json;\n}\n","export type PaymentCreationPhase = \"preparation\" | \"signing\" | \"validation\";\n\nconst AA_ERROR_MESSAGES: Record<string, string> = {\n AA10: \"Sender already constructed\",\n AA13: \"InitCode failed or OOG\",\n AA14: \"InitCode must return sender\",\n AA15: \"InitCode must create sender\",\n AA20: \"Account not deployed\",\n AA21: \"Insufficient funds for gas prefund\",\n AA22: \"Expired or not due\",\n AA23: \"Reverted (or OOG)\",\n AA24: \"Signature validation failed\",\n AA25: \"Nonce validation failed\",\n AA26: \"Account accessed global state\",\n AA30: \"Paymaster not deployed\",\n AA31: \"Paymaster deposit too low\",\n AA32: \"Paymaster expired or not due\",\n AA33: \"Paymaster reverted (or OOG)\",\n AA34: \"Paymaster context reverted\",\n AA40: \"Over verification gas limit\",\n AA41: \"Over max fee per gas\",\n AA50: \"Over max priority fee per gas\",\n AA51: \"Prefund below actualGasCost\",\n};\n\n/**\n * Extracts an AA error code (e.g. \"AA21\") from an error and returns\n * a human-readable reason. Returns null if no AA code is found.\n */\nexport function parseAAError(error: unknown): { code: string; reason: string } | null {\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/\\b(AA[0-9]{2})\\b/);\n if (!match) return null;\n const code = match[1];\n const reason = AA_ERROR_MESSAGES[code] ?? \"Unknown AA error\";\n return { code, reason };\n}\n\nexport class PaymentCreationError extends Error {\n readonly phase: PaymentCreationPhase;\n readonly reason: string;\n readonly safeAddress?: string;\n readonly network?: string;\n readonly code?: string;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n phase: PaymentCreationPhase;\n reason: string;\n safeAddress?: string;\n network?: string;\n code?: string;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = \"PaymentCreationError\";\n if (options.cause !== undefined) {\n this.cause = options.cause;\n }\n this.phase = options.phase;\n this.reason = options.reason;\n this.safeAddress = options.safeAddress;\n this.network = options.network;\n this.code = options.code;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n phase: this.phase,\n reason: this.reason,\n ...(this.code && { code: this.code }),\n ...(this.safeAddress && { safeAddress: this.safeAddress }),\n ...(this.network && { network: this.network }),\n };\n }\n}\n","import type { ChainInfo } from \"./types\";\n\nexport const SUPPORTED_CHAINS: Record<number, ChainInfo> = {\n 8453: {\n chainId: 8453,\n name: \"Base\",\n v1Name: \"base\",\n caip2: \"eip155:8453\",\n rpcUrl: \"https://mainnet.base.org\",\n blockExplorerUrl: \"https://basescan.org\",\n usdcAddress: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n safeTransactionServiceUrl: \"https://safe-transaction-base.safe.global\",\n testnet: false,\n },\n 84532: {\n chainId: 84532,\n name: \"Base Sepolia\",\n v1Name: \"base-sepolia\",\n caip2: \"eip155:84532\",\n rpcUrl: \"https://sepolia.base.org\",\n blockExplorerUrl: \"https://sepolia.basescan.org\",\n usdcAddress: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n safeTransactionServiceUrl:\n \"https://safe-transaction-base-sepolia.safe.global\",\n testnet: true,\n },\n 10: {\n chainId: 10,\n name: \"Optimism\",\n v1Name: \"optimism\",\n caip2: \"eip155:10\",\n rpcUrl: \"https://mainnet.optimism.io\",\n blockExplorerUrl: \"https://optimistic.etherscan.io\",\n usdcAddress: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n safeTransactionServiceUrl:\n \"https://safe-transaction-optimism.safe.global\",\n testnet: false,\n },\n 11155420: {\n chainId: 11155420,\n name: \"Optimism Sepolia\",\n v1Name: \"optimism-sepolia\",\n caip2: \"eip155:11155420\",\n rpcUrl: \"https://sepolia.optimism.io\",\n blockExplorerUrl: \"https://sepolia-optimistic.etherscan.io\",\n usdcAddress: \"0x5fd84259d66Cd46123540766Be93DFE6D43130D7\",\n safeTransactionServiceUrl: undefined,\n testnet: true,\n },\n 42161: {\n chainId: 42161,\n name: \"Arbitrum One\",\n v1Name: \"arbitrum\",\n caip2: \"eip155:42161\",\n rpcUrl: \"https://arb1.arbitrum.io/rpc\",\n blockExplorerUrl: \"https://arbiscan.io\",\n usdcAddress: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n safeTransactionServiceUrl:\n \"https://safe-transaction-arbitrum.safe.global\",\n testnet: false,\n },\n 421614: {\n chainId: 421614,\n name: \"Arbitrum Sepolia\",\n v1Name: \"arbitrum-sepolia\",\n caip2: \"eip155:421614\",\n rpcUrl: \"https://sepolia-rollup.arbitrum.io/rpc\",\n blockExplorerUrl: \"https://sepolia.arbiscan.io\",\n usdcAddress: \"0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d\",\n safeTransactionServiceUrl: undefined,\n testnet: true,\n },\n};\n\nexport const V1_NAME_INDEX: Map<string, ChainInfo> = new Map(\n Object.values(SUPPORTED_CHAINS).map((chain) => [chain.v1Name, chain]),\n);\n","import type { CAIP2Identifier, ChainInfo, NetworkInput } from \"./types\";\nimport { SUPPORTED_CHAINS, V1_NAME_INDEX } from \"./registry\";\n\nexport function parseCAIP2(caip2: string): number {\n const match = caip2.match(/^eip155:(\\d+)$/);\n if (!match) {\n throw new Error(\n `Invalid CAIP-2 identifier: ${caip2}. Expected format: eip155:{chainId}`,\n );\n }\n return parseInt(match[1], 10);\n}\n\nexport function toCAIP2(chainId: number): CAIP2Identifier {\n return `eip155:${chainId}` as CAIP2Identifier;\n}\n\nexport function resolveChainId(network: NetworkInput): number {\n if (typeof network === \"number\") {\n return network;\n }\n if (network.startsWith(\"eip155:\")) {\n return parseCAIP2(network);\n }\n const chain = V1_NAME_INDEX.get(network);\n if (!chain) {\n throw new Error(\n `Unknown network: ${network}. Expected CAIP-2 (eip155:chainId), a known v1 name, or a numeric chain ID.`,\n );\n }\n return chain.chainId;\n}\n\nexport function getV1Name(chainId: number): string | undefined {\n return SUPPORTED_CHAINS[chainId]?.v1Name;\n}\n\nexport function getV1Names(chainId: number): string[] {\n const name = getV1Name(chainId);\n return name ? [name] : [];\n}\n\nexport function isSupported(chainId: number): boolean {\n return chainId in SUPPORTED_CHAINS;\n}\n\nexport function getChainById(chainId: number): ChainInfo | undefined {\n return SUPPORTED_CHAINS[chainId];\n}\n\nexport function getChain(network: NetworkInput): ChainInfo {\n const chainId = resolveChainId(network);\n const chain = SUPPORTED_CHAINS[chainId];\n if (!chain) {\n throw new Error(\n `Chain ${chainId} is not in the supported chains registry.`,\n );\n }\n return chain;\n}\n\nexport function getSupportedChains(): ChainInfo[] {\n return Object.values(SUPPORTED_CHAINS);\n}\n\nexport function getMainnets(): ChainInfo[] {\n return Object.values(SUPPORTED_CHAINS).filter((c) => !c.testnet);\n}\n\nexport function getTestnets(): ChainInfo[] {\n return Object.values(SUPPORTED_CHAINS).filter((c) => c.testnet);\n}\n","import type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport {\n type Hex,\n getAddress,\n hashTypedData,\n toHex,\n} from \"viem\";\nimport type { SafeMessageSigner } from \"../../../accounts/types\";\nimport { encodeContractSignature } from \"../../../accounts/encodeContractSignature\";\nimport { computeSafeMessageHash } from \"../../../accounts/computeSafeMessageHash\";\nimport { resolveChainId } from \"../../../networks\";\n\nconst authorizationTypes = {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n} as const;\n\nfunction createNonce(): Hex {\n const cryptoObj = globalThis.crypto;\n if (!cryptoObj) throw new Error(\"Crypto API not available\");\n return toHex(cryptoObj.getRandomValues(new Uint8Array(32)));\n}\n\nexport interface ExactEvmSchemeEIP3009Config {\n safeAddress: Hex;\n signer: SafeMessageSigner;\n}\n\n/**\n * EVM client scheme that produces standard EIP-3009 `{ authorization, signature }`\n * payloads from a Safe Smart Account using EIP-1271 contract signatures.\n *\n * Unlike ExactEvmSchemeERC4337 (which creates UserOperation payloads), this scheme\n * creates payloads compatible with any standard x402 facilitator. The facilitator\n * verifies via `verifyTypedData` (which falls back to EIP-1271 for contract addresses)\n * and settles via `transferWithAuthorization(bytes)` (which uses SignatureChecker).\n *\n * Signing flow:\n * 1. Build EIP-3009 authorization (from=Safe, to=payTo, value, nonce, etc.)\n * 2. Compute EIP-712 hash of the authorization\n * 3. Wrap in Safe's message hash (what isValidSignature expects)\n * 4. Sign the Safe message hash via SafeMessageSigner (P256 or WebAuthn)\n * 5. Encode as Safe contract signature (v=0 format)\n *\n * Prerequisites:\n * - Safe must be deployed (EIP-1271 requires on-chain code)\n * - Safe must hold USDC balance (EIP-3009 transfers directly)\n * - USDC must support transferWithAuthorization(bytes) overload (v2.2+)\n */\nexport class ExactEvmSchemeEIP3009 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n private readonly safeAddress: Hex;\n private readonly signer: SafeMessageSigner;\n\n constructor(config: ExactEvmSchemeEIP3009Config) {\n this.safeAddress = config.safeAddress;\n this.signer = config.signer;\n }\n\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"x402Version\" | \"payload\">> {\n const chainId = resolveChainId(paymentRequirements.network);\n\n // v1 uses maxAmountRequired, v2 uses amount\n const amount =\n paymentRequirements.amount ??\n ((paymentRequirements as Record<string, unknown>).maxAmountRequired as string | undefined);\n\n if (!amount) {\n throw new Error(\"Payment requirements missing amount (v2) or maxAmountRequired (v1)\");\n }\n\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization = {\n from: getAddress(this.safeAddress),\n to: getAddress(paymentRequirements.payTo),\n value: amount,\n validAfter: (now - 600).toString(),\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n // Build EIP-712 domain from payment requirements extra fields\n const extra = paymentRequirements.extra as Record<string, unknown> | undefined;\n if (!extra?.name || !extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${paymentRequirements.asset}`,\n );\n }\n\n const domain = {\n name: extra.name as string,\n version: extra.version as string,\n chainId,\n verifyingContract: getAddress(paymentRequirements.asset) as Hex,\n };\n\n const message = {\n from: getAddress(authorization.from) as Hex,\n to: getAddress(authorization.to) as Hex,\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce as Hex,\n };\n\n // Step 1: Compute the EIP-712 typed data hash\n const eip712Hash = hashTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n\n // Step 2: Wrap in Safe's message hash (what Safe.isValidSignature expects)\n const safeMessageHash = computeSafeMessageHash(\n this.safeAddress,\n chainId,\n eip712Hash,\n );\n\n // Step 3: Sign the Safe message hash (P256 or WebAuthn)\n const innerSignature = await this.signer.sign(safeMessageHash);\n\n // Step 4: Encode as Safe contract signature (v=0)\n const signature = encodeContractSignature(\n this.signer.ownerAddress,\n innerSignature,\n );\n\n const payload = { authorization, signature };\n\n return {\n x402Version,\n ...(x402Version === 1\n ? { scheme: this.scheme, network: paymentRequirements.network }\n : {}),\n payload,\n };\n }\n}\n","import { type Hex, concat, pad, toHex } from \"viem\";\n\n/**\n * Encodes a signature in Safe's contract signature format (v=0).\n *\n * Safe's `checkNSignatures` expects this layout for contract owners:\n *\n * Static part (65 bytes):\n * - r (32 bytes): owner address padded to 32 bytes\n * - s (32 bytes): offset to dynamic data (relative to start of signatures)\n * - v (1 byte): 0x00 (indicates contract signature)\n *\n * Dynamic part (at the offset):\n * - length (32 bytes): length of the signature data\n * - data (variable): the actual signature bytes\n *\n * For a single signer, the static part is 65 bytes, so the dynamic data\n * starts at offset 65.\n */\nexport function encodeContractSignature(ownerAddress: Hex, signatureData: Hex): Hex {\n // Static part: r = address padded to 32 bytes\n const r = pad(ownerAddress, { size: 32 });\n\n // For a single signature, dynamic data starts right after the 65-byte static part\n const dynamicOffset = 65;\n const s = pad(toHex(dynamicOffset), { size: 32 });\n\n // v = 0x00 for contract signature\n const v = \"0x00\" as Hex;\n\n // Dynamic part: length-prefixed signature data\n const signatureBytes = (signatureData.length - 2) / 2;\n const length = pad(toHex(signatureBytes), { size: 32 });\n\n return concat([r, s, v, length, signatureData]);\n}\n","import {\n type Hex,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n} from \"viem\";\n\nconst DOMAIN_SEPARATOR_TYPEHASH = keccak256(\n encodePacked(\n [\"string\"],\n [\"EIP712Domain(uint256 chainId,address verifyingContract)\"],\n ),\n);\n\nconst SAFE_MSG_TYPEHASH = keccak256(\n encodePacked([\"string\"], [\"SafeMessage(bytes message)\"]),\n);\n\n/**\n * Computes the Safe message hash for EIP-1271 signature verification.\n *\n * This is what Safe's `isValidSignature(hash, sig)` expects: the hash is\n * first wrapped in Safe's EIP-712 domain before `checkNSignatures` runs.\n *\n * Flow: keccak256(0x19 || 0x01 || domainSeparator || structHash)\n * where structHash = keccak256(SAFE_MSG_TYPEHASH || keccak256(abi.encode(messageHash)))\n */\nexport function computeSafeMessageHash(\n safeAddress: Hex,\n chainId: number,\n messageHash: Hex,\n): Hex {\n const domainSeparator = keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"uint256\" }, { type: \"address\" }],\n [DOMAIN_SEPARATOR_TYPEHASH, BigInt(chainId), safeAddress],\n ),\n );\n\n const encodedMessage = encodeAbiParameters(\n [{ type: \"bytes32\" }],\n [messageHash],\n );\n const messageHashInner = keccak256(encodedMessage);\n\n const structHash = keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"bytes32\" }],\n [SAFE_MSG_TYPEHASH, messageHashInner],\n ),\n );\n\n return keccak256(\n encodePacked(\n [\"bytes1\", \"bytes1\", \"bytes32\", \"bytes32\"],\n [\"0x19\", \"0x01\", domainSeparator, structHash],\n ),\n );\n}\n","import { encodeAbiParameters, keccak256, type Hex } from \"viem\";\nimport { entryPoint07Address } from \"../../../constants\";\n\nexport interface PackedUserOp {\n sender: Hex;\n nonce: bigint;\n initCode: Hex;\n callData: Hex;\n accountGasLimits: Hex;\n preVerificationGas: bigint;\n gasFees: Hex;\n paymasterAndData: Hex;\n}\n\n/**\n * Compute the UserOperation hash for EntryPoint v0.7 packed format.\n *\n * The hash is computed as:\n * keccak256(abi.encode(keccak256(pack(userOp)), entryPoint, chainId))\n *\n * where pack(userOp) encodes the UserOp fields with initCode, callData,\n * and paymasterAndData replaced by their keccak256 hashes.\n */\nexport function computeUserOpHash(\n packedUserOp: PackedUserOp,\n chainId: number,\n entrypoint: Hex = entryPoint07Address,\n): Hex {\n const encoded = encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n ],\n [\n packedUserOp.sender,\n packedUserOp.nonce,\n keccak256(packedUserOp.initCode),\n keccak256(packedUserOp.callData),\n packedUserOp.accountGasLimits,\n packedUserOp.preVerificationGas,\n packedUserOp.gasFees,\n keccak256(packedUserOp.paymasterAndData),\n ],\n );\n\n const innerHash = keccak256(encoded);\n\n return keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"address\" }, { type: \"uint256\" }],\n [innerHash, entrypoint, BigInt(chainId)],\n ),\n );\n}\n","import type { Hex } from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\n\nexport { entryPoint07Address };\n\nexport const SAFE_4337_MODULE_ADDRESS =\n \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as const satisfies Hex;\n\nexport const SAFE_WEBAUTHN_SHARED_SIGNER =\n \"0xfD90FAd33ee8b58f32c00aceEad1358e4AFC23f9\" as const satisfies Hex;\n\nexport const FCL_P256_VERIFIER =\n \"0xA86e0054C51E4894D88762a017ECc5E5235f5DBA\" as const satisfies Hex;\n\nexport const P256_OWNER_FACTORY =\n \"0x349c03Eb61e26528cbf79F5D3Ba071FcA2aE82cB\" as const satisfies Hex;\n\nexport const WEBAUTHN_SIGNER_FACTORY =\n \"0xF7488fFbe67327ac9f37D5F722d83Fc900852Fbf\" as const satisfies Hex;\n\nexport const GUARD_FACTORY =\n \"0x35E2B487b682029e363BA7f06fD7392834A83077\" as const satisfies Hex;\n"],"mappings":"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","names":["import_viem","createViemBundlerClient","import_viem","import_viem","bundlerUrl","import_viem","import_viem","import_viem","import_viem","import_account_abstraction"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/exact/client/index.ts","../../../../src/exact/client/schemes/erc4337.ts","../../../../src/exact/client/bundler/viem.ts","../../../../src/exact/client/signers/safeAccountSigner.ts","../../../../src/exact/client/signers/safeMessageSigners.ts","../../../../src/exact/utils.ts","../../../../src/exact/client/utils/callData.ts","../../../../src/exact/client/utils/userOperation.ts","../../../../src/exact/client/errors.ts","../../../../src/networks/registry.ts","../../../../src/networks/helpers.ts","../../../../src/exact/client/schemes/eip3009.ts","../../../../src/accounts/encodeContractSignature.ts","../../../../src/accounts/computeSafeMessageHash.ts","../../../../src/exact/client/utils/userOpHash.ts","../../../../src/constants.ts"],"sourcesContent":["export * from \"./schemes\";\nexport * from \"./signers\";\nexport { PaymentCreationError, parseAAError } from \"./errors\";\nexport type { PaymentCreationPhase } from \"./errors\";\nexport * from \"./bundler\";\nexport * from \"./utils\";\n","import type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@x402/core/types\";\nimport {\n getAddress,\n createPublicClient,\n http,\n type Chain,\n type PublicClient,\n type Transport,\n Hex,\n} from \"viem\";\nimport * as allChains from \"viem/chains\";\nimport { defineChain } from \"viem\";\nimport type { SmartAccount } from \"viem/account-abstraction\";\nimport type { BundlerClient } from \"../bundler\";\nimport { ViemBundlerClient } from \"../bundler/viem\";\nimport type { UserOperationSigner } from \"../signers\";\nimport { SafeAccountSigner } from \"../signers\";\nimport { extractUserOperationCapability } from \"../../utils\";\nimport type { Erc4337Payload } from \"../../facilitator/types\";\nimport { buildERC20TransferCallData } from \"../utils/callData\";\nimport { userOpToJson } from \"../utils/userOperation\";\nimport { PaymentCreationError, parseAAError } from \"../errors\";\nimport { resolveChainId } from \"../../../networks\";\n\n/**\n * Base configuration properties shared by all configuration variants\n */\ninterface ExactEvmSchemeERC4337ConfigBase {\n /**\n * Entry point address (EntryPoint v0.7)\n * Optional - can be provided in payment requirements if not set here\n */\n entrypoint?: Hex;\n\n /**\n * Bundler URL (optional, can be provided in payment requirements)\n */\n bundlerUrl?: string;\n}\n\n/**\n * Configuration variant when bundlerClient is explicitly provided.\n * Account and publicClient are NOT needed when bundlerClient is used.\n * Signer is required when using bundlerClient.\n */\ntype ExactEvmSchemeERC4337ConfigWithBundler = ExactEvmSchemeERC4337ConfigBase & {\n /**\n * Bundler client for preparing and sending user operations.\n */\n bundlerClient: BundlerClient;\n /**\n * Signer for signing user operations (required when bundlerClient is provided).\n */\n signer: UserOperationSigner;\n} & {\n /**\n * Account must not be provided when bundlerClient is used.\n * Using `never` type prevents this property from being set.\n */\n account?: never;\n /**\n * Public client must not be provided when bundlerClient is used.\n * The bundlerClient already has its own publicClient configured.\n */\n publicClient?: never;\n};\n\n/**\n * Configuration variant when bundlerClient is not provided.\n * Account is required for dynamic bundlerClient creation.\n * Signer is optional - will be auto-created from account if not provided.\n * PublicClient is optional - will create a default from network if not provided.\n */\ntype ExactEvmSchemeERC4337ConfigWithAccount = ExactEvmSchemeERC4337ConfigBase & {\n /**\n * Bundler client is not provided - will be created dynamically from PaymentRequirements.\n * Using `never` type prevents this property from being set.\n */\n bundlerClient?: never;\n} & {\n /**\n * Smart account for user operation preparation.\n * Required when bundlerClient is not provided.\n */\n account: SmartAccount;\n /**\n * Signer for signing user operations.\n * Optional - will be auto-created from account using SafeAccountSigner if not provided.\n * The account must support signUserOperation method for auto-creation to work.\n */\n signer?: UserOperationSigner;\n /**\n * Public client for blockchain interactions.\n * Optional - will create a default from network if not provided.\n */\n publicClient?: PublicClient<Transport, Chain>;\n};\n\n/**\n * Configuration for the ERC-4337 client scheme.\n *\n * This is a discriminated union that enforces type-safe combinations:\n * - Either `bundlerClient` is provided (account and publicClient must NOT be provided)\n * - Or `account` is provided when bundlerClient is not (for dynamic creation, publicClient optional)\n *\n * @example\n * ```typescript\n * // Minimal config (just account - signer auto-created)\n * const scheme1 = new ExactEvmSchemeERC4337({\n * account: myAccount,\n * // signer will be auto-created from account\n * // bundlerClient will be created dynamically from PaymentRequirements\n * });\n *\n * // With account and custom signer\n * const scheme2 = new ExactEvmSchemeERC4337({\n * account: myAccount,\n * signer: myCustomSigner,\n * publicClient: myPublicClient, // Optional\n * });\n *\n * // With explicit bundlerClient (backward compatible)\n * const scheme3 = new ExactEvmSchemeERC4337({\n * bundlerClient: myBundlerClient,\n * signer: mySigner, // Required when bundlerClient is provided\n * // account and publicClient must NOT be provided (bundlerClient has its own)\n * });\n * ```\n */\nexport type ExactEvmSchemeERC4337Config =\n | ExactEvmSchemeERC4337ConfigWithBundler\n | ExactEvmSchemeERC4337ConfigWithAccount;\n\n/**\n * Resolves a network string to a Chain object.\n * Handles both CAIP-2 format (\"eip155:84532\") and v1 plain names (\"base-sepolia\").\n *\n * @param network - Network string in CAIP-2 or v1 plain name format\n * @returns The Chain object\n */\nfunction resolveChain(network: string): Chain {\n const chainId = resolveChainId(network);\n\n const known = Object.values(allChains).find((c: Chain) => c.id === chainId);\n if (known) return known;\n\n return defineChain({\n id: chainId,\n name: network,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: { default: { http: [] } },\n });\n}\n\n/**\n * Creates a default public client from a network string.\n *\n * @param network - The network string in CAIP-2 format (e.g., \"eip155:84532\")\n * @returns A PublicClient instance\n */\nfunction createDefaultPublicClient(network: string): PublicClient<Transport, Chain> {\n const chain = resolveChain(network);\n return createPublicClient({\n chain,\n transport: http(),\n });\n}\n\n/**\n * EVM client implementation for the Exact payment scheme using ERC-4337 UserOperations.\n *\n * This implementation creates payment payloads by building and signing UserOperations\n * that execute ERC20 transfers. The UserOperations are prepared using a bundler client\n * and signed using a user operation signer (e.g., Safe account, EOA).\n *\n * Supports minimal configuration: when bundlerClient is not provided and\n * PaymentRequirements.extra.userOperation.supported is true, a ViemBundlerClient\n * will be created dynamically from the payment requirements.\n *\n * @example\n * ```typescript\n * // Minimal config (just account - signer and bundlerClient auto-created)\n * import { ExactEvmSchemeERC4337 } from '@introspectivelabs/x402-evm/exact/client';\n * import { x402Client } from '@x402/core/client';\n *\n * const scheme = new ExactEvmSchemeERC4337({\n * account: safeAccount, // SmartAccount - signer will be auto-created\n * });\n *\n * // With custom signer\n * const scheme2 = new ExactEvmSchemeERC4337({\n * account: safeAccount,\n * signer: customSigner, // Optional - overrides auto-creation\n * });\n *\n * // Explicit config (backward compatible)\n * import { ViemBundlerClient } from '@introspectivelabs/x402-evm/exact/client/bundler';\n *\n * const bundlerClient = new ViemBundlerClient({\n * publicClient,\n * account,\n * chain,\n * bundlerUrl: 'https://bundler.example.com',\n * });\n *\n * const scheme3 = new ExactEvmSchemeERC4337({\n * bundlerClient,\n * signer: account, // Required when bundlerClient is provided\n * });\n *\n * const client = new x402Client();\n * client.register('eip155:84532', scheme);\n * ```\n */\nexport class ExactEvmSchemeERC4337 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n private readonly bundlerClient?: BundlerClient;\n private readonly account?: SmartAccount;\n private readonly publicClient?: PublicClient<Transport, Chain>;\n private readonly signer: UserOperationSigner;\n private readonly entrypoint?: Hex;\n private readonly bundlerUrl?: string;\n\n /**\n * Creates a new ExactEvmSchemeERC4337 instance.\n *\n * @param config - Configuration for the scheme (type-safe: either bundlerClient or account must be provided)\n * @throws Error if bundlerClient is not provided and account is also not provided (runtime safety check)\n * @throws Error if signer is not provided and account doesn't support signUserOperation\n */\n constructor(config: ExactEvmSchemeERC4337Config) {\n this.bundlerClient = config.bundlerClient;\n this.account = config.account;\n this.publicClient = config.publicClient;\n this.entrypoint = config.entrypoint;\n this.bundlerUrl = config.bundlerUrl;\n\n // Validate: if bundlerClient is not provided, account must be provided\n if (!this.bundlerClient && !this.account) {\n throw new Error(\n \"Either bundlerClient or account must be provided. \" +\n \"If bundlerClient is not provided, account (SmartAccount) is required for dynamic bundlerClient creation.\",\n );\n }\n\n // Handle signer: use provided signer or auto-create from account\n if (config.signer) {\n this.signer = config.signer;\n } else if (this.account) {\n // Auto-create signer from account if not provided\n if (!this.account.signUserOperation) {\n throw new Error(\n \"Account does not support signUserOperation. \" +\n \"Either provide a signer explicitly or use an account that supports signUserOperation.\",\n );\n }\n this.signer = new SafeAccountSigner(this.account);\n } else {\n // This should not happen due to type system, but add runtime check for safety\n throw new Error(\n \"Signer is required when bundlerClient is provided. \" +\n \"Either provide a signer explicitly or use account-based configuration.\",\n );\n }\n }\n\n /**\n * Creates a payment payload for the Exact scheme using ERC-4337 UserOperations.\n *\n * This method:\n * 1. Extracts user operation capability from payment requirements\n * 2. Creates bundlerClient dynamically if not provided (when userOperation.supported is true)\n * 3. Builds ERC20 transfer call data\n * 4. Prepares the user operation using the bundler client\n * 5. Signs the user operation\n * 6. Converts to JSON-RPC format\n * 7. Returns the x402 payment payload\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n * @throws Error if user operation capability is not found or required fields are missing\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"x402Version\" | \"payload\">> {\n // Extract user operation capability (optional - config defaults used when missing)\n const capability = extractUserOperationCapability(paymentRequirements);\n\n // Determine which bundlerClient to use\n let bundlerClient: BundlerClient;\n\n if (this.bundlerClient) {\n // Use provided bundlerClient (explicit config, backward compatible)\n bundlerClient = this.bundlerClient;\n } else {\n // Create bundlerClient dynamically from PaymentRequirements\n if (!this.account) {\n throw new Error(\n \"Account (SmartAccount) is required when bundlerClient is not provided. \" +\n \"Either provide bundlerClient in config or account for dynamic creation.\",\n );\n }\n\n // Get bundler URL (prioritize config defaults over PaymentRequirements)\n const bundlerUrl = this.bundlerUrl ?? capability?.bundlerUrl;\n if (!bundlerUrl) {\n throw new PaymentCreationError(\n \"Bundler URL not provided\",\n {\n phase: \"validation\",\n reason: \"Set bundlerUrl in ExactEvmSchemeERC4337Config or in payment requirements extra.userOperation.bundlerUrl\",\n network: paymentRequirements.network,\n },\n );\n }\n\n // Derive chain from network (supports both CAIP-2 and v1 plain names)\n const chain = resolveChain(paymentRequirements.network);\n\n // Use provided publicClient or create default from network\n const publicClient =\n this.publicClient ?? createDefaultPublicClient(paymentRequirements.network);\n\n // Create ViemBundlerClient dynamically\n bundlerClient = new ViemBundlerClient({\n publicClient,\n account: this.account,\n chain,\n bundlerUrl,\n });\n }\n\n // Get entry point (prioritize config defaults over PaymentRequirements)\n const entryPoint = this.entrypoint ?? (capability?.entrypoint as `0x${string}` | undefined);\n\n if (!entryPoint) {\n throw new PaymentCreationError(\n \"Entry point not provided\",\n {\n phase: \"validation\",\n reason: \"Set entrypoint in ExactEvmSchemeERC4337Config or in payment requirements extra.userOperation.entrypoint\",\n network: paymentRequirements.network,\n },\n );\n }\n\n // Get bundler URL (prioritize config defaults over PaymentRequirements)\n const bundlerUrl = this.bundlerUrl ?? capability?.bundlerUrl;\n if (!bundlerUrl) {\n throw new PaymentCreationError(\n \"Bundler URL not provided\",\n {\n phase: \"validation\",\n reason: \"Set bundlerUrl in ExactEvmSchemeERC4337Config or in payment requirements extra.userOperation.bundlerUrl\",\n network: paymentRequirements.network,\n },\n );\n }\n\n // Normalize addresses\n const token = getAddress(paymentRequirements.asset);\n const payTo = getAddress(paymentRequirements.payTo);\n // Handle both v2 (amount) and v1 (maxAmountRequired) fields\n const amountStr =\n paymentRequirements.amount ??\n ((paymentRequirements as Record<string, unknown>).maxAmountRequired as string | undefined);\n if (!amountStr) {\n throw new Error(\"Payment requirements missing amount (v2) or maxAmountRequired (v1)\");\n }\n const amount = BigInt(amountStr);\n\n // Build ERC20 transfer call data\n const callData = buildERC20TransferCallData(token, payTo, amount);\n\n // Prepare user operation (unsigned)\n let unsignedUserOp;\n try {\n unsignedUserOp = await bundlerClient.prepareUserOperation(\n [\n {\n to: token,\n value: BigInt(0), // ERC20 transfers don't send ETH\n data: callData,\n },\n ],\n entryPoint,\n );\n } catch (error) {\n const aaError = parseAAError(error);\n throw new PaymentCreationError(\n aaError\n ? `Payment preparation failed: ${aaError.reason}`\n : `Payment preparation failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n phase: \"preparation\",\n reason: aaError?.reason ?? (error instanceof Error ? error.message : String(error)),\n network: paymentRequirements.network,\n code: aaError?.code,\n cause: error,\n },\n );\n }\n\n // Sign the user operation\n let signature;\n try {\n signature = await this.signer.signUserOperation(unsignedUserOp);\n } catch (error) {\n const aaError = parseAAError(error);\n throw new PaymentCreationError(\n aaError\n ? `Payment signing failed: ${aaError.reason}`\n : `Payment signing failed: ${error instanceof Error ? error.message : String(error)}`,\n {\n phase: \"signing\",\n reason: aaError?.reason ?? (error instanceof Error ? error.message : String(error)),\n network: paymentRequirements.network,\n code: aaError?.code,\n cause: error,\n },\n );\n }\n\n // Create signed user operation\n const signedUserOp = {\n ...unsignedUserOp,\n signature,\n };\n\n // Convert to JSON-RPC format (bigint -> hex)\n const jsonUserOp = userOpToJson(signedUserOp);\n\n // Build the ERC-4337 payload\n const payload: Erc4337Payload = {\n type: \"erc4337\",\n entryPoint,\n bundlerRpcUrl: bundlerUrl,\n userOperation: jsonUserOp,\n };\n\n return {\n x402Version,\n // v1 requires scheme and network at top level\n ...(x402Version === 1\n ? { scheme: this.scheme, network: paymentRequirements.network }\n : {}),\n payload,\n };\n }\n}\n","import type { Chain, PublicClient, Transport } from \"viem\";\nimport { http } from \"viem\";\nimport type { SmartAccount } from \"viem/account-abstraction\";\nimport { createBundlerClient as createViemBundlerClient } from \"viem/account-abstraction\";\nimport type {\n BundlerClient,\n BundlerClientConfig,\n GasEstimate,\n PreparedUserOperation,\n UserOperationCall,\n} from \"./client\";\nimport type { UserOperation07Json } from \"../../facilitator/types\";\n\n/**\n * Configuration for creating a viem-based bundler client\n */\nexport interface ViemBundlerClientConfig extends BundlerClientConfig {\n /**\n * Viem public client for blockchain interactions\n */\n publicClient: PublicClient<Transport, Chain>;\n\n /**\n * Smart account for user operation preparation (must be a SmartAccount, not a regular Account)\n */\n account: SmartAccount;\n\n /**\n * Chain configuration\n */\n chain: Chain;\n\n /**\n * Bundler RPC URL\n */\n bundlerUrl: string;\n}\n\n/**\n * Viem-based implementation of BundlerClient.\n * Uses viem's account-abstraction utilities for user operation handling.\n */\nexport class ViemBundlerClient implements BundlerClient {\n private readonly bundlerClient: ReturnType<typeof createViemBundlerClient>;\n private readonly account: SmartAccount;\n private readonly entryPoint: `0x${string}`;\n\n /**\n * Creates a new ViemBundlerClient instance.\n *\n * @param config - Configuration for the bundler client\n */\n constructor(config: ViemBundlerClientConfig) {\n this.account = config.account;\n this.entryPoint = \"0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789\" as `0x${string}`; // EntryPoint v0.7\n\n // Create viem bundler client with bundler-specific transport\n this.bundlerClient = createViemBundlerClient({\n client: config.publicClient,\n chain: config.chain,\n account: config.account,\n transport: http(config.bundlerUrl),\n });\n }\n\n /**\n * Prepares an unsigned user operation for the given calls.\n *\n * @param calls - Array of calls to execute in the user operation\n * @param _entryPoint - The entry point address (unused, viem uses the configured entry point)\n * @returns Promise resolving to a prepared (unsigned) user operation\n */\n async prepareUserOperation(\n calls: UserOperationCall[],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _entryPoint: `0x${string}`,\n ): Promise<PreparedUserOperation> {\n const prepared = await this.bundlerClient.prepareUserOperation({\n account: this.account,\n calls: calls.map(call => ({\n to: call.to,\n value: call.value,\n data: call.data,\n })),\n });\n\n // viem v2 EntryPoint v0.7 returns separate fields (not v0.6 paymasterAndData)\n const p = prepared as Record<string, unknown>;\n\n return {\n sender: prepared.sender,\n nonce: prepared.nonce,\n callData: prepared.callData,\n callGasLimit: prepared.callGasLimit,\n verificationGasLimit: prepared.verificationGasLimit,\n preVerificationGas: prepared.preVerificationGas,\n maxFeePerGas: prepared.maxFeePerGas,\n maxPriorityFeePerGas: prepared.maxPriorityFeePerGas,\n // v0.7 factory fields (for account deployment)\n ...(p.factory ? { factory: p.factory as `0x${string}` } : {}),\n ...(p.factoryData ? { factoryData: p.factoryData as `0x${string}` } : {}),\n // v0.7 paymaster fields (separate, not paymasterAndData)\n ...(p.paymaster ? { paymaster: p.paymaster as `0x${string}` } : {}),\n ...(p.paymasterData ? { paymasterData: p.paymasterData as `0x${string}` } : {}),\n ...(p.paymasterVerificationGasLimit != null\n ? { paymasterVerificationGasLimit: p.paymasterVerificationGasLimit as bigint }\n : {}),\n ...(p.paymasterPostOpGasLimit != null\n ? { paymasterPostOpGasLimit: p.paymasterPostOpGasLimit as bigint }\n : {}),\n signature: prepared.signature,\n } as PreparedUserOperation;\n }\n\n /**\n * Estimates gas for a user operation.\n * Note: This is typically done as part of prepareUserOperation,\n * but is available as a separate method for flexibility.\n *\n * @param _userOp - The user operation to estimate gas for\n * @param _entryPoint - The entry point address\n * @returns Promise resolving to gas estimates\n */\n async estimateGas(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _userOp: UserOperation07Json,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _entryPoint: `0x${string}`,\n ): Promise<GasEstimate> {\n // Note: Gas estimation is typically done as part of prepareUserOperation\n // This method is provided for flexibility but may not be used in practice\n // The return type from estimateUserOperationGas doesn't include maxFeePerGas/maxPriorityFeePerGas\n // as those are determined by the network, not the bundler\n throw new Error(\n \"estimateGas should be called through prepareUserOperation, which includes gas estimation\",\n );\n }\n\n /**\n * Sends a user operation to the bundler.\n *\n * @param userOp - The signed user operation to send\n * @param _entryPoint - The entry point address (unused, viem uses the configured entry point)\n * @returns Promise resolving to the user operation hash\n */\n async sendUserOperation(\n userOp: UserOperation07Json,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _entryPoint: `0x${string}`,\n ): Promise<string> {\n // Convert JSON user operation to format expected by viem\n // viem's sendUserOperation accepts UserOperation fields directly (not nested)\n const hash = await this.bundlerClient.sendUserOperation({\n account: this.account,\n sender: userOp.sender as `0x${string}`,\n nonce: BigInt(userOp.nonce),\n callData: userOp.callData as `0x${string}`,\n callGasLimit: BigInt(userOp.callGasLimit),\n verificationGasLimit: BigInt(userOp.verificationGasLimit),\n preVerificationGas: BigInt(userOp.preVerificationGas),\n maxFeePerGas: BigInt(userOp.maxFeePerGas),\n maxPriorityFeePerGas: BigInt(userOp.maxPriorityFeePerGas),\n // Combine paymaster and paymasterData into paymasterAndData\n paymasterAndData:\n userOp.paymaster && userOp.paymasterData\n ? ((userOp.paymaster + userOp.paymasterData.slice(2)) as `0x${string}`)\n : userOp.paymaster\n ? (userOp.paymaster as `0x${string}`)\n : (\"0x\" as `0x${string}`),\n signature: userOp.signature as `0x${string}`,\n });\n\n return hash;\n }\n}\n","import type { SmartAccount } from \"viem/account-abstraction\";\nimport type { PreparedUserOperation } from \"../bundler\";\nimport type { UserOperationSigner } from \"./types\";\n\n/**\n * Adapter to make a SmartAccount (e.g., Safe account) work as a UserOperationSigner.\n *\n * This class wraps a SmartAccount that supports `signUserOperation` and adapts it\n * to the UserOperationSigner interface required by the x402 ERC-4337 scheme.\n *\n * @example\n * ```typescript\n * import { SafeAccountSigner } from \"@introspectivelabs/x402-evm/exact/client\";\n * import { toSafeSmartAccount } from \"permissionless/accounts\";\n *\n * const safeAccount = await toSafeSmartAccount({ ... });\n * const signer = new SafeAccountSigner(safeAccount);\n *\n * const scheme = new ExactEvmSchemeERC4337({\n * bundlerClient,\n * signer,\n * });\n * ```\n */\nexport class SafeAccountSigner implements UserOperationSigner {\n readonly address: `0x${string}`;\n\n /**\n * Creates a new SafeAccountSigner instance.\n *\n * @param account - The SmartAccount instance (e.g., from permissionless/accounts)\n * @throws Error if the account is not initialized or missing an address\n */\n constructor(private readonly account: SmartAccount) {\n if (!account?.address) {\n throw new Error(\"Smart account not initialized\");\n }\n this.address = account.address as `0x${string}`;\n }\n\n /**\n * Signs a prepared (unsigned) user operation.\n *\n * @param userOp - The prepared user operation to sign\n * @returns Promise resolving to the signature\n * @throws Error if the account does not support signUserOperation\n */\n async signUserOperation(userOp: PreparedUserOperation): Promise<`0x${string}`> {\n if (!this.account?.signUserOperation) {\n throw new Error(\"Smart account does not support signUserOperation\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await this.account.signUserOperation(userOp as any);\n }\n}\n","import { type Hex, concat, encodeAbiParameters } from \"viem\";\nimport type { WebAuthnAccount } from \"viem/account-abstraction\";\nimport type { P256Signer, SafeMessageSigner } from \"../../../accounts/types\";\n\n/**\n * Creates a SafeMessageSigner from a P256Signer.\n * The sign method returns concat([r, s]) (64 bytes raw P256 signature).\n */\nexport function createP256SafeMessageSigner(\n p256Signer: P256Signer,\n): SafeMessageSigner {\n return {\n ownerAddress: p256Signer.p256OwnerAddress,\n async sign(safeMessageHash: Hex): Promise<Hex> {\n const { r, s } = await p256Signer.sign(safeMessageHash);\n return concat([r, s]);\n },\n };\n}\n\n/**\n * Creates a SafeMessageSigner from a WebAuthnAccount.\n * The sign method triggers navigator.credentials.get() and returns\n * ABI-encoded WebAuthn struct compatible with Safe's verifier.\n *\n * @param webAuthnAccount - viem WebAuthnAccount (wraps credential + getFn)\n * @param deployedSignerAddress - Address of the per-credential signer deployed\n * via SafeWebAuthnSignerFactory (NOT the SharedSigner)\n */\nexport function createWebAuthnSafeMessageSigner(\n webAuthnAccount: WebAuthnAccount,\n deployedSignerAddress: Hex,\n): SafeMessageSigner {\n return {\n ownerAddress: deployedSignerAddress,\n async sign(safeMessageHash: Hex): Promise<Hex> {\n return encodeWebAuthnSignature(webAuthnAccount, safeMessageHash);\n },\n };\n}\n\n/**\n * Encodes a WebAuthn signature from raw sign() output into the ABI format\n * expected by Safe's WebAuthn verifier:\n * `(bytes authenticatorData, string clientDataFields, uint256[2] signature)`\n */\nasync function encodeWebAuthnSignature(\n owner: WebAuthnAccount,\n hash: Hex,\n): Promise<Hex> {\n const { signature: signatureData, webauthn } = await owner.sign({ hash });\n\n const sigBytes = signatureData.slice(2);\n const r = BigInt(\"0x\" + sigBytes.slice(0, 64));\n const s = BigInt(\"0x\" + sigBytes.slice(64, 128));\n\n const match = webauthn.clientDataJSON.match(\n /^\\{\"type\":\"webauthn.get\",\"challenge\":\"[A-Za-z0-9\\-_]{43}\",(.*)\\}$/,\n );\n const clientDataFields = match ? match[1] : \"\";\n\n return encodeAbiParameters(\n [\n { name: \"authenticatorData\", type: \"bytes\" },\n { name: \"clientDataFields\", type: \"string\" },\n { name: \"signature\", type: \"uint256[2]\" },\n ],\n [webauthn.authenticatorData, clientDataFields, [r, s]],\n );\n}\n","import { PaymentRequirements } from \"@x402/core/types\";\nimport { UserOperationCapability } from \"./types\";\n\n/**\n * Extracts the user operation capability from the payment requirements.\n *\n * @param requirements - The payment requirements\n * @returns The user operation capability\n */\nexport function extractUserOperationCapability(\n requirements: PaymentRequirements,\n): UserOperationCapability | undefined {\n const userOpExtra = requirements.extra?.userOperation;\n if (\n userOpExtra &&\n typeof userOpExtra === \"object\" &&\n \"supported\" in userOpExtra &&\n userOpExtra.supported === true\n ) {\n return userOpExtra as UserOperationCapability;\n }\n return undefined;\n}\n","import { encodeFunctionData } from \"viem\";\n\n/**\n * Standard ERC20 transfer function ABI\n */\nexport const ERC20_TRANSFER_ABI = [\n {\n type: \"function\",\n name: \"transfer\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"success\", type: \"bool\" }],\n },\n] as const;\n\n/**\n * Builds ERC20 transfer call data.\n *\n * @param token - The ERC20 token contract address\n * @param to - The recipient address\n * @param amount - The amount to transfer (in token's smallest unit)\n * @returns The encoded call data for the transfer function\n */\nexport function buildERC20TransferCallData(\n token: `0x${string}`,\n to: `0x${string}`,\n amount: bigint,\n): `0x${string}` {\n return encodeFunctionData({\n abi: ERC20_TRANSFER_ABI,\n functionName: \"transfer\",\n args: [to, amount],\n });\n}\n","import type { Hex } from \"viem\";\nimport type { UserOperation07Json } from \"../../facilitator/types\";\n\n/**\n * Converts a bigint value to a hex string in JSON-RPC format.\n *\n * @param value - The bigint value to convert\n * @returns The hex string representation\n */\nfunction toRpcHex(value: bigint): Hex {\n return `0x${value.toString(16)}` as Hex;\n}\n\n/**\n * Converts a user operation with bigint values to JSON-RPC compatible format.\n * This recursively converts all bigint values to hex strings.\n *\n * @param userOp - The user operation object (may contain bigints)\n * @returns The user operation in JSON-RPC format (all bigints converted to hex)\n */\nexport function userOpToJson(userOp: Record<string, unknown>): UserOperation07Json {\n const json: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(userOp)) {\n // Skip internal viem fields that bundlers reject\n if (key === \"account\") continue;\n\n if (typeof value === \"bigint\") {\n json[key] = toRpcHex(value);\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n // Recursively handle nested objects with bigints\n const inner: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n inner[k] = typeof v === \"bigint\" ? toRpcHex(v) : v;\n }\n json[key] = inner;\n } else {\n json[key] = value;\n }\n }\n\n return json as UserOperation07Json;\n}\n","export type PaymentCreationPhase = \"preparation\" | \"signing\" | \"validation\";\n\nconst AA_ERROR_MESSAGES: Record<string, string> = {\n AA10: \"Sender already constructed\",\n AA13: \"InitCode failed or OOG\",\n AA14: \"InitCode must return sender\",\n AA15: \"InitCode must create sender\",\n AA20: \"Account not deployed\",\n AA21: \"Insufficient funds for gas prefund\",\n AA22: \"Expired or not due\",\n AA23: \"Reverted (or OOG)\",\n AA24: \"Signature validation failed\",\n AA25: \"Nonce validation failed\",\n AA26: \"Account accessed global state\",\n AA30: \"Paymaster not deployed\",\n AA31: \"Paymaster deposit too low\",\n AA32: \"Paymaster expired or not due\",\n AA33: \"Paymaster reverted (or OOG)\",\n AA34: \"Paymaster context reverted\",\n AA40: \"Over verification gas limit\",\n AA41: \"Over max fee per gas\",\n AA50: \"Over max priority fee per gas\",\n AA51: \"Prefund below actualGasCost\",\n};\n\n/**\n * Extracts an AA error code (e.g. \"AA21\") from an error and returns\n * a human-readable reason. Returns null if no AA code is found.\n */\nexport function parseAAError(error: unknown): { code: string; reason: string } | null {\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/\\b(AA[0-9]{2})\\b/);\n if (!match) return null;\n const code = match[1];\n const reason = AA_ERROR_MESSAGES[code] ?? \"Unknown AA error\";\n return { code, reason };\n}\n\nexport class PaymentCreationError extends Error {\n readonly phase: PaymentCreationPhase;\n readonly reason: string;\n readonly safeAddress?: string;\n readonly network?: string;\n readonly code?: string;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n phase: PaymentCreationPhase;\n reason: string;\n safeAddress?: string;\n network?: string;\n code?: string;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = \"PaymentCreationError\";\n if (options.cause !== undefined) {\n this.cause = options.cause;\n }\n this.phase = options.phase;\n this.reason = options.reason;\n this.safeAddress = options.safeAddress;\n this.network = options.network;\n this.code = options.code;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n phase: this.phase,\n reason: this.reason,\n ...(this.code && { code: this.code }),\n ...(this.safeAddress && { safeAddress: this.safeAddress }),\n ...(this.network && { network: this.network }),\n };\n }\n}\n","import type { ChainInfo } from \"./types\";\n\nexport const SUPPORTED_CHAINS: Record<number, ChainInfo> = {\n 8453: {\n chainId: 8453,\n name: \"Base\",\n v1Name: \"base\",\n caip2: \"eip155:8453\",\n rpcUrl: \"https://mainnet.base.org\",\n blockExplorerUrl: \"https://basescan.org\",\n usdcAddress: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n safeTransactionServiceUrl: \"https://safe-transaction-base.safe.global\",\n testnet: false,\n },\n 84532: {\n chainId: 84532,\n name: \"Base Sepolia\",\n v1Name: \"base-sepolia\",\n caip2: \"eip155:84532\",\n rpcUrl: \"https://sepolia.base.org\",\n blockExplorerUrl: \"https://sepolia.basescan.org\",\n usdcAddress: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n safeTransactionServiceUrl:\n \"https://safe-transaction-base-sepolia.safe.global\",\n testnet: true,\n },\n 10: {\n chainId: 10,\n name: \"Optimism\",\n v1Name: \"optimism\",\n caip2: \"eip155:10\",\n rpcUrl: \"https://mainnet.optimism.io\",\n blockExplorerUrl: \"https://optimistic.etherscan.io\",\n usdcAddress: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n safeTransactionServiceUrl:\n \"https://safe-transaction-optimism.safe.global\",\n testnet: false,\n },\n 11155420: {\n chainId: 11155420,\n name: \"Optimism Sepolia\",\n v1Name: \"optimism-sepolia\",\n caip2: \"eip155:11155420\",\n rpcUrl: \"https://sepolia.optimism.io\",\n blockExplorerUrl: \"https://sepolia-optimistic.etherscan.io\",\n usdcAddress: \"0x5fd84259d66Cd46123540766Be93DFE6D43130D7\",\n safeTransactionServiceUrl: undefined,\n testnet: true,\n },\n 42161: {\n chainId: 42161,\n name: \"Arbitrum One\",\n v1Name: \"arbitrum\",\n caip2: \"eip155:42161\",\n rpcUrl: \"https://arb1.arbitrum.io/rpc\",\n blockExplorerUrl: \"https://arbiscan.io\",\n usdcAddress: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n safeTransactionServiceUrl:\n \"https://safe-transaction-arbitrum.safe.global\",\n testnet: false,\n },\n 421614: {\n chainId: 421614,\n name: \"Arbitrum Sepolia\",\n v1Name: \"arbitrum-sepolia\",\n caip2: \"eip155:421614\",\n rpcUrl: \"https://sepolia-rollup.arbitrum.io/rpc\",\n blockExplorerUrl: \"https://sepolia.arbiscan.io\",\n usdcAddress: \"0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d\",\n safeTransactionServiceUrl: undefined,\n testnet: true,\n },\n};\n\nexport const V1_NAME_INDEX: Map<string, ChainInfo> = new Map(\n Object.values(SUPPORTED_CHAINS).map((chain) => [chain.v1Name, chain]),\n);\n","import type { CAIP2Identifier, ChainInfo, NetworkInput } from \"./types\";\nimport { SUPPORTED_CHAINS, V1_NAME_INDEX } from \"./registry\";\n\nexport function parseCAIP2(caip2: string): number {\n const match = caip2.match(/^eip155:(\\d+)$/);\n if (!match) {\n throw new Error(\n `Invalid CAIP-2 identifier: ${caip2}. Expected format: eip155:{chainId}`,\n );\n }\n return parseInt(match[1], 10);\n}\n\nexport function toCAIP2(chainId: number): CAIP2Identifier {\n return `eip155:${chainId}` as CAIP2Identifier;\n}\n\nexport function resolveChainId(network: NetworkInput): number {\n if (typeof network === \"number\") {\n return network;\n }\n if (network.startsWith(\"eip155:\")) {\n return parseCAIP2(network);\n }\n const chain = V1_NAME_INDEX.get(network);\n if (!chain) {\n throw new Error(\n `Unknown network: ${network}. Expected CAIP-2 (eip155:chainId), a known v1 name, or a numeric chain ID.`,\n );\n }\n return chain.chainId;\n}\n\nexport function getV1Name(chainId: number): string | undefined {\n return SUPPORTED_CHAINS[chainId]?.v1Name;\n}\n\nexport function getV1Names(chainId: number): string[] {\n const name = getV1Name(chainId);\n return name ? [name] : [];\n}\n\nexport function isSupported(chainId: number): boolean {\n return chainId in SUPPORTED_CHAINS;\n}\n\nexport function getChainById(chainId: number): ChainInfo | undefined {\n return SUPPORTED_CHAINS[chainId];\n}\n\nexport function getChain(network: NetworkInput): ChainInfo {\n const chainId = resolveChainId(network);\n const chain = SUPPORTED_CHAINS[chainId];\n if (!chain) {\n throw new Error(\n `Chain ${chainId} is not in the supported chains registry.`,\n );\n }\n return chain;\n}\n\nexport function getSupportedChains(): ChainInfo[] {\n return Object.values(SUPPORTED_CHAINS);\n}\n\nexport function getMainnets(): ChainInfo[] {\n return Object.values(SUPPORTED_CHAINS).filter((c) => !c.testnet);\n}\n\nexport function getTestnets(): ChainInfo[] {\n return Object.values(SUPPORTED_CHAINS).filter((c) => c.testnet);\n}\n","import type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport {\n type Hex,\n getAddress,\n hashTypedData,\n toHex,\n} from \"viem\";\nimport type { SafeMessageSigner } from \"../../../accounts/types\";\nimport { encodeContractSignature } from \"../../../accounts/encodeContractSignature\";\nimport { computeSafeMessageHash } from \"../../../accounts/computeSafeMessageHash\";\nimport { resolveChainId } from \"../../../networks\";\n\nconst authorizationTypes = {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n} as const;\n\nfunction createNonce(): Hex {\n const cryptoObj = globalThis.crypto;\n if (!cryptoObj) throw new Error(\"Crypto API not available\");\n return toHex(cryptoObj.getRandomValues(new Uint8Array(32)));\n}\n\nexport interface ExactEvmSchemeEIP3009Config {\n safeAddress: Hex;\n signer: SafeMessageSigner;\n}\n\n/**\n * EVM client scheme that produces standard EIP-3009 `{ authorization, signature }`\n * payloads from a Safe Smart Account using EIP-1271 contract signatures.\n *\n * Unlike ExactEvmSchemeERC4337 (which creates UserOperation payloads), this scheme\n * creates payloads compatible with any standard x402 facilitator. The facilitator\n * verifies via `verifyTypedData` (which falls back to EIP-1271 for contract addresses)\n * and settles via `transferWithAuthorization(bytes)` (which uses SignatureChecker).\n *\n * Signing flow:\n * 1. Build EIP-3009 authorization (from=Safe, to=payTo, value, nonce, etc.)\n * 2. Compute EIP-712 hash of the authorization\n * 3. Wrap in Safe's message hash (what isValidSignature expects)\n * 4. Sign the Safe message hash via SafeMessageSigner (P256 or WebAuthn)\n * 5. Encode as Safe contract signature (v=0 format)\n *\n * Prerequisites:\n * - Safe must be deployed (EIP-1271 requires on-chain code)\n * - Safe must hold USDC balance (EIP-3009 transfers directly)\n * - USDC must support transferWithAuthorization(bytes) overload (v2.2+)\n */\nexport class ExactEvmSchemeEIP3009 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n private readonly safeAddress: Hex;\n private readonly signer: SafeMessageSigner;\n\n constructor(config: ExactEvmSchemeEIP3009Config) {\n this.safeAddress = config.safeAddress;\n this.signer = config.signer;\n }\n\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"x402Version\" | \"payload\">> {\n const chainId = resolveChainId(paymentRequirements.network);\n\n // v1 uses maxAmountRequired, v2 uses amount\n const amount =\n paymentRequirements.amount ??\n ((paymentRequirements as Record<string, unknown>).maxAmountRequired as string | undefined);\n\n if (!amount) {\n throw new Error(\"Payment requirements missing amount (v2) or maxAmountRequired (v1)\");\n }\n\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization = {\n from: getAddress(this.safeAddress),\n to: getAddress(paymentRequirements.payTo),\n value: amount,\n validAfter: (now - 600).toString(),\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n // Build EIP-712 domain from payment requirements extra fields\n const extra = paymentRequirements.extra as Record<string, unknown> | undefined;\n if (!extra?.name || !extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${paymentRequirements.asset}`,\n );\n }\n\n const domain = {\n name: extra.name as string,\n version: extra.version as string,\n chainId,\n verifyingContract: getAddress(paymentRequirements.asset) as Hex,\n };\n\n const message = {\n from: getAddress(authorization.from) as Hex,\n to: getAddress(authorization.to) as Hex,\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce as Hex,\n };\n\n // Step 1: Compute the EIP-712 typed data hash\n const eip712Hash = hashTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n\n // Step 2: Wrap in Safe's message hash (what Safe.isValidSignature expects)\n const safeMessageHash = computeSafeMessageHash(\n this.safeAddress,\n chainId,\n eip712Hash,\n );\n\n // Step 3: Sign the Safe message hash (P256 or WebAuthn)\n const innerSignature = await this.signer.sign(safeMessageHash);\n\n // Step 4: Encode as Safe contract signature (v=0)\n const signature = encodeContractSignature(\n this.signer.ownerAddress,\n innerSignature,\n );\n\n const payload = { authorization, signature };\n\n return {\n x402Version,\n ...(x402Version === 1\n ? { scheme: this.scheme, network: paymentRequirements.network }\n : {}),\n payload,\n };\n }\n}\n","import { type Hex, concat, pad, toHex } from \"viem\";\n\n/**\n * Encodes a signature in Safe's contract signature format (v=0).\n *\n * Safe's `checkNSignatures` expects this layout for contract owners:\n *\n * Static part (65 bytes):\n * - r (32 bytes): owner address padded to 32 bytes\n * - s (32 bytes): offset to dynamic data (relative to start of signatures)\n * - v (1 byte): 0x00 (indicates contract signature)\n *\n * Dynamic part (at the offset):\n * - length (32 bytes): length of the signature data\n * - data (variable): the actual signature bytes\n *\n * For a single signer, the static part is 65 bytes, so the dynamic data\n * starts at offset 65.\n */\nexport function encodeContractSignature(ownerAddress: Hex, signatureData: Hex): Hex {\n // Static part: r = address padded to 32 bytes\n const r = pad(ownerAddress, { size: 32 });\n\n // For a single signature, dynamic data starts right after the 65-byte static part\n const dynamicOffset = 65;\n const s = pad(toHex(dynamicOffset), { size: 32 });\n\n // v = 0x00 for contract signature\n const v = \"0x00\" as Hex;\n\n // Dynamic part: length-prefixed signature data\n const signatureBytes = (signatureData.length - 2) / 2;\n const length = pad(toHex(signatureBytes), { size: 32 });\n\n return concat([r, s, v, length, signatureData]);\n}\n","import {\n type Hex,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n} from \"viem\";\n\nconst DOMAIN_SEPARATOR_TYPEHASH = keccak256(\n encodePacked(\n [\"string\"],\n [\"EIP712Domain(uint256 chainId,address verifyingContract)\"],\n ),\n);\n\nconst SAFE_MSG_TYPEHASH = keccak256(\n encodePacked([\"string\"], [\"SafeMessage(bytes message)\"]),\n);\n\n/**\n * Computes the Safe message hash for EIP-1271 signature verification.\n *\n * This is what Safe's `isValidSignature(hash, sig)` expects: the hash is\n * first wrapped in Safe's EIP-712 domain before `checkNSignatures` runs.\n *\n * Flow: keccak256(0x19 || 0x01 || domainSeparator || structHash)\n * where structHash = keccak256(SAFE_MSG_TYPEHASH || keccak256(abi.encode(messageHash)))\n */\nexport function computeSafeMessageHash(\n safeAddress: Hex,\n chainId: number,\n messageHash: Hex,\n): Hex {\n const domainSeparator = keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"uint256\" }, { type: \"address\" }],\n [DOMAIN_SEPARATOR_TYPEHASH, BigInt(chainId), safeAddress],\n ),\n );\n\n const encodedMessage = encodeAbiParameters(\n [{ type: \"bytes32\" }],\n [messageHash],\n );\n const messageHashInner = keccak256(encodedMessage);\n\n const structHash = keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"bytes32\" }],\n [SAFE_MSG_TYPEHASH, messageHashInner],\n ),\n );\n\n return keccak256(\n encodePacked(\n [\"bytes1\", \"bytes1\", \"bytes32\", \"bytes32\"],\n [\"0x19\", \"0x01\", domainSeparator, structHash],\n ),\n );\n}\n","import { encodeAbiParameters, keccak256, type Hex } from \"viem\";\nimport { entryPoint07Address } from \"../../../constants\";\n\nexport interface PackedUserOp {\n sender: Hex;\n nonce: bigint;\n initCode: Hex;\n callData: Hex;\n accountGasLimits: Hex;\n preVerificationGas: bigint;\n gasFees: Hex;\n paymasterAndData: Hex;\n}\n\n/**\n * Compute the UserOperation hash for EntryPoint v0.7 packed format.\n *\n * The hash is computed as:\n * keccak256(abi.encode(keccak256(pack(userOp)), entryPoint, chainId))\n *\n * where pack(userOp) encodes the UserOp fields with initCode, callData,\n * and paymasterAndData replaced by their keccak256 hashes.\n */\nexport function computeUserOpHash(\n packedUserOp: PackedUserOp,\n chainId: number,\n entrypoint: Hex = entryPoint07Address,\n): Hex {\n const encoded = encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n { type: \"uint256\" },\n { type: \"bytes32\" },\n { type: \"bytes32\" },\n ],\n [\n packedUserOp.sender,\n packedUserOp.nonce,\n keccak256(packedUserOp.initCode),\n keccak256(packedUserOp.callData),\n packedUserOp.accountGasLimits,\n packedUserOp.preVerificationGas,\n packedUserOp.gasFees,\n keccak256(packedUserOp.paymasterAndData),\n ],\n );\n\n const innerHash = keccak256(encoded);\n\n return keccak256(\n encodeAbiParameters(\n [{ type: \"bytes32\" }, { type: \"address\" }, { type: \"uint256\" }],\n [innerHash, entrypoint, BigInt(chainId)],\n ),\n );\n}\n","import type { Hex } from \"viem\";\nimport { entryPoint07Address } from \"viem/account-abstraction\";\n\nexport { entryPoint07Address };\n\nexport const SAFE_4337_MODULE_ADDRESS =\n \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as const satisfies Hex;\n\nexport const SAFE_WEBAUTHN_SHARED_SIGNER =\n \"0x94a4F6affBd8975951142c3999aEAB7ecee555c2\" as const satisfies Hex;\n\nexport const FCL_P256_VERIFIER =\n \"0xA86e0054C51E4894D88762a017ECc5E5235f5DBA\" as const satisfies Hex;\n\nexport const P256_OWNER_FACTORY =\n \"0x349c03Eb61e26528cbf79F5D3Ba071FcA2aE82cB\" as const satisfies Hex;\n\nexport const WEBAUTHN_SIGNER_FACTORY =\n \"0xF7488fFbe67327ac9f37D5F722d83Fc900852Fbf\" as const satisfies Hex;\n\nexport const GUARD_FACTORY =\n \"0x35E2B487b682029e363BA7f06fD7392834A83077\" as const satisfies Hex;\n"],"mappings":"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","names":["import_viem","createViemBundlerClient","import_viem","import_viem","bundlerUrl","import_viem","import_viem","import_viem","import_viem","import_account_abstraction"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Hex, PublicClient, WalletClient } from 'viem';
|
|
2
|
-
export { F as FCL_P256_VERIFIER, G as GUARD_FACTORY, P as P256_OWNER_FACTORY, W as WEBAUTHN_SIGNER_FACTORY } from '../constants-
|
|
2
|
+
export { F as FCL_P256_VERIFIER, G as GUARD_FACTORY, P as P256_OWNER_FACTORY, W as WEBAUTHN_SIGNER_FACTORY } from '../constants-D7-tmODT.js';
|
|
3
3
|
|
|
4
4
|
declare const FACTORY_ADDRESSES: FactoryAddresses;
|
|
5
5
|
interface FactoryAddresses {
|