@introspectivelabs/x402-evm 0.1.0-beta.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/cjs/accounts/index.d.ts +3 -23
  2. package/dist/cjs/accounts/index.js +24 -20
  3. package/dist/cjs/accounts/index.js.map +1 -1
  4. package/dist/cjs/constants-Bl5JlK9d.d.ts +7 -0
  5. package/dist/cjs/exact/client/index.d.ts +3 -3
  6. package/dist/cjs/exact/client/index.js +25 -15
  7. package/dist/cjs/exact/client/index.js.map +1 -1
  8. package/dist/cjs/exact/server/index.d.ts +1 -0
  9. package/dist/cjs/exact/server/index.js +103 -0
  10. package/dist/cjs/exact/server/index.js.map +1 -1
  11. package/dist/cjs/factories/index.d.ts +25 -3
  12. package/dist/cjs/factories/index.js +35 -4
  13. package/dist/cjs/factories/index.js.map +1 -1
  14. package/dist/cjs/index.d.ts +4 -3
  15. package/dist/cjs/index.js +210 -165
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/networks/index.d.ts +1 -0
  18. package/dist/cjs/networks/index.js +6 -0
  19. package/dist/cjs/networks/index.js.map +1 -1
  20. package/dist/cjs/{types-DkMSfvxL.d.ts → types-lO5B0FRc.d.ts} +2 -0
  21. package/dist/cjs/{userOperation-qDblljjR.d.ts → userOperation-bd50ILnY.d.ts} +1 -1
  22. package/dist/esm/accounts/index.d.mts +3 -23
  23. package/dist/esm/accounts/index.mjs +2 -1
  24. package/dist/esm/{chunk-SR2JWH6A.mjs → chunk-3CGZ3NSF.mjs} +7 -1
  25. package/dist/esm/chunk-3CGZ3NSF.mjs.map +1 -0
  26. package/dist/esm/{chunk-BVA72I5T.mjs → chunk-FB2R2BXN.mjs} +23 -21
  27. package/dist/esm/chunk-FB2R2BXN.mjs.map +1 -0
  28. package/dist/esm/chunk-RN5WLEGU.mjs +1 -0
  29. package/dist/esm/chunk-RN5WLEGU.mjs.map +1 -0
  30. package/dist/esm/{chunk-4XERD37F.mjs → chunk-U7RIL3MO.mjs} +21 -17
  31. package/dist/esm/chunk-U7RIL3MO.mjs.map +1 -0
  32. package/dist/esm/{chunk-E3XDJP7M.mjs → chunk-UYKF2CHM.mjs} +21 -1
  33. package/dist/esm/chunk-UYKF2CHM.mjs.map +1 -0
  34. package/dist/esm/chunk-W3QALCLQ.mjs +17 -0
  35. package/dist/esm/chunk-W3QALCLQ.mjs.map +1 -0
  36. package/dist/esm/constants-Bl5JlK9d.d.mts +7 -0
  37. package/dist/esm/exact/client/index.d.mts +3 -3
  38. package/dist/esm/exact/client/index.mjs +3 -2
  39. package/dist/esm/exact/server/index.d.mts +1 -0
  40. package/dist/esm/exact/server/index.mjs +2 -1
  41. package/dist/esm/factories/index.d.mts +25 -3
  42. package/dist/esm/factories/index.mjs +29 -4
  43. package/dist/esm/factories/index.mjs.map +1 -1
  44. package/dist/esm/index.d.mts +4 -3
  45. package/dist/esm/index.mjs +19 -4
  46. package/dist/esm/index.mjs.map +1 -1
  47. package/dist/esm/networks/index.d.mts +1 -0
  48. package/dist/esm/networks/index.mjs +2 -1
  49. package/dist/esm/{types-DkMSfvxL.d.mts → types-lO5B0FRc.d.mts} +2 -0
  50. package/dist/esm/{userOperation-CI4ZetII.d.mts → userOperation--Sqhz6PA.d.mts} +1 -1
  51. package/package.json +1 -1
  52. package/dist/esm/chunk-4XERD37F.mjs.map +0 -1
  53. package/dist/esm/chunk-BVA72I5T.mjs.map +0 -1
  54. package/dist/esm/chunk-E3XDJP7M.mjs.map +0 -1
  55. package/dist/esm/chunk-SR2JWH6A.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { SmartAccount, WebAuthnAccount } from 'viem/account-abstraction';
2
- import { b as ToSafeSmartAccountParams, T as ToP256SafeSmartAccountParams } from '../types-DkMSfvxL.js';
3
- export { P as P256Signer, S as SafeMessageSigner, a as SignerConfig } from '../types-DkMSfvxL.js';
2
+ import { b as ToSafeSmartAccountParams, T as ToP256SafeSmartAccountParams } from '../types-lO5B0FRc.js';
3
+ export { P as P256Signer, S as SafeMessageSigner, a as SignerConfig } from '../types-lO5B0FRc.js';
4
4
  import { PublicClient, Transport, Chain, Hex } from 'viem';
5
5
 
6
6
  /**
@@ -84,30 +84,10 @@ type ToWebAuthnSafeSmartAccountParams = {
84
84
  version: "0.7";
85
85
  };
86
86
  safe4337ModuleAddress?: Hex;
87
+ safeWebAuthnSharedSignerAddress?: Hex;
87
88
  };
88
89
  /**
89
90
  * Creates a Safe SmartAccount that signs UserOperations with a WebAuthn passkey.
90
- *
91
- * This is a thin wrapper over permissionless's `toSafeSmartAccount` that sets
92
- * Safe-specific defaults. permissionless handles WebAuthn signing natively:
93
- * it maps the WebAuthnAccount to SafeWebAuthnSharedSigner and encodes the
94
- * assertion as `(authenticatorData, clientDataFields, [r, s])`.
95
- *
96
- * @example
97
- * ```typescript
98
- * import { toWebAuthnSafeSmartAccount } from '@introspectivelabs/x402-evm/accounts';
99
- * import { toWebAuthnAccount } from 'viem/account-abstraction';
100
- *
101
- * const webAuthnAccount = toWebAuthnAccount({
102
- * credential: { id: credentialId, publicKey: pubKeyHex },
103
- * });
104
- *
105
- * const account = await toWebAuthnSafeSmartAccount({
106
- * client: publicClient,
107
- * webAuthnAccount,
108
- * safeAddress: '0x...',
109
- * });
110
- * ```
111
91
  */
112
92
  declare function toWebAuthnSafeSmartAccount(params: ToWebAuthnSafeSmartAccountParams): Promise<SmartAccount>;
113
93
 
@@ -51,8 +51,13 @@ function encodeContractSignature(ownerAddress, signatureData) {
51
51
 
52
52
  // src/accounts/computeSafeOpHash.ts
53
53
  var import_viem2 = require("viem");
54
- var SAFE_4337_MODULE_DEFAULT = "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
55
- var ENTRYPOINT_V07 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
54
+
55
+ // src/constants.ts
56
+ var import_account_abstraction = require("viem/account-abstraction");
57
+ var SAFE_4337_MODULE_ADDRESS = "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
58
+ var SAFE_WEBAUTHN_SHARED_SIGNER = "0xfD90FAd33ee8b58f32c00aceEad1358e4AFC23f9";
59
+
60
+ // src/accounts/computeSafeOpHash.ts
56
61
  var SAFE_OP_TYPES = {
57
62
  SafeOp: [
58
63
  { type: "address", name: "safe" },
@@ -70,7 +75,7 @@ var SAFE_OP_TYPES = {
70
75
  { type: "address", name: "entryPoint" }
71
76
  ]
72
77
  };
73
- function computeSafeOpHash(userOp, chainId, safe4337ModuleAddress = SAFE_4337_MODULE_DEFAULT, entryPointAddress = ENTRYPOINT_V07) {
78
+ function computeSafeOpHash(userOp, chainId, safe4337ModuleAddress = SAFE_4337_MODULE_ADDRESS, entryPointAddress = import_account_abstraction.entryPoint07Address) {
74
79
  const initCode = userOp.factory && (0, import_viem2.isAddress)(userOp.factory) ? (0, import_viem2.concat)([userOp.factory, userOp.factoryData || "0x"]) : "0x";
75
80
  let paymasterAndData = "0x";
76
81
  if (userOp.paymaster && (0, import_viem2.isAddress)(userOp.paymaster)) {
@@ -107,8 +112,6 @@ function computeSafeOpHash(userOp, chainId, safe4337ModuleAddress = SAFE_4337_MO
107
112
  }
108
113
 
109
114
  // src/accounts/toP256SafeSmartAccount.ts
110
- var SAFE_4337_MODULE_DEFAULT2 = "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
111
- var ENTRYPOINT_V07_ADDRESS = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
112
115
  function createMockLocalAccount(address) {
113
116
  const notImplemented = () => {
114
117
  throw new Error("P256 contract owner: use signUserOperation instead");
@@ -125,8 +128,8 @@ function createMockLocalAccount(address) {
125
128
  };
126
129
  }
127
130
  async function toP256SafeSmartAccount(params) {
128
- const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_DEFAULT2;
129
- const entryPointAddress = params.entryPoint?.address ?? ENTRYPOINT_V07_ADDRESS;
131
+ const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;
132
+ const entryPointAddress = params.entryPoint?.address ?? import_account_abstraction.entryPoint07Address;
130
133
  const mockOwner = createMockLocalAccount(params.p256Signer.p256OwnerAddress);
131
134
  const baseAccount = await (0, import_accounts.toSafeSmartAccount)({
132
135
  client: params.client,
@@ -184,12 +187,10 @@ async function toP256SafeSmartAccount(params) {
184
187
 
185
188
  // src/accounts/toWebAuthnSafeSmartAccount.ts
186
189
  var import_accounts2 = require("permissionless/accounts");
187
- var SAFE_4337_MODULE_DEFAULT3 = "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
188
- var ENTRYPOINT_V07_ADDRESS2 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
189
190
  async function toWebAuthnSafeSmartAccount(params) {
190
- const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_DEFAULT3;
191
- const entryPointAddress = params.entryPoint?.address ?? ENTRYPOINT_V07_ADDRESS2;
192
- return (0, import_accounts2.toSafeSmartAccount)({
191
+ const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;
192
+ const entryPointAddress = params.entryPoint?.address ?? import_account_abstraction.entryPoint07Address;
193
+ const baseAccount = await (0, import_accounts2.toSafeSmartAccount)({
193
194
  client: params.client,
194
195
  owners: [params.webAuthnAccount],
195
196
  version: "1.5.0",
@@ -198,14 +199,13 @@ async function toWebAuthnSafeSmartAccount(params) {
198
199
  address: entryPointAddress,
199
200
  version: "0.7"
200
201
  },
201
- safe4337ModuleAddress
202
+ safe4337ModuleAddress,
203
+ ...params.safeWebAuthnSharedSignerAddress ? { safeWebAuthnSharedSignerAddress: params.safeWebAuthnSharedSignerAddress } : {}
202
204
  });
205
+ return baseAccount;
203
206
  }
204
207
 
205
208
  // src/accounts/toSafeSmartAccount.ts
206
- var SAFE_4337_MODULE_DEFAULT4 = "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
207
- var ENTRYPOINT_V07_ADDRESS3 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
208
- var SAFE_WEBAUTHN_SHARED_SIGNER = "0xfD90FAd33ee8b58f32c00aceEad1358e4AFC23f9";
209
209
  async function toSafeSmartAccount3(params) {
210
210
  const { signerConfig } = params;
211
211
  switch (signerConfig.type) {
@@ -223,7 +223,8 @@ async function toSafeSmartAccount3(params) {
223
223
  webAuthnAccount: signerConfig.webAuthnAccount,
224
224
  safeAddress: params.safeAddress,
225
225
  entryPoint: params.entryPoint,
226
- safe4337ModuleAddress: params.safe4337ModuleAddress
226
+ safe4337ModuleAddress: params.safe4337ModuleAddress,
227
+ safeWebAuthnSharedSignerAddress: signerConfig.safeWebAuthnSharedSignerAddress
227
228
  });
228
229
  case "multi":
229
230
  return buildMultiSignerAccount(params, signerConfig.signers, signerConfig.threshold ?? 1);
@@ -276,18 +277,21 @@ async function buildMultiSignerAccount(params, signers, threshold) {
276
277
  });
277
278
  }
278
279
  if (signers.webAuthn && !signers.p256) {
280
+ const signerConfig = params.signerConfig;
281
+ const sharedSignerAddr = signerConfig.type === "multi" ? signerConfig.safeWebAuthnSharedSignerAddress : void 0;
279
282
  return toWebAuthnSafeSmartAccount({
280
283
  client: params.client,
281
284
  webAuthnAccount: signers.webAuthn,
282
285
  safeAddress: params.safeAddress,
283
286
  entryPoint: params.entryPoint,
284
- safe4337ModuleAddress: params.safe4337ModuleAddress
287
+ safe4337ModuleAddress: params.safe4337ModuleAddress,
288
+ safeWebAuthnSharedSignerAddress: sharedSignerAddr
285
289
  });
286
290
  }
287
291
  const p256Signer = signers.p256;
288
292
  const webAuthnAccount = signers.webAuthn;
289
- const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_DEFAULT4;
290
- const entryPointAddress = params.entryPoint?.address ?? ENTRYPOINT_V07_ADDRESS3;
293
+ const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_ADDRESS;
294
+ const entryPointAddress = params.entryPoint?.address ?? import_account_abstraction.entryPoint07Address;
291
295
  const mockP256Owner = createMockLocalAccount2(p256Signer.p256OwnerAddress);
292
296
  const baseAccount = await (0, import_accounts3.toSafeSmartAccount)({
293
297
  client: params.client,
@@ -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/accounts/toWebAuthnSafeSmartAccount.ts","../../../src/accounts/extractPasskeyCoordinates.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// 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\";\n\nconst SAFE_4337_MODULE_DEFAULT = \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as Hex;\nconst ENTRYPOINT_V07_ADDRESS = \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\" as Hex;\n\n// Safe's SafeWebAuthnSharedSigner deployed address\nconst SAFE_WEBAUTHN_SHARED_SIGNER = \"0xfD90FAd33ee8b58f32c00aceEad1358e4AFC23f9\" as Hex;\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 });\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 return toWebAuthnSafeSmartAccount({\n client: params.client,\n webAuthnAccount: signers.webAuthn,\n safeAddress: params.safeAddress,\n entryPoint: params.entryPoint,\n safe4337ModuleAddress: params.safe4337ModuleAddress,\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_DEFAULT;\n const entryPointAddress = params.entryPoint?.address ?? ENTRYPOINT_V07_ADDRESS;\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\";\n\nconst SAFE_4337_MODULE_DEFAULT = \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as Hex;\nconst ENTRYPOINT_V07_ADDRESS = \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\" as Hex;\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_DEFAULT;\n const entryPointAddress =\n params.entryPoint?.address ?? ENTRYPOINT_V07_ADDRESS;\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\";\n\nconst SAFE_4337_MODULE_DEFAULT = \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as Hex;\nconst ENTRYPOINT_V07 = \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\" as Hex;\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_DEFAULT,\n entryPointAddress: Hex = ENTRYPOINT_V07,\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 type { SmartAccount, WebAuthnAccount } from \"viem/account-abstraction\";\nimport { toSafeSmartAccount } from \"permissionless/accounts\";\nimport type { PublicClient, Transport, Chain } from \"viem\";\n\nconst SAFE_4337_MODULE_DEFAULT = \"0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226\" as Hex;\nconst ENTRYPOINT_V07_ADDRESS = \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\" as Hex;\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};\n\n/**\n * Creates a Safe SmartAccount that signs UserOperations with a WebAuthn passkey.\n *\n * This is a thin wrapper over permissionless's `toSafeSmartAccount` that sets\n * Safe-specific defaults. permissionless handles WebAuthn signing natively:\n * it maps the WebAuthnAccount to SafeWebAuthnSharedSigner and encodes the\n * assertion as `(authenticatorData, clientDataFields, [r, s])`.\n *\n * @example\n * ```typescript\n * import { toWebAuthnSafeSmartAccount } from '@introspectivelabs/x402-evm/accounts';\n * import { toWebAuthnAccount } from 'viem/account-abstraction';\n *\n * const webAuthnAccount = toWebAuthnAccount({\n * credential: { id: credentialId, publicKey: pubKeyHex },\n * });\n *\n * const account = await toWebAuthnSafeSmartAccount({\n * client: publicClient,\n * webAuthnAccount,\n * safeAddress: '0x...',\n * });\n * ```\n */\nexport async function toWebAuthnSafeSmartAccount(\n params: ToWebAuthnSafeSmartAccountParams,\n): Promise<SmartAccount> {\n const safe4337ModuleAddress = params.safe4337ModuleAddress ?? SAFE_4337_MODULE_DEFAULT;\n const entryPointAddress = params.entryPoint?.address ?? ENTRYPOINT_V07_ADDRESS;\n\n return 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 }) as Promise<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"],"mappings":"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","names":["toSafeSmartAccount","import_viem","import_accounts","import_viem","import_viem","SAFE_4337_MODULE_DEFAULT","import_accounts","SAFE_4337_MODULE_DEFAULT","ENTRYPOINT_V07_ADDRESS","SAFE_4337_MODULE_DEFAULT","ENTRYPOINT_V07_ADDRESS","toSafeSmartAccount","createMockLocalAccount","toPermissionlessSafeSmartAccount"]}
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"],"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// 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","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"],"mappings":"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","names":["toSafeSmartAccount","import_viem","import_accounts","import_viem","import_viem","import_accounts","toSafeSmartAccount","createMockLocalAccount","toPermissionlessSafeSmartAccount"]}
@@ -0,0 +1,7 @@
1
+ declare const SAFE_4337_MODULE_ADDRESS: "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226";
2
+ declare const SAFE_WEBAUTHN_SHARED_SIGNER: "0xfD90FAd33ee8b58f32c00aceEad1358e4AFC23f9";
3
+ declare const FCL_P256_VERIFIER: "0xA86e0054C51E4894D88762a017ECc5E5235f5DBA";
4
+ declare const P256_OWNER_FACTORY: "0x349c03Eb61e26528cbf79F5D3Ba071FcA2aE82cB";
5
+ declare const WEBAUTHN_SIGNER_FACTORY: "0xF7488fFbe67327ac9f37D5F722d83Fc900852Fbf";
6
+
7
+ export { FCL_P256_VERIFIER as F, P256_OWNER_FACTORY as P, SAFE_4337_MODULE_ADDRESS as S, WEBAUTHN_SIGNER_FACTORY as W, SAFE_WEBAUTHN_SHARED_SIGNER as a };
@@ -1,9 +1,9 @@
1
- import { U as UserOperationSigner, P as PreparedUserOperation } from '../../userOperation-qDblljjR.js';
2
- export { B as BundlerClient, f as BundlerClientConfig, j as ERC20_TRANSFER_ABI, b as ExactEvmSchemeEIP3009, c as ExactEvmSchemeEIP3009Config, E as ExactEvmSchemeERC4337, a as ExactEvmSchemeERC4337Config, G as GasEstimate, g as UserOperationCall, V as ViemBundlerClient, h as ViemBundlerClientConfig, i as buildERC20TransferCallData, d as createP256SafeMessageSigner, e as createWebAuthnSafeMessageSigner, u as userOpToJson } from '../../userOperation-qDblljjR.js';
1
+ import { U as UserOperationSigner, P as PreparedUserOperation } from '../../userOperation-bd50ILnY.js';
2
+ export { B as BundlerClient, f as BundlerClientConfig, j as ERC20_TRANSFER_ABI, b as ExactEvmSchemeEIP3009, c as ExactEvmSchemeEIP3009Config, E as ExactEvmSchemeERC4337, a as ExactEvmSchemeERC4337Config, G as GasEstimate, g as UserOperationCall, V as ViemBundlerClient, h as ViemBundlerClientConfig, i as buildERC20TransferCallData, d as createP256SafeMessageSigner, e as createWebAuthnSafeMessageSigner, u as userOpToJson } from '../../userOperation-bd50ILnY.js';
3
3
  import { SmartAccount } from 'viem/account-abstraction';
4
4
  import 'viem';
5
5
  import '../../types-Dk5U6Xnw.js';
6
- import '../../types-DkMSfvxL.js';
6
+ import '../../types-lO5B0FRc.js';
7
7
  import '@x402/core/types';
8
8
 
9
9
  /**
@@ -84,6 +84,7 @@ var ViemBundlerClient = class {
84
84
  data: call.data
85
85
  }))
86
86
  });
87
+ const p = prepared;
87
88
  return {
88
89
  sender: prepared.sender,
89
90
  nonce: prepared.nonce,
@@ -93,16 +94,14 @@ var ViemBundlerClient = class {
93
94
  preVerificationGas: prepared.preVerificationGas,
94
95
  maxFeePerGas: prepared.maxFeePerGas,
95
96
  maxPriorityFeePerGas: prepared.maxPriorityFeePerGas,
96
- // viem uses paymasterAndData instead of separate paymaster/paymasterData
97
- paymaster: prepared.paymasterAndData?.slice(
98
- 0,
99
- 42
100
- ),
101
- paymasterData: prepared.paymasterAndData?.slice(
102
- 42
103
- ),
104
- paymasterVerificationGasLimit: prepared.paymasterVerificationGasLimit,
105
- paymasterPostOpGasLimit: prepared.paymasterPostOpGasLimit,
97
+ // v0.7 factory fields (for account deployment)
98
+ ...p.factory ? { factory: p.factory } : {},
99
+ ...p.factoryData ? { factoryData: p.factoryData } : {},
100
+ // v0.7 paymaster fields (separate, not paymasterAndData)
101
+ ...p.paymaster ? { paymaster: p.paymaster } : {},
102
+ ...p.paymasterData ? { paymasterData: p.paymasterData } : {},
103
+ ...p.paymasterVerificationGasLimit != null ? { paymasterVerificationGasLimit: p.paymasterVerificationGasLimit } : {},
104
+ ...p.paymasterPostOpGasLimit != null ? { paymasterPostOpGasLimit: p.paymasterPostOpGasLimit } : {},
106
105
  signature: prepared.signature
107
106
  };
108
107
  }
@@ -146,7 +145,7 @@ var ViemBundlerClient = class {
146
145
  }
147
146
  };
148
147
 
149
- // src/exact/client/signer/safeAccountSigner.ts
148
+ // src/exact/client/signers/safeAccountSigner.ts
150
149
  var SafeAccountSigner = class {
151
150
  /**
152
151
  * Creates a new SafeAccountSigner instance.
@@ -176,7 +175,7 @@ var SafeAccountSigner = class {
176
175
  }
177
176
  };
178
177
 
179
- // src/exact/client/signer/safeMessageSigners.ts
178
+ // src/exact/client/signers/safeMessageSigners.ts
180
179
  var import_viem2 = require("viem");
181
180
  function createP256SafeMessageSigner(p256Signer) {
182
181
  return {
@@ -335,6 +334,7 @@ var SUPPORTED_CHAINS = {
335
334
  rpcUrl: "https://mainnet.base.org",
336
335
  blockExplorerUrl: "https://basescan.org",
337
336
  usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
337
+ safeTransactionServiceUrl: "https://safe-transaction-base.safe.global",
338
338
  testnet: false
339
339
  },
340
340
  84532: {
@@ -345,6 +345,7 @@ var SUPPORTED_CHAINS = {
345
345
  rpcUrl: "https://sepolia.base.org",
346
346
  blockExplorerUrl: "https://sepolia.basescan.org",
347
347
  usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
348
+ safeTransactionServiceUrl: "https://safe-transaction-base-sepolia.safe.global",
348
349
  testnet: true
349
350
  },
350
351
  10: {
@@ -355,6 +356,7 @@ var SUPPORTED_CHAINS = {
355
356
  rpcUrl: "https://mainnet.optimism.io",
356
357
  blockExplorerUrl: "https://optimistic.etherscan.io",
357
358
  usdcAddress: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
359
+ safeTransactionServiceUrl: "https://safe-transaction-optimism.safe.global",
358
360
  testnet: false
359
361
  },
360
362
  11155420: {
@@ -365,6 +367,7 @@ var SUPPORTED_CHAINS = {
365
367
  rpcUrl: "https://sepolia.optimism.io",
366
368
  blockExplorerUrl: "https://sepolia-optimistic.etherscan.io",
367
369
  usdcAddress: "0x5fd84259d66Cd46123540766Be93DFE6D43130D7",
370
+ safeTransactionServiceUrl: void 0,
368
371
  testnet: true
369
372
  },
370
373
  42161: {
@@ -375,6 +378,7 @@ var SUPPORTED_CHAINS = {
375
378
  rpcUrl: "https://arb1.arbitrum.io/rpc",
376
379
  blockExplorerUrl: "https://arbiscan.io",
377
380
  usdcAddress: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
381
+ safeTransactionServiceUrl: "https://safe-transaction-arbitrum.safe.global",
378
382
  testnet: false
379
383
  },
380
384
  421614: {
@@ -385,6 +389,7 @@ var SUPPORTED_CHAINS = {
385
389
  rpcUrl: "https://sepolia-rollup.arbitrum.io/rpc",
386
390
  blockExplorerUrl: "https://sepolia.arbiscan.io",
387
391
  usdcAddress: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d",
392
+ safeTransactionServiceUrl: void 0,
388
393
  testnet: true
389
394
  }
390
395
  };
@@ -544,9 +549,11 @@ var ExactEvmSchemeERC4337 = class {
544
549
  }
545
550
  const token = (0, import_viem4.getAddress)(paymentRequirements.asset);
546
551
  const payTo = (0, import_viem4.getAddress)(paymentRequirements.payTo);
547
- const amount = BigInt(
548
- paymentRequirements.amount ?? paymentRequirements.maxAmountRequired
549
- );
552
+ const amountStr = paymentRequirements.amount ?? paymentRequirements.maxAmountRequired;
553
+ if (!amountStr) {
554
+ throw new Error("Payment requirements missing amount (v2) or maxAmountRequired (v1)");
555
+ }
556
+ const amount = BigInt(amountStr);
550
557
  const callData = buildERC20TransferCallData(token, payTo, amount);
551
558
  let unsignedUserOp;
552
559
  try {
@@ -687,6 +694,9 @@ var ExactEvmSchemeEIP3009 = class {
687
694
  async createPaymentPayload(x402Version, paymentRequirements) {
688
695
  const chainId = resolveChainId(paymentRequirements.network);
689
696
  const amount = paymentRequirements.amount ?? paymentRequirements.maxAmountRequired;
697
+ if (!amount) {
698
+ throw new Error("Payment requirements missing amount (v2) or maxAmountRequired (v1)");
699
+ }
690
700
  const nonce = createNonce();
691
701
  const now = Math.floor(Date.now() / 1e3);
692
702
  const authorization = {