@zerodev/sdk 4.0.7 → 4.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/kernel-zerodev/client/create-client.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/client/create-client.js +34 -5
- package/dist/cjs/kernel-zerodev/client/create-client.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js +2 -2
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js +0 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +1 -10
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/esm/kernel-zerodev/client/create-client.d.ts +1 -1
- package/dist/esm/kernel-zerodev/client/create-client.js +36 -7
- package/dist/esm/kernel-zerodev/client/create-client.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js +3 -3
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js +1 -2
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js +0 -8
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
- package/dist/types/kernel-zerodev/client/create-client.d.ts +1 -1
- package/dist/types/kernel-zerodev/client/create-client.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +0 -1
- package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/kernel-zerodev/client/create-client.ts +45 -9
- package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +3 -3
- package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +1 -2
- package/src/kernel-zerodev/owner/passkey/utils.ts +0 -9
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type PublicErc4337Client, type HttpTransport } from "@alchemy/aa-core";
|
|
2
2
|
import { type Chain } from "viem";
|
|
3
3
|
import type { PaymasterAndBundlerProviders } from "../paymaster/types.js";
|
|
4
4
|
interface ZeroDevClientConfig {
|
|
@@ -4,15 +4,44 @@ exports.createZeroDevPublicErc4337Client = void 0;
|
|
|
4
4
|
const aa_core_1 = require("@alchemy/aa-core");
|
|
5
5
|
const viem_1 = require("viem");
|
|
6
6
|
const constants_js_1 = require("../constants.js");
|
|
7
|
+
function isMethodInErc4337RpcSchema(variable) {
|
|
8
|
+
return [
|
|
9
|
+
"eth_sendUserOperation",
|
|
10
|
+
"eth_estimateUserOperationGas",
|
|
11
|
+
"eth_getUserOperationReceipt",
|
|
12
|
+
"eth_getUserOperationByHash",
|
|
13
|
+
"eth_supportedEntryPoints",
|
|
14
|
+
"eth_maxPriorityFeePerGas",
|
|
15
|
+
].includes(variable);
|
|
16
|
+
}
|
|
7
17
|
const createZeroDevPublicErc4337Client = ({ chain, rpcUrl, projectId, bundlerProvider, }) => {
|
|
18
|
+
const erc4337Transport = (0, viem_1.http)(rpcUrl, {
|
|
19
|
+
fetchOptions: {
|
|
20
|
+
headers: rpcUrl === constants_js_1.BUNDLER_URL ? { projectId, bundlerProvider } : {},
|
|
21
|
+
},
|
|
22
|
+
name: "Connected bundler network",
|
|
23
|
+
key: "connected-bundler-network",
|
|
24
|
+
});
|
|
25
|
+
const publicTransport = (0, viem_1.http)(constants_js_1.CHAIN_ID_TO_NODE[chain.id]);
|
|
8
26
|
let client = (0, aa_core_1.createPublicErc4337FromClient)((0, viem_1.createPublicClient)({
|
|
9
27
|
chain,
|
|
10
|
-
transport: (0, viem_1.
|
|
11
|
-
|
|
12
|
-
|
|
28
|
+
transport: (0, viem_1.custom)({
|
|
29
|
+
async request({ method, params }) {
|
|
30
|
+
let response;
|
|
31
|
+
if (isMethodInErc4337RpcSchema(method)) {
|
|
32
|
+
response = await erc4337Transport({ chain }).request({
|
|
33
|
+
method,
|
|
34
|
+
params,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
response = await publicTransport({ chain }).request({
|
|
39
|
+
method,
|
|
40
|
+
params,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return response;
|
|
13
44
|
},
|
|
14
|
-
name: "Connected bundler network",
|
|
15
|
-
key: "connected-bundler-network",
|
|
16
45
|
}),
|
|
17
46
|
}));
|
|
18
47
|
return client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-client.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/client/create-client.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"create-client.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/client/create-client.ts"],"names":[],"mappings":";;;AAAA,8CAK0B;AAC1B,+BAAoE;AACpE,kDAAgE;AAYhE,SAAS,0BAA0B,CACjC,QAAgB;IAEhB,OACE;QACE,uBAAuB;QACvB,8BAA8B;QAC9B,6BAA6B;QAC7B,4BAA4B;QAC5B,0BAA0B;QAC1B,0BAA0B;KAE7B,CAAC,QAAQ,CAAC,QAAqC,CAAC,CAAC;AACpD,CAAC;AAEM,MAAM,gCAAgC,GAAG,CAAC,EAC/C,KAAK,EACL,MAAM,EACN,SAAS,EACT,eAAe,GACK,EAAsC,EAAE;IAC5D,MAAM,gBAAgB,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE;QACpC,YAAY,EAAE;YACZ,OAAO,EAAE,MAAM,KAAK,0BAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE;SACtE;QACD,IAAI,EAAE,2BAA2B;QACjC,GAAG,EAAE,2BAA2B;KACjC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAA,WAAI,EAAC,+BAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,GAAG,IAAA,uCAA6B,EACxC,IAAA,yBAAkB,EAAC;QACjB,KAAK;QACL,SAAS,EAAE,IAAA,aAAM,EAAC;YAChB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC9B,IAAI,QAAQ,CAAC;gBACb,IAAI,0BAA0B,CAAC,MAAM,CAAC,EAAE;oBACtC,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC;wBACnD,MAAM;wBACN,MAAM;qBACA,CAAC,CAAC;iBACX;qBAAM;oBACL,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC;wBAClD,MAAM;wBACN,MAAM;qBACA,CAAC,CAAC;iBACX;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;SACF,CAAC;KACH,CAAC,CACH,CAAC;IAEF,OAAO,MAAuD,CAAC;AACjE,CAAC,CAAC;AAtCW,QAAA,gCAAgC,oCAsC3C","sourcesContent":["import {\n createPublicErc4337FromClient,\n type PublicErc4337Client,\n type Erc337RpcSchema,\n type HttpTransport,\n} from \"@alchemy/aa-core\";\nimport { http, createPublicClient, type Chain, custom } from \"viem\";\nimport { BUNDLER_URL, CHAIN_ID_TO_NODE } from \"../constants.js\";\nimport type { PaymasterAndBundlerProviders } from \"../paymaster/types.js\";\n\ninterface ZeroDevClientConfig {\n chain: Chain;\n projectId: string;\n rpcUrl?: string;\n bundlerProvider?: PaymasterAndBundlerProviders;\n}\n\ntype MethodsOfErc4337RpcSchema = Erc337RpcSchema[number][\"Method\"];\n\nfunction isMethodInErc4337RpcSchema(\n variable: string\n): variable is MethodsOfErc4337RpcSchema {\n return (\n [\n \"eth_sendUserOperation\",\n \"eth_estimateUserOperationGas\",\n \"eth_getUserOperationReceipt\",\n \"eth_getUserOperationByHash\",\n \"eth_supportedEntryPoints\",\n \"eth_maxPriorityFeePerGas\",\n ] as const\n ).includes(variable as MethodsOfErc4337RpcSchema);\n}\n\nexport const createZeroDevPublicErc4337Client = ({\n chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n}: ZeroDevClientConfig): PublicErc4337Client<HttpTransport> => {\n const erc4337Transport = http(rpcUrl, {\n fetchOptions: {\n headers: rpcUrl === BUNDLER_URL ? { projectId, bundlerProvider } : {},\n },\n name: \"Connected bundler network\",\n key: \"connected-bundler-network\",\n });\n const publicTransport = http(CHAIN_ID_TO_NODE[chain.id]);\n let client = createPublicErc4337FromClient(\n createPublicClient({\n chain,\n transport: custom({\n async request({ method, params }) {\n let response;\n if (isMethodInErc4337RpcSchema(method)) {\n response = await erc4337Transport({ chain }).request({\n method,\n params,\n } as any);\n } else {\n response = await publicTransport({ chain }).request({\n method,\n params,\n } as any);\n }\n return response;\n },\n }),\n })\n );\n\n return client as unknown as PublicErc4337Client<HttpTransport>;\n};\n"]}
|
|
@@ -11,6 +11,7 @@ const constants_js_1 = require("../../constants.js");
|
|
|
11
11
|
async function createPasskeyOwner({ name, projectId, fallback, apiUrl = constants_js_1.API_URL, }) {
|
|
12
12
|
if (typeof window !== "undefined") {
|
|
13
13
|
const challenge = (0, utils_js_1.generateRandomBuffer)();
|
|
14
|
+
const authenticatorUserId = (0, utils_js_1.generateRandomBuffer)();
|
|
14
15
|
try {
|
|
15
16
|
const attestation = await (0, http_1.getWebAuthnAttestation)({
|
|
16
17
|
publicKey: {
|
|
@@ -22,7 +23,6 @@ async function createPasskeyOwner({ name, projectId, fallback, apiUrl = constant
|
|
|
22
23
|
residentKey: "required",
|
|
23
24
|
userVerification: "required",
|
|
24
25
|
},
|
|
25
|
-
excludeCredentials: await (0, utils_js_1.getCredentials)(projectId),
|
|
26
26
|
extensions: { credProps: true },
|
|
27
27
|
challenge,
|
|
28
28
|
pubKeyCredParams: [
|
|
@@ -32,7 +32,7 @@ async function createPasskeyOwner({ name, projectId, fallback, apiUrl = constant
|
|
|
32
32
|
},
|
|
33
33
|
],
|
|
34
34
|
user: {
|
|
35
|
-
id:
|
|
35
|
+
id: authenticatorUserId,
|
|
36
36
|
name,
|
|
37
37
|
displayName: name,
|
|
38
38
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,wCAAuD;AACvD,kDAA0B;AAE1B,
|
|
1
|
+
{"version":3,"file":"createPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,wCAAuD;AACvD,kDAA0B;AAE1B,yCAOoB;AACpB,qDAA6C;AAEtC,KAAK,UAAU,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,MAAM,GAAG,sBAAO,GAMjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACzC,MAAM,mBAAmB,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACnD,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAA,6BAAsB,EAAC;gBAC/C,SAAS,EAAE;oBACT,EAAE,EAAE;wBAEF,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;wBAE5B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;qBAC/B;oBACD,sBAAsB,EAAE;wBACtB,WAAW,EAAE,UAAU;wBACvB,gBAAgB,EAAE,UAAU;qBAC7B;oBAED,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;oBAC/B,SAAS;oBACT,gBAAgB,EAAE;wBAChB;4BACE,IAAI,EAAE,oBAAS;4BACf,GAAG,EAAE,gBAAK;yBACX;qBACF;oBACD,IAAI,EAAE;wBACJ,EAAE,EAAE,mBAAmB;wBACvB,IAAI;wBACJ,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,UAAU,EACzC;gBACE,SAAS,EAAE,IAAA,0BAAe,EAAC,SAAS,CAAC;gBACrC,IAAI;gBACJ,WAAW;aACZ,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,IAAA,sBAAW,EACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,WAAW,CAAC,YAAY,EACxB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,IAAA,wBAAa,EACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,WAAW,CAAC,YAAY,EACxB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YAEV,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,mBAAmB,EAAE;gBAC/D,IAAI,QAAQ;oBAAE,OAAO,MAAM,QAAQ,EAAE,CAAC;aACvC;YACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC;AApFD,gDAoFC","sourcesContent":["import { getWebAuthnAttestation } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n base64UrlEncode,\n es256,\n generateRandomBuffer,\n publicKey,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function createPasskeyOwner({\n name,\n projectId,\n fallback,\n apiUrl = API_URL,\n}: {\n name: string;\n projectId: string;\n fallback?: () => Promise<SmartAccountSigner | undefined>;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n const authenticatorUserId = generateRandomBuffer();\n try {\n const attestation = await getWebAuthnAttestation({\n publicKey: {\n rp: {\n //@ts-expect-error\n id: window.location.hostname,\n //@ts-expect-error\n name: window.location.hostname,\n },\n authenticatorSelection: {\n residentKey: \"required\", // or 'preferred', 'discouraged'\n userVerification: \"required\",\n },\n // excludeCredentials: await getCredentials(projectId),\n extensions: { credProps: true },\n challenge,\n pubKeyCredParams: [\n {\n type: publicKey,\n alg: es256,\n },\n ],\n user: {\n id: authenticatorUserId,\n name,\n displayName: name,\n },\n },\n });\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets`,\n {\n challenge: base64UrlEncode(challenge),\n name,\n attestation,\n }\n );\n const { id, walletId, address } = await response.data;\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n attestation.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n attestation.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n //@ts-expect-error\n if (e instanceof DOMException && e.name === \"InvalidStateError\") {\n if (fallback) return await fallback();\n }\n console.log(e);\n }\n }\n return;\n}\n"]}
|
|
@@ -16,7 +16,6 @@ async function getPasskeyOwner({ projectId, apiUrl = constants_js_1.API_URL, })
|
|
|
16
16
|
publicKey: {
|
|
17
17
|
rpId: window.location.hostname,
|
|
18
18
|
userVerification: "required",
|
|
19
|
-
allowCredentials: await (0, utils_js_1.getCredentials)(projectId),
|
|
20
19
|
},
|
|
21
20
|
}));
|
|
22
21
|
const response = await axios_1.default.post(`${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAmE;AACnE,kDAA0B;AAE1B,
|
|
1
|
+
{"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAmE;AACnE,kDAA0B;AAE1B,yCAKoB;AACpB,qDAA6C;AAEtC,KAAK,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,MAAM,GAAG,sBAAO,GAIjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACzC,IAAI;YACF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,IAAA,+BAAoB,EAAC,IAAA,0BAAe,EAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAE7B;aACF,CAAC,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,YAAY,SAAS,CAAC,YAAY,EAAE,EACnE;gBACE,SAAS,EAAE,IAAA,0BAAe,EAAC,SAAS,CAAC;gBACrC,SAAS;aACV,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,IAAA,sBAAW,EACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,IAAA,wBAAa,EACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC;AAxDD,0CAwDC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n // allowCredentials: await getCredentials(projectId),\n },\n })\n );\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`,\n {\n challenge: base64UrlEncode(challenge),\n assertion,\n }\n );\n const { id, walletId, address } = await response.data;\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n console.log(e);\n }\n }\n return;\n}\n"]}
|
|
@@ -7,5 +7,4 @@ export declare const base64UrlEncode: (challenge: ArrayBuffer) => string;
|
|
|
7
7
|
export declare function signatureToHex({ r, s, v }: Signature): Hex;
|
|
8
8
|
export declare const signMessage: (msg: string | Uint8Array, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
9
9
|
export declare const signTypedData: (params: SignTypedDataParams, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
10
|
-
export declare const getCredentials: (projectId: string, apiUrl?: string) => Promise<any>;
|
|
11
10
|
export declare function base64URLStringToBuffer(base64URLString: string): ArrayBuffer;
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.base64URLStringToBuffer = exports.
|
|
6
|
+
exports.base64URLStringToBuffer = exports.signTypedData = exports.signMessage = exports.signatureToHex = exports.base64UrlEncode = exports.generateRandomBuffer = exports.es256 = exports.publicKey = void 0;
|
|
7
7
|
const http_1 = require("@turnkey/http");
|
|
8
8
|
const axios_1 = __importDefault(require("axios"));
|
|
9
9
|
const constants_js_1 = require("../../constants.js");
|
|
@@ -80,15 +80,6 @@ const signTypedData = async (params, id, walletId, projectId, credentialId, apiU
|
|
|
80
80
|
return await (0, exports.signMessage)(hashToSign, id, walletId, projectId, credentialId, apiUrl);
|
|
81
81
|
};
|
|
82
82
|
exports.signTypedData = signTypedData;
|
|
83
|
-
const getCredentials = async (projectId, apiUrl = constants_js_1.API_URL) => {
|
|
84
|
-
const response = await axios_1.default.get(`${apiUrl}/projects/${projectId}/wallets`);
|
|
85
|
-
const credentials = response.data;
|
|
86
|
-
return credentials.map((credential) => ({
|
|
87
|
-
id: base64URLStringToBuffer(credential),
|
|
88
|
-
type: "public-key",
|
|
89
|
-
}));
|
|
90
|
-
};
|
|
91
|
-
exports.getCredentials = getCredentials;
|
|
92
83
|
function base64URLStringToBuffer(base64URLString) {
|
|
93
84
|
const base64 = base64URLString.replace(/-/g, "+").replace(/_/g, "/");
|
|
94
85
|
const padLength = (4 - (base64.length % 4)) % 4;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":";;;;;;AAAA,wCAAwD;AACxD,kDAA0B;AAC1B,qDAA6C;AAE7C,mCAAgC;AAEhC,+BAAqC;AAErC,IAAA,kBAAW,EAAC;IACV,OAAO,EAAE,yBAAyB;CACnC,CAAC,CAAC;AAEU,QAAA,SAAS,GAAG,YAAY,CAAC;AAEzB,QAAA,KAAK,GAAG,CAAC,CAAC,CAAC;AAEjB,MAAM,oBAAoB,GAAG,GAAgB,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC,CAAC;AALW,QAAA,oBAAoB,wBAK/B;AAEK,MAAM,eAAe,GAAG,CAAC,SAAsB,EAAU,EAAE;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;SAC1B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC;AANW,QAAA,eAAe,mBAM1B;AAWF,SAAgB,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAa;IACnD,OAAO,eAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAChC,CAAC,EAAE,KAAK,CAAC,EAAE;QACX,CAAC,EAAE,KAAK,CAAC,EAAE;QAEX,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE;KACpB,CAAQ,CAAC;AACZ,CAAC;AAPD,wCAOC;AAEM,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAwB,EACxB,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,sBAAO,EAChB,EAAE;IACF,MAAM,aAAa,GAAG,MAAM,iBAAU,CAAC,kBAAkB,CACvD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,gCAAgC;YACtC,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE;gBACV,YAAY,EAAE,QAAQ;gBACtB,OAAO,EAAE,eAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;gBACtC,QAAQ,EAAE,8BAA8B;gBACxC,YAAY,EAAE,qBAAqB;aACpC;YACD,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;SAChC;KACF,EACD;QACE,SAAS,EAAE;YACT,gBAAgB,EAAE;gBAChB;oBACE,EAAE,EAAE,uBAAuB,CAAC,YAAY,CAAC;oBACzC,IAAI,EAAE,iBAAS;iBAChB;aACF;SACF;KACF,CACF,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,eAAK,CAAC,IAAI,CACpC,GAAG,MAAM,aAAa,SAAS,gBAAgB,EAC/C;QACE,aAAa;KACd,CACF,CAAC;IACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,2BAA2B,EAAE;QACnD,IAAI,MAAM,GAAG,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC;QAEpD,IAAI,MAAM,EAAE;YACV,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,SAAS,EAAE;gBACb,OAAO,SAAS,CAAC;aAClB;SACF;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAnDW,QAAA,WAAW,eAmDtB;AAEK,MAAM,aAAa,GAAG,KAAK,EAChC,MAA2B,EAC3B,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,sBAAO,EAChB,EAAE;IACF,MAAM,UAAU,GAAG,IAAA,oBAAa,EAAC,MAAM,CAAC,CAAC;IACzC,OAAO,MAAM,IAAA,mBAAW,EACtB,UAAU,EACV,EAAE,EACF,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,aAAa,iBAiBxB;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { browserInit, TurnkeyApi } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport { API_URL } from \"../../constants.js\";\nimport type { Hex, Signature } from \"./types.js\";\nimport { ethers } from \"ethers\";\nimport type { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const publicKey = \"public-key\";\n\nexport const es256 = -7;\n\nexport const generateRandomBuffer = (): ArrayBuffer => {\n const arr = new Uint8Array(32);\n //@ts-expect-error\n crypto.getRandomValues(arr);\n return arr.buffer;\n};\n\nexport const base64UrlEncode = (challenge: ArrayBuffer): string => {\n return Buffer.from(challenge)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n};\n\n// VIEM\n// export function signatureToHex({ r, s, v }: Signature): Hex {\n// return `0x${new secp256k1.Signature(\n// hexToBigInt(r),\n// hexToBigInt(s),\n// ).toCompactHex()}${toHex(v).slice(2)}`\n// }\n\n//ETHERS\nexport function signatureToHex({ r, s, v }: Signature): Hex {\n return ethers.utils.joinSignature({\n r: `0x${r}`,\n s: `0x${s}`,\n //@ts-expect-error\n v: parseInt(v) + 27,\n }) as Hex;\n}\n\nexport const signMessage = async (\n msg: string | Uint8Array,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const signedRequest = await TurnkeyApi.signSignRawPayload(\n {\n body: {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD\",\n organizationId: id,\n parameters: {\n privateKeyId: walletId,\n payload: ethers.utils.hashMessage(msg),\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n timestampMs: String(Date.now()),\n },\n },\n {\n publicKey: {\n allowCredentials: [\n {\n id: base64URLStringToBuffer(credentialId),\n type: publicKey,\n },\n ],\n },\n }\n );\n const proxyResponse = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/proxy`,\n {\n signedRequest,\n }\n );\n const { activity } = await proxyResponse.data;\n if (activity.status === \"ACTIVITY_STATUS_COMPLETED\") {\n let result = activity?.result?.signRawPayloadResult;\n\n if (result) {\n const assembled = signatureToHex(result);\n if (assembled) {\n return assembled;\n }\n }\n }\n return \"0x\";\n};\n\nexport const signTypedData = async (\n params: SignTypedDataParams,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const hashToSign = hashTypedData(params);\n return await signMessage(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\n// https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8\nexport function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, \"+\").replace(/_/g, \"/\");\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, \"=\");\n\n // Convert to a binary string\n const binary = atob(padded);\n\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return buffer;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type PublicErc4337Client, type HttpTransport } from "@alchemy/aa-core";
|
|
2
2
|
import { type Chain } from "viem";
|
|
3
3
|
import type { PaymasterAndBundlerProviders } from "../paymaster/types.js";
|
|
4
4
|
interface ZeroDevClientConfig {
|
|
@@ -1,15 +1,44 @@
|
|
|
1
1
|
import { createPublicErc4337FromClient, } from "@alchemy/aa-core";
|
|
2
|
-
import { http, createPublicClient } from "viem";
|
|
3
|
-
import { BUNDLER_URL } from "../constants.js";
|
|
2
|
+
import { http, createPublicClient, custom } from "viem";
|
|
3
|
+
import { BUNDLER_URL, CHAIN_ID_TO_NODE } from "../constants.js";
|
|
4
|
+
function isMethodInErc4337RpcSchema(variable) {
|
|
5
|
+
return [
|
|
6
|
+
"eth_sendUserOperation",
|
|
7
|
+
"eth_estimateUserOperationGas",
|
|
8
|
+
"eth_getUserOperationReceipt",
|
|
9
|
+
"eth_getUserOperationByHash",
|
|
10
|
+
"eth_supportedEntryPoints",
|
|
11
|
+
"eth_maxPriorityFeePerGas",
|
|
12
|
+
].includes(variable);
|
|
13
|
+
}
|
|
4
14
|
export const createZeroDevPublicErc4337Client = ({ chain, rpcUrl, projectId, bundlerProvider, }) => {
|
|
15
|
+
const erc4337Transport = http(rpcUrl, {
|
|
16
|
+
fetchOptions: {
|
|
17
|
+
headers: rpcUrl === BUNDLER_URL ? { projectId, bundlerProvider } : {},
|
|
18
|
+
},
|
|
19
|
+
name: "Connected bundler network",
|
|
20
|
+
key: "connected-bundler-network",
|
|
21
|
+
});
|
|
22
|
+
const publicTransport = http(CHAIN_ID_TO_NODE[chain.id]);
|
|
5
23
|
let client = createPublicErc4337FromClient(createPublicClient({
|
|
6
24
|
chain,
|
|
7
|
-
transport:
|
|
8
|
-
|
|
9
|
-
|
|
25
|
+
transport: custom({
|
|
26
|
+
async request({ method, params }) {
|
|
27
|
+
let response;
|
|
28
|
+
if (isMethodInErc4337RpcSchema(method)) {
|
|
29
|
+
response = await erc4337Transport({ chain }).request({
|
|
30
|
+
method,
|
|
31
|
+
params,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
response = await publicTransport({ chain }).request({
|
|
36
|
+
method,
|
|
37
|
+
params,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return response;
|
|
10
41
|
},
|
|
11
|
-
name: "Connected bundler network",
|
|
12
|
-
key: "connected-bundler-network",
|
|
13
42
|
}),
|
|
14
43
|
}));
|
|
15
44
|
return client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-client.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/client/create-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,
|
|
1
|
+
{"version":3,"file":"create-client.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/client/create-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,GAI9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAc,MAAM,EAAE,MAAM,MAAM,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAYhE,SAAS,0BAA0B,CACjC,QAAgB;IAEhB,OACE;QACE,uBAAuB;QACvB,8BAA8B;QAC9B,6BAA6B;QAC7B,4BAA4B;QAC5B,0BAA0B;QAC1B,0BAA0B;KAE7B,CAAC,QAAQ,CAAC,QAAqC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,EAC/C,KAAK,EACL,MAAM,EACN,SAAS,EACT,eAAe,GACK,EAAsC,EAAE;IAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE;QACpC,YAAY,EAAE;YACZ,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE;SACtE;QACD,IAAI,EAAE,2BAA2B;QACjC,GAAG,EAAE,2BAA2B;KACjC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,GAAG,6BAA6B,CACxC,kBAAkB,CAAC;QACjB,KAAK;QACL,SAAS,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC9B,IAAI,QAAQ,CAAC;gBACb,IAAI,0BAA0B,CAAC,MAAM,CAAC,EAAE;oBACtC,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC;wBACnD,MAAM;wBACN,MAAM;qBACA,CAAC,CAAC;iBACX;qBAAM;oBACL,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC;wBAClD,MAAM;wBACN,MAAM;qBACA,CAAC,CAAC;iBACX;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;SACF,CAAC;KACH,CAAC,CACH,CAAC;IAEF,OAAO,MAAuD,CAAC;AACjE,CAAC,CAAC","sourcesContent":["import {\n createPublicErc4337FromClient,\n type PublicErc4337Client,\n type Erc337RpcSchema,\n type HttpTransport,\n} from \"@alchemy/aa-core\";\nimport { http, createPublicClient, type Chain, custom } from \"viem\";\nimport { BUNDLER_URL, CHAIN_ID_TO_NODE } from \"../constants.js\";\nimport type { PaymasterAndBundlerProviders } from \"../paymaster/types.js\";\n\ninterface ZeroDevClientConfig {\n chain: Chain;\n projectId: string;\n rpcUrl?: string;\n bundlerProvider?: PaymasterAndBundlerProviders;\n}\n\ntype MethodsOfErc4337RpcSchema = Erc337RpcSchema[number][\"Method\"];\n\nfunction isMethodInErc4337RpcSchema(\n variable: string\n): variable is MethodsOfErc4337RpcSchema {\n return (\n [\n \"eth_sendUserOperation\",\n \"eth_estimateUserOperationGas\",\n \"eth_getUserOperationReceipt\",\n \"eth_getUserOperationByHash\",\n \"eth_supportedEntryPoints\",\n \"eth_maxPriorityFeePerGas\",\n ] as const\n ).includes(variable as MethodsOfErc4337RpcSchema);\n}\n\nexport const createZeroDevPublicErc4337Client = ({\n chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n}: ZeroDevClientConfig): PublicErc4337Client<HttpTransport> => {\n const erc4337Transport = http(rpcUrl, {\n fetchOptions: {\n headers: rpcUrl === BUNDLER_URL ? { projectId, bundlerProvider } : {},\n },\n name: \"Connected bundler network\",\n key: \"connected-bundler-network\",\n });\n const publicTransport = http(CHAIN_ID_TO_NODE[chain.id]);\n let client = createPublicErc4337FromClient(\n createPublicClient({\n chain,\n transport: custom({\n async request({ method, params }) {\n let response;\n if (isMethodInErc4337RpcSchema(method)) {\n response = await erc4337Transport({ chain }).request({\n method,\n params,\n } as any);\n } else {\n response = await publicTransport({ chain }).request({\n method,\n params,\n } as any);\n }\n return response;\n },\n }),\n })\n );\n\n return client as unknown as PublicErc4337Client<HttpTransport>;\n};\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { getWebAuthnAttestation } from "@turnkey/http";
|
|
2
2
|
import axios from "axios";
|
|
3
|
-
import { base64UrlEncode, es256, generateRandomBuffer,
|
|
3
|
+
import { base64UrlEncode, es256, generateRandomBuffer, publicKey, signMessage, signTypedData, } from "./utils.js";
|
|
4
4
|
import { API_URL } from "../../constants.js";
|
|
5
5
|
export async function createPasskeyOwner({ name, projectId, fallback, apiUrl = API_URL, }) {
|
|
6
6
|
if (typeof window !== "undefined") {
|
|
7
7
|
const challenge = generateRandomBuffer();
|
|
8
|
+
const authenticatorUserId = generateRandomBuffer();
|
|
8
9
|
try {
|
|
9
10
|
const attestation = await getWebAuthnAttestation({
|
|
10
11
|
publicKey: {
|
|
@@ -16,7 +17,6 @@ export async function createPasskeyOwner({ name, projectId, fallback, apiUrl = A
|
|
|
16
17
|
residentKey: "required",
|
|
17
18
|
userVerification: "required",
|
|
18
19
|
},
|
|
19
|
-
excludeCredentials: await getCredentials(projectId),
|
|
20
20
|
extensions: { credProps: true },
|
|
21
21
|
challenge,
|
|
22
22
|
pubKeyCredParams: [
|
|
@@ -26,7 +26,7 @@ export async function createPasskeyOwner({ name, projectId, fallback, apiUrl = A
|
|
|
26
26
|
},
|
|
27
27
|
],
|
|
28
28
|
user: {
|
|
29
|
-
id:
|
|
29
|
+
id: authenticatorUserId,
|
|
30
30
|
name,
|
|
31
31
|
displayName: name,
|
|
32
32
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,KAAK,EACL,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"createPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,KAAK,EACL,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,MAAM,GAAG,OAAO,GAMjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,MAAM,mBAAmB,GAAG,oBAAoB,EAAE,CAAC;QACnD,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC;gBAC/C,SAAS,EAAE;oBACT,EAAE,EAAE;wBAEF,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;wBAE5B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;qBAC/B;oBACD,sBAAsB,EAAE;wBACtB,WAAW,EAAE,UAAU;wBACvB,gBAAgB,EAAE,UAAU;qBAC7B;oBAED,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;oBAC/B,SAAS;oBACT,gBAAgB,EAAE;wBAChB;4BACE,IAAI,EAAE,SAAS;4BACf,GAAG,EAAE,KAAK;yBACX;qBACF;oBACD,IAAI,EAAE;wBACJ,EAAE,EAAE,mBAAmB;wBACvB,IAAI;wBACJ,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,UAAU,EACzC;gBACE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;gBACrC,IAAI;gBACJ,WAAW;aACZ,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,WAAW,CACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,WAAW,CAAC,YAAY,EACxB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,aAAa,CACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,WAAW,CAAC,YAAY,EACxB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YAEV,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,mBAAmB,EAAE;gBAC/D,IAAI,QAAQ;oBAAE,OAAO,MAAM,QAAQ,EAAE,CAAC;aACvC;YACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC","sourcesContent":["import { getWebAuthnAttestation } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n base64UrlEncode,\n es256,\n generateRandomBuffer,\n publicKey,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function createPasskeyOwner({\n name,\n projectId,\n fallback,\n apiUrl = API_URL,\n}: {\n name: string;\n projectId: string;\n fallback?: () => Promise<SmartAccountSigner | undefined>;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n const authenticatorUserId = generateRandomBuffer();\n try {\n const attestation = await getWebAuthnAttestation({\n publicKey: {\n rp: {\n //@ts-expect-error\n id: window.location.hostname,\n //@ts-expect-error\n name: window.location.hostname,\n },\n authenticatorSelection: {\n residentKey: \"required\", // or 'preferred', 'discouraged'\n userVerification: \"required\",\n },\n // excludeCredentials: await getCredentials(projectId),\n extensions: { credProps: true },\n challenge,\n pubKeyCredParams: [\n {\n type: publicKey,\n alg: es256,\n },\n ],\n user: {\n id: authenticatorUserId,\n name,\n displayName: name,\n },\n },\n });\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets`,\n {\n challenge: base64UrlEncode(challenge),\n name,\n attestation,\n }\n );\n const { id, walletId, address } = await response.data;\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n attestation.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n attestation.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n //@ts-expect-error\n if (e instanceof DOMException && e.name === \"InvalidStateError\") {\n if (fallback) return await fallback();\n }\n console.log(e);\n }\n }\n return;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getWebAuthnAssertion } from "@turnkey/http/dist/webauthn";
|
|
2
2
|
import axios from "axios";
|
|
3
|
-
import { base64UrlEncode, generateRandomBuffer,
|
|
3
|
+
import { base64UrlEncode, generateRandomBuffer, signMessage, signTypedData, } from "./utils.js";
|
|
4
4
|
import { API_URL } from "../../constants.js";
|
|
5
5
|
export async function getPasskeyOwner({ projectId, apiUrl = API_URL, }) {
|
|
6
6
|
if (typeof window !== "undefined") {
|
|
@@ -10,7 +10,6 @@ export async function getPasskeyOwner({ projectId, apiUrl = API_URL, }) {
|
|
|
10
10
|
publicKey: {
|
|
11
11
|
rpId: window.location.hostname,
|
|
12
12
|
userVerification: "required",
|
|
13
|
-
allowCredentials: await getCredentials(projectId),
|
|
14
13
|
},
|
|
15
14
|
}));
|
|
16
15
|
const response = await axios.post(`${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,MAAM,GAAG,OAAO,GAIjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAE7B;aACF,CAAC,CACH,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,GAAG,MAAM,aAAa,SAAS,YAAY,SAAS,CAAC,YAAY,EAAE,EACnE;gBACE,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC;gBACrC,SAAS;aACV,CACF,CAAC;YACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACtD,MAAM,KAAK,GAAuB;gBAChC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;gBAC/B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACnB,WAAW,CACT,GAAG,EACH,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;gBACH,aAAa,EAAE,CAAC,MAA2B,EAAE,EAAE,CAC7C,aAAa,CACX,MAAM,EACN,EAAE,EACF,QAAQ,EACR,SAAS,EACT,SAAS,CAAC,YAAY,EACtB,MAAM,CACP;aACJ,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,OAAO;AACT,CAAC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n // allowCredentials: await getCredentials(projectId),\n },\n })\n );\n const response = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/${assertion.credentialId}`,\n {\n challenge: base64UrlEncode(challenge),\n assertion,\n }\n );\n const { id, walletId, address } = await response.data;\n const owner: SmartAccountSigner = {\n getAddress: async () => address,\n signMessage: (msg) =>\n signMessage(\n msg,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n signTypedData: (params: SignTypedDataParams) =>\n signTypedData(\n params,\n id,\n walletId,\n projectId,\n assertion.credentialId,\n apiUrl\n ),\n };\n return owner;\n } catch (e) {\n console.log(e);\n }\n }\n return;\n}\n"]}
|
|
@@ -7,5 +7,4 @@ export declare const base64UrlEncode: (challenge: ArrayBuffer) => string;
|
|
|
7
7
|
export declare function signatureToHex({ r, s, v }: Signature): Hex;
|
|
8
8
|
export declare const signMessage: (msg: string | Uint8Array, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
9
9
|
export declare const signTypedData: (params: SignTypedDataParams, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
10
|
-
export declare const getCredentials: (projectId: string, apiUrl?: string) => Promise<any>;
|
|
11
10
|
export declare function base64URLStringToBuffer(base64URLString: string): ArrayBuffer;
|
|
@@ -69,14 +69,6 @@ export const signTypedData = async (params, id, walletId, projectId, credentialI
|
|
|
69
69
|
const hashToSign = hashTypedData(params);
|
|
70
70
|
return await signMessage(hashToSign, id, walletId, projectId, credentialId, apiUrl);
|
|
71
71
|
};
|
|
72
|
-
export const getCredentials = async (projectId, apiUrl = API_URL) => {
|
|
73
|
-
const response = await axios.get(`${apiUrl}/projects/${projectId}/wallets`);
|
|
74
|
-
const credentials = response.data;
|
|
75
|
-
return credentials.map((credential) => ({
|
|
76
|
-
id: base64URLStringToBuffer(credential),
|
|
77
|
-
type: "public-key",
|
|
78
|
-
}));
|
|
79
|
-
};
|
|
80
72
|
export function base64URLStringToBuffer(base64URLString) {
|
|
81
73
|
const base64 = base64URLString.replace(/-/g, "+").replace(/_/g, "/");
|
|
82
74
|
const padLength = (4 - (base64.length % 4)) % 4;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { browserInit, TurnkeyApi } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport { API_URL } from \"../../constants.js\";\nimport type { Hex, Signature } from \"./types.js\";\nimport { ethers } from \"ethers\";\nimport type { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const publicKey = \"public-key\";\n\nexport const es256 = -7;\n\nexport const generateRandomBuffer = (): ArrayBuffer => {\n const arr = new Uint8Array(32);\n //@ts-expect-error\n crypto.getRandomValues(arr);\n return arr.buffer;\n};\n\nexport const base64UrlEncode = (challenge: ArrayBuffer): string => {\n return Buffer.from(challenge)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n};\n\n// VIEM\n// export function signatureToHex({ r, s, v }: Signature): Hex {\n// return `0x${new secp256k1.Signature(\n// hexToBigInt(r),\n// hexToBigInt(s),\n// ).toCompactHex()}${toHex(v).slice(2)}`\n// }\n\n//ETHERS\nexport function signatureToHex({ r, s, v }: Signature): Hex {\n return ethers.utils.joinSignature({\n r: `0x${r}`,\n s: `0x${s}`,\n //@ts-expect-error\n v: parseInt(v) + 27,\n }) as Hex;\n}\n\nexport const signMessage = async (\n msg: string | Uint8Array,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const signedRequest = await TurnkeyApi.signSignRawPayload(\n {\n body: {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD\",\n organizationId: id,\n parameters: {\n privateKeyId: walletId,\n payload: ethers.utils.hashMessage(msg),\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n timestampMs: String(Date.now()),\n },\n },\n {\n publicKey: {\n allowCredentials: [\n {\n id: base64URLStringToBuffer(credentialId),\n type: publicKey,\n },\n ],\n },\n }\n );\n const proxyResponse = await axios.post(\n `${apiUrl}/projects/${projectId}/wallets/proxy`,\n {\n signedRequest,\n }\n );\n const { activity } = await proxyResponse.data;\n if (activity.status === \"ACTIVITY_STATUS_COMPLETED\") {\n let result = activity?.result?.signRawPayloadResult;\n\n if (result) {\n const assembled = signatureToHex(result);\n if (assembled) {\n return assembled;\n }\n }\n }\n return \"0x\";\n};\n\nexport const signTypedData = async (\n params: SignTypedDataParams,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n const hashToSign = hashTypedData(params);\n return await signMessage(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\n// https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8\nexport function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {\n // Convert from Base64URL to Base64\n const base64 = base64URLString.replace(/-/g, \"+\").replace(/_/g, \"/\");\n /**\n * Pad with '=' until it's a multiple of four\n * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding\n * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding\n * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding\n * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding\n */\n const padLength = (4 - (base64.length % 4)) % 4;\n const padded = base64.padEnd(base64.length + padLength, \"=\");\n\n // Convert to a binary string\n const binary = atob(padded);\n\n // Convert binary string to buffer\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return buffer;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type PublicErc4337Client, type HttpTransport } from "@alchemy/aa-core";
|
|
2
2
|
import { type Chain } from "viem";
|
|
3
3
|
import type { PaymasterAndBundlerProviders } from "../paymaster/types.js";
|
|
4
4
|
interface ZeroDevClientConfig {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-client.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/client/create-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,
|
|
1
|
+
{"version":3,"file":"create-client.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/client/create-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAA4B,KAAK,KAAK,EAAU,MAAM,MAAM,CAAC;AAEpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE1E,UAAU,mBAAmB;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,4BAA4B,CAAC;CAChD;AAmBD,eAAO,MAAM,gCAAgC,mDAK1C,mBAAmB,KAAG,oBAAoB,aAAa,CAiCzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"createPasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWhF,wBAAsB,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,MAAgB,GACjB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CA0E1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"getPasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAShF,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,MAAgB,GACjB,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAkD1C"}
|
|
@@ -7,6 +7,5 @@ export declare const base64UrlEncode: (challenge: ArrayBuffer) => string;
|
|
|
7
7
|
export declare function signatureToHex({ r, s, v }: Signature): Hex;
|
|
8
8
|
export declare const signMessage: (msg: string | Uint8Array, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
9
9
|
export declare const signTypedData: (params: SignTypedDataParams, id: string, walletId: string, projectId: string, credentialId: string, apiUrl?: string) => Promise<`0x${string}`>;
|
|
10
|
-
export declare const getCredentials: (projectId: string, apiUrl?: string) => Promise<any>;
|
|
11
10
|
export declare function base64URLStringToBuffer(base64URLString: string): ArrayBuffer;
|
|
12
11
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,eAAO,MAAM,SAAS,eAAe,CAAC;AAEtC,eAAO,MAAM,KAAK,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB,QAAO,WAKvC,CAAC;AAEF,eAAO,MAAM,eAAe,cAAe,WAAW,KAAG,MAMxD,CAAC;AAWF,wBAAgB,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,GAAG,GAAG,CAO1D;AAED,eAAO,MAAM,WAAW,QACjB,MAAM,GAAG,UAAU,MACpB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CA8CrB,CAAC;AAEF,eAAO,MAAM,aAAa,WAChB,mBAAmB,MACvB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAYrB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,eAAO,MAAM,SAAS,eAAe,CAAC;AAEtC,eAAO,MAAM,KAAK,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB,QAAO,WAKvC,CAAC;AAEF,eAAO,MAAM,eAAe,cAAe,WAAW,KAAG,MAMxD,CAAC;AAWF,wBAAgB,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,GAAG,GAAG,CAO1D;AAED,eAAO,MAAM,WAAW,QACjB,MAAM,GAAG,UAAU,MACpB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CA8CrB,CAAC;AAEF,eAAO,MAAM,aAAa,WAChB,mBAAmB,MACvB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAYrB,CAAC;AAGF,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAyB5E"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createPublicErc4337FromClient,
|
|
3
|
-
type HttpTransport,
|
|
4
3
|
type PublicErc4337Client,
|
|
4
|
+
type Erc337RpcSchema,
|
|
5
|
+
type HttpTransport,
|
|
5
6
|
} from "@alchemy/aa-core";
|
|
6
|
-
import { http, createPublicClient, type Chain } from "viem";
|
|
7
|
-
import { BUNDLER_URL } from "../constants.js";
|
|
7
|
+
import { http, createPublicClient, type Chain, custom } from "viem";
|
|
8
|
+
import { BUNDLER_URL, CHAIN_ID_TO_NODE } from "../constants.js";
|
|
8
9
|
import type { PaymasterAndBundlerProviders } from "../paymaster/types.js";
|
|
9
10
|
|
|
10
11
|
interface ZeroDevClientConfig {
|
|
@@ -14,24 +15,59 @@ interface ZeroDevClientConfig {
|
|
|
14
15
|
bundlerProvider?: PaymasterAndBundlerProviders;
|
|
15
16
|
}
|
|
16
17
|
|
|
18
|
+
type MethodsOfErc4337RpcSchema = Erc337RpcSchema[number]["Method"];
|
|
19
|
+
|
|
20
|
+
function isMethodInErc4337RpcSchema(
|
|
21
|
+
variable: string
|
|
22
|
+
): variable is MethodsOfErc4337RpcSchema {
|
|
23
|
+
return (
|
|
24
|
+
[
|
|
25
|
+
"eth_sendUserOperation",
|
|
26
|
+
"eth_estimateUserOperationGas",
|
|
27
|
+
"eth_getUserOperationReceipt",
|
|
28
|
+
"eth_getUserOperationByHash",
|
|
29
|
+
"eth_supportedEntryPoints",
|
|
30
|
+
"eth_maxPriorityFeePerGas",
|
|
31
|
+
] as const
|
|
32
|
+
).includes(variable as MethodsOfErc4337RpcSchema);
|
|
33
|
+
}
|
|
34
|
+
|
|
17
35
|
export const createZeroDevPublicErc4337Client = ({
|
|
18
36
|
chain,
|
|
19
37
|
rpcUrl,
|
|
20
38
|
projectId,
|
|
21
39
|
bundlerProvider,
|
|
22
40
|
}: ZeroDevClientConfig): PublicErc4337Client<HttpTransport> => {
|
|
41
|
+
const erc4337Transport = http(rpcUrl, {
|
|
42
|
+
fetchOptions: {
|
|
43
|
+
headers: rpcUrl === BUNDLER_URL ? { projectId, bundlerProvider } : {},
|
|
44
|
+
},
|
|
45
|
+
name: "Connected bundler network",
|
|
46
|
+
key: "connected-bundler-network",
|
|
47
|
+
});
|
|
48
|
+
const publicTransport = http(CHAIN_ID_TO_NODE[chain.id]);
|
|
23
49
|
let client = createPublicErc4337FromClient(
|
|
24
50
|
createPublicClient({
|
|
25
51
|
chain,
|
|
26
|
-
transport:
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
transport: custom({
|
|
53
|
+
async request({ method, params }) {
|
|
54
|
+
let response;
|
|
55
|
+
if (isMethodInErc4337RpcSchema(method)) {
|
|
56
|
+
response = await erc4337Transport({ chain }).request({
|
|
57
|
+
method,
|
|
58
|
+
params,
|
|
59
|
+
} as any);
|
|
60
|
+
} else {
|
|
61
|
+
response = await publicTransport({ chain }).request({
|
|
62
|
+
method,
|
|
63
|
+
params,
|
|
64
|
+
} as any);
|
|
65
|
+
}
|
|
66
|
+
return response;
|
|
29
67
|
},
|
|
30
|
-
name: "Connected bundler network",
|
|
31
|
-
key: "connected-bundler-network",
|
|
32
68
|
}),
|
|
33
69
|
})
|
|
34
70
|
);
|
|
35
71
|
|
|
36
|
-
return client
|
|
72
|
+
return client as unknown as PublicErc4337Client<HttpTransport>;
|
|
37
73
|
};
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
base64UrlEncode,
|
|
6
6
|
es256,
|
|
7
7
|
generateRandomBuffer,
|
|
8
|
-
getCredentials,
|
|
9
8
|
publicKey,
|
|
10
9
|
signMessage,
|
|
11
10
|
signTypedData,
|
|
@@ -26,6 +25,7 @@ export async function createPasskeyOwner({
|
|
|
26
25
|
//@ts-expect-error
|
|
27
26
|
if (typeof window !== "undefined") {
|
|
28
27
|
const challenge = generateRandomBuffer();
|
|
28
|
+
const authenticatorUserId = generateRandomBuffer();
|
|
29
29
|
try {
|
|
30
30
|
const attestation = await getWebAuthnAttestation({
|
|
31
31
|
publicKey: {
|
|
@@ -39,7 +39,7 @@ export async function createPasskeyOwner({
|
|
|
39
39
|
residentKey: "required", // or 'preferred', 'discouraged'
|
|
40
40
|
userVerification: "required",
|
|
41
41
|
},
|
|
42
|
-
excludeCredentials: await getCredentials(projectId),
|
|
42
|
+
// excludeCredentials: await getCredentials(projectId),
|
|
43
43
|
extensions: { credProps: true },
|
|
44
44
|
challenge,
|
|
45
45
|
pubKeyCredParams: [
|
|
@@ -49,7 +49,7 @@ export async function createPasskeyOwner({
|
|
|
49
49
|
},
|
|
50
50
|
],
|
|
51
51
|
user: {
|
|
52
|
-
id:
|
|
52
|
+
id: authenticatorUserId,
|
|
53
53
|
name,
|
|
54
54
|
displayName: name,
|
|
55
55
|
},
|
|
@@ -4,7 +4,6 @@ import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
|
|
|
4
4
|
import {
|
|
5
5
|
base64UrlEncode,
|
|
6
6
|
generateRandomBuffer,
|
|
7
|
-
getCredentials,
|
|
8
7
|
signMessage,
|
|
9
8
|
signTypedData,
|
|
10
9
|
} from "./utils.js";
|
|
@@ -27,7 +26,7 @@ export async function getPasskeyOwner({
|
|
|
27
26
|
//@ts-expect-error
|
|
28
27
|
rpId: window.location.hostname,
|
|
29
28
|
userVerification: "required",
|
|
30
|
-
allowCredentials: await getCredentials(projectId),
|
|
29
|
+
// allowCredentials: await getCredentials(projectId),
|
|
31
30
|
},
|
|
32
31
|
})
|
|
33
32
|
);
|
|
@@ -119,15 +119,6 @@ export const signTypedData = async (
|
|
|
119
119
|
);
|
|
120
120
|
};
|
|
121
121
|
|
|
122
|
-
export const getCredentials = async (projectId: string, apiUrl = API_URL) => {
|
|
123
|
-
const response = await axios.get(`${apiUrl}/projects/${projectId}/wallets`);
|
|
124
|
-
const credentials = response.data;
|
|
125
|
-
return credentials.map((credential: string) => ({
|
|
126
|
-
id: base64URLStringToBuffer(credential),
|
|
127
|
-
type: "public-key",
|
|
128
|
-
}));
|
|
129
|
-
};
|
|
130
|
-
|
|
131
122
|
// https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8
|
|
132
123
|
export function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {
|
|
133
124
|
// Convert from Base64URL to Base64
|