@zerodev/sdk 4.0.2-alpha.25 → 4.0.2-passkey.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.d.ts +8 -0
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js +53 -0
- package/dist/cjs/kernel-zerodev/owner/getCustodialOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js +15 -0
- package/dist/cjs/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/index.d.ts +2 -0
- package/dist/cjs/kernel-zerodev/owner/index.js +8 -0
- package/dist/cjs/kernel-zerodev/owner/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +7 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js +65 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +6 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js +16 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +5 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js +41 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/index.d.ts +3 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/index.js +10 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/types.d.ts +12 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/types.js +3 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/types.js.map +1 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.d.ts +11 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js +105 -0
- package/dist/cjs/kernel-zerodev/owner/passkey/utils.js.map +1 -0
- package/dist/cjs/kernel-zerodev/utils.d.ts +0 -8
- package/dist/cjs/kernel-zerodev/utils.js +1 -60
- package/dist/cjs/kernel-zerodev/utils.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.d.ts +8 -0
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js +46 -0
- package/dist/esm/kernel-zerodev/owner/getCustodialOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.d.ts +2 -0
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js +12 -0
- package/dist/esm/kernel-zerodev/owner/getRPCProviderOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/index.d.ts +2 -0
- package/dist/esm/kernel-zerodev/owner/index.js +3 -0
- package/dist/esm/kernel-zerodev/owner/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +7 -0
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js +58 -0
- package/dist/esm/kernel-zerodev/owner/passkey/createPasskeyOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +6 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js +12 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +5 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js +34 -0
- package/dist/esm/kernel-zerodev/owner/passkey/getPasskeyOwner.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/index.d.ts +3 -0
- package/dist/esm/kernel-zerodev/owner/passkey/index.js +4 -0
- package/dist/esm/kernel-zerodev/owner/passkey/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/types.d.ts +12 -0
- package/dist/esm/kernel-zerodev/owner/passkey/types.js +2 -0
- package/dist/esm/kernel-zerodev/owner/passkey/types.js.map +1 -0
- package/dist/esm/kernel-zerodev/owner/passkey/utils.d.ts +11 -0
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js +92 -0
- package/dist/esm/kernel-zerodev/owner/passkey/utils.js.map +1 -0
- package/dist/esm/kernel-zerodev/utils.d.ts +0 -8
- package/dist/esm/kernel-zerodev/utils.js +1 -55
- package/dist/esm/kernel-zerodev/utils.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts +9 -0
- package/dist/types/kernel-zerodev/owner/getCustodialOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/getRPCProviderOwner.d.ts +3 -0
- package/dist/types/kernel-zerodev/owner/getRPCProviderOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/index.d.ts +3 -0
- package/dist/types/kernel-zerodev/owner/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts +8 -0
- package/dist/types/kernel-zerodev/owner/passkey/createPasskeyOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts +7 -0
- package/dist/types/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts +6 -0
- package/dist/types/kernel-zerodev/owner/passkey/getPasskeyOwner.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/index.d.ts +4 -0
- package/dist/types/kernel-zerodev/owner/passkey/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/types.d.ts +14 -0
- package/dist/types/kernel-zerodev/owner/passkey/types.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts +12 -0
- package/dist/types/kernel-zerodev/owner/passkey/utils.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/utils.d.ts +0 -8
- package/dist/types/kernel-zerodev/utils.d.ts.map +1 -1
- package/package.json +7 -1
- package/passkey/package.json +5 -0
- package/src/index.ts +3 -0
- package/src/kernel-zerodev/owner/getCustodialOwner.ts +74 -0
- package/src/kernel-zerodev/owner/getRPCProviderOwner.ts +22 -0
- package/src/kernel-zerodev/owner/index.ts +2 -0
- package/src/kernel-zerodev/owner/passkey/createPasskeyOwner.ts +98 -0
- package/src/kernel-zerodev/owner/passkey/getOrCreatePasskeyOwner.ts +22 -0
- package/src/kernel-zerodev/owner/passkey/getPasskeyOwner.ts +69 -0
- package/src/kernel-zerodev/owner/passkey/index.ts +3 -0
- package/src/kernel-zerodev/owner/passkey/types.ts +18 -0
- package/src/kernel-zerodev/owner/passkey/utils.ts +157 -0
- 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.federatedPostSignRawPayload(
|
|
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
|
|
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 }, () =>
|