@zerodev/sdk 4.0.24 → 4.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js +2 -3
  2. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
  3. package/dist/cjs/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js +2 -0
  4. package/dist/cjs/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js.map +1 -1
  5. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js +1 -2
  6. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
  7. package/dist/cjs/kernel-zerodev/owner/passkey/index.d.ts +1 -0
  8. package/dist/cjs/kernel-zerodev/owner/passkey/index.js +3 -1
  9. package/dist/cjs/kernel-zerodev/owner/passkey/index.js.map +1 -1
  10. package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +1 -0
  11. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +7 -2
  12. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  13. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js +3 -4
  14. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -1
  15. package/dist/esm/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js +3 -1
  16. package/dist/esm/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.js.map +1 -1
  17. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js +2 -3
  18. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -1
  19. package/dist/esm/kernel-zerodev/owner/passkey/index.d.ts +1 -0
  20. package/dist/esm/kernel-zerodev/owner/passkey/index.js +1 -0
  21. package/dist/esm/kernel-zerodev/owner/passkey/index.js.map +1 -1
  22. package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +1 -0
  23. package/dist/esm/kernel-zerodev/owner/passkey/utils.js +5 -1
  24. package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -1
  25. package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts.map +1 -1
  26. package/dist/types/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.d.ts.map +1 -1
  27. package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -1
  28. package/dist/types/kernel-zerodev/owner/passkey/index.d.ts +1 -0
  29. package/dist/types/kernel-zerodev/owner/passkey/index.d.ts.map +1 -1
  30. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +1 -0
  31. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -1
  32. package/package.json +1 -1
  33. package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +3 -4
  34. package/src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts +3 -0
  35. package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +2 -3
  36. package/src/kernel-zerodev/owner/passkey/index.ts +1 -0
  37. package/src/kernel-zerodev/owner/passkey/utils.ts +6 -1
@@ -16,12 +16,11 @@ async function createPasskeyOwner({ name, projectId, withCredentials = false, fa
16
16
  if (withCredentials) {
17
17
  credentials = await (0, utils_js_1.getCredentials)(projectId, name);
18
18
  }
19
- if (credentials.length >= 64) {
19
+ if (credentials && credentials?.length >= 64) {
20
20
  throw new exceptions_js_1.UsernameIsAlreadyUsed();
21
21
  }
22
22
  try {
23
- utils_js_1.abortController.controller.abort();
24
- utils_js_1.abortController.controller = new AbortController();
23
+ (0, utils_js_1.abortWebauthn)();
25
24
  const attestation = await (0, http_1.getWebAuthnAttestation)({
26
25
  publicKey: {
27
26
  rp: {
@@ -1 +1 @@
1
- {"version":3,"file":"createPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,wCAAuD;AACvD,kDAA0B;AAE1B,yCASoB;AACpB,qDAA6C;AAC7C,mDAAwD;AAEjD,KAAK,UAAU,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,eAAe,GAAG,KAAK,EACvB,QAAQ,EACR,MAAM,GAAG,sBAAO,GAOjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACzC,IAAI,WAAW,GAAG,SAAS,CAAA;QAC3B,IAAI,eAAe,EAAE;YACnB,WAAW,GAAG,MAAM,IAAA,yBAAc,EAAC,SAAS,EAAE,IAAI,CAAC,CAAA;SACpD;QACD,IAAI,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE;YAC5B,MAAM,IAAI,qCAAqB,EAAE,CAAA;SAClC;QAED,IAAI;YACF,0BAAe,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YAClC,0BAAe,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YAClD,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;oBACD,kBAAkB,EAAE,WAAW;oBAC/B,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,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,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;AA/FD,gDA+FC","sourcesContent":["import { getWebAuthnAttestation } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortController,\n base64UrlEncode,\n es256,\n generateRandomBuffer,\n getCredentials,\n publicKey,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\nimport { UsernameIsAlreadyUsed } from \"./exceptions.js\";\n\nexport async function createPasskeyOwner({\n name,\n projectId,\n withCredentials = false,\n fallback,\n apiUrl = API_URL,\n}: {\n name: string;\n projectId: string;\n withCredentials?: boolean;\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 let credentials = undefined\n if (withCredentials) {\n credentials = await getCredentials(projectId, name)\n }\n if (credentials.length >= 64) {\n throw new UsernameIsAlreadyUsed()\n }\n\n try {\n abortController.controller.abort()\n abortController.controller = new AbortController()\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: credentials,\n extensions: { credProps: true },\n challenge,\n pubKeyCredParams: [\n {\n type: publicKey,\n alg: es256,\n },\n ],\n user: {\n id: Uint8Array.from(name, (c) => c.charCodeAt(0)),\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
+ {"version":3,"file":"createPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,wCAAuD;AACvD,kDAA0B;AAE1B,yCASoB;AACpB,qDAA6C;AAC7C,mDAAwD;AAEjD,KAAK,UAAU,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,eAAe,GAAG,KAAK,EACvB,QAAQ,EACR,MAAM,GAAG,sBAAO,GAOjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACzC,IAAI,WAAW,GAAG,SAAS,CAAA;QAC3B,IAAI,eAAe,EAAE;YACnB,WAAW,GAAG,MAAM,IAAA,yBAAc,EAAC,SAAS,EAAE,IAAI,CAAC,CAAA;SACpD;QACD,IAAI,WAAW,IAAI,WAAW,EAAE,MAAM,IAAI,EAAE,EAAE;YAC5C,MAAM,IAAI,qCAAqB,EAAE,CAAA;SAClC;QAED,IAAI;YACF,IAAA,wBAAa,GAAE,CAAA;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;oBACD,kBAAkB,EAAE,WAAW;oBAC/B,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,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,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;AA9FD,gDA8FC","sourcesContent":["import { getWebAuthnAttestation } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortWebauthn,\n base64UrlEncode,\n es256,\n generateRandomBuffer,\n getCredentials,\n publicKey,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\nimport { UsernameIsAlreadyUsed } from \"./exceptions.js\";\n\nexport async function createPasskeyOwner({\n name,\n projectId,\n withCredentials = false,\n fallback,\n apiUrl = API_URL,\n}: {\n name: string;\n projectId: string;\n withCredentials?: boolean;\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 let credentials = undefined\n if (withCredentials) {\n credentials = await getCredentials(projectId, name)\n }\n if (credentials && credentials?.length >= 64) {\n throw new UsernameIsAlreadyUsed()\n }\n\n try {\n abortWebauthn()\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: credentials,\n extensions: { credProps: true },\n challenge,\n pubKeyCredParams: [\n {\n type: publicKey,\n alg: es256,\n },\n ],\n user: {\n id: Uint8Array.from(name, (c) => c.charCodeAt(0)),\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,6 +16,7 @@ async function getAutocompletePasskeyOwner({ projectId, apiUrl = constants_js_1.
16
16
  if (typeof window !== "undefined") {
17
17
  const challenge = (0, utils_js_1.generateRandomBuffer)();
18
18
  try {
19
+ (0, utils_js_1.abortWebauthn)();
19
20
  const assertion = JSON.parse(await (0, webauthn_1.getWebAuthnAssertion)((0, utils_js_1.base64UrlEncode)(challenge), {
20
21
  mediation: 'conditional',
21
22
  publicKey: {
@@ -29,6 +30,7 @@ async function getAutocompletePasskeyOwner({ projectId, apiUrl = constants_js_1.
29
30
  assertion,
30
31
  });
31
32
  const { id, walletId, address } = await response.data;
33
+ console.log('owner', id, walletId, address);
32
34
  const owner = {
33
35
  getAddress: async () => address,
34
36
  signMessage: (msg) => (0, utils_js_1.signMessage)(msg, id, walletId, projectId, assertion.credentialId, apiUrl),
@@ -1 +1 @@
1
- {"version":3,"file":"getAutocompletePasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAmE;AACnE,kDAA0B;AAE1B,yCAMoB;AACpB,qDAA6C;AAEtC,KAAK,UAAU,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAM,GAAG,sBAAO,GAKjB;IAEC,IAAI,CAAC,mBAAmB,EAAE,+BAA+B;QAEnD,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,EAAE;QAC3D,OAAO;KACR;IAGH,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,aAAa;gBACxB,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,MAAM,EAAE,0BAAe,CAAC,UAAU,CAAC,MAAM;aAC1C,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;AAjED,kEAiEC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortController,\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getAutocompletePasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-ignore\n if (!PublicKeyCredential?.isConditionalMediationAvailable ||\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable()) {\n return;\n }\n\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 mediation: 'conditional',\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n },\n signal: abortController.controller.signal\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"]}
1
+ {"version":3,"file":"getAutocompletePasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAmE;AACnE,kDAA0B;AAE1B,yCAOoB;AACpB,qDAA6C;AAEtC,KAAK,UAAU,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAM,GAAG,sBAAO,GAKjB;IAEC,IAAI,CAAC,mBAAmB,EAAE,+BAA+B;QAEnD,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,EAAE;QAC3D,OAAO;KACR;IAGH,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACzC,IAAI;YACF,IAAA,wBAAa,GAAE,CAAA;YACf,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,IAAA,+BAAoB,EAAC,IAAA,0BAAe,EAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,MAAM,EAAE,0BAAe,CAAC,UAAU,CAAC,MAAM;aAC1C,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,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC3C,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;AAnED,kEAmEC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortController,\n abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getAutocompletePasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-ignore\n if (!PublicKeyCredential?.isConditionalMediationAvailable ||\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable()) {\n return;\n }\n\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn()\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n mediation: 'conditional',\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n },\n signal: abortController.controller.signal\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 console.log('owner', id, walletId, address)\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"]}
@@ -12,8 +12,7 @@ async function getPasskeyOwner({ projectId, name, apiUrl = constants_js_1.API_UR
12
12
  if (typeof window !== "undefined") {
13
13
  const challenge = (0, utils_js_1.generateRandomBuffer)();
14
14
  try {
15
- utils_js_1.abortController.controller.abort();
16
- utils_js_1.abortController.controller = new AbortController();
15
+ (0, utils_js_1.abortWebauthn)();
17
16
  const assertion = JSON.parse(await (0, webauthn_1.getWebAuthnAssertion)((0, utils_js_1.base64UrlEncode)(challenge), {
18
17
  publicKey: {
19
18
  rpId: window.location.hostname,
@@ -1 +1 @@
1
- {"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAmE;AACnE,kDAA0B;AAE1B,yCAOoB;AACpB,qDAA6C;AAEtC,KAAK,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,MAAM,GAAG,sBAAO,EAChB,eAAe,GAAG,KAAK,EAMxB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACzC,IAAI;YACF,0BAAe,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YAClC,0BAAe,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YAClD,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;oBAC5B,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,IAAA,yBAAc,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;iBACtF;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;AA9DD,0CA8DC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortController,\n base64UrlEncode,\n generateRandomBuffer,\n getCredentials,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n name,\n apiUrl = API_URL,\n withCredentials = false\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n withCredentials?: boolean;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortController.controller.abort()\n abortController.controller = new AbortController()\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: withCredentials ? await getCredentials(projectId, name) : undefined,\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"]}
1
+ {"version":3,"file":"getPasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAmE;AACnE,kDAA0B;AAE1B,yCAOoB;AACpB,qDAA6C;AAEtC,KAAK,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,MAAM,GAAG,sBAAO,EAChB,eAAe,GAAG,KAAK,EAMxB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,IAAA,+BAAoB,GAAE,CAAC;QACzC,IAAI;YACF,IAAA,wBAAa,GAAE,CAAA;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;oBAC5B,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,IAAA,yBAAc,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;iBACtF;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;AA7DD,0CA6DC","sourcesContent":["import { getWebAuthnAssertion } from \"@turnkey/http/dist/webauthn\";\nimport axios from \"axios\";\nimport type { SignTypedDataParams, SmartAccountSigner } from \"@alchemy/aa-core\";\nimport {\n abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n getCredentials,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n name,\n apiUrl = API_URL,\n withCredentials = false\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n withCredentials?: boolean;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn()\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: withCredentials ? await getCredentials(projectId, name) : undefined,\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"]}
@@ -1,3 +1,4 @@
1
+ export { abortWebauthn } from './utils.js';
1
2
  export { getPasskeyOwner } from "./getPasskeyOwner.js";
2
3
  export { createPasskeyOwner } from "./createPasskeyOwner.js";
3
4
  export { getAutocompletePasskeyOwner } from "./getAutocompletePasskeyOwner.js";
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAutocompletePasskeyOwner = exports.createPasskeyOwner = exports.getPasskeyOwner = void 0;
3
+ exports.getAutocompletePasskeyOwner = exports.createPasskeyOwner = exports.getPasskeyOwner = exports.abortWebauthn = void 0;
4
+ var utils_js_1 = require("./utils.js");
5
+ Object.defineProperty(exports, "abortWebauthn", { enumerable: true, get: function () { return utils_js_1.abortWebauthn; } });
4
6
  var getPasskeyOwner_js_1 = require("./getPasskeyOwner.js");
5
7
  Object.defineProperty(exports, "getPasskeyOwner", { enumerable: true, get: function () { return getPasskeyOwner_js_1.getPasskeyOwner; } });
6
8
  var createPasskeyOwner_js_1 = require("./createPasskeyOwner.js");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/index.ts"],"names":[],"mappings":";;;AAAA,2DAAuD;AAA9C,qHAAA,eAAe,OAAA;AACxB,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA","sourcesContent":["export { getPasskeyOwner } from \"./getPasskeyOwner.js\";\nexport { createPasskeyOwner } from \"./createPasskeyOwner.js\";\nexport { getAutocompletePasskeyOwner } from \"./getAutocompletePasskeyOwner.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/index.ts"],"names":[],"mappings":";;;AAAA,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AACtB,2DAAuD;AAA9C,qHAAA,eAAe,OAAA;AACxB,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA","sourcesContent":["export { abortWebauthn } from './utils.js';\nexport { getPasskeyOwner } from \"./getPasskeyOwner.js\";\nexport { createPasskeyOwner } from \"./createPasskeyOwner.js\";\nexport { getAutocompletePasskeyOwner } from \"./getAutocompletePasskeyOwner.js\";\n"]}
@@ -3,6 +3,7 @@ import type { SignTypedDataParams } from "@alchemy/aa-core";
3
3
  export declare const abortController: {
4
4
  controller: AbortController;
5
5
  };
6
+ export declare function abortWebauthn(): void;
6
7
  export declare const publicKey = "public-key";
7
8
  export declare const es256 = -7;
8
9
  export declare const generateRandomBuffer: () => 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.getCredentials = exports.signTypedData = exports.signMessage = exports.signMessageImplementation = exports.base64UrlEncode = exports.generateRandomBuffer = exports.es256 = exports.publicKey = exports.abortController = void 0;
6
+ exports.base64URLStringToBuffer = exports.getCredentials = exports.signTypedData = exports.signMessage = exports.signMessageImplementation = exports.base64UrlEncode = exports.generateRandomBuffer = exports.es256 = exports.publicKey = exports.abortWebauthn = exports.abortController = 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");
@@ -14,6 +14,11 @@ const viem_1 = require("viem");
14
14
  exports.abortController = {
15
15
  controller: new AbortController(),
16
16
  };
17
+ function abortWebauthn() {
18
+ exports.abortController.controller.abort('ZeroDev: Reset previous Webauthn request');
19
+ exports.abortController.controller = new AbortController();
20
+ }
21
+ exports.abortWebauthn = abortWebauthn;
17
22
  exports.publicKey = "public-key";
18
23
  exports.es256 = -7;
19
24
  const generateRandomBuffer = () => {
@@ -31,7 +36,7 @@ const base64UrlEncode = (challenge) => {
31
36
  };
32
37
  exports.base64UrlEncode = base64UrlEncode;
33
38
  const signMessageImplementation = async (msg, id, walletId, projectId, credentialId, apiUrl = constants_js_1.API_URL) => {
34
- console.log("SIGN MESSAGE IMPLEMENTATION");
39
+ abortWebauthn();
35
40
  const signedRequest = await http_1.TurnkeyApi.signSignRawPayload({
36
41
  body: {
37
42
  type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD",
@@ -1 +1 @@
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 { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData, signatureToHex, hashMessage } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const abortController = {\n controller: new AbortController(),\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\nexport const signMessageImplementation = async (\n msg: string,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n console.log(\"SIGN MESSAGE IMPLEMENTATION\");\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: 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 signatureHex = signatureToHex({\n r: `0x${result.r}`,\n s: `0x${result.s}`,\n v: result.v === \"00\" ? 27n : 28n,\n });\n if (signatureHex) {\n return signatureHex;\n }\n }\n }\n return \"0x\";\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 return await signMessageImplementation(\n hashMessage(typeof msg === \"string\" ? msg : { raw: msg }),\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\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 signMessageImplementation(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const getCredentials = async (projectId: string, name?: string, apiUrl = API_URL) => {\n const url = `${apiUrl}/projects/${projectId}/wallets` + (name ? `/${name}` : '')\n const response = await axios.get(url);\n const credentials = response.data;\n return credentials.map((credential: string) => ({\n id: base64URLStringToBuffer(credential),\n type: \"public-key\",\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
+ {"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 { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData, signatureToHex, hashMessage } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const abortController = {\n controller: new AbortController(),\n}\n\nexport function abortWebauthn() {\n abortController.controller.abort('ZeroDev: Reset previous Webauthn request')\n abortController.controller = new AbortController()\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\nexport const signMessageImplementation = async (\n msg: string,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n abortWebauthn()\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: 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 signatureHex = signatureToHex({\n r: `0x${result.r}`,\n s: `0x${result.s}`,\n v: result.v === \"00\" ? 27n : 28n,\n });\n if (signatureHex) {\n return signatureHex;\n }\n }\n }\n return \"0x\";\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 return await signMessageImplementation(\n hashMessage(typeof msg === \"string\" ? msg : { raw: msg }),\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\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 signMessageImplementation(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const getCredentials = async (projectId: string, name?: string, apiUrl = API_URL) => {\n const url = `${apiUrl}/projects/${projectId}/wallets` + (name ? `/${name}` : '')\n const response = await axios.get(url);\n const credentials = response.data;\n return credentials.map((credential: string) => ({\n id: base64URLStringToBuffer(credential),\n type: \"public-key\",\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,6 +1,6 @@
1
1
  import { getWebAuthnAttestation } from "@turnkey/http";
2
2
  import axios from "axios";
3
- import { abortController, base64UrlEncode, es256, generateRandomBuffer, getCredentials, publicKey, signMessage, signTypedData, } from "./utils.js";
3
+ import { abortWebauthn, base64UrlEncode, es256, generateRandomBuffer, getCredentials, publicKey, signMessage, signTypedData, } from "./utils.js";
4
4
  import { API_URL } from "../../constants.js";
5
5
  import { UsernameIsAlreadyUsed } from "./exceptions.js";
6
6
  export async function createPasskeyOwner({ name, projectId, withCredentials = false, fallback, apiUrl = API_URL, }) {
@@ -10,12 +10,11 @@ export async function createPasskeyOwner({ name, projectId, withCredentials = fa
10
10
  if (withCredentials) {
11
11
  credentials = await getCredentials(projectId, name);
12
12
  }
13
- if (credentials.length >= 64) {
13
+ if (credentials && credentials?.length >= 64) {
14
14
  throw new UsernameIsAlreadyUsed();
15
15
  }
16
16
  try {
17
- abortController.controller.abort();
18
- abortController.controller = new AbortController();
17
+ abortWebauthn();
19
18
  const attestation = await getWebAuthnAttestation({
20
19
  publicKey: {
21
20
  rp: {
@@ -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,eAAe,EACf,KAAK,EACL,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,eAAe,GAAG,KAAK,EACvB,QAAQ,EACR,MAAM,GAAG,OAAO,GAOjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI,WAAW,GAAG,SAAS,CAAA;QAC3B,IAAI,eAAe,EAAE;YACnB,WAAW,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;SACpD;QACD,IAAI,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE;YAC5B,MAAM,IAAI,qBAAqB,EAAE,CAAA;SAClC;QAED,IAAI;YACF,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YAClC,eAAe,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YAClD,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;oBACD,kBAAkB,EAAE,WAAW;oBAC/B,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,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,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 abortController,\n base64UrlEncode,\n es256,\n generateRandomBuffer,\n getCredentials,\n publicKey,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\nimport { UsernameIsAlreadyUsed } from \"./exceptions.js\";\n\nexport async function createPasskeyOwner({\n name,\n projectId,\n withCredentials = false,\n fallback,\n apiUrl = API_URL,\n}: {\n name: string;\n projectId: string;\n withCredentials?: boolean;\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 let credentials = undefined\n if (withCredentials) {\n credentials = await getCredentials(projectId, name)\n }\n if (credentials.length >= 64) {\n throw new UsernameIsAlreadyUsed()\n }\n\n try {\n abortController.controller.abort()\n abortController.controller = new AbortController()\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: credentials,\n extensions: { credProps: true },\n challenge,\n pubKeyCredParams: [\n {\n type: publicKey,\n alg: es256,\n },\n ],\n user: {\n id: Uint8Array.from(name, (c) => c.charCodeAt(0)),\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
+ {"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,aAAa,EACb,eAAe,EACf,KAAK,EACL,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,eAAe,GAAG,KAAK,EACvB,QAAQ,EACR,MAAM,GAAG,OAAO,GAOjB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI,WAAW,GAAG,SAAS,CAAA;QAC3B,IAAI,eAAe,EAAE;YACnB,WAAW,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;SACpD;QACD,IAAI,WAAW,IAAI,WAAW,EAAE,MAAM,IAAI,EAAE,EAAE;YAC5C,MAAM,IAAI,qBAAqB,EAAE,CAAA;SAClC;QAED,IAAI;YACF,aAAa,EAAE,CAAA;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;oBACD,kBAAkB,EAAE,WAAW;oBAC/B,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,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,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 abortWebauthn,\n base64UrlEncode,\n es256,\n generateRandomBuffer,\n getCredentials,\n publicKey,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\nimport { UsernameIsAlreadyUsed } from \"./exceptions.js\";\n\nexport async function createPasskeyOwner({\n name,\n projectId,\n withCredentials = false,\n fallback,\n apiUrl = API_URL,\n}: {\n name: string;\n projectId: string;\n withCredentials?: boolean;\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 let credentials = undefined\n if (withCredentials) {\n credentials = await getCredentials(projectId, name)\n }\n if (credentials && credentials?.length >= 64) {\n throw new UsernameIsAlreadyUsed()\n }\n\n try {\n abortWebauthn()\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: credentials,\n extensions: { credProps: true },\n challenge,\n pubKeyCredParams: [\n {\n type: publicKey,\n alg: es256,\n },\n ],\n user: {\n id: Uint8Array.from(name, (c) => c.charCodeAt(0)),\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 { abortController, base64UrlEncode, generateRandomBuffer, signMessage, signTypedData, } from "./utils.js";
3
+ import { abortController, abortWebauthn, base64UrlEncode, generateRandomBuffer, signMessage, signTypedData, } from "./utils.js";
4
4
  import { API_URL } from "../../constants.js";
5
5
  export async function getAutocompletePasskeyOwner({ projectId, apiUrl = API_URL, }) {
6
6
  if (!PublicKeyCredential?.isConditionalMediationAvailable ||
@@ -10,6 +10,7 @@ export async function getAutocompletePasskeyOwner({ projectId, apiUrl = API_URL,
10
10
  if (typeof window !== "undefined") {
11
11
  const challenge = generateRandomBuffer();
12
12
  try {
13
+ abortWebauthn();
13
14
  const assertion = JSON.parse(await getWebAuthnAssertion(base64UrlEncode(challenge), {
14
15
  mediation: 'conditional',
15
16
  publicKey: {
@@ -23,6 +24,7 @@ export async function getAutocompletePasskeyOwner({ projectId, apiUrl = API_URL,
23
24
  assertion,
24
25
  });
25
26
  const { id, walletId, address } = await response.data;
27
+ console.log('owner', id, walletId, address);
26
28
  const owner = {
27
29
  getAddress: async () => address,
28
30
  signMessage: (msg) => signMessage(msg, id, walletId, projectId, assertion.credentialId, apiUrl),
@@ -1 +1 @@
1
- {"version":3,"file":"getAutocompletePasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAM,GAAG,OAAO,GAKjB;IAEC,IAAI,CAAC,mBAAmB,EAAE,+BAA+B;QAEnD,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,EAAE;QAC3D,OAAO;KACR;IAGH,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,aAAa;gBACxB,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM;aAC1C,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 abortController,\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getAutocompletePasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-ignore\n if (!PublicKeyCredential?.isConditionalMediationAvailable ||\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable()) {\n return;\n }\n\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 mediation: 'conditional',\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n },\n signal: abortController.controller.signal\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"]}
1
+ {"version":3,"file":"getAutocompletePasskeyOwner.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAM,GAAG,OAAO,GAKjB;IAEC,IAAI,CAAC,mBAAmB,EAAE,+BAA+B;QAEnD,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,EAAE;QAC3D,OAAO;KACR;IAGH,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,aAAa,EAAE,CAAA;YACf,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACrD,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE;oBAET,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM;aAC1C,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,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC3C,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 abortController,\n abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getAutocompletePasskeyOwner({\n projectId,\n apiUrl = API_URL,\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-ignore\n if (!PublicKeyCredential?.isConditionalMediationAvailable ||\n //@ts-ignore\n !PublicKeyCredential?.isConditionalMediationAvailable()) {\n return;\n }\n\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn()\n const assertion = JSON.parse(\n await getWebAuthnAssertion(base64UrlEncode(challenge), {\n mediation: 'conditional',\n publicKey: {\n //@ts-expect-error\n rpId: window.location.hostname,\n userVerification: \"required\",\n },\n signal: abortController.controller.signal\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 console.log('owner', id, walletId, address)\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"]}
@@ -1,13 +1,12 @@
1
1
  import { getWebAuthnAssertion } from "@turnkey/http/dist/webauthn";
2
2
  import axios from "axios";
3
- import { abortController, base64UrlEncode, generateRandomBuffer, getCredentials, signMessage, signTypedData, } from "./utils.js";
3
+ import { abortWebauthn, base64UrlEncode, generateRandomBuffer, getCredentials, signMessage, signTypedData, } from "./utils.js";
4
4
  import { API_URL } from "../../constants.js";
5
5
  export async function getPasskeyOwner({ projectId, name, apiUrl = API_URL, withCredentials = false }) {
6
6
  if (typeof window !== "undefined") {
7
7
  const challenge = generateRandomBuffer();
8
8
  try {
9
- abortController.controller.abort();
10
- abortController.controller = new AbortController();
9
+ abortWebauthn();
11
10
  const assertion = JSON.parse(await getWebAuthnAssertion(base64UrlEncode(challenge), {
12
11
  publicKey: {
13
12
  rpId: window.location.hostname,
@@ -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,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,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,IAAI,EACJ,MAAM,GAAG,OAAO,EAChB,eAAe,GAAG,KAAK,EAMxB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;YAClC,eAAe,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;YAClD,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;oBAC5B,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;iBACtF;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 abortController,\n base64UrlEncode,\n generateRandomBuffer,\n getCredentials,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n name,\n apiUrl = API_URL,\n withCredentials = false\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n withCredentials?: boolean;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortController.controller.abort()\n abortController.controller = new AbortController()\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: withCredentials ? await getCredentials(projectId, name) : undefined,\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"]}
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,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,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,IAAI,EACJ,MAAM,GAAG,OAAO,EAChB,eAAe,GAAG,KAAK,EAMxB;IAEC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,IAAI;YACF,aAAa,EAAE,CAAA;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;oBAC5B,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;iBACtF;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 abortWebauthn,\n base64UrlEncode,\n generateRandomBuffer,\n getCredentials,\n signMessage,\n signTypedData,\n} from \"./utils.js\";\nimport { API_URL } from \"../../constants.js\";\n\nexport async function getPasskeyOwner({\n projectId,\n name,\n apiUrl = API_URL,\n withCredentials = false\n}: {\n projectId: string;\n name?: string;\n apiUrl?: string;\n withCredentials?: boolean;\n}): Promise<SmartAccountSigner | undefined> {\n //@ts-expect-error\n if (typeof window !== \"undefined\") {\n const challenge = generateRandomBuffer();\n try {\n abortWebauthn()\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: withCredentials ? await getCredentials(projectId, name) : undefined,\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"]}
@@ -1,3 +1,4 @@
1
+ export { abortWebauthn } from './utils.js';
1
2
  export { getPasskeyOwner } from "./getPasskeyOwner.js";
2
3
  export { createPasskeyOwner } from "./createPasskeyOwner.js";
3
4
  export { getAutocompletePasskeyOwner } from "./getAutocompletePasskeyOwner.js";
@@ -1,3 +1,4 @@
1
+ export { abortWebauthn } from './utils.js';
1
2
  export { getPasskeyOwner } from "./getPasskeyOwner.js";
2
3
  export { createPasskeyOwner } from "./createPasskeyOwner.js";
3
4
  export { getAutocompletePasskeyOwner } from "./getAutocompletePasskeyOwner.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC","sourcesContent":["export { getPasskeyOwner } from \"./getPasskeyOwner.js\";\nexport { createPasskeyOwner } from \"./createPasskeyOwner.js\";\nexport { getAutocompletePasskeyOwner } from \"./getAutocompletePasskeyOwner.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC","sourcesContent":["export { abortWebauthn } from './utils.js';\nexport { getPasskeyOwner } from \"./getPasskeyOwner.js\";\nexport { createPasskeyOwner } from \"./createPasskeyOwner.js\";\nexport { getAutocompletePasskeyOwner } from \"./getAutocompletePasskeyOwner.js\";\n"]}
@@ -3,6 +3,7 @@ import type { SignTypedDataParams } from "@alchemy/aa-core";
3
3
  export declare const abortController: {
4
4
  controller: AbortController;
5
5
  };
6
+ export declare function abortWebauthn(): void;
6
7
  export declare const publicKey = "public-key";
7
8
  export declare const es256 = -7;
8
9
  export declare const generateRandomBuffer: () => ArrayBuffer;
@@ -8,6 +8,10 @@ browserInit({
8
8
  export const abortController = {
9
9
  controller: new AbortController(),
10
10
  };
11
+ export function abortWebauthn() {
12
+ abortController.controller.abort('ZeroDev: Reset previous Webauthn request');
13
+ abortController.controller = new AbortController();
14
+ }
11
15
  export const publicKey = "public-key";
12
16
  export const es256 = -7;
13
17
  export const generateRandomBuffer = () => {
@@ -23,7 +27,7 @@ export const base64UrlEncode = (challenge) => {
23
27
  .replace(/=/g, "");
24
28
  };
25
29
  export const signMessageImplementation = async (msg, id, walletId, projectId, credentialId, apiUrl = API_URL) => {
26
- console.log("SIGN MESSAGE IMPLEMENTATION");
30
+ abortWebauthn();
27
31
  const signedRequest = await TurnkeyApi.signSignRawPayload({
28
32
  body: {
29
33
  type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD",
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAElE,WAAW,CAAC;IACV,OAAO,EAAE,yBAAyB;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,IAAI,eAAe,EAAE;CAClC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AAEtC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC;AAExB,MAAM,CAAC,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;AAEF,MAAM,CAAC,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;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAC5C,GAAW,EACX,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,OAAO,EAChB,EAAE;IACF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,kBAAkB,CACvD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,gCAAgC;YACtC,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE;gBACV,YAAY,EAAE,QAAQ;gBACtB,OAAO,EAAE,GAAG;gBACZ,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,SAAS;iBAChB;aACF;SACF;KACF,CACF,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,KAAK,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,YAAY,GAAG,cAAc,CAAC;gBAClC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE;gBAClB,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE;gBAClB,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;aACjC,CAAC,CAAC;YACH,IAAI,YAAY,EAAE;gBAChB,OAAO,YAAY,CAAC;aACrB;SACF;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAwB,EACxB,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,OAAO,EAChB,EAAE;IACF,OAAO,MAAM,yBAAyB,CACpC,WAAW,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EACzD,EAAE,EACF,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,MAA2B,EAC3B,EAAU,EACV,QAAgB,EAChB,SAAiB,EACjB,YAAoB,EACpB,MAAM,GAAG,OAAO,EAChB,EAAE;IACF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,MAAM,yBAAyB,CACpC,UAAU,EACV,EAAE,EACF,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,SAAiB,EAAE,IAAa,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;IACzF,MAAM,GAAG,GAAG,GAAG,MAAM,aAAa,SAAS,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAChF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;IAClC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAkB,EAAE,EAAE,CAAC,CAAC;QAC9C,EAAE,EAAE,uBAAuB,CAAC,UAAU,CAAC;QACvC,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAGF,MAAM,UAAU,uBAAuB,CAAC,eAAuB;IAE7D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAQrE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAG7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAG5B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACjC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { browserInit, TurnkeyApi } from \"@turnkey/http\";\nimport axios from \"axios\";\nimport { API_URL } from \"../../constants.js\";\nimport type { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData, signatureToHex, hashMessage } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const abortController = {\n controller: new AbortController(),\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\nexport const signMessageImplementation = async (\n msg: string,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n console.log(\"SIGN MESSAGE IMPLEMENTATION\");\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: 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 signatureHex = signatureToHex({\n r: `0x${result.r}`,\n s: `0x${result.s}`,\n v: result.v === \"00\" ? 27n : 28n,\n });\n if (signatureHex) {\n return signatureHex;\n }\n }\n }\n return \"0x\";\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 return await signMessageImplementation(\n hashMessage(typeof msg === \"string\" ? msg : { raw: msg }),\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\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 signMessageImplementation(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const getCredentials = async (projectId: string, name?: string, apiUrl = API_URL) => {\n const url = `${apiUrl}/projects/${projectId}/wallets` + (name ? `/${name}` : '')\n const response = await axios.get(url);\n const credentials = response.data;\n return credentials.map((credential: string) => ({\n id: base64URLStringToBuffer(credential),\n type: \"public-key\",\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
+ {"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 { SignTypedDataParams } from \"@alchemy/aa-core\";\nimport { hashTypedData, signatureToHex, hashMessage } from \"viem\";\n\nbrowserInit({\n baseUrl: \"https://api.turnkey.com\",\n});\n\nexport const abortController = {\n controller: new AbortController(),\n}\n\nexport function abortWebauthn() {\n abortController.controller.abort('ZeroDev: Reset previous Webauthn request')\n abortController.controller = new AbortController()\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\nexport const signMessageImplementation = async (\n msg: string,\n id: string,\n walletId: string,\n projectId: string,\n credentialId: string,\n apiUrl = API_URL\n) => {\n abortWebauthn()\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: 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 signatureHex = signatureToHex({\n r: `0x${result.r}`,\n s: `0x${result.s}`,\n v: result.v === \"00\" ? 27n : 28n,\n });\n if (signatureHex) {\n return signatureHex;\n }\n }\n }\n return \"0x\";\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 return await signMessageImplementation(\n hashMessage(typeof msg === \"string\" ? msg : { raw: msg }),\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\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 signMessageImplementation(\n hashToSign,\n id,\n walletId,\n projectId,\n credentialId,\n apiUrl\n );\n};\n\nexport const getCredentials = async (projectId: string, name?: string, apiUrl = API_URL) => {\n const url = `${apiUrl}/projects/${projectId}/wallets` + (name ? `/${name}` : '')\n const response = await axios.get(url);\n const credentials = response.data;\n return credentials.map((credential: string) => ({\n id: base64URLStringToBuffer(credential),\n type: \"public-key\",\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 +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;AAchF,wBAAsB,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,eAAuB,EACvB,QAAQ,EACR,MAAgB,GACjB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,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,CAmF1C"}
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;AAchF,wBAAsB,kBAAkB,CAAC,EACvC,IAAI,EACJ,SAAS,EACT,eAAuB,EACvB,QAAQ,EACR,MAAgB,GACjB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,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,CAkF1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"getAutocompletePasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUhF,wBAAsB,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAgB,GACjB,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CA0D1C"}
1
+ {"version":3,"file":"getAutocompletePasskeyOwner.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/getAutocompletePasskeyOwner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWhF,wBAAsB,2BAA2B,CAAC,EAChD,SAAS,EACT,MAAgB,GACjB,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CA4D1C"}
@@ -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;AAWhF,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,MAAgB,EAChB,eAAuB,EACxB,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAoD1C"}
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;AAWhF,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,MAAgB,EAChB,eAAuB,EACxB,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAmD1C"}
@@ -1,3 +1,4 @@
1
+ export { abortWebauthn } from './utils.js';
1
2
  export { getPasskeyOwner } from "./getPasskeyOwner.js";
2
3
  export { createPasskeyOwner } from "./createPasskeyOwner.js";
3
4
  export { getAutocompletePasskeyOwner } from "./getAutocompletePasskeyOwner.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC"}
@@ -3,6 +3,7 @@ import type { SignTypedDataParams } from "@alchemy/aa-core";
3
3
  export declare const abortController: {
4
4
  controller: AbortController;
5
5
  };
6
+ export declare function abortWebauthn(): void;
6
7
  export declare const publicKey = "public-key";
7
8
  export declare const es256 = -7;
8
9
  export declare const generateRandomBuffer: () => ArrayBuffer;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,eAAO,MAAM,eAAe;;CAE3B,CAAA;AAED,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;AAEF,eAAO,MAAM,yBAAyB,QAC/B,MAAM,MACP,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAmDrB,CAAC;AAEF,eAAO,MAAM,WAAW,QACjB,MAAM,GAAG,UAAU,MACpB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAWrB,CAAC;AAEF,eAAO,MAAM,aAAa,WAChB,mBAAmB,MACvB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAYrB,CAAC;AAEF,eAAO,MAAM,cAAc,cAAqB,MAAM,SAAS,MAAM,kCAQpE,CAAC;AAGF,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAyB5E"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/kernel-zerodev/owner/passkey/utils.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D,eAAO,MAAM,eAAe;;CAE3B,CAAA;AAED,wBAAgB,aAAa,SAG5B;AAED,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;AAEF,eAAO,MAAM,yBAAyB,QAC/B,MAAM,MACP,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAmDrB,CAAC;AAEF,eAAO,MAAM,WAAW,QACjB,MAAM,GAAG,UAAU,MACpB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAWrB,CAAC;AAEF,eAAO,MAAM,aAAa,WAChB,mBAAmB,MACvB,MAAM,YACA,MAAM,aACL,MAAM,gBACH,MAAM,4CAYrB,CAAC;AAEF,eAAO,MAAM,cAAc,cAAqB,MAAM,SAAS,MAAM,kCAQpE,CAAC;AAGF,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAyB5E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerodev/sdk",
3
- "version": "4.0.24",
3
+ "version": "4.0.26",
4
4
  "description": "A collection of ERC-4337 compliant smart contract account interfaces",
5
5
  "author": "ZeroDev",
6
6
  "license": "MIT",
@@ -2,7 +2,7 @@ import { getWebAuthnAttestation } from "@turnkey/http";
2
2
  import axios from "axios";
3
3
  import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
4
4
  import {
5
- abortController,
5
+ abortWebauthn,
6
6
  base64UrlEncode,
7
7
  es256,
8
8
  generateRandomBuffer,
@@ -34,13 +34,12 @@ export async function createPasskeyOwner({
34
34
  if (withCredentials) {
35
35
  credentials = await getCredentials(projectId, name)
36
36
  }
37
- if (credentials.length >= 64) {
37
+ if (credentials && credentials?.length >= 64) {
38
38
  throw new UsernameIsAlreadyUsed()
39
39
  }
40
40
 
41
41
  try {
42
- abortController.controller.abort()
43
- abortController.controller = new AbortController()
42
+ abortWebauthn()
44
43
  const attestation = await getWebAuthnAttestation({
45
44
  publicKey: {
46
45
  rp: {
@@ -3,6 +3,7 @@ import axios from "axios";
3
3
  import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
4
4
  import {
5
5
  abortController,
6
+ abortWebauthn,
6
7
  base64UrlEncode,
7
8
  generateRandomBuffer,
8
9
  signMessage,
@@ -29,6 +30,7 @@ export async function getAutocompletePasskeyOwner({
29
30
  if (typeof window !== "undefined") {
30
31
  const challenge = generateRandomBuffer();
31
32
  try {
33
+ abortWebauthn()
32
34
  const assertion = JSON.parse(
33
35
  await getWebAuthnAssertion(base64UrlEncode(challenge), {
34
36
  mediation: 'conditional',
@@ -48,6 +50,7 @@ export async function getAutocompletePasskeyOwner({
48
50
  }
49
51
  );
50
52
  const { id, walletId, address } = await response.data;
53
+ console.log('owner', id, walletId, address)
51
54
  const owner: SmartAccountSigner = {
52
55
  getAddress: async () => address,
53
56
  signMessage: (msg) =>
@@ -2,7 +2,7 @@ import { getWebAuthnAssertion } from "@turnkey/http/dist/webauthn";
2
2
  import axios from "axios";
3
3
  import type { SignTypedDataParams, SmartAccountSigner } from "@alchemy/aa-core";
4
4
  import {
5
- abortController,
5
+ abortWebauthn,
6
6
  base64UrlEncode,
7
7
  generateRandomBuffer,
8
8
  getCredentials,
@@ -26,8 +26,7 @@ export async function getPasskeyOwner({
26
26
  if (typeof window !== "undefined") {
27
27
  const challenge = generateRandomBuffer();
28
28
  try {
29
- abortController.controller.abort()
30
- abortController.controller = new AbortController()
29
+ abortWebauthn()
31
30
  const assertion = JSON.parse(
32
31
  await getWebAuthnAssertion(base64UrlEncode(challenge), {
33
32
  publicKey: {
@@ -1,3 +1,4 @@
1
+ export { abortWebauthn } from './utils.js';
1
2
  export { getPasskeyOwner } from "./getPasskeyOwner.js";
2
3
  export { createPasskeyOwner } from "./createPasskeyOwner.js";
3
4
  export { getAutocompletePasskeyOwner } from "./getAutocompletePasskeyOwner.js";
@@ -12,6 +12,11 @@ export const abortController = {
12
12
  controller: new AbortController(),
13
13
  }
14
14
 
15
+ export function abortWebauthn() {
16
+ abortController.controller.abort('ZeroDev: Reset previous Webauthn request')
17
+ abortController.controller = new AbortController()
18
+ }
19
+
15
20
  export const publicKey = "public-key";
16
21
 
17
22
  export const es256 = -7;
@@ -39,7 +44,7 @@ export const signMessageImplementation = async (
39
44
  credentialId: string,
40
45
  apiUrl = API_URL
41
46
  ) => {
42
- console.log("SIGN MESSAGE IMPLEMENTATION");
47
+ abortWebauthn()
43
48
  const signedRequest = await TurnkeyApi.signSignRawPayload(
44
49
  {
45
50
  body: {