@zerodev/sdk 4.0.2-alpha.25 → 4.0.2-passkey.1

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 (101) hide show
  1. package/dist/cjs/index.d.ts +1 -0
  2. package/dist/cjs/index.js +1 -0
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.d.ts +8 -0
  5. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js +53 -0
  6. package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js.map +1 -0
  7. package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.d.ts +2 -0
  8. package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js +15 -0
  9. package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -0
  10. package/dist/cjs/kernel-zerodev/owner/index.d.ts +2 -0
  11. package/dist/cjs/kernel-zerodev/owner/index.js +8 -0
  12. package/dist/cjs/kernel-zerodev/owner/index.js.map +1 -0
  13. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +7 -0
  14. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js +65 -0
  15. package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -0
  16. package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +6 -0
  17. package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js +16 -0
  18. package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js.map +1 -0
  19. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +5 -0
  20. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js +41 -0
  21. package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -0
  22. package/dist/cjs/kernel-zerodev/owner/passkey/index.d.ts +3 -0
  23. package/dist/cjs/kernel-zerodev/owner/passkey/index.js +10 -0
  24. package/dist/cjs/kernel-zerodev/owner/passkey/index.js.map +1 -0
  25. package/dist/cjs/kernel-zerodev/owner/passkey/types.d.ts +12 -0
  26. package/dist/cjs/kernel-zerodev/owner/passkey/types.js +3 -0
  27. package/dist/cjs/kernel-zerodev/owner/passkey/types.js.map +1 -0
  28. package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +11 -0
  29. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +105 -0
  30. package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -0
  31. package/dist/cjs/kernel-zerodev/utils.d.ts +0 -8
  32. package/dist/cjs/kernel-zerodev/utils.js +1 -60
  33. package/dist/cjs/kernel-zerodev/utils.js.map +1 -1
  34. package/dist/esm/index.d.ts +1 -0
  35. package/dist/esm/index.js +1 -0
  36. package/dist/esm/index.js.map +1 -1
  37. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.d.ts +8 -0
  38. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js +46 -0
  39. package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js.map +1 -0
  40. package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.d.ts +2 -0
  41. package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js +12 -0
  42. package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -0
  43. package/dist/esm/kernel-zerodev/owner/index.d.ts +2 -0
  44. package/dist/esm/kernel-zerodev/owner/index.js +3 -0
  45. package/dist/esm/kernel-zerodev/owner/index.js.map +1 -0
  46. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +7 -0
  47. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js +58 -0
  48. package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -0
  49. package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +6 -0
  50. package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js +12 -0
  51. package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js.map +1 -0
  52. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +5 -0
  53. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js +34 -0
  54. package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -0
  55. package/dist/esm/kernel-zerodev/owner/passkey/index.d.ts +3 -0
  56. package/dist/esm/kernel-zerodev/owner/passkey/index.js +4 -0
  57. package/dist/esm/kernel-zerodev/owner/passkey/index.js.map +1 -0
  58. package/dist/esm/kernel-zerodev/owner/passkey/types.d.ts +12 -0
  59. package/dist/esm/kernel-zerodev/owner/passkey/types.js +2 -0
  60. package/dist/esm/kernel-zerodev/owner/passkey/types.js.map +1 -0
  61. package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +11 -0
  62. package/dist/esm/kernel-zerodev/owner/passkey/utils.js +92 -0
  63. package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -0
  64. package/dist/esm/kernel-zerodev/utils.d.ts +0 -8
  65. package/dist/esm/kernel-zerodev/utils.js +1 -55
  66. package/dist/esm/kernel-zerodev/utils.js.map +1 -1
  67. package/dist/types/index.d.ts +1 -0
  68. package/dist/types/index.d.ts.map +1 -1
  69. package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts +9 -0
  70. package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts.map +1 -0
  71. package/dist/types/kernel-zerodev/owner/getRPCProviderOwner.d.ts +3 -0
  72. package/dist/types/kernel-zerodev/owner/getRPCProviderOwner.d.ts.map +1 -0
  73. package/dist/types/kernel-zerodev/owner/index.d.ts +3 -0
  74. package/dist/types/kernel-zerodev/owner/index.d.ts.map +1 -0
  75. package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +8 -0
  76. package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts.map +1 -0
  77. package/dist/types/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +7 -0
  78. package/dist/types/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts.map +1 -0
  79. package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +6 -0
  80. package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -0
  81. package/dist/types/kernel-zerodev/owner/passkey/index.d.ts +4 -0
  82. package/dist/types/kernel-zerodev/owner/passkey/index.d.ts.map +1 -0
  83. package/dist/types/kernel-zerodev/owner/passkey/types.d.ts +14 -0
  84. package/dist/types/kernel-zerodev/owner/passkey/types.d.ts.map +1 -0
  85. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +12 -0
  86. package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -0
  87. package/dist/types/kernel-zerodev/utils.d.ts +0 -8
  88. package/dist/types/kernel-zerodev/utils.d.ts.map +1 -1
  89. package/package.json +8 -2
  90. package/passkey/package.json +5 -0
  91. package/src/index.ts +3 -0
  92. package/src/kernel-zerodev/owner/getCustodialOwner.ts +74 -0
  93. package/src/kernel-zerodev/owner/getRPCProviderOwner.ts +22 -0
  94. package/src/kernel-zerodev/owner/index.ts +2 -0
  95. package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +98 -0
  96. package/src/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.ts +22 -0
  97. package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +69 -0
  98. package/src/kernel-zerodev/owner/passkey/index.ts +3 -0
  99. package/src/kernel-zerodev/owner/passkey/types.ts +18 -0
  100. package/src/kernel-zerodev/owner/passkey/utils.ts +157 -0
  101. package/src/kernel-zerodev/utils.ts +1 -90
@@ -0,0 +1,157 @@
1
+ import { browserInit, TurnkeyApi } from "@turnkey/http";
2
+ import axios from "axios";
3
+ import { API_URL } from "../../constants.js";
4
+ import type { Hex, Signature } from "./types.js";
5
+ import { ethers } from "ethers";
6
+ import type { SignTypedDataParams } from "@alchemy/aa-core";
7
+ import { hashTypedData } from "viem";
8
+
9
+ browserInit({
10
+ baseUrl: "https://coordinator-beta.turnkey.io",
11
+ });
12
+
13
+ export const publicKey = "public-key";
14
+
15
+ export const es256 = -7;
16
+
17
+ export const generateRandomBuffer = (): ArrayBuffer => {
18
+ const arr = new Uint8Array(32);
19
+ //@ts-expect-error
20
+ crypto.getRandomValues(arr);
21
+ return arr.buffer;
22
+ };
23
+
24
+ export const base64UrlEncode = (challenge: ArrayBuffer): string => {
25
+ return Buffer.from(challenge)
26
+ .toString("base64")
27
+ .replace(/\+/g, "-")
28
+ .replace(/\//g, "_")
29
+ .replace(/=/g, "");
30
+ };
31
+
32
+ // VIEM
33
+ // export function signatureToHex({ r, s, v }: Signature): Hex {
34
+ // return `0x${new secp256k1.Signature(
35
+ // hexToBigInt(r),
36
+ // hexToBigInt(s),
37
+ // ).toCompactHex()}${toHex(v).slice(2)}`
38
+ // }
39
+
40
+ //ETHERS
41
+ export function signatureToHex({ r, s, v }: Signature): Hex {
42
+ return ethers.utils.joinSignature({
43
+ r: `0x${r}`,
44
+ s: `0x${s}`,
45
+ //@ts-expect-error
46
+ v: parseInt(v) + 27,
47
+ }) as Hex;
48
+ }
49
+
50
+ export const signMessage = async (
51
+ msg: string | Uint8Array,
52
+ id: string,
53
+ walletId: string,
54
+ projectId: string,
55
+ credentialId: string,
56
+ apiUrl = API_URL
57
+ ) => {
58
+ const signedRequest = await TurnkeyApi.signSignRawPayload(
59
+ {
60
+ body: {
61
+ type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD",
62
+ organizationId: id,
63
+ parameters: {
64
+ privateKeyId: walletId,
65
+ payload: ethers.utils.hashMessage(msg),
66
+ encoding: "PAYLOAD_ENCODING_HEXADECIMAL",
67
+ hashFunction: "HASH_FUNCTION_NO_OP",
68
+ },
69
+ timestampMs: String(Date.now()),
70
+ },
71
+ },
72
+ {
73
+ publicKey: {
74
+ allowCredentials: [
75
+ {
76
+ id: base64URLStringToBuffer(credentialId),
77
+ type: publicKey,
78
+ },
79
+ ],
80
+ },
81
+ }
82
+ );
83
+ const proxyResponse = await axios.post(
84
+ `${apiUrl}/projects/${projectId}/wallets/proxy`,
85
+ {
86
+ signedRequest,
87
+ }
88
+ );
89
+ const { activity } = await proxyResponse.data;
90
+ if (activity.status === "ACTIVITY_STATUS_COMPLETED") {
91
+ let result = activity?.result?.signRawPayloadResult;
92
+
93
+ if (result) {
94
+ const assembled = signatureToHex(result);
95
+ if (assembled) {
96
+ return assembled;
97
+ }
98
+ }
99
+ }
100
+ return "0x";
101
+ };
102
+
103
+ export const signTypedData = async (
104
+ params: SignTypedDataParams,
105
+ id: string,
106
+ walletId: string,
107
+ projectId: string,
108
+ credentialId: string,
109
+ apiUrl = API_URL
110
+ ) => {
111
+ const hashToSign = hashTypedData(params);
112
+ return await signMessage(
113
+ hashToSign,
114
+ id,
115
+ walletId,
116
+ projectId,
117
+ credentialId,
118
+ apiUrl
119
+ );
120
+ };
121
+
122
+ export const getCredentials = async (projectId: string, apiUrl = API_URL) => {
123
+ const response = await axios.get(`${apiUrl}/projects/${projectId}/wallets`);
124
+ const credentials = response.data;
125
+ return credentials.map((credential: string) => ({
126
+ id: base64URLStringToBuffer(credential),
127
+ type: "public-key",
128
+ }));
129
+ };
130
+
131
+ // https://github.com/MasterKale/SimpleWebAuthn/blob/master/packages/browser/src/helpers/base64URLStringToBuffer.ts#L8
132
+ export function base64URLStringToBuffer(base64URLString: string): ArrayBuffer {
133
+ // Convert from Base64URL to Base64
134
+ const base64 = base64URLString.replace(/-/g, "+").replace(/_/g, "/");
135
+ /**
136
+ * Pad with '=' until it's a multiple of four
137
+ * (4 - (85 % 4 = 1) = 3) % 4 = 3 padding
138
+ * (4 - (86 % 4 = 2) = 2) % 4 = 2 padding
139
+ * (4 - (87 % 4 = 3) = 1) % 4 = 1 padding
140
+ * (4 - (88 % 4 = 0) = 4) % 4 = 0 padding
141
+ */
142
+ const padLength = (4 - (base64.length % 4)) % 4;
143
+ const padded = base64.padEnd(base64.length + padLength, "=");
144
+
145
+ // Convert to a binary string
146
+ const binary = atob(padded);
147
+
148
+ // Convert binary string to buffer
149
+ const buffer = new ArrayBuffer(binary.length);
150
+ const bytes = new Uint8Array(buffer);
151
+
152
+ for (let i = 0; i < binary.length; i++) {
153
+ bytes[i] = binary.charCodeAt(i);
154
+ }
155
+
156
+ return buffer;
157
+ }
@@ -13,10 +13,8 @@ import type {
13
13
  } from "@alchemy/aa-core";
14
14
  import { Signer, type TypedDataField } from "@ethersproject/abstract-signer";
15
15
  import { Wallet } from "@ethersproject/wallet";
16
- import { Web3Provider, type ExternalProvider } from "@ethersproject/providers";
17
- import { API_URL, gasTokenChainAddresses } from "./constants.js";
18
16
  import type { SupportedGasToken } from "./paymaster/types.js";
19
- import axios from "axios";
17
+ import { gasTokenChainAddresses } from "./constants.js";
20
18
 
21
19
  export type UserOperationCallDataWithDelegate = UserOperationCallData & {
22
20
  delegateCall?: boolean;
@@ -100,93 +98,6 @@ export const convertEthersSignerToAccountSigner = (
100
98
  };
101
99
  };
102
100
 
103
- export function getRPCProviderOwner(web3Provider: any): SmartAccountSigner {
104
- const provider = new Web3Provider(web3Provider as ExternalProvider);
105
- const signer = provider.getSigner();
106
-
107
- return {
108
- getAddress: async () =>
109
- Promise.resolve((await signer.getAddress()) as `0x${string}`),
110
- signMessage: async (msg: Uint8Array | string) =>
111
- (await signer.signMessage(msg)) as `0x${string}`,
112
- signTypedData: async (params: SignTypedDataParams) =>
113
- (await signer._signTypedData(
114
- params.domain!,
115
- params.types as unknown as Record<string, TypedDataField[]>,
116
- params.message
117
- )) as Hex,
118
- };
119
- }
120
-
121
- export async function getCustodialOwner(
122
- identifier: string,
123
- {
124
- custodialFilePath,
125
- privateKey,
126
- publicKey,
127
- keyId,
128
- apiUrl = API_URL,
129
- }: {
130
- privateKey?: string;
131
- publicKey?: string;
132
- keyId?: string;
133
- custodialFilePath?: string;
134
- apiUrl?: string;
135
- }
136
- ): Promise<SmartAccountSigner | undefined> {
137
- if (custodialFilePath) {
138
- let fsModule;
139
- try {
140
- fsModule = require.resolve("fs") && require("fs");
141
- } catch (error) {
142
- console.log("FS module not available. Skipping FS operation...");
143
- return;
144
- }
145
- const data = fsModule.readFileSync(custodialFilePath, "utf8");
146
- const values = data.split("\n");
147
- [privateKey, publicKey, keyId] = values;
148
- }
149
- let TurnkeySigner;
150
- try {
151
- TurnkeySigner =
152
- require.resolve("@turnkey/ethers") &&
153
- require("@turnkey/ethers").TurnkeySigner;
154
- } catch (error) {
155
- console.log(
156
- "@turnkey/ethers module not available. Skipping FS operation..."
157
- );
158
- return;
159
- }
160
- if (!privateKey || !publicKey || !keyId) {
161
- throw new Error(
162
- "Must provide custodialFilePath or privateKey, publicKey, and keyId."
163
- );
164
- }
165
-
166
- const response = await axios.post(`${apiUrl}/wallets/${identifier}`, {
167
- keyId,
168
- });
169
-
170
- const turnkeySigner = new TurnkeySigner({
171
- apiPublicKey: publicKey,
172
- apiPrivateKey: privateKey,
173
- baseUrl: "https://coordinator-beta.turnkey.io",
174
- organizationId: keyId,
175
- privateKeyId: response.data.walletId,
176
- });
177
- return {
178
- getAddress: async () => (await turnkeySigner.getAddress()) as `0x${string}`,
179
- signMessage: async (msg: Uint8Array | string) =>
180
- (await turnkeySigner.signMessage(msg)) as `0x${string}`,
181
- signTypedData: async (params: SignTypedDataParams) =>
182
- (await turnkeySigner.signTypedData(
183
- params.domain,
184
- params.types,
185
- params.message
186
- )) as Hex,
187
- };
188
- }
189
-
190
101
  export const randomHexString = (length: number): Hex =>
191
102
  toHex(
192
103
  Array.from({ length }, () =>