@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.
- package/dist/esm/src/ma-v2/account/nativeSMASigner.js +7 -13
- package/dist/esm/src/ma-v2/account/nativeSMASigner.js.map +1 -1
- package/dist/esm/src/ma-v2/modules/single-signer-validation/signer.js +6 -10
- package/dist/esm/src/ma-v2/modules/single-signer-validation/signer.js.map +1 -1
- package/dist/esm/src/ma-v2/modules/webauthn-validation/signingMethods.d.ts +3 -3
- package/dist/esm/src/ma-v2/modules/webauthn-validation/signingMethods.js +64 -40
- package/dist/esm/src/ma-v2/modules/webauthn-validation/signingMethods.js.map +1 -1
- package/dist/esm/src/ma-v2/utils.d.ts +16 -3
- package/dist/esm/src/ma-v2/utils.js +41 -5
- package/dist/esm/src/ma-v2/utils.js.map +1 -1
- package/dist/types/src/ma-v2/account/nativeSMASigner.d.ts.map +1 -1
- package/dist/types/src/ma-v2/modules/single-signer-validation/signer.d.ts.map +1 -1
- package/dist/types/src/ma-v2/modules/webauthn-validation/signingMethods.d.ts +3 -3
- package/dist/types/src/ma-v2/modules/webauthn-validation/signingMethods.d.ts.map +1 -1
- package/dist/types/src/ma-v2/utils.d.ts +16 -3
- package/dist/types/src/ma-v2/utils.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/ma-v2/account/nativeSMASigner.ts +9 -18
- package/src/ma-v2/modules/single-signer-validation/signer.ts +8 -13
- package/src/ma-v2/modules/webauthn-validation/signingMethods.ts +78 -42
- package/src/ma-v2/utils.ts +59 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { concat, concatHex, hashMessage, hashTypedData, } from "viem";
|
|
2
|
-
import { packUOSignature,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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":"AAKA,OAAO,EAGL,MAAM,EACN,SAAS,EACT,WAAW,EACX,aAAa,GAKd,MAAM,MAAM,CAAC;AACd,OAAO,EACL,eAAe,EACf,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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":"AAKA,OAAO,EAGL,MAAM,EACN,SAAS,EACT,WAAW,EACX,aAAa,GAKd,MAAM,MAAM,CAAC;AACd,OAAO,EACL,6CAA6C,EAC7C,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,
|
|
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 {
|
|
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
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
198
|
-
throw new Error(
|
|
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;
|
|
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;
|
|
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;
|
|
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
|
|
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
|
|
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":"AAAA,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/ma-v2/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,SAAS,EAKd,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAEf,MAAM,MAAM,CAAC;AAcd,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACnC,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,MAAM,qBAAqB,GAAG;IAElC,mBAAmB,EAAE,GAAG,CAAC;CAC1B,CAAC;AAGF,MAAM,MAAM,uBAAuB,GAAG;IACpC,mBAAmB,EAAE,GAAG,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAGF,eAAO,MAAM,eAAe,GAAI,0BAG7B,qBAAqB,KAAG,GAE1B,CAAC;AAGF,eAAO,MAAM,oBAAoB,GAAI,oCAGlC,uBAAuB,KAAG,GAQ5B,CAAC;AAKF,eAAO,MAAM,yBAAyB,GAAI,oCAGvC,uBAAuB,KAAG,GAO5B,CAAC;AAEF,eAAO,MAAM,oCAAoC,QAAO,OAEvD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,OAAO,KAAK,KAAG,OAgB3D,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,OAAO,KAAK,KAAG,OAgB7D,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,OAAO,KAAK,KAAG,OAgB5D,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,OAAO,KAAK,KAAG,OAgBzD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,KAAK,KAAG,OAgBpD,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAC9B,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,EACvD,QAAQ,SACJ,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/C,SAAS,GAAG,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,IACzE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAElC;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,SAAS,SAAS,GAAG,SAAS,EACxC,MAAM,SAAS,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,EACpD,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,EACvD,QAAQ,SACJ,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/C,SAAS,GAAG,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAE3E,MAAM,EAAE,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EACxD,IAAI,EAAE,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,GAC5C,OAAO,CACR,aAAa,GAAG;IACd,kCAAkC,EAAE,MAAM,OAAO,CAC/C,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAC;CACH,CACF,CA8BA;AAED,eAAO,MAAM,8BAA8B,y+EAC67E,CAAC;AAEz+E,eAAO,MAAM,qBAAqB,6hJAC0/I,CAAC;AAE7hJ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,+DAK/B,gBAAgB,KAAG,MAOrB,CAAC;AAGF,eAAO,MAAM,mBAAmB,GAC9B,gBAAgB,GAAG,KAClB;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,GAAG,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;CAWjC,CAAC;AACF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,oCAAoC,EAAE,GAAG,CAAC;IAC1C,GAAG,EAAE,GAAG,CAAC;CACV,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,GAAI,gDAGvC,+BAA+B,KAAG,GASpC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,MAAM,KAAK,EAAE,KAAK,MAAM,KAAG,KAEtD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,CAAC,SAAS,SAAS,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,WAAW,SAAS,MAAM,SAAS,GAAG,cAAc,GAAG,MAAM,SAAS,EAEtE,qBAAqB,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,EAChE,gBAAgB,OAAO,KACtB,OAkBF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@account-kit/smart-contracts",
|
|
3
|
-
"version": "4.
|
|
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.
|
|
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": "
|
|
72
|
+
"gitHead": "2113dcf956dd2b35a98031ef7ec5bc23c0594684",
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@aa-sdk/core": "^4.
|
|
75
|
-
"@account-kit/infra": "^4.
|
|
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
|
-
|
|
20
|
+
pack1271EOASignature,
|
|
21
21
|
DEFAULT_OWNER_ENTITY_ID,
|
|
22
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
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
|
-
?
|
|
155
|
-
:
|
|
189
|
+
return isDeferredAction(typedDataDefinition, accountAddress)
|
|
190
|
+
? signature
|
|
191
|
+
: signingMethods.formatSign(signature);
|
|
156
192
|
},
|
|
157
193
|
};
|
|
158
194
|
};
|
package/src/ma-v2/utils.ts
CHANGED
|
@@ -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
|
|
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
|
|
324
|
-
throw new Error(
|
|
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
|
};
|