@account-kit/signer 4.0.0-alpha.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/LICENSE +21 -0
- package/dist/cjs/base.d.ts +37 -0
- package/dist/cjs/base.js +292 -0
- package/dist/cjs/base.js.map +1 -0
- package/dist/cjs/client/base.d.ts +230 -0
- package/dist/cjs/client/base.js +298 -0
- package/dist/cjs/client/base.js.map +1 -0
- package/dist/cjs/client/index.d.ts +146 -0
- package/dist/cjs/client/index.js +260 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/client/types.d.ts +106 -0
- package/dist/cjs/client/types.js +3 -0
- package/dist/cjs/client/types.js.map +1 -0
- package/dist/cjs/errors.d.ts +4 -0
- package/dist/cjs/errors.js +16 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +14 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/session/manager.d.ts +45 -0
- package/dist/cjs/session/manager.js +230 -0
- package/dist/cjs/session/manager.js.map +1 -0
- package/dist/cjs/session/types.d.ts +16 -0
- package/dist/cjs/session/types.js +3 -0
- package/dist/cjs/session/types.js.map +1 -0
- package/dist/cjs/signer.d.ts +262 -0
- package/dist/cjs/signer.js +34 -0
- package/dist/cjs/signer.js.map +1 -0
- package/dist/cjs/types.d.ts +14 -0
- package/dist/cjs/types.js +12 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/base64UrlEncode.d.ts +1 -0
- package/dist/cjs/utils/base64UrlEncode.js +12 -0
- package/dist/cjs/utils/base64UrlEncode.js.map +1 -0
- package/dist/cjs/utils/generateRandomBuffer.d.ts +1 -0
- package/dist/cjs/utils/generateRandomBuffer.js +10 -0
- package/dist/cjs/utils/generateRandomBuffer.js.map +1 -0
- package/dist/cjs/version.d.ts +1 -0
- package/dist/cjs/version.js +5 -0
- package/dist/cjs/version.js.map +1 -0
- package/dist/esm/base.d.ts +37 -0
- package/dist/esm/base.js +288 -0
- package/dist/esm/base.js.map +1 -0
- package/dist/esm/client/base.d.ts +230 -0
- package/dist/esm/client/base.js +291 -0
- package/dist/esm/client/base.js.map +1 -0
- package/dist/esm/client/index.d.ts +146 -0
- package/dist/esm/client/index.js +256 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/types.d.ts +106 -0
- package/dist/esm/client/types.js +2 -0
- package/dist/esm/client/types.js.map +1 -0
- package/dist/esm/errors.d.ts +4 -0
- package/dist/esm/errors.js +12 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/session/manager.d.ts +45 -0
- package/dist/esm/session/manager.js +223 -0
- package/dist/esm/session/manager.js.map +1 -0
- package/dist/esm/session/types.d.ts +16 -0
- package/dist/esm/session/types.js +2 -0
- package/dist/esm/session/types.js.map +1 -0
- package/dist/esm/signer.d.ts +262 -0
- package/dist/esm/signer.js +30 -0
- package/dist/esm/signer.js.map +1 -0
- package/dist/esm/types.d.ts +14 -0
- package/dist/esm/types.js +9 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/base64UrlEncode.d.ts +1 -0
- package/dist/esm/utils/base64UrlEncode.js +8 -0
- package/dist/esm/utils/base64UrlEncode.js.map +1 -0
- package/dist/esm/utils/generateRandomBuffer.d.ts +1 -0
- package/dist/esm/utils/generateRandomBuffer.js +6 -0
- package/dist/esm/utils/generateRandomBuffer.js.map +1 -0
- package/dist/esm/version.d.ts +1 -0
- package/dist/esm/version.js +2 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/types/base.d.ts +89 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/client/base.d.ts +246 -0
- package/dist/types/client/base.d.ts.map +1 -0
- package/dist/types/client/index.d.ts +151 -0
- package/dist/types/client/index.d.ts.map +1 -0
- package/dist/types/client/types.d.ts +107 -0
- package/dist/types/client/types.d.ts.map +1 -0
- package/dist/types/errors.d.ts +5 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/session/manager.d.ts +46 -0
- package/dist/types/session/manager.d.ts.map +1 -0
- package/dist/types/session/types.d.ts +17 -0
- package/dist/types/session/types.d.ts.map +1 -0
- package/dist/types/signer.d.ts +269 -0
- package/dist/types/signer.d.ts.map +1 -0
- package/dist/types/types.d.ts +15 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils/base64UrlEncode.d.ts +2 -0
- package/dist/types/utils/base64UrlEncode.d.ts.map +1 -0
- package/dist/types/utils/generateRandomBuffer.d.ts +2 -0
- package/dist/types/utils/generateRandomBuffer.d.ts.map +1 -0
- package/dist/types/version.d.ts +2 -0
- package/dist/types/version.d.ts.map +1 -0
- package/package.json +79 -0
- package/src/base.ts +386 -0
- package/src/client/base.ts +399 -0
- package/src/client/index.ts +267 -0
- package/src/client/types.ts +121 -0
- package/src/errors.ts +15 -0
- package/src/index.ts +10 -0
- package/src/session/manager.ts +249 -0
- package/src/session/types.ts +16 -0
- package/src/signer.ts +55 -0
- package/src/types.ts +17 -0
- package/src/utils/base64UrlEncode.ts +7 -0
- package/src/utils/generateRandomBuffer.ts +5 -0
- package/src/version.ts +3 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { ConnectionConfigSchema } from "@aa-sdk/core";
|
|
2
|
+
import { TurnkeyClient } from "@turnkey/http";
|
|
3
|
+
import EventEmitter from "eventemitter3";
|
|
4
|
+
import { NotAuthenticatedError } from "../errors.js";
|
|
5
|
+
import { base64UrlEncode } from "../utils/base64UrlEncode.js";
|
|
6
|
+
export class BaseSignerClient {
|
|
7
|
+
constructor(params) {
|
|
8
|
+
Object.defineProperty(this, "_user", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true,
|
|
12
|
+
value: void 0
|
|
13
|
+
});
|
|
14
|
+
Object.defineProperty(this, "connectionConfig", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true,
|
|
18
|
+
value: void 0
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(this, "turnkeyClient", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true,
|
|
24
|
+
value: void 0
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(this, "rootOrg", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true,
|
|
30
|
+
value: void 0
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(this, "eventEmitter", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: void 0
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(this, "on", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: (event, listener) => {
|
|
43
|
+
this.eventEmitter.on(event, listener);
|
|
44
|
+
return () => this.eventEmitter.removeListener(event, listener);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "addPasskey", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: async (options) => {
|
|
52
|
+
if (!this.user) {
|
|
53
|
+
throw new NotAuthenticatedError();
|
|
54
|
+
}
|
|
55
|
+
const { attestation, challenge } = await this.getWebAuthnAttestation(options);
|
|
56
|
+
const { activity } = await this.turnkeyClient.createAuthenticators({
|
|
57
|
+
type: "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2",
|
|
58
|
+
timestampMs: Date.now().toString(),
|
|
59
|
+
organizationId: this.user.orgId,
|
|
60
|
+
parameters: {
|
|
61
|
+
userId: this.user.userId,
|
|
62
|
+
authenticators: [
|
|
63
|
+
{
|
|
64
|
+
attestation,
|
|
65
|
+
authenticatorName: `passkey-${Date.now().toString()}`,
|
|
66
|
+
challenge: base64UrlEncode(challenge),
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
const { authenticatorIds } = await this.pollActivityCompletion(activity, this.user.orgId, "createAuthenticatorsResult");
|
|
72
|
+
return authenticatorIds;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
Object.defineProperty(this, "whoami", {
|
|
76
|
+
enumerable: true,
|
|
77
|
+
configurable: true,
|
|
78
|
+
writable: true,
|
|
79
|
+
value: async (orgId = this.user?.orgId) => {
|
|
80
|
+
if (this.user) {
|
|
81
|
+
return this.user;
|
|
82
|
+
}
|
|
83
|
+
if (!orgId) {
|
|
84
|
+
throw new Error("No orgId provided");
|
|
85
|
+
}
|
|
86
|
+
const stampedRequest = await this.turnkeyClient.stampGetWhoami({
|
|
87
|
+
organizationId: orgId,
|
|
88
|
+
});
|
|
89
|
+
const user = await this.request("/v1/whoami", {
|
|
90
|
+
stampedRequest,
|
|
91
|
+
});
|
|
92
|
+
const credentialId = (() => {
|
|
93
|
+
try {
|
|
94
|
+
return JSON.parse(stampedRequest?.stamp.stampHeaderValue)
|
|
95
|
+
.credentialId;
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
this.user = {
|
|
102
|
+
...user,
|
|
103
|
+
credentialId,
|
|
104
|
+
};
|
|
105
|
+
return this.user;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
Object.defineProperty(this, "lookupUserByEmail", {
|
|
109
|
+
enumerable: true,
|
|
110
|
+
configurable: true,
|
|
111
|
+
writable: true,
|
|
112
|
+
value: async (email) => {
|
|
113
|
+
return this.request("/v1/lookup", { email });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
Object.defineProperty(this, "signRawMessage", {
|
|
117
|
+
enumerable: true,
|
|
118
|
+
configurable: true,
|
|
119
|
+
writable: true,
|
|
120
|
+
value: async (msg) => {
|
|
121
|
+
if (!this.user) {
|
|
122
|
+
throw new NotAuthenticatedError();
|
|
123
|
+
}
|
|
124
|
+
const stampedRequest = await this.turnkeyClient.stampSignRawPayload({
|
|
125
|
+
organizationId: this.user.orgId,
|
|
126
|
+
type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2",
|
|
127
|
+
timestampMs: Date.now().toString(),
|
|
128
|
+
parameters: {
|
|
129
|
+
encoding: "PAYLOAD_ENCODING_HEXADECIMAL",
|
|
130
|
+
hashFunction: "HASH_FUNCTION_NO_OP",
|
|
131
|
+
payload: msg,
|
|
132
|
+
signWith: this.user.address,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
const { signature } = await this.request("/v1/sign-payload", {
|
|
136
|
+
stampedRequest,
|
|
137
|
+
});
|
|
138
|
+
return signature;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
Object.defineProperty(this, "getUser", {
|
|
142
|
+
enumerable: true,
|
|
143
|
+
configurable: true,
|
|
144
|
+
writable: true,
|
|
145
|
+
value: () => {
|
|
146
|
+
return this.user ?? null;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
Object.defineProperty(this, "request", {
|
|
150
|
+
enumerable: true,
|
|
151
|
+
configurable: true,
|
|
152
|
+
writable: true,
|
|
153
|
+
value: async (route, body) => {
|
|
154
|
+
const url = this.connectionConfig.rpcUrl ?? "https://api.g.alchemy.com";
|
|
155
|
+
const basePath = "/signer";
|
|
156
|
+
const headers = new Headers();
|
|
157
|
+
headers.append("Content-Type", "application/json");
|
|
158
|
+
if (this.connectionConfig.apiKey) {
|
|
159
|
+
headers.append("Authorization", `Bearer ${this.connectionConfig.apiKey}`);
|
|
160
|
+
}
|
|
161
|
+
else if (this.connectionConfig.jwt) {
|
|
162
|
+
headers.append("Authorization", `Bearer ${this.connectionConfig.jwt}`);
|
|
163
|
+
}
|
|
164
|
+
const response = await fetch(`${url}${basePath}${route}`, {
|
|
165
|
+
method: "POST",
|
|
166
|
+
body: JSON.stringify(body),
|
|
167
|
+
headers,
|
|
168
|
+
});
|
|
169
|
+
if (!response.ok) {
|
|
170
|
+
throw new Error(await response.text());
|
|
171
|
+
}
|
|
172
|
+
const json = await response.json();
|
|
173
|
+
return json;
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
Object.defineProperty(this, "exportAsSeedPhrase", {
|
|
177
|
+
enumerable: true,
|
|
178
|
+
configurable: true,
|
|
179
|
+
writable: true,
|
|
180
|
+
value: async (stamper) => {
|
|
181
|
+
if (!this.user) {
|
|
182
|
+
throw new NotAuthenticatedError();
|
|
183
|
+
}
|
|
184
|
+
const { wallets } = await this.turnkeyClient.getWallets({
|
|
185
|
+
organizationId: this.user.orgId,
|
|
186
|
+
});
|
|
187
|
+
const walletAccounts = await Promise.all(wallets.map(({ walletId }) => this.turnkeyClient.getWalletAccounts({
|
|
188
|
+
organizationId: this.user.orgId,
|
|
189
|
+
walletId,
|
|
190
|
+
}))).then((x) => x.flatMap((x) => x.accounts));
|
|
191
|
+
const walletAccount = walletAccounts.find((x) => x.address === this.user.address);
|
|
192
|
+
if (!walletAccount) {
|
|
193
|
+
throw new Error(`Could not find wallet associated with ${this.user.address}`);
|
|
194
|
+
}
|
|
195
|
+
const { activity } = await this.turnkeyClient.exportWallet({
|
|
196
|
+
organizationId: this.user.orgId,
|
|
197
|
+
type: "ACTIVITY_TYPE_EXPORT_WALLET",
|
|
198
|
+
timestampMs: Date.now().toString(),
|
|
199
|
+
parameters: {
|
|
200
|
+
walletId: walletAccount.walletId,
|
|
201
|
+
targetPublicKey: stamper.publicKey(),
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
const { exportBundle } = await this.pollActivityCompletion(activity, this.user.orgId, "exportWalletResult");
|
|
205
|
+
const result = await stamper.injectWalletExportBundle(exportBundle);
|
|
206
|
+
if (!result) {
|
|
207
|
+
throw new Error("Failed to inject wallet export bundle");
|
|
208
|
+
}
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
Object.defineProperty(this, "exportAsPrivateKey", {
|
|
213
|
+
enumerable: true,
|
|
214
|
+
configurable: true,
|
|
215
|
+
writable: true,
|
|
216
|
+
value: async (stamper) => {
|
|
217
|
+
if (!this.user) {
|
|
218
|
+
throw new NotAuthenticatedError();
|
|
219
|
+
}
|
|
220
|
+
const { activity } = await this.turnkeyClient.exportWalletAccount({
|
|
221
|
+
organizationId: this.user.orgId,
|
|
222
|
+
type: "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT",
|
|
223
|
+
timestampMs: Date.now().toString(),
|
|
224
|
+
parameters: {
|
|
225
|
+
address: this.user.address,
|
|
226
|
+
targetPublicKey: stamper.publicKey(),
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
const { exportBundle } = await this.pollActivityCompletion(activity, this.user.orgId, "exportWalletAccountResult");
|
|
230
|
+
const result = await stamper.injectKeyExportBundle(exportBundle);
|
|
231
|
+
if (!result) {
|
|
232
|
+
throw new Error("Failed to inject wallet export bundle");
|
|
233
|
+
}
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
Object.defineProperty(this, "pollActivityCompletion", {
|
|
238
|
+
enumerable: true,
|
|
239
|
+
configurable: true,
|
|
240
|
+
writable: true,
|
|
241
|
+
value: async (activity, organizationId, resultKey) => {
|
|
242
|
+
if (activity.status === "ACTIVITY_STATUS_COMPLETED") {
|
|
243
|
+
return activity.result[resultKey];
|
|
244
|
+
}
|
|
245
|
+
const { activity: { status, id, result }, } = await this.turnkeyClient.getActivity({
|
|
246
|
+
activityId: activity.id,
|
|
247
|
+
organizationId,
|
|
248
|
+
});
|
|
249
|
+
if (status === "ACTIVITY_STATUS_COMPLETED") {
|
|
250
|
+
return result[resultKey];
|
|
251
|
+
}
|
|
252
|
+
if (status === "ACTIVITY_STATUS_FAILED" ||
|
|
253
|
+
status === "ACTIVITY_STATUS_REJECTED" ||
|
|
254
|
+
status === "ACTIVITY_STATUS_CONSENSUS_NEEDED") {
|
|
255
|
+
throw new Error(`Failed to get activity with with id ${id} (status: ${status})`);
|
|
256
|
+
}
|
|
257
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
258
|
+
return this.pollActivityCompletion(activity, organizationId, resultKey);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
const { stamper, connection, rootOrgId } = params;
|
|
262
|
+
this.rootOrg = rootOrgId ?? "24c1acf5-810f-41e0-a503-d5d13fa8e830";
|
|
263
|
+
this.eventEmitter = new EventEmitter();
|
|
264
|
+
this.connectionConfig = ConnectionConfigSchema.parse(connection);
|
|
265
|
+
this.turnkeyClient = new TurnkeyClient({ baseUrl: "https://api.turnkey.com" }, stamper);
|
|
266
|
+
}
|
|
267
|
+
get user() {
|
|
268
|
+
return this._user;
|
|
269
|
+
}
|
|
270
|
+
set user(user) {
|
|
271
|
+
if (user && !this._user) {
|
|
272
|
+
this.eventEmitter.emit("connected", user);
|
|
273
|
+
}
|
|
274
|
+
else if (!user && this._user) {
|
|
275
|
+
this.eventEmitter.emit("disconnected");
|
|
276
|
+
}
|
|
277
|
+
this._user = user;
|
|
278
|
+
}
|
|
279
|
+
setStamper(stamper) {
|
|
280
|
+
this.turnkeyClient.stamper = stamper;
|
|
281
|
+
}
|
|
282
|
+
exportWalletInner(params) {
|
|
283
|
+
switch (params.exportAs) {
|
|
284
|
+
case "PRIVATE_KEY":
|
|
285
|
+
return this.exportAsPrivateKey(params.exportStamper);
|
|
286
|
+
case "SEED_PHRASE":
|
|
287
|
+
return this.exportAsSeedPhrase(params.exportStamper);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/client/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ConnectionConfig, ConnectionConfigSchema } from \"@aa-sdk/core\";\nimport { TurnkeyClient } from \"@turnkey/http\";\nimport EventEmitter from \"eventemitter3\";\nimport type { Hex } from \"viem\";\nimport { NotAuthenticatedError } from \"../errors.js\";\nimport { base64UrlEncode } from \"../utils/base64UrlEncode.js\";\nimport type {\n AlchemySignerClientEvent,\n AlchemySignerClientEvents,\n CreateAccountParams,\n EmailAuthParams,\n GetWebAuthnAttestationResult,\n SignerBody,\n SignerResponse,\n SignerRoutes,\n SignupResponse,\n User,\n} from \"./types.js\";\n\nexport interface BaseSignerClientParams {\n stamper: TurnkeyClient[\"stamper\"];\n connection: ConnectionConfig;\n rootOrgId?: string;\n rpId?: string;\n}\n\nexport type ExportWalletStamper = TurnkeyClient[\"stamper\"] & {\n injectWalletExportBundle(bundle: string): Promise<boolean>;\n injectKeyExportBundle(bundle: string): Promise<boolean>;\n publicKey(): string | null;\n};\n\nexport abstract class BaseSignerClient<TExportWalletParams = unknown> {\n private _user: User | undefined;\n private connectionConfig: ConnectionConfig;\n protected turnkeyClient: TurnkeyClient;\n protected rootOrg: string;\n protected eventEmitter: EventEmitter<AlchemySignerClientEvents>;\n\n constructor(params: BaseSignerClientParams) {\n const { stamper, connection, rootOrgId } = params;\n\n this.rootOrg = rootOrgId ?? \"24c1acf5-810f-41e0-a503-d5d13fa8e830\";\n this.eventEmitter = new EventEmitter<AlchemySignerClientEvents>();\n this.connectionConfig = ConnectionConfigSchema.parse(connection);\n this.turnkeyClient = new TurnkeyClient(\n { baseUrl: \"https://api.turnkey.com\" },\n stamper\n );\n }\n\n protected get user() {\n return this._user;\n }\n\n protected set user(user: User | undefined) {\n if (user && !this._user) {\n this.eventEmitter.emit(\"connected\", user);\n } else if (!user && this._user) {\n this.eventEmitter.emit(\"disconnected\");\n }\n\n this._user = user;\n }\n\n protected setStamper(stamper: TurnkeyClient[\"stamper\"]) {\n this.turnkeyClient.stamper = stamper;\n }\n\n protected exportWalletInner(params: {\n exportStamper: ExportWalletStamper;\n exportAs: \"SEED_PHRASE\" | \"PRIVATE_KEY\";\n }): Promise<boolean> {\n switch (params.exportAs) {\n case \"PRIVATE_KEY\":\n return this.exportAsPrivateKey(params.exportStamper);\n case \"SEED_PHRASE\":\n return this.exportAsSeedPhrase(params.exportStamper);\n }\n }\n\n // #region ABSTRACT METHODS\n\n public abstract createAccount(\n params: CreateAccountParams\n ): Promise<SignupResponse>;\n\n public abstract initEmailAuth(\n params: Omit<EmailAuthParams, \"targetPublicKey\">\n ): Promise<{ orgId: string }>;\n\n public abstract completeEmailAuth(params: {\n bundle: string;\n orgId: string;\n }): Promise<User>;\n\n public abstract disconnect(): Promise<void>;\n\n public abstract exportWallet(params: TExportWalletParams): Promise<boolean>;\n\n public abstract lookupUserWithPasskey(user?: User): Promise<User>;\n\n protected abstract getWebAuthnAttestation(\n options: CredentialCreationOptions,\n userDetails?: { username: string }\n ): Promise<GetWebAuthnAttestationResult>;\n\n // #endregion\n\n // #region PUBLIC METHODS\n\n /**\n * Listen to events emitted by the client\n *\n * @param event the event you want to listen to\n * @param listener the callback function to execute when an event is fired\n * @returns a function that will remove the listener when called\n */\n public on = <E extends AlchemySignerClientEvent>(\n event: E,\n listener: AlchemySignerClientEvents[E]\n ) => {\n this.eventEmitter.on(event, listener as any);\n\n return () => this.eventEmitter.removeListener(event, listener as any);\n };\n\n public addPasskey = async (options: CredentialCreationOptions) => {\n if (!this.user) {\n throw new NotAuthenticatedError();\n }\n const { attestation, challenge } = await this.getWebAuthnAttestation(\n options\n );\n\n const { activity } = await this.turnkeyClient.createAuthenticators({\n type: \"ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.user.orgId,\n parameters: {\n userId: this.user.userId,\n authenticators: [\n {\n attestation,\n authenticatorName: `passkey-${Date.now().toString()}`,\n challenge: base64UrlEncode(challenge),\n },\n ],\n },\n });\n\n const { authenticatorIds } = await this.pollActivityCompletion(\n activity,\n this.user.orgId,\n \"createAuthenticatorsResult\"\n );\n\n return authenticatorIds;\n };\n\n public whoami = async (orgId = this.user?.orgId): Promise<User> => {\n if (this.user) {\n return this.user;\n }\n\n if (!orgId) {\n throw new Error(\"No orgId provided\");\n }\n\n const stampedRequest = await this.turnkeyClient.stampGetWhoami({\n organizationId: orgId,\n });\n\n const user = await this.request(\"/v1/whoami\", {\n stampedRequest,\n });\n\n const credentialId = (() => {\n try {\n return JSON.parse(stampedRequest?.stamp.stampHeaderValue)\n .credentialId as string;\n } catch (e) {\n return undefined;\n }\n })();\n\n this.user = {\n ...user,\n credentialId,\n };\n\n return this.user;\n };\n\n public lookupUserByEmail = async (email: string) => {\n return this.request(\"/v1/lookup\", { email });\n };\n\n /**\n * This will sign a message with the user's private key, without doing any transformations on the message.\n * For SignMessage or SignTypedData, the caller should hash the message before calling this method and pass\n * that result here.\n *\n * @param msg the hex representation of the bytes to sign\n * @returns the signature over the raw hex\n */\n public signRawMessage = async (msg: Hex) => {\n if (!this.user) {\n throw new NotAuthenticatedError();\n }\n\n const stampedRequest = await this.turnkeyClient.stampSignRawPayload({\n organizationId: this.user.orgId,\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n parameters: {\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n payload: msg,\n signWith: this.user.address,\n },\n });\n\n const { signature } = await this.request(\"/v1/sign-payload\", {\n stampedRequest,\n });\n\n return signature;\n };\n\n public getUser = (): User | null => {\n return this.user ?? null;\n };\n\n public request = async <R extends SignerRoutes>(\n route: R,\n body: SignerBody<R>\n ): Promise<SignerResponse<R>> => {\n const url = this.connectionConfig.rpcUrl ?? \"https://api.g.alchemy.com\";\n const basePath = \"/signer\";\n\n const headers = new Headers();\n headers.append(\"Content-Type\", \"application/json\");\n if (this.connectionConfig.apiKey) {\n headers.append(\"Authorization\", `Bearer ${this.connectionConfig.apiKey}`);\n } else if (this.connectionConfig.jwt) {\n headers.append(\"Authorization\", `Bearer ${this.connectionConfig.jwt}`);\n }\n\n const response = await fetch(`${url}${basePath}${route}`, {\n method: \"POST\",\n body: JSON.stringify(body),\n headers,\n });\n\n if (!response.ok) {\n throw new Error(await response.text());\n }\n\n const json = await response.json();\n\n return json as SignerResponse<R>;\n };\n\n // #endregion\n\n // #region PRIVATE METHODS\n private exportAsSeedPhrase = async (stamper: ExportWalletStamper) => {\n if (!this.user) {\n throw new NotAuthenticatedError();\n }\n\n const { wallets } = await this.turnkeyClient.getWallets({\n organizationId: this.user.orgId,\n });\n\n const walletAccounts = await Promise.all(\n wallets.map(({ walletId }) =>\n this.turnkeyClient.getWalletAccounts({\n organizationId: this.user!.orgId,\n walletId,\n })\n )\n ).then((x) => x.flatMap((x) => x.accounts));\n\n const walletAccount = walletAccounts.find(\n (x) => x.address === this.user!.address\n );\n\n if (!walletAccount) {\n throw new Error(\n `Could not find wallet associated with ${this.user.address}`\n );\n }\n\n const { activity } = await this.turnkeyClient.exportWallet({\n organizationId: this.user.orgId,\n type: \"ACTIVITY_TYPE_EXPORT_WALLET\",\n timestampMs: Date.now().toString(),\n parameters: {\n walletId: walletAccount!.walletId,\n targetPublicKey: stamper.publicKey()!,\n },\n });\n\n const { exportBundle } = await this.pollActivityCompletion(\n activity,\n this.user.orgId,\n \"exportWalletResult\"\n );\n\n const result = await stamper.injectWalletExportBundle(exportBundle);\n\n if (!result) {\n throw new Error(\"Failed to inject wallet export bundle\");\n }\n\n return result;\n };\n\n private exportAsPrivateKey = async (stamper: ExportWalletStamper) => {\n if (!this.user) {\n throw new NotAuthenticatedError();\n }\n\n const { activity } = await this.turnkeyClient.exportWalletAccount({\n organizationId: this.user.orgId,\n type: \"ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT\",\n timestampMs: Date.now().toString(),\n parameters: {\n address: this.user.address,\n targetPublicKey: stamper.publicKey()!,\n },\n });\n\n const { exportBundle } = await this.pollActivityCompletion(\n activity,\n this.user.orgId,\n \"exportWalletAccountResult\"\n );\n\n const result = await stamper.injectKeyExportBundle(exportBundle);\n\n if (!result) {\n throw new Error(\"Failed to inject wallet export bundle\");\n }\n\n return result;\n };\n\n protected pollActivityCompletion = async <\n T extends keyof Awaited<\n ReturnType<(typeof this.turnkeyClient)[\"getActivity\"]>\n >[\"activity\"][\"result\"]\n >(\n activity: Awaited<\n ReturnType<(typeof this.turnkeyClient)[\"getActivity\"]>\n >[\"activity\"],\n organizationId: string,\n resultKey: T\n ): Promise<\n NonNullable<\n Awaited<\n ReturnType<(typeof this.turnkeyClient)[\"getActivity\"]>\n >[\"activity\"][\"result\"][T]\n >\n > => {\n if (activity.status === \"ACTIVITY_STATUS_COMPLETED\") {\n return activity.result[resultKey]!;\n }\n\n const {\n activity: { status, id, result },\n } = await this.turnkeyClient.getActivity({\n activityId: activity.id,\n organizationId,\n });\n\n if (status === \"ACTIVITY_STATUS_COMPLETED\") {\n return result[resultKey]!;\n }\n\n if (\n status === \"ACTIVITY_STATUS_FAILED\" ||\n status === \"ACTIVITY_STATUS_REJECTED\" ||\n status === \"ACTIVITY_STATUS_CONSENSUS_NEEDED\"\n ) {\n throw new Error(\n `Failed to get activity with with id ${id} (status: ${status})`\n );\n }\n\n // TODO: add ability to configure this + add exponential backoff\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n return this.pollActivityCompletion(activity, organizationId, resultKey);\n };\n // #endregion\n}\n"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { BaseSignerClient } from "./base.js";
|
|
3
|
+
import type { CreateAccountParams, CredentialCreationOptionOverrides, EmailAuthParams, ExportWalletParams, User } from "./types.js";
|
|
4
|
+
export declare const AlchemySignerClientParamsSchema: z.ZodObject<{
|
|
5
|
+
connection: z.ZodUnion<[z.ZodObject<{
|
|
6
|
+
rpcUrl: z.ZodOptional<z.ZodNever>;
|
|
7
|
+
apiKey: z.ZodString;
|
|
8
|
+
jwt: z.ZodOptional<z.ZodNever>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
apiKey: string;
|
|
11
|
+
rpcUrl?: undefined;
|
|
12
|
+
jwt?: undefined;
|
|
13
|
+
}, {
|
|
14
|
+
apiKey: string;
|
|
15
|
+
rpcUrl?: undefined;
|
|
16
|
+
jwt?: undefined;
|
|
17
|
+
}>, z.ZodObject<{
|
|
18
|
+
rpcUrl: z.ZodOptional<z.ZodNever>;
|
|
19
|
+
apiKey: z.ZodOptional<z.ZodNever>;
|
|
20
|
+
jwt: z.ZodString;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
jwt: string;
|
|
23
|
+
rpcUrl?: undefined;
|
|
24
|
+
apiKey?: undefined;
|
|
25
|
+
}, {
|
|
26
|
+
jwt: string;
|
|
27
|
+
rpcUrl?: undefined;
|
|
28
|
+
apiKey?: undefined;
|
|
29
|
+
}>, z.ZodObject<{
|
|
30
|
+
rpcUrl: z.ZodString;
|
|
31
|
+
apiKey: z.ZodOptional<z.ZodNever>;
|
|
32
|
+
jwt: z.ZodOptional<z.ZodNever>;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
rpcUrl: string;
|
|
35
|
+
apiKey?: undefined;
|
|
36
|
+
jwt?: undefined;
|
|
37
|
+
}, {
|
|
38
|
+
rpcUrl: string;
|
|
39
|
+
apiKey?: undefined;
|
|
40
|
+
jwt?: undefined;
|
|
41
|
+
}>, z.ZodObject<{
|
|
42
|
+
rpcUrl: z.ZodString;
|
|
43
|
+
apiKey: z.ZodOptional<z.ZodNever>;
|
|
44
|
+
jwt: z.ZodString;
|
|
45
|
+
}, "strip", z.ZodTypeAny, {
|
|
46
|
+
rpcUrl: string;
|
|
47
|
+
jwt: string;
|
|
48
|
+
apiKey?: undefined;
|
|
49
|
+
}, {
|
|
50
|
+
rpcUrl: string;
|
|
51
|
+
jwt: string;
|
|
52
|
+
apiKey?: undefined;
|
|
53
|
+
}>]>;
|
|
54
|
+
iframeConfig: z.ZodObject<{
|
|
55
|
+
iframeElementId: z.ZodDefault<z.ZodString>;
|
|
56
|
+
iframeContainerId: z.ZodString;
|
|
57
|
+
}, "strip", z.ZodTypeAny, {
|
|
58
|
+
iframeElementId: string;
|
|
59
|
+
iframeContainerId: string;
|
|
60
|
+
}, {
|
|
61
|
+
iframeContainerId: string;
|
|
62
|
+
iframeElementId?: string | undefined;
|
|
63
|
+
}>;
|
|
64
|
+
rpId: z.ZodOptional<z.ZodString>;
|
|
65
|
+
rootOrgId: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
66
|
+
}, "strip", z.ZodTypeAny, {
|
|
67
|
+
connection: {
|
|
68
|
+
apiKey: string;
|
|
69
|
+
rpcUrl?: undefined;
|
|
70
|
+
jwt?: undefined;
|
|
71
|
+
} | {
|
|
72
|
+
jwt: string;
|
|
73
|
+
rpcUrl?: undefined;
|
|
74
|
+
apiKey?: undefined;
|
|
75
|
+
} | {
|
|
76
|
+
rpcUrl: string;
|
|
77
|
+
apiKey?: undefined;
|
|
78
|
+
jwt?: undefined;
|
|
79
|
+
} | {
|
|
80
|
+
rpcUrl: string;
|
|
81
|
+
jwt: string;
|
|
82
|
+
apiKey?: undefined;
|
|
83
|
+
};
|
|
84
|
+
rootOrgId: string;
|
|
85
|
+
iframeConfig: {
|
|
86
|
+
iframeElementId: string;
|
|
87
|
+
iframeContainerId: string;
|
|
88
|
+
};
|
|
89
|
+
rpId?: string | undefined;
|
|
90
|
+
}, {
|
|
91
|
+
connection: {
|
|
92
|
+
apiKey: string;
|
|
93
|
+
rpcUrl?: undefined;
|
|
94
|
+
jwt?: undefined;
|
|
95
|
+
} | {
|
|
96
|
+
jwt: string;
|
|
97
|
+
rpcUrl?: undefined;
|
|
98
|
+
apiKey?: undefined;
|
|
99
|
+
} | {
|
|
100
|
+
rpcUrl: string;
|
|
101
|
+
apiKey?: undefined;
|
|
102
|
+
jwt?: undefined;
|
|
103
|
+
} | {
|
|
104
|
+
rpcUrl: string;
|
|
105
|
+
jwt: string;
|
|
106
|
+
apiKey?: undefined;
|
|
107
|
+
};
|
|
108
|
+
iframeConfig: {
|
|
109
|
+
iframeContainerId: string;
|
|
110
|
+
iframeElementId?: string | undefined;
|
|
111
|
+
};
|
|
112
|
+
rpId?: string | undefined;
|
|
113
|
+
rootOrgId?: string | undefined;
|
|
114
|
+
}>;
|
|
115
|
+
export type AlchemySignerClientParams = z.input<typeof AlchemySignerClientParamsSchema>;
|
|
116
|
+
export declare class AlchemySignerWebClient extends BaseSignerClient<ExportWalletParams> {
|
|
117
|
+
private iframeStamper;
|
|
118
|
+
private webauthnStamper;
|
|
119
|
+
iframeContainerId: string;
|
|
120
|
+
constructor(params: AlchemySignerClientParams);
|
|
121
|
+
createAccount: (params: CreateAccountParams) => Promise<import("./types.js").SignupResponse>;
|
|
122
|
+
initEmailAuth: (params: Omit<EmailAuthParams, "targetPublicKey">) => Promise<{
|
|
123
|
+
orgId: string;
|
|
124
|
+
}>;
|
|
125
|
+
completeEmailAuth: ({ bundle, orgId, }: {
|
|
126
|
+
bundle: string;
|
|
127
|
+
orgId: string;
|
|
128
|
+
}) => Promise<User>;
|
|
129
|
+
lookupUserWithPasskey: (user?: User | undefined) => Promise<User>;
|
|
130
|
+
exportWallet: ({ iframeContainerId, iframeElementId, }: ExportWalletParams) => Promise<boolean>;
|
|
131
|
+
disconnect: () => Promise<void>;
|
|
132
|
+
private initIframeStamper;
|
|
133
|
+
private initWebauthnStamper;
|
|
134
|
+
protected getWebAuthnAttestation: (options?: CredentialCreationOptionOverrides, userDetails?: {
|
|
135
|
+
username: string;
|
|
136
|
+
}) => Promise<{
|
|
137
|
+
challenge: ArrayBuffer;
|
|
138
|
+
authenticatorUserId: ArrayBuffer;
|
|
139
|
+
attestation: {
|
|
140
|
+
credentialId: string;
|
|
141
|
+
clientDataJson: string;
|
|
142
|
+
attestationObject: string;
|
|
143
|
+
transports: ("AUTHENTICATOR_TRANSPORT_BLE" | "AUTHENTICATOR_TRANSPORT_INTERNAL" | "AUTHENTICATOR_TRANSPORT_NFC" | "AUTHENTICATOR_TRANSPORT_USB" | "AUTHENTICATOR_TRANSPORT_HYBRID")[];
|
|
144
|
+
};
|
|
145
|
+
}>;
|
|
146
|
+
}
|