@account-kit/smart-contracts 4.73.1-alpha.9 → 4.75.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.
@@ -1,5 +1,5 @@
1
1
  import { concat, concatHex, hashMessage, hashTypedData, } from "viem";
2
- import { packUOSignature, pack1271Signature, DEFAULT_OWNER_ENTITY_ID, assertNeverSignatureRequestType, } from "../utils.js";
2
+ import { packUOSignature, pack1271EOASignature, DEFAULT_OWNER_ENTITY_ID, assertNever, isDeferredAction, } from "../utils.js";
3
3
  import { SignatureType } from "../modules/utils.js";
4
4
  /**
5
5
  * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.
@@ -28,14 +28,13 @@ export const nativeSMASigner = (signer, chain, accountAddress, deferredActionDat
28
28
  const signingMethods = {
29
29
  prepareSign: async (request) => {
30
30
  let hash;
31
- switch (request.type) {
31
+ const requestType = request.type;
32
+ switch (requestType) {
32
33
  case "personal_sign":
33
34
  hash = hashMessage(request.data);
34
35
  break;
35
36
  case "eth_signTypedData_v4":
36
- const isDeferredAction = request.data?.primaryType === "DeferredAction" &&
37
- request.data?.domain?.verifyingContract === accountAddress;
38
- if (isDeferredAction) {
37
+ if (isDeferredAction(request.data, accountAddress)) {
39
38
  return request;
40
39
  }
41
40
  else {
@@ -43,7 +42,7 @@ export const nativeSMASigner = (signer, chain, accountAddress, deferredActionDat
43
42
  break;
44
43
  }
45
44
  default:
46
- assertNeverSignatureRequestType();
45
+ return assertNever(requestType, "Invalid signature request type");
47
46
  }
48
47
  return {
49
48
  type: "eth_signTypedData_v4",
@@ -63,7 +62,7 @@ export const nativeSMASigner = (signer, chain, accountAddress, deferredActionDat
63
62
  };
64
63
  },
65
64
  formatSign: async (signature) => {
66
- return pack1271Signature({
65
+ return pack1271EOASignature({
67
66
  validationSignature: signature,
68
67
  entityId: DEFAULT_OWNER_ENTITY_ID,
69
68
  });
@@ -114,12 +113,7 @@ export const nativeSMASigner = (signer, chain, accountAddress, deferredActionDat
114
113
  throw new Error("Invalid signature request type");
115
114
  }
116
115
  const sig = await signer.signTypedData(data);
117
- const isDeferredAction = typedDataDefinition.primaryType === "DeferredAction" &&
118
- typedDataDefinition.domain != null &&
119
- // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)
120
- "verifyingContract" in typedDataDefinition.domain &&
121
- typedDataDefinition.domain.verifyingContract === accountAddress;
122
- return isDeferredAction
116
+ return isDeferredAction(typedDataDefinition, accountAddress)
123
117
  ? concat([SignatureType.EOA, sig])
124
118
  : signingMethods.formatSign(sig);
125
119
  },
@@ -1 +1 @@
1
- {"version":3,"file":"nativeSMASigner.js","sourceRoot":"","sources":["../../../../../src/ma-v2/account/nativeSMASigner.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SmartAccountSigner,\n SigningMethods,\n SignatureRequest,\n} from \"@aa-sdk/core\";\nimport {\n type Address,\n type Chain,\n concat,\n concatHex,\n hashMessage,\n hashTypedData,\n type Hex,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport {\n packUOSignature,\n pack1271Signature,\n DEFAULT_OWNER_ENTITY_ID,\n assertNeverSignatureRequestType,\n} from \"../utils.js\";\nimport { SignatureType } from \"../modules/utils.js\";\n\n/**\n * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.\n *\n * @example\n * ```ts\n * import { nativeSMASigner } from \"@account-kit/smart-contracts\";\n * import { LocalAccountSigner } from \"@aa-sdk/core\";\n *\n * const MNEMONIC = \"...\":\n *\n * const account = createModularAccountV2({ config });\n *\n * const signer = LocalAccountSigner.mnemonicToAccountSigner(MNEMONIC);\n *\n * const messageSigner = nativeSMASigner(signer, chain, account.address);\n * ```\n *\n * @param {SmartAccountSigner} signer Signer to use for signing operations\n * @param {Chain} chain Chain object for the signer\n * @param {Address} accountAddress address of the smart account using this signer\n * @param {Hex} deferredActionData optional deferred action data to prepend to the uo signatures\n * @returns {object} an object with methods for signing operations and managing signatures\n */\nexport const nativeSMASigner = (\n signer: SmartAccountSigner,\n chain: Chain,\n accountAddress: Address,\n deferredActionData?: Hex,\n) => {\n const signingMethods: SigningMethods = {\n prepareSign: async (\n request: SignatureRequest,\n ): Promise<SignatureRequest> => {\n let hash;\n\n switch (request.type) {\n case \"personal_sign\":\n hash = hashMessage(request.data);\n break;\n\n case \"eth_signTypedData_v4\":\n const isDeferredAction =\n request.data?.primaryType === \"DeferredAction\" &&\n request.data?.domain?.verifyingContract === accountAddress;\n\n if (isDeferredAction) {\n return request;\n } else {\n hash = await hashTypedData(request.data);\n break;\n }\n\n default:\n assertNeverSignatureRequestType();\n }\n\n return {\n type: \"eth_signTypedData_v4\",\n data: {\n domain: {\n chainId: Number(chain.id),\n verifyingContract: accountAddress,\n },\n types: {\n ReplaySafeHash: [{ name: \"hash\", type: \"bytes32\" }],\n },\n message: {\n hash,\n },\n primaryType: \"ReplaySafeHash\",\n },\n };\n },\n formatSign: async (signature: Hex) => {\n return pack1271Signature({\n validationSignature: signature,\n entityId: DEFAULT_OWNER_ENTITY_ID,\n });\n },\n };\n\n return {\n ...signingMethods,\n getDummySignature: (): Hex => {\n const sig = packUOSignature({\n // orderedHookData: [],\n validationSignature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n });\n\n return deferredActionData ? concatHex([deferredActionData, sig]) : sig;\n },\n\n signUserOperationHash: async (uoHash: Hex): Promise<Hex> => {\n let sig = await signer\n .signMessage({ raw: uoHash })\n .then((signature: Hex) =>\n packUOSignature({\n // orderedHookData: [],\n validationSignature: signature,\n }),\n );\n\n if (deferredActionData) {\n sig = concatHex([deferredActionData, sig]);\n deferredActionData = undefined;\n }\n\n return sig;\n },\n\n // we apply the expected 1271 packing here since the account contract will expect it\n async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {\n const { type, data } = await signingMethods.prepareSign({\n type: \"personal_sign\",\n data: message,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n return signingMethods.formatSign(sig);\n },\n\n // TODO: maybe move \"sign deferred actions\" to a separate function?\n // we don't apply the expected 1271 packing since deferred sigs use typed data sigs and don't expect the 1271 packing\n signTypedData: async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n >(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>,\n ): Promise<Hex> => {\n const { type, data } = await signingMethods.prepareSign({\n type: \"eth_signTypedData_v4\",\n data: typedDataDefinition as TypedDataDefinition,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n const isDeferredAction =\n typedDataDefinition.primaryType === \"DeferredAction\" &&\n typedDataDefinition.domain != null &&\n // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)\n \"verifyingContract\" in typedDataDefinition.domain &&\n typedDataDefinition.domain.verifyingContract === accountAddress;\n\n return isDeferredAction\n ? concat([SignatureType.EOA, sig])\n : signingMethods.formatSign(sig);\n },\n };\n};\n"]}
1
+ {"version":3,"file":"nativeSMASigner.js","sourceRoot":"","sources":["../../../../../src/ma-v2/account/nativeSMASigner.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SmartAccountSigner,\n SigningMethods,\n SignatureRequest,\n} from \"@aa-sdk/core\";\nimport {\n type Address,\n type Chain,\n concat,\n concatHex,\n hashMessage,\n hashTypedData,\n type Hex,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport {\n packUOSignature,\n pack1271EOASignature,\n DEFAULT_OWNER_ENTITY_ID,\n assertNever,\n isDeferredAction,\n} from \"../utils.js\";\nimport { SignatureType } from \"../modules/utils.js\";\n\n/**\n * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.\n *\n * @example\n * ```ts\n * import { nativeSMASigner } from \"@account-kit/smart-contracts\";\n * import { LocalAccountSigner } from \"@aa-sdk/core\";\n *\n * const MNEMONIC = \"...\":\n *\n * const account = createModularAccountV2({ config });\n *\n * const signer = LocalAccountSigner.mnemonicToAccountSigner(MNEMONIC);\n *\n * const messageSigner = nativeSMASigner(signer, chain, account.address);\n * ```\n *\n * @param {SmartAccountSigner} signer Signer to use for signing operations\n * @param {Chain} chain Chain object for the signer\n * @param {Address} accountAddress address of the smart account using this signer\n * @param {Hex} deferredActionData optional deferred action data to prepend to the uo signatures\n * @returns {object} an object with methods for signing operations and managing signatures\n */\nexport const nativeSMASigner = (\n signer: SmartAccountSigner,\n chain: Chain,\n accountAddress: Address,\n deferredActionData?: Hex,\n) => {\n const signingMethods: SigningMethods = {\n prepareSign: async (\n request: SignatureRequest,\n ): Promise<SignatureRequest> => {\n let hash;\n const requestType = request.type;\n\n switch (requestType) {\n case \"personal_sign\":\n hash = hashMessage(request.data);\n break;\n\n case \"eth_signTypedData_v4\":\n if (isDeferredAction(request.data, accountAddress)) {\n return request;\n } else {\n hash = await hashTypedData(request.data);\n break;\n }\n\n default:\n return assertNever(requestType, \"Invalid signature request type\");\n }\n\n return {\n type: \"eth_signTypedData_v4\",\n data: {\n domain: {\n chainId: Number(chain.id),\n verifyingContract: accountAddress,\n },\n types: {\n ReplaySafeHash: [{ name: \"hash\", type: \"bytes32\" }],\n },\n message: {\n hash,\n },\n primaryType: \"ReplaySafeHash\",\n },\n };\n },\n formatSign: async (signature: Hex) => {\n return pack1271EOASignature({\n validationSignature: signature,\n entityId: DEFAULT_OWNER_ENTITY_ID,\n });\n },\n };\n\n return {\n ...signingMethods,\n getDummySignature: (): Hex => {\n const sig = packUOSignature({\n // orderedHookData: [],\n validationSignature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n });\n\n return deferredActionData ? concatHex([deferredActionData, sig]) : sig;\n },\n\n signUserOperationHash: async (uoHash: Hex): Promise<Hex> => {\n let sig = await signer\n .signMessage({ raw: uoHash })\n .then((signature: Hex) =>\n packUOSignature({\n // orderedHookData: [],\n validationSignature: signature,\n }),\n );\n\n if (deferredActionData) {\n sig = concatHex([deferredActionData, sig]);\n deferredActionData = undefined;\n }\n\n return sig;\n },\n\n // we apply the expected 1271 packing here since the account contract will expect it\n async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {\n const { type, data } = await signingMethods.prepareSign({\n type: \"personal_sign\",\n data: message,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n return signingMethods.formatSign(sig);\n },\n\n // TODO: maybe move \"sign deferred actions\" to a separate function?\n // we don't apply the expected 1271 packing since deferred sigs use typed data sigs and don't expect the 1271 packing\n signTypedData: async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n >(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>,\n ): Promise<Hex> => {\n const { type, data } = await signingMethods.prepareSign({\n type: \"eth_signTypedData_v4\",\n data: typedDataDefinition as TypedDataDefinition,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n return isDeferredAction(typedDataDefinition, accountAddress)\n ? concat([SignatureType.EOA, sig])\n : signingMethods.formatSign(sig);\n },\n };\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { concat, concatHex, hashMessage, hashTypedData, } from "viem";
2
2
  import { getDefaultSingleSignerValidationModuleAddress, SignatureType, } from "../utils.js";
3
- import { packUOSignature, pack1271Signature, assertNeverSignatureRequestType, } from "../../utils.js";
3
+ import { packUOSignature, pack1271EOASignature, isDeferredAction, assertNever, } from "../../utils.js";
4
4
  /**
5
5
  * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.
6
6
  *
@@ -30,7 +30,8 @@ export const singleSignerMessageSigner = (signer, chain, accountAddress, entityI
30
30
  const signingMethods = {
31
31
  prepareSign: async (request) => {
32
32
  let hash;
33
- switch (request.type) {
33
+ const requestType = request.type;
34
+ switch (requestType) {
34
35
  case "personal_sign":
35
36
  hash = hashMessage(request.data);
36
37
  break;
@@ -38,7 +39,7 @@ export const singleSignerMessageSigner = (signer, chain, accountAddress, entityI
38
39
  hash = await hashTypedData(request.data);
39
40
  break;
40
41
  default:
41
- assertNeverSignatureRequestType();
42
+ return assertNever(requestType, "Invalid signature request type");
42
43
  }
43
44
  return {
44
45
  type: "eth_signTypedData_v4",
@@ -59,7 +60,7 @@ export const singleSignerMessageSigner = (signer, chain, accountAddress, entityI
59
60
  };
60
61
  },
61
62
  formatSign: async (signature) => {
62
- return pack1271Signature({
63
+ return pack1271EOASignature({
63
64
  validationSignature: signature,
64
65
  entityId,
65
66
  });
@@ -110,12 +111,7 @@ export const singleSignerMessageSigner = (signer, chain, accountAddress, entityI
110
111
  throw new Error("Invalid signature request type");
111
112
  }
112
113
  const sig = await signer.signTypedData(data);
113
- const isDeferredAction = typedDataDefinition.primaryType === "DeferredAction" &&
114
- typedDataDefinition.domain != null &&
115
- // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)
116
- "verifyingContract" in typedDataDefinition.domain &&
117
- typedDataDefinition.domain.verifyingContract === accountAddress;
118
- return isDeferredAction
114
+ return isDeferredAction(typedDataDefinition, accountAddress)
119
115
  ? concat([SignatureType.EOA, sig])
120
116
  : signingMethods.formatSign(sig);
121
117
  },
@@ -1 +1 @@
1
- {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/single-signer-validation/signer.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SmartAccountSigner,\n SigningMethods,\n SignatureRequest,\n} from \"@aa-sdk/core\";\nimport {\n type Address,\n type Chain,\n concat,\n concatHex,\n hashMessage,\n hashTypedData,\n type Hex,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport {\n getDefaultSingleSignerValidationModuleAddress,\n SignatureType,\n} from \"../utils.js\";\nimport {\n packUOSignature,\n pack1271Signature,\n assertNeverSignatureRequestType,\n} from \"../../utils.js\";\n\n/**\n * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.\n *\n * @example \n \n * ```ts\n * import { singleSignerMessageSigner } from \"@account-kit/smart-contracts\";\n * import { LocalAccountSigner } from \"@aa-sdk/core\";\n *\n * const MNEMONIC = \"...\":\n * \n * const account = createModularAccountV2({ config });\n *\n * const signer = LocalAccountSigner.mnemonicToAccountSigner(MNEMONIC);\n *\n * const messageSigner = singleSignerMessageSigner(signer, chain, account.address, account.signerEntity.entityId);\n * ```\n *\n * @param {SmartAccountSigner} signer Signer to use for signing operations\n * @param {Chain} chain Chain object for the signer\n * @param {Address} accountAddress address of the smart account using this signer\n * @param {number} entityId the entity id of the signing validation\n * @param {Hex} deferredActionData optional deferred action data to prepend to the uo signatures\n * @returns {object} an object with methods for signing operations and managing signatures\n */\nexport const singleSignerMessageSigner = (\n signer: SmartAccountSigner,\n chain: Chain,\n accountAddress: Address,\n entityId: number,\n deferredActionData?: Hex,\n) => {\n const signingMethods: SigningMethods = {\n prepareSign: async (\n request: SignatureRequest,\n ): Promise<SignatureRequest> => {\n let hash;\n\n switch (request.type) {\n case \"personal_sign\":\n hash = hashMessage(request.data);\n break;\n\n case \"eth_signTypedData_v4\":\n hash = await hashTypedData(request.data);\n break;\n\n default:\n assertNeverSignatureRequestType();\n }\n\n return {\n type: \"eth_signTypedData_v4\",\n data: {\n domain: {\n chainId: Number(chain.id),\n verifyingContract:\n getDefaultSingleSignerValidationModuleAddress(chain),\n salt: concatHex([`0x${\"00\".repeat(12)}`, accountAddress]),\n },\n types: {\n ReplaySafeHash: [{ name: \"hash\", type: \"bytes32\" }],\n },\n message: {\n hash,\n },\n primaryType: \"ReplaySafeHash\",\n },\n };\n },\n formatSign: async (signature: Hex) => {\n return pack1271Signature({\n validationSignature: signature,\n entityId,\n });\n },\n };\n\n return {\n ...signingMethods,\n getDummySignature: (): Hex => {\n const sig = packUOSignature({\n // orderedHookData: [],\n validationSignature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n });\n\n return deferredActionData ? concatHex([deferredActionData, sig]) : sig;\n },\n\n signUserOperationHash: async (uoHash: Hex): Promise<Hex> => {\n let sig = await signer\n .signMessage({ raw: uoHash })\n .then((signature: Hex) =>\n packUOSignature({\n // orderedHookData: [],\n validationSignature: signature,\n }),\n );\n\n if (deferredActionData) {\n sig = concatHex([deferredActionData, sig]);\n deferredActionData = undefined;\n }\n\n return sig;\n },\n\n // we apply the expected 1271 packing here since the account contract will expect it\n async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {\n const { type, data } = await signingMethods.prepareSign({\n type: \"personal_sign\",\n data: message,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n return signingMethods.formatSign(sig);\n },\n\n // TODO: maybe move \"sign deferred actions\" to a separate function?\n // we don't apply the expected 1271 packing since deferred sigs use typed data sigs and don't expect the 1271 packing\n signTypedData: async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n >(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>,\n ): Promise<Hex> => {\n const { type, data } = await signingMethods.prepareSign({\n type: \"eth_signTypedData_v4\",\n data: typedDataDefinition as TypedDataDefinition,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n const isDeferredAction =\n typedDataDefinition.primaryType === \"DeferredAction\" &&\n typedDataDefinition.domain != null &&\n // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)\n \"verifyingContract\" in typedDataDefinition.domain &&\n typedDataDefinition.domain.verifyingContract === accountAddress;\n\n return isDeferredAction\n ? concat([SignatureType.EOA, sig])\n : signingMethods.formatSign(sig);\n },\n };\n};\n"]}
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/single-signer-validation/signer.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SmartAccountSigner,\n SigningMethods,\n SignatureRequest,\n} from \"@aa-sdk/core\";\nimport {\n type Address,\n type Chain,\n concat,\n concatHex,\n hashMessage,\n hashTypedData,\n type Hex,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport {\n getDefaultSingleSignerValidationModuleAddress,\n SignatureType,\n} from \"../utils.js\";\nimport {\n packUOSignature,\n pack1271EOASignature,\n isDeferredAction,\n assertNever,\n} from \"../../utils.js\";\n\n/**\n * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.\n *\n * @example \n \n * ```ts\n * import { singleSignerMessageSigner } from \"@account-kit/smart-contracts\";\n * import { LocalAccountSigner } from \"@aa-sdk/core\";\n *\n * const MNEMONIC = \"...\":\n * \n * const account = createModularAccountV2({ config });\n *\n * const signer = LocalAccountSigner.mnemonicToAccountSigner(MNEMONIC);\n *\n * const messageSigner = singleSignerMessageSigner(signer, chain, account.address, account.signerEntity.entityId);\n * ```\n *\n * @param {SmartAccountSigner} signer Signer to use for signing operations\n * @param {Chain} chain Chain object for the signer\n * @param {Address} accountAddress address of the smart account using this signer\n * @param {number} entityId the entity id of the signing validation\n * @param {Hex} deferredActionData optional deferred action data to prepend to the uo signatures\n * @returns {object} an object with methods for signing operations and managing signatures\n */\nexport const singleSignerMessageSigner = (\n signer: SmartAccountSigner,\n chain: Chain,\n accountAddress: Address,\n entityId: number,\n deferredActionData?: Hex,\n) => {\n const signingMethods: SigningMethods = {\n prepareSign: async (\n request: SignatureRequest,\n ): Promise<SignatureRequest> => {\n let hash;\n const requestType = request.type;\n\n switch (requestType) {\n case \"personal_sign\":\n hash = hashMessage(request.data);\n break;\n\n case \"eth_signTypedData_v4\":\n hash = await hashTypedData(request.data);\n break;\n\n default:\n return assertNever(requestType, \"Invalid signature request type\");\n }\n\n return {\n type: \"eth_signTypedData_v4\",\n data: {\n domain: {\n chainId: Number(chain.id),\n verifyingContract:\n getDefaultSingleSignerValidationModuleAddress(chain),\n salt: concatHex([`0x${\"00\".repeat(12)}`, accountAddress]),\n },\n types: {\n ReplaySafeHash: [{ name: \"hash\", type: \"bytes32\" }],\n },\n message: {\n hash,\n },\n primaryType: \"ReplaySafeHash\",\n },\n };\n },\n formatSign: async (signature: Hex) => {\n return pack1271EOASignature({\n validationSignature: signature,\n entityId,\n });\n },\n };\n\n return {\n ...signingMethods,\n getDummySignature: (): Hex => {\n const sig = packUOSignature({\n // orderedHookData: [],\n validationSignature:\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\",\n });\n\n return deferredActionData ? concatHex([deferredActionData, sig]) : sig;\n },\n\n signUserOperationHash: async (uoHash: Hex): Promise<Hex> => {\n let sig = await signer\n .signMessage({ raw: uoHash })\n .then((signature: Hex) =>\n packUOSignature({\n // orderedHookData: [],\n validationSignature: signature,\n }),\n );\n\n if (deferredActionData) {\n sig = concatHex([deferredActionData, sig]);\n deferredActionData = undefined;\n }\n\n return sig;\n },\n\n // we apply the expected 1271 packing here since the account contract will expect it\n async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {\n const { type, data } = await signingMethods.prepareSign({\n type: \"personal_sign\",\n data: message,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n return signingMethods.formatSign(sig);\n },\n\n // TODO: maybe move \"sign deferred actions\" to a separate function?\n // we don't apply the expected 1271 packing since deferred sigs use typed data sigs and don't expect the 1271 packing\n signTypedData: async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n >(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>,\n ): Promise<Hex> => {\n const { type, data } = await signingMethods.prepareSign({\n type: \"eth_signTypedData_v4\",\n data: typedDataDefinition as TypedDataDefinition,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const sig = await signer.signTypedData(data);\n\n return isDeferredAction(typedDataDefinition, accountAddress)\n ? concat([SignatureType.EOA, sig])\n : signingMethods.formatSign(sig);\n },\n };\n};\n"]}
@@ -1,5 +1,6 @@
1
1
  import { type Address, type Chain, type Hex, type SignableMessage, type TypedData, type TypedDataDefinition } from "viem";
2
2
  import { type ToWebAuthnAccountParameters } from "viem/account-abstraction";
3
+ import type { SignatureRequest } from "@aa-sdk/core";
3
4
  /**
4
5
  * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.
5
6
  *
@@ -25,12 +26,11 @@ export declare const webauthnSigningFunctions: (credential: ToWebAuthnAccountPar
25
26
  id: string;
26
27
  publicKey: `0x${string}`;
27
28
  getDummySignature: () => Hex;
28
- sign: ({ hash }: {
29
- hash: Hex;
30
- }) => Promise<`0x${string}`>;
31
29
  signUserOperationHash: (uoHash: Hex) => Promise<Hex>;
32
30
  signMessage({ message }: {
33
31
  message: SignableMessage;
34
32
  }): Promise<Hex>;
35
33
  signTypedData: <const typedData extends TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(typedDataDefinition: TypedDataDefinition<typedData, primaryType>) => Promise<Hex>;
34
+ prepareSign: (request: SignatureRequest) => Promise<SignatureRequest>;
35
+ formatSign: (signature: Hex) => Promise<Hex>;
36
36
  };
@@ -1,7 +1,7 @@
1
1
  import * as WebAuthnP256 from "ox/WebAuthnP256";
2
2
  import { concatHex, encodeAbiParameters, hashMessage, hashTypedData, } from "viem";
3
3
  import {} from "viem/account-abstraction";
4
- import { pack1271Signature } from "../../utils.js";
4
+ import { assertNever, isDeferredAction, pack1271WebAuthnSignature, } from "../../utils.js";
5
5
  import { getDefaultWebauthnValidationModuleAddress } from "../utils.js";
6
6
  /**
7
7
  * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.
@@ -57,11 +57,55 @@ export const webauthnSigningFunctions = (credential, getFn, rpId, chain, account
57
57
  },
58
58
  ]);
59
59
  };
60
+ const signingMethods = {
61
+ prepareSign: async (request) => {
62
+ const requestType = request.type;
63
+ let hash;
64
+ switch (requestType) {
65
+ case "personal_sign":
66
+ hash = hashMessage(request.data);
67
+ break;
68
+ case "eth_signTypedData_v4":
69
+ if (isDeferredAction(request.data, accountAddress)) {
70
+ return request;
71
+ }
72
+ else {
73
+ hash = hashTypedData(request.data);
74
+ break;
75
+ }
76
+ default:
77
+ return assertNever(requestType, "Invalid signature request type");
78
+ }
79
+ return {
80
+ type: "eth_signTypedData_v4",
81
+ data: {
82
+ domain: {
83
+ chainId: Number(chain.id),
84
+ verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),
85
+ salt: concatHex([`0x${"00".repeat(12)}`, accountAddress]),
86
+ },
87
+ types: {
88
+ ReplaySafeHash: [{ name: "hash", type: "bytes32" }],
89
+ },
90
+ message: {
91
+ hash,
92
+ },
93
+ primaryType: "ReplaySafeHash",
94
+ },
95
+ };
96
+ },
97
+ formatSign: async (signature) => {
98
+ return pack1271WebAuthnSignature({
99
+ validationSignature: signature,
100
+ entityId,
101
+ });
102
+ },
103
+ };
60
104
  return {
105
+ ...signingMethods,
61
106
  id,
62
107
  publicKey,
63
108
  getDummySignature: () => "0xff000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000",
64
- sign,
65
109
  signUserOperationHash: async (uoHash) => {
66
110
  let sig = await sign({ hash: hashMessage({ raw: uoHash }) });
67
111
  if (deferredActionData) {
@@ -71,48 +115,28 @@ export const webauthnSigningFunctions = (credential, getFn, rpId, chain, account
71
115
  return concatHex(["0xff", sig]);
72
116
  },
73
117
  async signMessage({ message }) {
74
- const hash = hashTypedData({
75
- domain: {
76
- chainId: Number(chain.id),
77
- verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),
78
- salt: concatHex([`0x${"00".repeat(12)}`, accountAddress]),
79
- },
80
- types: {
81
- ReplaySafeHash: [{ name: "hash", type: "bytes32" }],
82
- },
83
- message: {
84
- hash: hashMessage(message),
85
- },
86
- primaryType: "ReplaySafeHash",
87
- });
88
- return pack1271Signature({
89
- validationSignature: await sign({ hash }),
90
- entityId,
118
+ const { data, type } = await signingMethods.prepareSign({
119
+ type: "personal_sign",
120
+ data: message,
91
121
  });
122
+ if (type !== "eth_signTypedData_v4") {
123
+ throw new Error("Invalid signature request type");
124
+ }
125
+ const signature = await sign({ hash: hashTypedData(data) });
126
+ return signingMethods.formatSign(signature);
92
127
  },
93
128
  signTypedData: async (typedDataDefinition) => {
94
- const isDeferredAction = typedDataDefinition?.primaryType === "DeferredAction" &&
95
- // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)
96
- "verifyingContract" in typedDataDefinition.domain &&
97
- typedDataDefinition.domain.verifyingContract === accountAddress;
98
- const hash = await hashTypedData({
99
- domain: {
100
- chainId: Number(chain.id),
101
- verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),
102
- salt: concatHex([`0x${"00".repeat(12)}`, accountAddress]),
103
- },
104
- types: {
105
- ReplaySafeHash: [{ name: "hash", type: "bytes32" }],
106
- },
107
- message: {
108
- hash: hashTypedData(typedDataDefinition),
109
- },
110
- primaryType: "ReplaySafeHash",
129
+ const { data, type } = await signingMethods.prepareSign({
130
+ type: "eth_signTypedData_v4",
131
+ data: typedDataDefinition,
111
132
  });
112
- const validationSignature = await sign({ hash });
113
- return isDeferredAction
114
- ? pack1271Signature({ validationSignature, entityId })
115
- : validationSignature;
133
+ if (type !== "eth_signTypedData_v4") {
134
+ throw new Error("Invalid signature request type");
135
+ }
136
+ const signature = await sign({ hash: hashTypedData(data) });
137
+ return isDeferredAction(typedDataDefinition, accountAddress)
138
+ ? signature
139
+ : signingMethods.formatSign(signature);
116
140
  },
117
141
  };
118
142
  };
@@ -1 +1 @@
1
- {"version":3,"file":"signingMethods.js","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/webauthn-validation/signingMethods.ts"],"names":[],"mappings":"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","sourcesContent":["import * as WebAuthnP256 from \"ox/WebAuthnP256\";\nimport {\n type Address,\n type Chain,\n concatHex,\n encodeAbiParameters,\n hashMessage,\n hashTypedData,\n type Hex,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport { type ToWebAuthnAccountParameters } from \"viem/account-abstraction\";\nimport { pack1271Signature } from \"../../utils.js\";\nimport { getDefaultWebauthnValidationModuleAddress } from \"../utils.js\";\n\n/**\n * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.\n *\n * @example \n \n * ```ts\n * import { webauthnSigningFunctions } from \"@account-kit/smart-contracts\";\n * import { LocalAccountSigner } from \"@aa-sdk/core\";\n *\n * const messageSigner = webauthnSigningFunctions(credential, getFn, rpId, chain, account.address, account.signerEntity.entityId);\n * ```\n *\n * @param {ToWebAuthnAccountParameters} credential the Webauthn public key credential object\n * @param {ToWebAuthnAccountParameters[\"getFn\"]} getFn function to retrieve the WebAuthn credential\n * @param {ToWebAuthnAccountParameters[\"rpId\"]} rpId the relying party ID for the WebAuthn credential\n * @param {Chain} chain Chain object for the signer\n * @param {Address} accountAddress address of the smart account using this signer\n * @param {number} entityId the entity id of the signing validation\n * @param {Hex} deferredActionData optional deferred action data to prepend to the uo signatures\n * @returns {object} an object with methods for signing operations and managing signatures\n */\nexport const webauthnSigningFunctions = (\n credential: ToWebAuthnAccountParameters[\"credential\"],\n getFn: ToWebAuthnAccountParameters[\"getFn\"],\n rpId: ToWebAuthnAccountParameters[\"rpId\"],\n chain: Chain,\n accountAddress: Address,\n entityId: number,\n deferredActionData?: Hex,\n) => {\n const { id, publicKey } = credential;\n\n const sign = async ({ hash }: { hash: Hex }) => {\n const { metadata, signature } = await WebAuthnP256.sign({\n credentialId: id,\n getFn,\n challenge: hash,\n rpId,\n });\n\n return encodeAbiParameters(\n [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"authenticatorData\", type: \"bytes\" },\n { name: \"clientDataJSON\", type: \"string\" },\n { name: \"challengeIndex\", type: \"uint256\" },\n { name: \"typeIndex\", type: \"uint256\" },\n { name: \"r\", type: \"uint256\" },\n { name: \"s\", type: \"uint256\" },\n ],\n },\n ],\n [\n {\n authenticatorData: metadata.authenticatorData,\n clientDataJSON: metadata.clientDataJSON,\n challengeIndex: BigInt(metadata.challengeIndex),\n typeIndex: BigInt(metadata.typeIndex),\n r: signature.r,\n s: signature.s,\n },\n ],\n );\n };\n\n return {\n id,\n publicKey,\n getDummySignature: (): Hex =>\n \"0xff000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000\",\n sign,\n signUserOperationHash: async (uoHash: Hex): Promise<Hex> => {\n let sig = await sign({ hash: hashMessage({ raw: uoHash }) });\n if (deferredActionData) {\n sig = concatHex([deferredActionData, sig]);\n deferredActionData = undefined;\n }\n\n return concatHex([\"0xff\", sig]);\n },\n\n async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {\n const hash = hashTypedData({\n domain: {\n chainId: Number(chain.id),\n verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),\n salt: concatHex([`0x${\"00\".repeat(12)}`, accountAddress]),\n },\n types: {\n ReplaySafeHash: [{ name: \"hash\", type: \"bytes32\" }],\n },\n message: {\n hash: hashMessage(message),\n },\n primaryType: \"ReplaySafeHash\",\n });\n\n return pack1271Signature({\n validationSignature: await sign({ hash }),\n entityId,\n });\n },\n\n signTypedData: async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n >(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>,\n ): Promise<Hex> => {\n const isDeferredAction =\n typedDataDefinition?.primaryType === \"DeferredAction\" &&\n // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)\n \"verifyingContract\" in typedDataDefinition.domain &&\n typedDataDefinition.domain.verifyingContract === accountAddress;\n\n const hash = await hashTypedData({\n domain: {\n chainId: Number(chain.id),\n verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),\n salt: concatHex([`0x${\"00\".repeat(12)}`, accountAddress]),\n },\n types: {\n ReplaySafeHash: [{ name: \"hash\", type: \"bytes32\" }],\n },\n message: {\n hash: hashTypedData(typedDataDefinition),\n },\n primaryType: \"ReplaySafeHash\",\n });\n\n const validationSignature = await sign({ hash });\n\n return isDeferredAction\n ? pack1271Signature({ validationSignature, entityId })\n : validationSignature;\n },\n };\n};\n"]}
1
+ {"version":3,"file":"signingMethods.js","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/webauthn-validation/signingMethods.ts"],"names":[],"mappings":"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","sourcesContent":["import * as WebAuthnP256 from \"ox/WebAuthnP256\";\nimport {\n type Address,\n type Chain,\n concatHex,\n encodeAbiParameters,\n hashMessage,\n hashTypedData,\n type Hex,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport { type ToWebAuthnAccountParameters } from \"viem/account-abstraction\";\nimport {\n assertNever,\n isDeferredAction,\n pack1271WebAuthnSignature,\n} from \"../../utils.js\";\nimport { getDefaultWebauthnValidationModuleAddress } from \"../utils.js\";\nimport type { SignatureRequest, SigningMethods } from \"@aa-sdk/core\";\n\n/**\n * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.\n *\n * @example \n \n * ```ts\n * import { webauthnSigningFunctions } from \"@account-kit/smart-contracts\";\n * import { LocalAccountSigner } from \"@aa-sdk/core\";\n *\n * const messageSigner = webauthnSigningFunctions(credential, getFn, rpId, chain, account.address, account.signerEntity.entityId);\n * ```\n *\n * @param {ToWebAuthnAccountParameters} credential the Webauthn public key credential object\n * @param {ToWebAuthnAccountParameters[\"getFn\"]} getFn function to retrieve the WebAuthn credential\n * @param {ToWebAuthnAccountParameters[\"rpId\"]} rpId the relying party ID for the WebAuthn credential\n * @param {Chain} chain Chain object for the signer\n * @param {Address} accountAddress address of the smart account using this signer\n * @param {number} entityId the entity id of the signing validation\n * @param {Hex} deferredActionData optional deferred action data to prepend to the uo signatures\n * @returns {object} an object with methods for signing operations and managing signatures\n */\nexport const webauthnSigningFunctions = (\n credential: ToWebAuthnAccountParameters[\"credential\"],\n getFn: ToWebAuthnAccountParameters[\"getFn\"],\n rpId: ToWebAuthnAccountParameters[\"rpId\"],\n chain: Chain,\n accountAddress: Address,\n entityId: number,\n deferredActionData?: Hex,\n) => {\n const { id, publicKey } = credential;\n\n const sign = async ({ hash }: { hash: Hex }) => {\n const { metadata, signature } = await WebAuthnP256.sign({\n credentialId: id,\n getFn,\n challenge: hash,\n rpId,\n });\n\n return encodeAbiParameters(\n [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"authenticatorData\", type: \"bytes\" },\n { name: \"clientDataJSON\", type: \"string\" },\n { name: \"challengeIndex\", type: \"uint256\" },\n { name: \"typeIndex\", type: \"uint256\" },\n { name: \"r\", type: \"uint256\" },\n { name: \"s\", type: \"uint256\" },\n ],\n },\n ],\n [\n {\n authenticatorData: metadata.authenticatorData,\n clientDataJSON: metadata.clientDataJSON,\n challengeIndex: BigInt(metadata.challengeIndex),\n typeIndex: BigInt(metadata.typeIndex),\n r: signature.r,\n s: signature.s,\n },\n ],\n );\n };\n\n const signingMethods: SigningMethods = {\n prepareSign: async (\n request: SignatureRequest,\n ): Promise<SignatureRequest> => {\n const requestType = request.type;\n let hash;\n\n switch (requestType) {\n case \"personal_sign\":\n hash = hashMessage(request.data);\n break;\n\n case \"eth_signTypedData_v4\":\n if (isDeferredAction(request.data, accountAddress)) {\n return request;\n } else {\n hash = hashTypedData(request.data);\n break;\n }\n\n default:\n return assertNever(requestType, \"Invalid signature request type\");\n }\n\n return {\n type: \"eth_signTypedData_v4\",\n data: {\n domain: {\n chainId: Number(chain.id),\n verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),\n salt: concatHex([`0x${\"00\".repeat(12)}`, accountAddress]),\n },\n types: {\n ReplaySafeHash: [{ name: \"hash\", type: \"bytes32\" }],\n },\n message: {\n hash,\n },\n primaryType: \"ReplaySafeHash\",\n },\n };\n },\n formatSign: async (signature: Hex) => {\n return pack1271WebAuthnSignature({\n validationSignature: signature,\n entityId,\n });\n },\n };\n\n return {\n ...signingMethods,\n id,\n publicKey,\n getDummySignature: (): Hex =>\n \"0xff000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000\",\n signUserOperationHash: async (uoHash: Hex): Promise<Hex> => {\n let sig = await sign({ hash: hashMessage({ raw: uoHash }) });\n if (deferredActionData) {\n sig = concatHex([deferredActionData, sig]);\n deferredActionData = undefined;\n }\n\n return concatHex([\"0xff\", sig]);\n },\n\n async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {\n const { data, type } = await signingMethods.prepareSign({\n type: \"personal_sign\",\n data: message,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const signature = await sign({ hash: hashTypedData(data) });\n\n return signingMethods.formatSign(signature);\n },\n\n signTypedData: async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n >(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>,\n ): Promise<Hex> => {\n const { data, type } = await signingMethods.prepareSign({\n type: \"eth_signTypedData_v4\",\n data: typedDataDefinition as TypedDataDefinition,\n });\n\n if (type !== \"eth_signTypedData_v4\") {\n throw new Error(\"Invalid signature request type\");\n }\n\n const signature = await sign({ hash: hashTypedData(data) });\n\n return isDeferredAction(typedDataDefinition, accountAddress)\n ? signature\n : signingMethods.formatSign(signature);\n },\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { type Hex, type Chain, type Address, type Transport } from "viem";
1
+ import { type Hex, type Chain, type Address, type Transport, type TypedDataDefinition, type TypedData } from "viem";
2
2
  import { type ModularAccountV2 } from "./account/common/modularAccountV2Base.js";
3
3
  import { type GetAccountParameter, type SmartAccountClient, type SmartAccountSigner, type SmartContractAccountWithSigner, type UpgradeToData } from "@aa-sdk/core";
4
4
  export declare const DEFAULT_OWNER_ENTITY_ID = 0;
@@ -10,7 +10,8 @@ export type Pack1271SignatureParams = {
10
10
  entityId: number;
11
11
  };
12
12
  export declare const packUOSignature: ({ validationSignature, }: PackUOSignatureParams) => Hex;
13
- export declare const pack1271Signature: ({ validationSignature, entityId, }: Pack1271SignatureParams) => Hex;
13
+ export declare const pack1271EOASignature: ({ validationSignature, entityId, }: Pack1271SignatureParams) => Hex;
14
+ export declare const pack1271WebAuthnSignature: ({ validationSignature, entityId, }: Pack1271SignatureParams) => Hex;
14
15
  export declare const getDefaultWebAuthnMAV2FactoryAddress: () => Address;
15
16
  export declare const getDefaultMAV2FactoryAddress: (chain: Chain) => Address;
16
17
  export declare const getDefaultSMAV2BytecodeAddress: (chain: Chain) => Address;
@@ -105,4 +106,16 @@ export type BuildDeferredActionDigestParams = {
105
106
  * @returns {Hex} The encoded digest to be prepended to the userOp signature
106
107
  */
107
108
  export declare const buildDeferredActionDigest: ({ fullPreSignatureDeferredActionDigest, sig, }: BuildDeferredActionDigestParams) => Hex;
108
- export declare const assertNeverSignatureRequestType: () => never;
109
+ export declare const assertNever: (_val: never, msg: string) => never;
110
+ /**
111
+ * Type guard to check if a TypedDataDefinition is a deferred action.
112
+ *
113
+ * A deferred action has:
114
+ * - primaryType: "DeferredAction"
115
+ * - domain.verifyingContract matching the account address
116
+ *
117
+ * @param {TypedDataDefinition} typedDataDefinition - The typed data to check
118
+ * @param {Address} accountAddress - Account address to verify against domain.verifyingContract
119
+ * @returns {boolean} - True if the typedDataDefinition is a deferred action for this account
120
+ */
121
+ export declare const isDeferredAction: <const typedData extends TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(typedDataDefinition: TypedDataDefinition<typedData, primaryType>, accountAddress: Address) => boolean;
@@ -1,4 +1,4 @@
1
- import { concat, toHex, custom, encodeFunctionData, parseAbi, size, concatHex, hexToNumber, } from "viem";
1
+ import { concat, toHex, custom, encodeFunctionData, parseAbi, size, concatHex, hexToNumber, isAddressEqual, } from "viem";
2
2
  import { arbitrum, arbitrumSepolia, base, baseSepolia, mainnet, optimism, optimismSepolia, polygon, polygonAmoy, sepolia, } from "@account-kit/infra";
3
3
  import { createModularAccountV2 } from "./account/modularAccountV2.js";
4
4
  import {} from "./account/common/modularAccountV2Base.js";
@@ -11,8 +11,8 @@ export const packUOSignature = ({
11
11
  validationSignature, }) => {
12
12
  return concat(["0xFF", "0x00", validationSignature]);
13
13
  };
14
- // Signature packing utility for 1271 signatures
15
- export const pack1271Signature = ({ validationSignature, entityId, }) => {
14
+ // Signature packing utility for 1271 EOA signatures
15
+ export const pack1271EOASignature = ({ validationSignature, entityId, }) => {
16
16
  return concat([
17
17
  "0x00",
18
18
  toHex(entityId, { size: 4 }),
@@ -21,6 +21,17 @@ export const pack1271Signature = ({ validationSignature, entityId, }) => {
21
21
  validationSignature,
22
22
  ]);
23
23
  };
24
+ // WebAuthn signatures for EIP-1271 need the MAv2 segment structure
25
+ // Format: 0x00 (hooks) + entityId + 0xFF (segment marker) + WebAuthn signature
26
+ // Unlike EOA signatures, there's no signature type byte (0x00) before the WebAuthn data
27
+ export const pack1271WebAuthnSignature = ({ validationSignature, entityId, }) => {
28
+ return concatHex([
29
+ "0x00", // No pre-validation hooks
30
+ toHex(entityId, { size: 4 }), // Entity ID
31
+ "0xFF", // Reserved segment marker
32
+ validationSignature, // WebAuthn signature (already ABI-encoded)
33
+ ]);
34
+ };
24
35
  export const getDefaultWebAuthnMAV2FactoryAddress = () => {
25
36
  return "0x55010E571dCf07e254994bfc88b9C1C8FAe31960";
26
37
  };
@@ -194,7 +205,32 @@ export const buildDeferredActionDigest = ({ fullPreSignatureDeferredActionDigest
194
205
  ]);
195
206
  return encodedData;
196
207
  };
197
- export const assertNeverSignatureRequestType = () => {
198
- throw new Error("Invalid signature request type ");
208
+ export const assertNever = (_val, msg) => {
209
+ throw new Error(msg);
210
+ };
211
+ /**
212
+ * Type guard to check if a TypedDataDefinition is a deferred action.
213
+ *
214
+ * A deferred action has:
215
+ * - primaryType: "DeferredAction"
216
+ * - domain.verifyingContract matching the account address
217
+ *
218
+ * @param {TypedDataDefinition} typedDataDefinition - The typed data to check
219
+ * @param {Address} accountAddress - Account address to verify against domain.verifyingContract
220
+ * @returns {boolean} - True if the typedDataDefinition is a deferred action for this account
221
+ */
222
+ export const isDeferredAction = (typedDataDefinition, accountAddress) => {
223
+ if (typedDataDefinition.primaryType !== "DeferredAction" ||
224
+ !typedDataDefinition.domain ||
225
+ typeof typedDataDefinition.domain !== "object" ||
226
+ !("verifyingContract" in typedDataDefinition.domain)) {
227
+ return false;
228
+ }
229
+ try {
230
+ return isAddressEqual(typedDataDefinition.domain.verifyingContract, accountAddress);
231
+ }
232
+ catch {
233
+ return false;
234
+ }
199
235
  };
200
236
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/ma-v2/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n concat,\n toHex,\n custom,\n encodeFunctionData,\n type Hex,\n type Chain,\n type Address,\n type Transport,\n parseAbi,\n size,\n concatHex,\n hexToNumber,\n} from \"viem\";\nimport {\n arbitrum,\n arbitrumSepolia,\n base,\n baseSepolia,\n mainnet,\n optimism,\n optimismSepolia,\n polygon,\n polygonAmoy,\n sepolia,\n} from \"@account-kit/infra\";\nimport { createModularAccountV2 } from \"./account/modularAccountV2.js\";\nimport { type ModularAccountV2 } from \"./account/common/modularAccountV2Base.js\";\nimport { semiModularAccountStorageAbi } from \"./abis/semiModularAccountStorageAbi.js\";\nimport {\n AccountNotFoundError,\n ChainNotFoundError,\n type GetAccountParameter,\n type SmartAccountClient,\n type SmartAccountSigner,\n type SmartContractAccountWithSigner,\n type UpgradeToData,\n} from \"@aa-sdk/core\";\n\nexport const DEFAULT_OWNER_ENTITY_ID = 0;\n\nexport type PackUOSignatureParams = {\n // orderedHookData: HookData[];\n validationSignature: Hex;\n};\n\n// TODO: direct call validation 1271\nexport type Pack1271SignatureParams = {\n validationSignature: Hex;\n entityId: number;\n};\n\n// Signature packing utility for user operations\nexport const packUOSignature = ({\n // orderedHookData, TODO: integrate in next iteration of MAv2 sdk\n validationSignature,\n}: PackUOSignatureParams): Hex => {\n return concat([\"0xFF\", \"0x00\", validationSignature]);\n};\n\n// Signature packing utility for 1271 signatures\nexport const pack1271Signature = ({\n validationSignature,\n entityId,\n}: Pack1271SignatureParams): Hex => {\n return concat([\n \"0x00\",\n toHex(entityId, { size: 4 }),\n \"0xFF\",\n \"0x00\", // EOA type signature\n validationSignature,\n ]);\n};\n\nexport const getDefaultWebAuthnMAV2FactoryAddress = (): Address => {\n return \"0x55010E571dCf07e254994bfc88b9C1C8FAe31960\";\n};\n\nexport const getDefaultMAV2FactoryAddress = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x00000000000017c61b5bEe81050EC8eFc9c6fecd\";\n }\n};\n\nexport const getDefaultSMAV2BytecodeAddress = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x000000000000c5A9089039570Dd36455b5C07383\";\n }\n};\n\nexport const getDefaultSMAV2StorageAddress = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x0000000000006E2f9d80CaEc0Da6500f005EB25A\";\n }\n};\n\nexport const getDefaultSMAV27702Address = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x69007702764179f14F51cdce752f4f775d74E139\";\n }\n};\n\nexport const getDefaultMAV2Address = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x00000000000002377B26b1EdA7b0BC371C60DD4f\";\n }\n};\n\nexport type GetMAV2UpgradeToData<\n TSigner extends SmartAccountSigner = SmartAccountSigner,\n TAccount extends\n | SmartContractAccountWithSigner<string, TSigner>\n | undefined = SmartContractAccountWithSigner<string, TSigner> | undefined,\n> = GetAccountParameter<TAccount>;\n\n/**\n * Retrieves the data necessary to upgrade to a Modular Account V2 (MA v2).\n * Note that the upgrade will be to the Semi Modular Account Storage variant\n *\n * @example\n * ```ts\n * import { createLightAccountClient, getMAV2UpgradeToData } from \"@account-kit/smart-contracts\";\n *\n * const client = createLightAccountClient({});\n * const upgradeData = await getMAV2UpgradeToData(client, {});\n * ```\n *\n * @param {SmartAccountClient<TTransport, TChain, TAccount>} client The smart account client\n * @param {GetMAV2UpgradeToData<TSigner, TAccount>} args The arguments required for the upgrade\n * @returns {Promise<UpgradeToData & { createModularAccountV2FromExisting: () => Promise<ModularAccountV2<TSigner>>}>} A promise that resolves to upgrade data augmented with a function to create a Modular Account V2\n */\nexport async function getMAV2UpgradeToData<\n TTransport extends Transport = Transport,\n TChain extends Chain | undefined = Chain | undefined,\n TSigner extends SmartAccountSigner = SmartAccountSigner,\n TAccount extends\n | SmartContractAccountWithSigner<string, TSigner>\n | undefined = SmartContractAccountWithSigner<string, TSigner> | undefined,\n>(\n client: SmartAccountClient<TTransport, TChain, TAccount>,\n args: GetMAV2UpgradeToData<TSigner, TAccount>,\n): Promise<\n UpgradeToData & {\n createModularAccountV2FromExisting: () => Promise<\n ModularAccountV2<TSigner>\n >;\n }\n> {\n const { account: account_ = client.account } = args;\n\n if (!account_) {\n throw new AccountNotFoundError();\n }\n const account = account_ as SmartContractAccountWithSigner<string, TSigner>;\n\n const chain = client.chain;\n if (!chain) {\n throw new ChainNotFoundError();\n }\n\n const initData = encodeFunctionData({\n abi: semiModularAccountStorageAbi,\n functionName: \"initialize\",\n args: [await account.getSigner().getAddress()],\n });\n\n return {\n implAddress: getDefaultSMAV2StorageAddress(chain),\n initializationData: initData,\n createModularAccountV2FromExisting: async () =>\n createModularAccountV2({\n transport: custom(client.transport),\n chain: chain as Chain,\n signer: account.getSigner(),\n accountAddress: account.address,\n }),\n };\n}\n\nexport const entityIdAndNonceReaderBytecode =\n \"0x608060405234801561001057600080fd5b506040516104f13803806104f183398101604081905261002f916101e5565b60006008826001600160c01b0316901c90506000808263ffffffff1611610057576001610059565b815b90506001600160a01b0385163b15610133575b60006001600160a01b03861663d31b575b6bffffffff0000000000000000604085901b166040516001600160e01b031960e084901b1681526001600160401b03199091166004820152602401600060405180830381865afa1580156100d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526100fd91908101906103c6565b805190915060ff161580156101155750606081015151155b156101205750610133565b8161012a816104a4565b9250505061006c565b604051631aab3f0d60e11b81526001600160a01b03868116600483015264ffffffff01600160c01b038516600884901b64ffffffff0016176024830152600091908616906335567e1a90604401602060405180830381865afa15801561019d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c191906104d7565b90508060005260206000f35b6001600160a01b03811681146101e257600080fd5b50565b6000806000606084860312156101fa57600080fd5b8351610205816101cd565b6020850151909350610216816101cd565b60408501519092506001600160c01b038116811461023357600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156102765761027661023e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156102a4576102a461023e565b604052919050565b60006001600160401b038211156102c5576102c561023e565b5060051b60200190565b600082601f8301126102e057600080fd5b81516102f36102ee826102ac565b61027c565b8082825260208201915060208360051b86010192508583111561031557600080fd5b602085015b8381101561034857805166ffffffffffffff198116811461033a57600080fd5b83526020928301920161031a565b5095945050505050565b600082601f83011261036357600080fd5b81516103716102ee826102ac565b8082825260208201915060208360051b86010192508583111561039357600080fd5b602085015b838110156103485780516001600160e01b0319811681146103b857600080fd5b835260209283019201610398565b6000602082840312156103d857600080fd5b81516001600160401b038111156103ee57600080fd5b82016080818503121561040057600080fd5b610408610254565b815160ff8116811461041957600080fd5b815260208201516001600160401b0381111561043457600080fd5b610440868285016102cf565b60208301525060408201516001600160401b0381111561045f57600080fd5b61046b868285016102cf565b60408301525060608201516001600160401b0381111561048a57600080fd5b61049686828501610352565b606083015250949350505050565b600063ffffffff821663ffffffff81036104ce57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6000602082840312156104e957600080fd5b505191905056fe\";\n\nexport const mintableERC20Bytecode =\n \"0x608060405234801561000f575f80fd5b506040518060400160405280600d81526020016c26b4b73a30b13632aa37b5b2b760991b81525060405180604001604052806002815260200161135560f21b8152508160039081610060919061010d565b50600461006d828261010d565b5050506101c7565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061009d57607f821691505b6020821081036100bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561010857805f5260205f20601f840160051c810160208510156100e65750805b601f840160051c820191505b81811015610105575f81556001016100f2565b50505b505050565b81516001600160401b0381111561012657610126610075565b61013a816101348454610089565b846100c1565b6020601f82116001811461016c575f83156101555750848201515b5f19600385901b1c1916600184901b178455610105565b5f84815260208120601f198516915b8281101561019b578785015182556020948501946001909201910161017b565b50848210156101b857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610737806101d45f395ff3fe608060405234801561000f575f80fd5b506004361061008c575f3560e01c806306fdde0314610090578063095ea7b3146100ae57806318160ddd146100d157806323b872dd146100e3578063313ce567146100f657806340c10f191461010557806370a082311461011a57806395d89b4114610142578063a9059cbb1461014a578063dd62ed3e1461015d575b5f80fd5b610098610170565b6040516100a59190610572565b60405180910390f35b6100c16100bc3660046105c2565b610200565b60405190151581526020016100a5565b6002545b6040519081526020016100a5565b6100c16100f13660046105ea565b610219565b604051601281526020016100a5565b6101186101133660046105c2565b61023c565b005b6100d5610128366004610624565b6001600160a01b03165f9081526020819052604090205490565b61009861024a565b6100c16101583660046105c2565b610259565b6100d561016b366004610644565b610266565b60606003805461017f90610675565b80601f01602080910402602001604051908101604052809291908181526020018280546101ab90610675565b80156101f65780601f106101cd576101008083540402835291602001916101f6565b820191905f5260205f20905b8154815290600101906020018083116101d957829003601f168201915b5050505050905090565b5f3361020d818585610290565b60019150505b92915050565b5f336102268582856102a2565b6102318585856102fc565b506001949350505050565b6102468282610359565b5050565b60606004805461017f90610675565b5f3361020d8185856102fc565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61029d838383600161038d565b505050565b5f6102ad8484610266565b90505f198110156102f657818110156102e857828183604051637dc7a0d960e11b81526004016102df939291906106ad565b60405180910390fd5b6102f684848484035f61038d565b50505050565b6001600160a01b038316610325575f604051634b637e8f60e11b81526004016102df91906106ce565b6001600160a01b03821661034e575f60405163ec442f0560e01b81526004016102df91906106ce565b61029d83838361045f565b6001600160a01b038216610382575f60405163ec442f0560e01b81526004016102df91906106ce565b6102465f838361045f565b6001600160a01b0384166103b6575f60405163e602df0560e01b81526004016102df91906106ce565b6001600160a01b0383166103df575f604051634a1406b160e11b81526004016102df91906106ce565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156102f657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161045191815260200190565b60405180910390a350505050565b6001600160a01b038316610489578060025f82825461047e91906106e2565b909155506104e69050565b6001600160a01b0383165f90815260208190526040902054818110156104c85783818360405163391434e360e21b81526004016102df939291906106ad565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661050257600280548290039055610520565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161056591815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146105bd575f80fd5b919050565b5f80604083850312156105d3575f80fd5b6105dc836105a7565b946020939093013593505050565b5f805f606084860312156105fc575f80fd5b610605846105a7565b9250610613602085016105a7565b929592945050506040919091013590565b5f60208284031215610634575f80fd5b61063d826105a7565b9392505050565b5f8060408385031215610655575f80fd5b61065e836105a7565b915061066c602084016105a7565b90509250929050565b600181811c9082168061068957607f821691505b6020821081036106a757634e487b7160e01b5f52602260045260245ffd5b50919050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b8082018082111561021357634e487b7160e01b5f52601160045260245ffdfea2646970667358221220f9ae46a2e15270bfb77fe3d4d0ee0e45b749e3dde93805ee2cf795cb800244e664736f6c634300081a0033\";\n\nexport const mintableERC20Abi = parseAbi([\n \"function transfer(address to, uint256 amount) external\",\n \"function mint(address to, uint256 amount) external\",\n \"function balanceOf(address target) external returns (uint256)\",\n]);\n\nexport type BuildNonceParams = {\n nonceKey?: bigint;\n entityId?: number;\n isGlobalValidation?: boolean;\n isDeferredAction?: boolean;\n isDirectCallValidation?: boolean;\n};\n\nexport const buildFullNonceKey = ({\n nonceKey = 0n,\n entityId = 0,\n isGlobalValidation = true,\n isDeferredAction = false,\n}: BuildNonceParams): bigint => {\n return (\n (nonceKey << 40n) +\n (BigInt(entityId) << 8n) +\n (isDeferredAction ? 2n : 0n) +\n (isGlobalValidation ? 1n : 0n)\n );\n};\n\n// Parses out the 3 components from a deferred action\nexport const parseDeferredAction = (\n deferredAction: Hex,\n): {\n entityId: number;\n isGlobalValidation: boolean;\n nonce: bigint;\n deferredActionData: Hex;\n hasAssociatedExecHooks: boolean;\n} => {\n // 2 for 0x, 2 for 00/01, 38 for parallel nonce, 8 for entity id, 2 for options byte, 16 for parallel nonce\n return {\n entityId: hexToNumber(`0x${deferredAction.slice(42, 50)}`),\n isGlobalValidation:\n hexToNumber(`0x${deferredAction.slice(50, 52)}`) % 2 === 1,\n nonce: BigInt(`0x${deferredAction.slice(4, 68)}`),\n deferredActionData: `0x${deferredAction.slice(68)}` as `0x${string}`,\n hasAssociatedExecHooks: deferredAction[3] === \"1\",\n };\n};\nexport type BuildDeferredActionDigestParams = {\n fullPreSignatureDeferredActionDigest: Hex;\n sig: Hex;\n};\n\n/**\n * Creates the digest which must be prepended to the userOp signature.\n *\n * Assumption: The client this extends is used to sign the typed data.\n *\n * @param {object} args The argument object containing the following:\n * @param {Hex} args.fullPreSignatureDeferredActionDigest The The data to append the signature and length to\n * @param {Hex} args.sig The signature to include in the digest\n * @returns {Hex} The encoded digest to be prepended to the userOp signature\n */\nexport const buildDeferredActionDigest = ({\n fullPreSignatureDeferredActionDigest,\n sig,\n}: BuildDeferredActionDigestParams): Hex => {\n const sigLength = size(sig);\n\n const encodedData = concatHex([\n fullPreSignatureDeferredActionDigest,\n toHex(sigLength, { size: 4 }),\n sig,\n ]);\n return encodedData;\n};\n\nexport const assertNeverSignatureRequestType = (): never => {\n throw new Error(\"Invalid signature request type \");\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/ma-v2/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n concat,\n toHex,\n custom,\n encodeFunctionData,\n type Hex,\n type Chain,\n type Address,\n type Transport,\n parseAbi,\n size,\n concatHex,\n hexToNumber,\n type TypedDataDefinition,\n type TypedData,\n isAddressEqual,\n} from \"viem\";\nimport {\n arbitrum,\n arbitrumSepolia,\n base,\n baseSepolia,\n mainnet,\n optimism,\n optimismSepolia,\n polygon,\n polygonAmoy,\n sepolia,\n} from \"@account-kit/infra\";\nimport { createModularAccountV2 } from \"./account/modularAccountV2.js\";\nimport { type ModularAccountV2 } from \"./account/common/modularAccountV2Base.js\";\nimport { semiModularAccountStorageAbi } from \"./abis/semiModularAccountStorageAbi.js\";\nimport {\n AccountNotFoundError,\n ChainNotFoundError,\n type GetAccountParameter,\n type SmartAccountClient,\n type SmartAccountSigner,\n type SmartContractAccountWithSigner,\n type UpgradeToData,\n} from \"@aa-sdk/core\";\n\nexport const DEFAULT_OWNER_ENTITY_ID = 0;\n\nexport type PackUOSignatureParams = {\n // orderedHookData: HookData[];\n validationSignature: Hex;\n};\n\n// TODO: direct call validation 1271\nexport type Pack1271SignatureParams = {\n validationSignature: Hex;\n entityId: number;\n};\n\n// Signature packing utility for user operations\nexport const packUOSignature = ({\n // orderedHookData, TODO: integrate in next iteration of MAv2 sdk\n validationSignature,\n}: PackUOSignatureParams): Hex => {\n return concat([\"0xFF\", \"0x00\", validationSignature]);\n};\n\n// Signature packing utility for 1271 EOA signatures\nexport const pack1271EOASignature = ({\n validationSignature,\n entityId,\n}: Pack1271SignatureParams): Hex => {\n return concat([\n \"0x00\",\n toHex(entityId, { size: 4 }),\n \"0xFF\",\n \"0x00\", // EOA type signature\n validationSignature,\n ]);\n};\n\n// WebAuthn signatures for EIP-1271 need the MAv2 segment structure\n// Format: 0x00 (hooks) + entityId + 0xFF (segment marker) + WebAuthn signature\n// Unlike EOA signatures, there's no signature type byte (0x00) before the WebAuthn data\nexport const pack1271WebAuthnSignature = ({\n validationSignature,\n entityId,\n}: Pack1271SignatureParams): Hex => {\n return concatHex([\n \"0x00\", // No pre-validation hooks\n toHex(entityId, { size: 4 }), // Entity ID\n \"0xFF\", // Reserved segment marker\n validationSignature, // WebAuthn signature (already ABI-encoded)\n ]);\n};\n\nexport const getDefaultWebAuthnMAV2FactoryAddress = (): Address => {\n return \"0x55010E571dCf07e254994bfc88b9C1C8FAe31960\";\n};\n\nexport const getDefaultMAV2FactoryAddress = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x00000000000017c61b5bEe81050EC8eFc9c6fecd\";\n }\n};\n\nexport const getDefaultSMAV2BytecodeAddress = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x000000000000c5A9089039570Dd36455b5C07383\";\n }\n};\n\nexport const getDefaultSMAV2StorageAddress = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x0000000000006E2f9d80CaEc0Da6500f005EB25A\";\n }\n};\n\nexport const getDefaultSMAV27702Address = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x69007702764179f14F51cdce752f4f775d74E139\";\n }\n};\n\nexport const getDefaultMAV2Address = (chain: Chain): Address => {\n switch (chain.id) {\n // TODO: case mekong.id:\n case sepolia.id:\n case baseSepolia.id:\n case polygon.id:\n case mainnet.id:\n case polygonAmoy.id:\n case optimism.id:\n case optimismSepolia.id:\n case arbitrum.id:\n case arbitrumSepolia.id:\n case base.id:\n default:\n return \"0x00000000000002377B26b1EdA7b0BC371C60DD4f\";\n }\n};\n\nexport type GetMAV2UpgradeToData<\n TSigner extends SmartAccountSigner = SmartAccountSigner,\n TAccount extends\n | SmartContractAccountWithSigner<string, TSigner>\n | undefined = SmartContractAccountWithSigner<string, TSigner> | undefined,\n> = GetAccountParameter<TAccount>;\n\n/**\n * Retrieves the data necessary to upgrade to a Modular Account V2 (MA v2).\n * Note that the upgrade will be to the Semi Modular Account Storage variant\n *\n * @example\n * ```ts\n * import { createLightAccountClient, getMAV2UpgradeToData } from \"@account-kit/smart-contracts\";\n *\n * const client = createLightAccountClient({});\n * const upgradeData = await getMAV2UpgradeToData(client, {});\n * ```\n *\n * @param {SmartAccountClient<TTransport, TChain, TAccount>} client The smart account client\n * @param {GetMAV2UpgradeToData<TSigner, TAccount>} args The arguments required for the upgrade\n * @returns {Promise<UpgradeToData & { createModularAccountV2FromExisting: () => Promise<ModularAccountV2<TSigner>>}>} A promise that resolves to upgrade data augmented with a function to create a Modular Account V2\n */\nexport async function getMAV2UpgradeToData<\n TTransport extends Transport = Transport,\n TChain extends Chain | undefined = Chain | undefined,\n TSigner extends SmartAccountSigner = SmartAccountSigner,\n TAccount extends\n | SmartContractAccountWithSigner<string, TSigner>\n | undefined = SmartContractAccountWithSigner<string, TSigner> | undefined,\n>(\n client: SmartAccountClient<TTransport, TChain, TAccount>,\n args: GetMAV2UpgradeToData<TSigner, TAccount>,\n): Promise<\n UpgradeToData & {\n createModularAccountV2FromExisting: () => Promise<\n ModularAccountV2<TSigner>\n >;\n }\n> {\n const { account: account_ = client.account } = args;\n\n if (!account_) {\n throw new AccountNotFoundError();\n }\n const account = account_ as SmartContractAccountWithSigner<string, TSigner>;\n\n const chain = client.chain;\n if (!chain) {\n throw new ChainNotFoundError();\n }\n\n const initData = encodeFunctionData({\n abi: semiModularAccountStorageAbi,\n functionName: \"initialize\",\n args: [await account.getSigner().getAddress()],\n });\n\n return {\n implAddress: getDefaultSMAV2StorageAddress(chain),\n initializationData: initData,\n createModularAccountV2FromExisting: async () =>\n createModularAccountV2({\n transport: custom(client.transport),\n chain: chain as Chain,\n signer: account.getSigner(),\n accountAddress: account.address,\n }),\n };\n}\n\nexport const entityIdAndNonceReaderBytecode =\n \"0x608060405234801561001057600080fd5b506040516104f13803806104f183398101604081905261002f916101e5565b60006008826001600160c01b0316901c90506000808263ffffffff1611610057576001610059565b815b90506001600160a01b0385163b15610133575b60006001600160a01b03861663d31b575b6bffffffff0000000000000000604085901b166040516001600160e01b031960e084901b1681526001600160401b03199091166004820152602401600060405180830381865afa1580156100d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526100fd91908101906103c6565b805190915060ff161580156101155750606081015151155b156101205750610133565b8161012a816104a4565b9250505061006c565b604051631aab3f0d60e11b81526001600160a01b03868116600483015264ffffffff01600160c01b038516600884901b64ffffffff0016176024830152600091908616906335567e1a90604401602060405180830381865afa15801561019d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c191906104d7565b90508060005260206000f35b6001600160a01b03811681146101e257600080fd5b50565b6000806000606084860312156101fa57600080fd5b8351610205816101cd565b6020850151909350610216816101cd565b60408501519092506001600160c01b038116811461023357600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156102765761027661023e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156102a4576102a461023e565b604052919050565b60006001600160401b038211156102c5576102c561023e565b5060051b60200190565b600082601f8301126102e057600080fd5b81516102f36102ee826102ac565b61027c565b8082825260208201915060208360051b86010192508583111561031557600080fd5b602085015b8381101561034857805166ffffffffffffff198116811461033a57600080fd5b83526020928301920161031a565b5095945050505050565b600082601f83011261036357600080fd5b81516103716102ee826102ac565b8082825260208201915060208360051b86010192508583111561039357600080fd5b602085015b838110156103485780516001600160e01b0319811681146103b857600080fd5b835260209283019201610398565b6000602082840312156103d857600080fd5b81516001600160401b038111156103ee57600080fd5b82016080818503121561040057600080fd5b610408610254565b815160ff8116811461041957600080fd5b815260208201516001600160401b0381111561043457600080fd5b610440868285016102cf565b60208301525060408201516001600160401b0381111561045f57600080fd5b61046b868285016102cf565b60408301525060608201516001600160401b0381111561048a57600080fd5b61049686828501610352565b606083015250949350505050565b600063ffffffff821663ffffffff81036104ce57634e487b7160e01b600052601160045260246000fd5b60010192915050565b6000602082840312156104e957600080fd5b505191905056fe\";\n\nexport const mintableERC20Bytecode =\n \"0x608060405234801561000f575f80fd5b506040518060400160405280600d81526020016c26b4b73a30b13632aa37b5b2b760991b81525060405180604001604052806002815260200161135560f21b8152508160039081610060919061010d565b50600461006d828261010d565b5050506101c7565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061009d57607f821691505b6020821081036100bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561010857805f5260205f20601f840160051c810160208510156100e65750805b601f840160051c820191505b81811015610105575f81556001016100f2565b50505b505050565b81516001600160401b0381111561012657610126610075565b61013a816101348454610089565b846100c1565b6020601f82116001811461016c575f83156101555750848201515b5f19600385901b1c1916600184901b178455610105565b5f84815260208120601f198516915b8281101561019b578785015182556020948501946001909201910161017b565b50848210156101b857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b610737806101d45f395ff3fe608060405234801561000f575f80fd5b506004361061008c575f3560e01c806306fdde0314610090578063095ea7b3146100ae57806318160ddd146100d157806323b872dd146100e3578063313ce567146100f657806340c10f191461010557806370a082311461011a57806395d89b4114610142578063a9059cbb1461014a578063dd62ed3e1461015d575b5f80fd5b610098610170565b6040516100a59190610572565b60405180910390f35b6100c16100bc3660046105c2565b610200565b60405190151581526020016100a5565b6002545b6040519081526020016100a5565b6100c16100f13660046105ea565b610219565b604051601281526020016100a5565b6101186101133660046105c2565b61023c565b005b6100d5610128366004610624565b6001600160a01b03165f9081526020819052604090205490565b61009861024a565b6100c16101583660046105c2565b610259565b6100d561016b366004610644565b610266565b60606003805461017f90610675565b80601f01602080910402602001604051908101604052809291908181526020018280546101ab90610675565b80156101f65780601f106101cd576101008083540402835291602001916101f6565b820191905f5260205f20905b8154815290600101906020018083116101d957829003601f168201915b5050505050905090565b5f3361020d818585610290565b60019150505b92915050565b5f336102268582856102a2565b6102318585856102fc565b506001949350505050565b6102468282610359565b5050565b60606004805461017f90610675565b5f3361020d8185856102fc565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61029d838383600161038d565b505050565b5f6102ad8484610266565b90505f198110156102f657818110156102e857828183604051637dc7a0d960e11b81526004016102df939291906106ad565b60405180910390fd5b6102f684848484035f61038d565b50505050565b6001600160a01b038316610325575f604051634b637e8f60e11b81526004016102df91906106ce565b6001600160a01b03821661034e575f60405163ec442f0560e01b81526004016102df91906106ce565b61029d83838361045f565b6001600160a01b038216610382575f60405163ec442f0560e01b81526004016102df91906106ce565b6102465f838361045f565b6001600160a01b0384166103b6575f60405163e602df0560e01b81526004016102df91906106ce565b6001600160a01b0383166103df575f604051634a1406b160e11b81526004016102df91906106ce565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156102f657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161045191815260200190565b60405180910390a350505050565b6001600160a01b038316610489578060025f82825461047e91906106e2565b909155506104e69050565b6001600160a01b0383165f90815260208190526040902054818110156104c85783818360405163391434e360e21b81526004016102df939291906106ad565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661050257600280548290039055610520565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161056591815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146105bd575f80fd5b919050565b5f80604083850312156105d3575f80fd5b6105dc836105a7565b946020939093013593505050565b5f805f606084860312156105fc575f80fd5b610605846105a7565b9250610613602085016105a7565b929592945050506040919091013590565b5f60208284031215610634575f80fd5b61063d826105a7565b9392505050565b5f8060408385031215610655575f80fd5b61065e836105a7565b915061066c602084016105a7565b90509250929050565b600181811c9082168061068957607f821691505b6020821081036106a757634e487b7160e01b5f52602260045260245ffd5b50919050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b8082018082111561021357634e487b7160e01b5f52601160045260245ffdfea2646970667358221220f9ae46a2e15270bfb77fe3d4d0ee0e45b749e3dde93805ee2cf795cb800244e664736f6c634300081a0033\";\n\nexport const mintableERC20Abi = parseAbi([\n \"function transfer(address to, uint256 amount) external\",\n \"function mint(address to, uint256 amount) external\",\n \"function balanceOf(address target) external returns (uint256)\",\n]);\n\nexport type BuildNonceParams = {\n nonceKey?: bigint;\n entityId?: number;\n isGlobalValidation?: boolean;\n isDeferredAction?: boolean;\n isDirectCallValidation?: boolean;\n};\n\nexport const buildFullNonceKey = ({\n nonceKey = 0n,\n entityId = 0,\n isGlobalValidation = true,\n isDeferredAction = false,\n}: BuildNonceParams): bigint => {\n return (\n (nonceKey << 40n) +\n (BigInt(entityId) << 8n) +\n (isDeferredAction ? 2n : 0n) +\n (isGlobalValidation ? 1n : 0n)\n );\n};\n\n// Parses out the 3 components from a deferred action\nexport const parseDeferredAction = (\n deferredAction: Hex,\n): {\n entityId: number;\n isGlobalValidation: boolean;\n nonce: bigint;\n deferredActionData: Hex;\n hasAssociatedExecHooks: boolean;\n} => {\n // 2 for 0x, 2 for 00/01, 38 for parallel nonce, 8 for entity id, 2 for options byte, 16 for parallel nonce\n return {\n entityId: hexToNumber(`0x${deferredAction.slice(42, 50)}`),\n isGlobalValidation:\n hexToNumber(`0x${deferredAction.slice(50, 52)}`) % 2 === 1,\n nonce: BigInt(`0x${deferredAction.slice(4, 68)}`),\n deferredActionData: `0x${deferredAction.slice(68)}` as `0x${string}`,\n hasAssociatedExecHooks: deferredAction[3] === \"1\",\n };\n};\nexport type BuildDeferredActionDigestParams = {\n fullPreSignatureDeferredActionDigest: Hex;\n sig: Hex;\n};\n\n/**\n * Creates the digest which must be prepended to the userOp signature.\n *\n * Assumption: The client this extends is used to sign the typed data.\n *\n * @param {object} args The argument object containing the following:\n * @param {Hex} args.fullPreSignatureDeferredActionDigest The The data to append the signature and length to\n * @param {Hex} args.sig The signature to include in the digest\n * @returns {Hex} The encoded digest to be prepended to the userOp signature\n */\nexport const buildDeferredActionDigest = ({\n fullPreSignatureDeferredActionDigest,\n sig,\n}: BuildDeferredActionDigestParams): Hex => {\n const sigLength = size(sig);\n\n const encodedData = concatHex([\n fullPreSignatureDeferredActionDigest,\n toHex(sigLength, { size: 4 }),\n sig,\n ]);\n return encodedData;\n};\n\nexport const assertNever = (_val: never, msg: string): never => {\n throw new Error(msg);\n};\n\n/**\n * Type guard to check if a TypedDataDefinition is a deferred action.\n *\n * A deferred action has:\n * - primaryType: \"DeferredAction\"\n * - domain.verifyingContract matching the account address\n *\n * @param {TypedDataDefinition} typedDataDefinition - The typed data to check\n * @param {Address} accountAddress - Account address to verify against domain.verifyingContract\n * @returns {boolean} - True if the typedDataDefinition is a deferred action for this account\n */\nexport const isDeferredAction = <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n>(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>,\n accountAddress: Address,\n): boolean => {\n if (\n typedDataDefinition.primaryType !== \"DeferredAction\" ||\n !typedDataDefinition.domain ||\n typeof typedDataDefinition.domain !== \"object\" ||\n !(\"verifyingContract\" in typedDataDefinition.domain)\n ) {\n return false;\n }\n\n try {\n return isAddressEqual(\n typedDataDefinition.domain.verifyingContract as Address,\n accountAddress,\n );\n } catch {\n return false;\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nativeSMASigner.d.ts","sourceRoot":"","sources":["../../../../../src/ma-v2/account/nativeSMASigner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EAKV,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,MAAM,CAAC;AASd;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,kBAAkB,EAC1B,OAAO,KAAK,EACZ,gBAAgB,OAAO,EACvB,qBAAqB,GAAG;6BAwDC,GAAG;oCAUY,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;6BAmBzB;QAAE,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;0BAkBlE,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,yCAE/B,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,KAC/D,OAAO,CAAC,GAAG,CAAC;;;CAwBlB,CAAC"}
1
+ {"version":3,"file":"nativeSMASigner.d.ts","sourceRoot":"","sources":["../../../../../src/ma-v2/account/nativeSMASigner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EAKV,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,MAAM,CAAC;AAUd;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,kBAAkB,EAC1B,OAAO,KAAK,EACZ,gBAAgB,OAAO,EACvB,qBAAqB,GAAG;6BAqDC,GAAG;oCAUY,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;6BAmBzB;QAAE,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;0BAkBlE,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,yCAE/B,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,KAC/D,OAAO,CAAC,GAAG,CAAC;;;CAiBlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/single-signer-validation/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EAKV,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,MAAM,CAAC;AAWd;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,yBAAyB,GACpC,QAAQ,kBAAkB,EAC1B,OAAO,KAAK,EACZ,gBAAgB,OAAO,EACvB,UAAU,MAAM,EAChB,qBAAqB,GAAG;6BAkDC,GAAG;oCAUY,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;6BAmBzB;QAAE,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;0BAkBlE,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,yCAE/B,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,KAC/D,OAAO,CAAC,GAAG,CAAC;;;CAwBlB,CAAC"}
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/single-signer-validation/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EAKV,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,MAAM,CAAC;AAYd;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,yBAAyB,GACpC,QAAQ,kBAAkB,EAC1B,OAAO,KAAK,EACZ,gBAAgB,OAAO,EACvB,UAAU,MAAM,EAChB,qBAAqB,GAAG;6BAmDC,GAAG;oCAUY,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;6BAmBzB;QAAE,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;0BAkBlE,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,yCAE/B,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,KAC/D,OAAO,CAAC,GAAG,CAAC;;;CAiBlB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { type Address, type Chain, type Hex, type SignableMessage, type TypedData, type TypedDataDefinition } from "viem";
2
2
  import { type ToWebAuthnAccountParameters } from "viem/account-abstraction";
3
+ import type { SignatureRequest } from "@aa-sdk/core";
3
4
  /**
4
5
  * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.
5
6
  *
@@ -25,13 +26,12 @@ export declare const webauthnSigningFunctions: (credential: ToWebAuthnAccountPar
25
26
  id: string;
26
27
  publicKey: `0x${string}`;
27
28
  getDummySignature: () => Hex;
28
- sign: ({ hash }: {
29
- hash: Hex;
30
- }) => Promise<`0x${string}`>;
31
29
  signUserOperationHash: (uoHash: Hex) => Promise<Hex>;
32
30
  signMessage({ message }: {
33
31
  message: SignableMessage;
34
32
  }): Promise<Hex>;
35
33
  signTypedData: <const typedData extends TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(typedDataDefinition: TypedDataDefinition<typedData, primaryType>) => Promise<Hex>;
34
+ prepareSign: (request: SignatureRequest) => Promise<SignatureRequest>;
35
+ formatSign: (signature: Hex) => Promise<Hex>;
36
36
  };
37
37
  //# sourceMappingURL=signingMethods.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signingMethods.d.ts","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/webauthn-validation/signingMethods.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EAKV,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAI5E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,2BAA2B,CAAC,YAAY,CAAC,EACrD,OAAO,2BAA2B,CAAC,OAAO,CAAC,EAC3C,MAAM,2BAA2B,CAAC,MAAM,CAAC,EACzC,OAAO,KAAK,EACZ,gBAAgB,OAAO,EACvB,UAAU,MAAM,EAChB,qBAAqB,GAAG;;;6BA2CC,GAAG;qBAvCE;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE;oCA0CH,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;6BAUzB;QAAE,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;0BAuBlE,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,yCAE/B,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,KAC/D,OAAO,CAAC,GAAG,CAAC;CA6BlB,CAAC"}
1
+ {"version":3,"file":"signingMethods.d.ts","sourceRoot":"","sources":["../../../../../../src/ma-v2/modules/webauthn-validation/signingMethods.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EAKV,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAO5E,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,2BAA2B,CAAC,YAAY,CAAC,EACrD,OAAO,2BAA2B,CAAC,OAAO,CAAC,EAC3C,MAAM,2BAA2B,CAAC,MAAM,CAAC,EACzC,OAAO,KAAK,EACZ,gBAAgB,OAAO,EACvB,UAAU,MAAM,EAChB,qBAAqB,GAAG;;;6BA8FC,GAAG;oCAEY,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;6BAUzB;QAAE,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;0BAgBlE,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,yCAE/B,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,KAC/D,OAAO,CAAC,GAAG,CAAC;;;CAiBlB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type Hex, type Chain, type Address, type Transport } from "viem";
1
+ import { type Hex, type Chain, type Address, type Transport, type TypedDataDefinition, type TypedData } from "viem";
2
2
  import { type ModularAccountV2 } from "./account/common/modularAccountV2Base.js";
3
3
  import { type GetAccountParameter, type SmartAccountClient, type SmartAccountSigner, type SmartContractAccountWithSigner, type UpgradeToData } from "@aa-sdk/core";
4
4
  export declare const DEFAULT_OWNER_ENTITY_ID = 0;
@@ -10,7 +10,8 @@ export type Pack1271SignatureParams = {
10
10
  entityId: number;
11
11
  };
12
12
  export declare const packUOSignature: ({ validationSignature, }: PackUOSignatureParams) => Hex;
13
- export declare const pack1271Signature: ({ validationSignature, entityId, }: Pack1271SignatureParams) => Hex;
13
+ export declare const pack1271EOASignature: ({ validationSignature, entityId, }: Pack1271SignatureParams) => Hex;
14
+ export declare const pack1271WebAuthnSignature: ({ validationSignature, entityId, }: Pack1271SignatureParams) => Hex;
14
15
  export declare const getDefaultWebAuthnMAV2FactoryAddress: () => Address;
15
16
  export declare const getDefaultMAV2FactoryAddress: (chain: Chain) => Address;
16
17
  export declare const getDefaultSMAV2BytecodeAddress: (chain: Chain) => Address;
@@ -105,5 +106,17 @@ export type BuildDeferredActionDigestParams = {
105
106
  * @returns {Hex} The encoded digest to be prepended to the userOp signature
106
107
  */
107
108
  export declare const buildDeferredActionDigest: ({ fullPreSignatureDeferredActionDigest, sig, }: BuildDeferredActionDigestParams) => Hex;
108
- export declare const assertNeverSignatureRequestType: () => never;
109
+ export declare const assertNever: (_val: never, msg: string) => never;
110
+ /**
111
+ * Type guard to check if a TypedDataDefinition is a deferred action.
112
+ *
113
+ * A deferred action has:
114
+ * - primaryType: "DeferredAction"
115
+ * - domain.verifyingContract matching the account address
116
+ *
117
+ * @param {TypedDataDefinition} typedDataDefinition - The typed data to check
118
+ * @param {Address} accountAddress - Account address to verify against domain.verifyingContract
119
+ * @returns {boolean} - True if the typedDataDefinition is a deferred action for this account
120
+ */
121
+ export declare const isDeferredAction: <const typedData extends TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(typedDataDefinition: TypedDataDefinition<typedData, primaryType>, accountAddress: Address) => boolean;
109
122
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/ma-v2/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/ma-v2/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@account-kit/smart-contracts",
3
- "version": "4.73.1-alpha.9",
3
+ "version": "4.75.0",
4
4
  "description": "aa-sdk compatible interfaces for Alchemy Smart Accounts",
5
5
  "author": "Alchemy",
6
6
  "license": "MIT",
@@ -51,7 +51,7 @@
51
51
  "test:run": "vitest run"
52
52
  },
53
53
  "devDependencies": {
54
- "@account-kit/plugingen": "^4.73.1-alpha.9",
54
+ "@account-kit/plugingen": "^4.75.0",
55
55
  "change-case": "^5.1.2",
56
56
  "dedent": "^1.5.1",
57
57
  "dotenv": "^16.3.1",
@@ -69,10 +69,10 @@
69
69
  "url": "https://github.com/alchemyplatform/aa-sdk/issues"
70
70
  },
71
71
  "homepage": "https://github.com/alchemyplatform/aa-sdk#readme",
72
- "gitHead": "55c990661fe74790e0321bd9828031dc2b2cd158",
72
+ "gitHead": "2113dcf956dd2b35a98031ef7ec5bc23c0594684",
73
73
  "dependencies": {
74
- "@aa-sdk/core": "^4.73.1-alpha.9",
75
- "@account-kit/infra": "^4.73.1-alpha.9",
74
+ "@aa-sdk/core": "^4.75.0",
75
+ "@account-kit/infra": "^4.75.0",
76
76
  "webauthn-p256": "^0.0.10"
77
77
  },
78
78
  "peerDependencies": {
@@ -17,9 +17,10 @@ import {
17
17
  } from "viem";
18
18
  import {
19
19
  packUOSignature,
20
- pack1271Signature,
20
+ pack1271EOASignature,
21
21
  DEFAULT_OWNER_ENTITY_ID,
22
- assertNeverSignatureRequestType,
22
+ assertNever,
23
+ isDeferredAction,
23
24
  } from "../utils.js";
24
25
  import { SignatureType } from "../modules/utils.js";
25
26
 
@@ -57,18 +58,15 @@ export const nativeSMASigner = (
57
58
  request: SignatureRequest,
58
59
  ): Promise<SignatureRequest> => {
59
60
  let hash;
61
+ const requestType = request.type;
60
62
 
61
- switch (request.type) {
63
+ switch (requestType) {
62
64
  case "personal_sign":
63
65
  hash = hashMessage(request.data);
64
66
  break;
65
67
 
66
68
  case "eth_signTypedData_v4":
67
- const isDeferredAction =
68
- request.data?.primaryType === "DeferredAction" &&
69
- request.data?.domain?.verifyingContract === accountAddress;
70
-
71
- if (isDeferredAction) {
69
+ if (isDeferredAction(request.data, accountAddress)) {
72
70
  return request;
73
71
  } else {
74
72
  hash = await hashTypedData(request.data);
@@ -76,7 +74,7 @@ export const nativeSMASigner = (
76
74
  }
77
75
 
78
76
  default:
79
- assertNeverSignatureRequestType();
77
+ return assertNever(requestType, "Invalid signature request type");
80
78
  }
81
79
 
82
80
  return {
@@ -97,7 +95,7 @@ export const nativeSMASigner = (
97
95
  };
98
96
  },
99
97
  formatSign: async (signature: Hex) => {
100
- return pack1271Signature({
98
+ return pack1271EOASignature({
101
99
  validationSignature: signature,
102
100
  entityId: DEFAULT_OWNER_ENTITY_ID,
103
101
  });
@@ -169,14 +167,7 @@ export const nativeSMASigner = (
169
167
 
170
168
  const sig = await signer.signTypedData(data);
171
169
 
172
- const isDeferredAction =
173
- typedDataDefinition.primaryType === "DeferredAction" &&
174
- typedDataDefinition.domain != null &&
175
- // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)
176
- "verifyingContract" in typedDataDefinition.domain &&
177
- typedDataDefinition.domain.verifyingContract === accountAddress;
178
-
179
- return isDeferredAction
170
+ return isDeferredAction(typedDataDefinition, accountAddress)
180
171
  ? concat([SignatureType.EOA, sig])
181
172
  : signingMethods.formatSign(sig);
182
173
  },
@@ -21,8 +21,9 @@ import {
21
21
  } from "../utils.js";
22
22
  import {
23
23
  packUOSignature,
24
- pack1271Signature,
25
- assertNeverSignatureRequestType,
24
+ pack1271EOASignature,
25
+ isDeferredAction,
26
+ assertNever,
26
27
  } from "../../utils.js";
27
28
 
28
29
  /**
@@ -62,8 +63,9 @@ export const singleSignerMessageSigner = (
62
63
  request: SignatureRequest,
63
64
  ): Promise<SignatureRequest> => {
64
65
  let hash;
66
+ const requestType = request.type;
65
67
 
66
- switch (request.type) {
68
+ switch (requestType) {
67
69
  case "personal_sign":
68
70
  hash = hashMessage(request.data);
69
71
  break;
@@ -73,7 +75,7 @@ export const singleSignerMessageSigner = (
73
75
  break;
74
76
 
75
77
  default:
76
- assertNeverSignatureRequestType();
78
+ return assertNever(requestType, "Invalid signature request type");
77
79
  }
78
80
 
79
81
  return {
@@ -96,7 +98,7 @@ export const singleSignerMessageSigner = (
96
98
  };
97
99
  },
98
100
  formatSign: async (signature: Hex) => {
99
- return pack1271Signature({
101
+ return pack1271EOASignature({
100
102
  validationSignature: signature,
101
103
  entityId,
102
104
  });
@@ -168,14 +170,7 @@ export const singleSignerMessageSigner = (
168
170
 
169
171
  const sig = await signer.signTypedData(data);
170
172
 
171
- const isDeferredAction =
172
- typedDataDefinition.primaryType === "DeferredAction" &&
173
- typedDataDefinition.domain != null &&
174
- // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)
175
- "verifyingContract" in typedDataDefinition.domain &&
176
- typedDataDefinition.domain.verifyingContract === accountAddress;
177
-
178
- return isDeferredAction
173
+ return isDeferredAction(typedDataDefinition, accountAddress)
179
174
  ? concat([SignatureType.EOA, sig])
180
175
  : signingMethods.formatSign(sig);
181
176
  },
@@ -12,8 +12,13 @@ import {
12
12
  type TypedDataDefinition,
13
13
  } from "viem";
14
14
  import { type ToWebAuthnAccountParameters } from "viem/account-abstraction";
15
- import { pack1271Signature } from "../../utils.js";
15
+ import {
16
+ assertNever,
17
+ isDeferredAction,
18
+ pack1271WebAuthnSignature,
19
+ } from "../../utils.js";
16
20
  import { getDefaultWebauthnValidationModuleAddress } from "../utils.js";
21
+ import type { SignatureRequest, SigningMethods } from "@aa-sdk/core";
17
22
 
18
23
  /**
19
24
  * Creates an object with methods for generating a dummy signature, signing user operation hashes, signing messages, and signing typed data.
@@ -83,12 +88,62 @@ export const webauthnSigningFunctions = (
83
88
  );
84
89
  };
85
90
 
91
+ const signingMethods: SigningMethods = {
92
+ prepareSign: async (
93
+ request: SignatureRequest,
94
+ ): Promise<SignatureRequest> => {
95
+ const requestType = request.type;
96
+ let hash;
97
+
98
+ switch (requestType) {
99
+ case "personal_sign":
100
+ hash = hashMessage(request.data);
101
+ break;
102
+
103
+ case "eth_signTypedData_v4":
104
+ if (isDeferredAction(request.data, accountAddress)) {
105
+ return request;
106
+ } else {
107
+ hash = hashTypedData(request.data);
108
+ break;
109
+ }
110
+
111
+ default:
112
+ return assertNever(requestType, "Invalid signature request type");
113
+ }
114
+
115
+ return {
116
+ type: "eth_signTypedData_v4",
117
+ data: {
118
+ domain: {
119
+ chainId: Number(chain.id),
120
+ verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),
121
+ salt: concatHex([`0x${"00".repeat(12)}`, accountAddress]),
122
+ },
123
+ types: {
124
+ ReplaySafeHash: [{ name: "hash", type: "bytes32" }],
125
+ },
126
+ message: {
127
+ hash,
128
+ },
129
+ primaryType: "ReplaySafeHash",
130
+ },
131
+ };
132
+ },
133
+ formatSign: async (signature: Hex) => {
134
+ return pack1271WebAuthnSignature({
135
+ validationSignature: signature,
136
+ entityId,
137
+ });
138
+ },
139
+ };
140
+
86
141
  return {
142
+ ...signingMethods,
87
143
  id,
88
144
  publicKey,
89
145
  getDummySignature: (): Hex =>
90
146
  "0xff000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001949fc7c88032b9fcb5f6efc7a7b8c63668eae9871b765e23123bb473ff57aa831a7c0d9276168ebcc29f2875a0239cffdf2a9cd1c2007c5c77c071db9264df1d000000000000000000000000000000000000000000000000000000000000002549960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97630500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273496a396e6164474850596759334b7156384f7a4a666c726275504b474f716d59576f4d57516869467773222c226f726967696e223a2268747470733a2f2f7369676e2e636f696e626173652e636f6d222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000",
91
- sign,
92
147
  signUserOperationHash: async (uoHash: Hex): Promise<Hex> => {
93
148
  let sig = await sign({ hash: hashMessage({ raw: uoHash }) });
94
149
  if (deferredActionData) {
@@ -100,25 +155,18 @@ export const webauthnSigningFunctions = (
100
155
  },
101
156
 
102
157
  async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {
103
- const hash = hashTypedData({
104
- domain: {
105
- chainId: Number(chain.id),
106
- verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),
107
- salt: concatHex([`0x${"00".repeat(12)}`, accountAddress]),
108
- },
109
- types: {
110
- ReplaySafeHash: [{ name: "hash", type: "bytes32" }],
111
- },
112
- message: {
113
- hash: hashMessage(message),
114
- },
115
- primaryType: "ReplaySafeHash",
158
+ const { data, type } = await signingMethods.prepareSign({
159
+ type: "personal_sign",
160
+ data: message,
116
161
  });
117
162
 
118
- return pack1271Signature({
119
- validationSignature: await sign({ hash }),
120
- entityId,
121
- });
163
+ if (type !== "eth_signTypedData_v4") {
164
+ throw new Error("Invalid signature request type");
165
+ }
166
+
167
+ const signature = await sign({ hash: hashTypedData(data) });
168
+
169
+ return signingMethods.formatSign(signature);
122
170
  },
123
171
 
124
172
  signTypedData: async <
@@ -127,32 +175,20 @@ export const webauthnSigningFunctions = (
127
175
  >(
128
176
  typedDataDefinition: TypedDataDefinition<typedData, primaryType>,
129
177
  ): Promise<Hex> => {
130
- const isDeferredAction =
131
- typedDataDefinition?.primaryType === "DeferredAction" &&
132
- // @ts-expect-error the domain type I think changed in viem, so this is not working correctly (TODO: fix this)
133
- "verifyingContract" in typedDataDefinition.domain &&
134
- typedDataDefinition.domain.verifyingContract === accountAddress;
135
-
136
- const hash = await hashTypedData({
137
- domain: {
138
- chainId: Number(chain.id),
139
- verifyingContract: getDefaultWebauthnValidationModuleAddress(chain),
140
- salt: concatHex([`0x${"00".repeat(12)}`, accountAddress]),
141
- },
142
- types: {
143
- ReplaySafeHash: [{ name: "hash", type: "bytes32" }],
144
- },
145
- message: {
146
- hash: hashTypedData(typedDataDefinition),
147
- },
148
- primaryType: "ReplaySafeHash",
178
+ const { data, type } = await signingMethods.prepareSign({
179
+ type: "eth_signTypedData_v4",
180
+ data: typedDataDefinition as TypedDataDefinition,
149
181
  });
150
182
 
151
- const validationSignature = await sign({ hash });
183
+ if (type !== "eth_signTypedData_v4") {
184
+ throw new Error("Invalid signature request type");
185
+ }
186
+
187
+ const signature = await sign({ hash: hashTypedData(data) });
152
188
 
153
- return isDeferredAction
154
- ? pack1271Signature({ validationSignature, entityId })
155
- : validationSignature;
189
+ return isDeferredAction(typedDataDefinition, accountAddress)
190
+ ? signature
191
+ : signingMethods.formatSign(signature);
156
192
  },
157
193
  };
158
194
  };
@@ -11,6 +11,9 @@ import {
11
11
  size,
12
12
  concatHex,
13
13
  hexToNumber,
14
+ type TypedDataDefinition,
15
+ type TypedData,
16
+ isAddressEqual,
14
17
  } from "viem";
15
18
  import {
16
19
  arbitrum,
@@ -58,8 +61,8 @@ export const packUOSignature = ({
58
61
  return concat(["0xFF", "0x00", validationSignature]);
59
62
  };
60
63
 
61
- // Signature packing utility for 1271 signatures
62
- export const pack1271Signature = ({
64
+ // Signature packing utility for 1271 EOA signatures
65
+ export const pack1271EOASignature = ({
63
66
  validationSignature,
64
67
  entityId,
65
68
  }: Pack1271SignatureParams): Hex => {
@@ -72,6 +75,21 @@ export const pack1271Signature = ({
72
75
  ]);
73
76
  };
74
77
 
78
+ // WebAuthn signatures for EIP-1271 need the MAv2 segment structure
79
+ // Format: 0x00 (hooks) + entityId + 0xFF (segment marker) + WebAuthn signature
80
+ // Unlike EOA signatures, there's no signature type byte (0x00) before the WebAuthn data
81
+ export const pack1271WebAuthnSignature = ({
82
+ validationSignature,
83
+ entityId,
84
+ }: Pack1271SignatureParams): Hex => {
85
+ return concatHex([
86
+ "0x00", // No pre-validation hooks
87
+ toHex(entityId, { size: 4 }), // Entity ID
88
+ "0xFF", // Reserved segment marker
89
+ validationSignature, // WebAuthn signature (already ABI-encoded)
90
+ ]);
91
+ };
92
+
75
93
  export const getDefaultWebAuthnMAV2FactoryAddress = (): Address => {
76
94
  return "0x55010E571dCf07e254994bfc88b9C1C8FAe31960";
77
95
  };
@@ -320,6 +338,43 @@ export const buildDeferredActionDigest = ({
320
338
  return encodedData;
321
339
  };
322
340
 
323
- export const assertNeverSignatureRequestType = (): never => {
324
- throw new Error("Invalid signature request type ");
341
+ export const assertNever = (_val: never, msg: string): never => {
342
+ throw new Error(msg);
343
+ };
344
+
345
+ /**
346
+ * Type guard to check if a TypedDataDefinition is a deferred action.
347
+ *
348
+ * A deferred action has:
349
+ * - primaryType: "DeferredAction"
350
+ * - domain.verifyingContract matching the account address
351
+ *
352
+ * @param {TypedDataDefinition} typedDataDefinition - The typed data to check
353
+ * @param {Address} accountAddress - Account address to verify against domain.verifyingContract
354
+ * @returns {boolean} - True if the typedDataDefinition is a deferred action for this account
355
+ */
356
+ export const isDeferredAction = <
357
+ const typedData extends TypedData | Record<string, unknown>,
358
+ primaryType extends keyof typedData | "EIP712Domain" = keyof typedData,
359
+ >(
360
+ typedDataDefinition: TypedDataDefinition<typedData, primaryType>,
361
+ accountAddress: Address,
362
+ ): boolean => {
363
+ if (
364
+ typedDataDefinition.primaryType !== "DeferredAction" ||
365
+ !typedDataDefinition.domain ||
366
+ typeof typedDataDefinition.domain !== "object" ||
367
+ !("verifyingContract" in typedDataDefinition.domain)
368
+ ) {
369
+ return false;
370
+ }
371
+
372
+ try {
373
+ return isAddressEqual(
374
+ typedDataDefinition.domain.verifyingContract as Address,
375
+ accountAddress,
376
+ );
377
+ } catch {
378
+ return false;
379
+ }
325
380
  };