@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.
- package/dist/cjs/accounts/index.d.ts +3 -23
- package/dist/cjs/accounts/index.js +24 -20
- package/dist/cjs/accounts/index.js.map +1 -1
- package/dist/cjs/constants-Bl5JlK9d.d.ts +7 -0
- package/dist/cjs/exact/client/index.d.ts +3 -3
- package/dist/cjs/exact/client/index.js +25 -15
- package/dist/cjs/exact/client/index.js.map +1 -1
- package/dist/cjs/exact/server/index.d.ts +1 -0
- package/dist/cjs/exact/server/index.js +103 -0
- package/dist/cjs/exact/server/index.js.map +1 -1
- package/dist/cjs/factories/index.d.ts +25 -3
- package/dist/cjs/factories/index.js +35 -4
- package/dist/cjs/factories/index.js.map +1 -1
- package/dist/cjs/index.d.ts +4 -3
- package/dist/cjs/index.js +210 -165
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/networks/index.d.ts +1 -0
- package/dist/cjs/networks/index.js +6 -0
- package/dist/cjs/networks/index.js.map +1 -1
- package/dist/cjs/{types-DkMSfvxL.d.ts → types-lO5B0FRc.d.ts} +2 -0
- package/dist/cjs/{userOperation-qDblljjR.d.ts → userOperation-bd50ILnY.d.ts} +1 -1
- package/dist/esm/accounts/index.d.mts +3 -23
- package/dist/esm/accounts/index.mjs +2 -1
- package/dist/esm/{chunk-SR2JWH6A.mjs → chunk-3CGZ3NSF.mjs} +7 -1
- package/dist/esm/chunk-3CGZ3NSF.mjs.map +1 -0
- package/dist/esm/{chunk-BVA72I5T.mjs → chunk-FB2R2BXN.mjs} +23 -21
- package/dist/esm/chunk-FB2R2BXN.mjs.map +1 -0
- package/dist/esm/chunk-RN5WLEGU.mjs +1 -0
- package/dist/esm/chunk-RN5WLEGU.mjs.map +1 -0
- package/dist/esm/{chunk-4XERD37F.mjs → chunk-U7RIL3MO.mjs} +21 -17
- package/dist/esm/chunk-U7RIL3MO.mjs.map +1 -0
- package/dist/esm/{chunk-E3XDJP7M.mjs → chunk-UYKF2CHM.mjs} +21 -1
- package/dist/esm/chunk-UYKF2CHM.mjs.map +1 -0
- package/dist/esm/chunk-W3QALCLQ.mjs +17 -0
- package/dist/esm/chunk-W3QALCLQ.mjs.map +1 -0
- package/dist/esm/constants-Bl5JlK9d.d.mts +7 -0
- package/dist/esm/exact/client/index.d.mts +3 -3
- package/dist/esm/exact/client/index.mjs +3 -2
- package/dist/esm/exact/server/index.d.mts +1 -0
- package/dist/esm/exact/server/index.mjs +2 -1
- package/dist/esm/factories/index.d.mts +25 -3
- package/dist/esm/factories/index.mjs +29 -4
- package/dist/esm/factories/index.mjs.map +1 -1
- package/dist/esm/index.d.mts +4 -3
- package/dist/esm/index.mjs +19 -4
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/networks/index.d.mts +1 -0
- package/dist/esm/networks/index.mjs +2 -1
- package/dist/esm/{types-DkMSfvxL.d.mts → types-lO5B0FRc.d.mts} +2 -0
- package/dist/esm/{userOperation-CI4ZetII.d.mts → userOperation--Sqhz6PA.d.mts} +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-4XERD37F.mjs.map +0 -1
- package/dist/esm/chunk-BVA72I5T.mjs.map +0 -1
- package/dist/esm/chunk-E3XDJP7M.mjs.map +0 -1
- 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-
|
|
3
|
-
export { P as P256Signer, S as SafeMessageSigner, a as SignerConfig } from '../types-
|
|
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
|
-
|
|
55
|
-
|
|
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 =
|
|
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 ??
|
|
129
|
-
const entryPointAddress = params.entryPoint?.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 ??
|
|
191
|
-
const entryPointAddress = params.entryPoint?.address ??
|
|
192
|
-
|
|
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 ??
|
|
290
|
-
const entryPointAddress = params.entryPoint?.address ??
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
paymasterData:
|
|
102
|
-
|
|
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/
|
|
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/
|
|
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
|
|
548
|
-
|
|
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 = {
|