@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.
Files changed (121) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/base.d.ts +37 -0
  3. package/dist/cjs/base.js +292 -0
  4. package/dist/cjs/base.js.map +1 -0
  5. package/dist/cjs/client/base.d.ts +230 -0
  6. package/dist/cjs/client/base.js +298 -0
  7. package/dist/cjs/client/base.js.map +1 -0
  8. package/dist/cjs/client/index.d.ts +146 -0
  9. package/dist/cjs/client/index.js +260 -0
  10. package/dist/cjs/client/index.js.map +1 -0
  11. package/dist/cjs/client/types.d.ts +106 -0
  12. package/dist/cjs/client/types.js +3 -0
  13. package/dist/cjs/client/types.js.map +1 -0
  14. package/dist/cjs/errors.d.ts +4 -0
  15. package/dist/cjs/errors.js +16 -0
  16. package/dist/cjs/errors.js.map +1 -0
  17. package/dist/cjs/index.d.ts +8 -0
  18. package/dist/cjs/index.js +14 -0
  19. package/dist/cjs/index.js.map +1 -0
  20. package/dist/cjs/package.json +1 -0
  21. package/dist/cjs/session/manager.d.ts +45 -0
  22. package/dist/cjs/session/manager.js +230 -0
  23. package/dist/cjs/session/manager.js.map +1 -0
  24. package/dist/cjs/session/types.d.ts +16 -0
  25. package/dist/cjs/session/types.js +3 -0
  26. package/dist/cjs/session/types.js.map +1 -0
  27. package/dist/cjs/signer.d.ts +262 -0
  28. package/dist/cjs/signer.js +34 -0
  29. package/dist/cjs/signer.js.map +1 -0
  30. package/dist/cjs/types.d.ts +14 -0
  31. package/dist/cjs/types.js +12 -0
  32. package/dist/cjs/types.js.map +1 -0
  33. package/dist/cjs/utils/base64UrlEncode.d.ts +1 -0
  34. package/dist/cjs/utils/base64UrlEncode.js +12 -0
  35. package/dist/cjs/utils/base64UrlEncode.js.map +1 -0
  36. package/dist/cjs/utils/generateRandomBuffer.d.ts +1 -0
  37. package/dist/cjs/utils/generateRandomBuffer.js +10 -0
  38. package/dist/cjs/utils/generateRandomBuffer.js.map +1 -0
  39. package/dist/cjs/version.d.ts +1 -0
  40. package/dist/cjs/version.js +5 -0
  41. package/dist/cjs/version.js.map +1 -0
  42. package/dist/esm/base.d.ts +37 -0
  43. package/dist/esm/base.js +288 -0
  44. package/dist/esm/base.js.map +1 -0
  45. package/dist/esm/client/base.d.ts +230 -0
  46. package/dist/esm/client/base.js +291 -0
  47. package/dist/esm/client/base.js.map +1 -0
  48. package/dist/esm/client/index.d.ts +146 -0
  49. package/dist/esm/client/index.js +256 -0
  50. package/dist/esm/client/index.js.map +1 -0
  51. package/dist/esm/client/types.d.ts +106 -0
  52. package/dist/esm/client/types.js +2 -0
  53. package/dist/esm/client/types.js.map +1 -0
  54. package/dist/esm/errors.d.ts +4 -0
  55. package/dist/esm/errors.js +12 -0
  56. package/dist/esm/errors.js.map +1 -0
  57. package/dist/esm/index.d.ts +8 -0
  58. package/dist/esm/index.js +6 -0
  59. package/dist/esm/index.js.map +1 -0
  60. package/dist/esm/package.json +1 -0
  61. package/dist/esm/session/manager.d.ts +45 -0
  62. package/dist/esm/session/manager.js +223 -0
  63. package/dist/esm/session/manager.js.map +1 -0
  64. package/dist/esm/session/types.d.ts +16 -0
  65. package/dist/esm/session/types.js +2 -0
  66. package/dist/esm/session/types.js.map +1 -0
  67. package/dist/esm/signer.d.ts +262 -0
  68. package/dist/esm/signer.js +30 -0
  69. package/dist/esm/signer.js.map +1 -0
  70. package/dist/esm/types.d.ts +14 -0
  71. package/dist/esm/types.js +9 -0
  72. package/dist/esm/types.js.map +1 -0
  73. package/dist/esm/utils/base64UrlEncode.d.ts +1 -0
  74. package/dist/esm/utils/base64UrlEncode.js +8 -0
  75. package/dist/esm/utils/base64UrlEncode.js.map +1 -0
  76. package/dist/esm/utils/generateRandomBuffer.d.ts +1 -0
  77. package/dist/esm/utils/generateRandomBuffer.js +6 -0
  78. package/dist/esm/utils/generateRandomBuffer.js.map +1 -0
  79. package/dist/esm/version.d.ts +1 -0
  80. package/dist/esm/version.js +2 -0
  81. package/dist/esm/version.js.map +1 -0
  82. package/dist/types/base.d.ts +89 -0
  83. package/dist/types/base.d.ts.map +1 -0
  84. package/dist/types/client/base.d.ts +246 -0
  85. package/dist/types/client/base.d.ts.map +1 -0
  86. package/dist/types/client/index.d.ts +151 -0
  87. package/dist/types/client/index.d.ts.map +1 -0
  88. package/dist/types/client/types.d.ts +107 -0
  89. package/dist/types/client/types.d.ts.map +1 -0
  90. package/dist/types/errors.d.ts +5 -0
  91. package/dist/types/errors.d.ts.map +1 -0
  92. package/dist/types/index.d.ts +9 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/session/manager.d.ts +46 -0
  95. package/dist/types/session/manager.d.ts.map +1 -0
  96. package/dist/types/session/types.d.ts +17 -0
  97. package/dist/types/session/types.d.ts.map +1 -0
  98. package/dist/types/signer.d.ts +269 -0
  99. package/dist/types/signer.d.ts.map +1 -0
  100. package/dist/types/types.d.ts +15 -0
  101. package/dist/types/types.d.ts.map +1 -0
  102. package/dist/types/utils/base64UrlEncode.d.ts +2 -0
  103. package/dist/types/utils/base64UrlEncode.d.ts.map +1 -0
  104. package/dist/types/utils/generateRandomBuffer.d.ts +2 -0
  105. package/dist/types/utils/generateRandomBuffer.d.ts.map +1 -0
  106. package/dist/types/version.d.ts +2 -0
  107. package/dist/types/version.d.ts.map +1 -0
  108. package/package.json +79 -0
  109. package/src/base.ts +386 -0
  110. package/src/client/base.ts +399 -0
  111. package/src/client/index.ts +267 -0
  112. package/src/client/types.ts +121 -0
  113. package/src/errors.ts +15 -0
  114. package/src/index.ts +10 -0
  115. package/src/session/manager.ts +249 -0
  116. package/src/session/types.ts +16 -0
  117. package/src/signer.ts +55 -0
  118. package/src/types.ts +17 -0
  119. package/src/utils/base64UrlEncode.ts +7 -0
  120. package/src/utils/generateRandomBuffer.ts +5 -0
  121. package/src/version.ts +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAEa,QAAA,OAAO,GAAG,eAAe,CAAC","sourcesContent":["// This file is autogenerated by inject-version.ts. Any changes will be\n// overwritten on commit!\nexport const VERSION = \"4.0.0-alpha.0\";\n"]}
@@ -0,0 +1,37 @@
1
+ import { type SmartAccountAuthenticator } from "@aa-sdk/core";
2
+ import { type CustomSource, type Hex, type LocalAccount, type SignableMessage, type TypedData, type TypedDataDefinition } from "viem";
3
+ import type { BaseSignerClient } from "./client/base";
4
+ import type { User } from "./client/types";
5
+ import { type SessionManagerParams } from "./session/manager.js";
6
+ import type { AuthParams } from "./signer";
7
+ import { type AlchemySignerEvents } from "./types.js";
8
+ export interface BaseAlchemySignerParams<TClient extends BaseSignerClient> {
9
+ client: TClient;
10
+ sessionConfig?: Omit<SessionManagerParams, "client">;
11
+ }
12
+ export declare abstract class BaseAlchemySigner<TClient extends BaseSignerClient> implements SmartAccountAuthenticator<AuthParams, User, TClient> {
13
+ signerType: string;
14
+ inner: TClient;
15
+ private sessionManager;
16
+ private store;
17
+ constructor({ client, sessionConfig }: BaseAlchemySignerParams<TClient>);
18
+ on: <E extends keyof AlchemySignerEvents>(event: E, listener: AlchemySignerEvents[E]) => () => void;
19
+ authenticate: (params: AuthParams) => Promise<User>;
20
+ disconnect: () => Promise<void>;
21
+ getAuthDetails: () => Promise<User>;
22
+ getAddress: () => Promise<`0x${string}`>;
23
+ signMessage: (msg: SignableMessage) => Promise<`0x${string}`>;
24
+ signTypedData: <const TTypedData extends TypedData | {
25
+ [key: string]: unknown;
26
+ }, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>) => Promise<Hex>;
27
+ signTransaction: CustomSource["signTransaction"];
28
+ getUser: (email: string) => Promise<{
29
+ orgId: string;
30
+ } | null>;
31
+ addPasskey: (params?: CredentialCreationOptions) => Promise<string[]>;
32
+ exportWallet: (params: Parameters<(typeof this.inner)["exportWallet"]>[0]) => Promise<boolean>;
33
+ toViemAccount: () => LocalAccount;
34
+ private authenticateWithEmail;
35
+ private authenticateWithPasskey;
36
+ private registerListeners;
37
+ }
@@ -0,0 +1,288 @@
1
+ import { takeBytes } from "@aa-sdk/core";
2
+ import { hashMessage, hashTypedData, keccak256, serializeTransaction, } from "viem";
3
+ import { toAccount } from "viem/accounts";
4
+ import { subscribeWithSelector } from "zustand/middleware";
5
+ import { createStore } from "zustand/vanilla";
6
+ import { NotAuthenticatedError } from "./errors.js";
7
+ import { SessionManager, } from "./session/manager.js";
8
+ import { AlchemySignerStatus, } from "./types.js";
9
+ export class BaseAlchemySigner {
10
+ constructor({ client, sessionConfig }) {
11
+ Object.defineProperty(this, "signerType", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: "alchemy-signer"
16
+ });
17
+ Object.defineProperty(this, "inner", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ Object.defineProperty(this, "sessionManager", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ Object.defineProperty(this, "store", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: void 0
34
+ });
35
+ Object.defineProperty(this, "on", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: (event, listener) => {
40
+ switch (event) {
41
+ case "connected":
42
+ return this.store.subscribe(({ status }) => status, (status) => status === AlchemySignerStatus.CONNECTED &&
43
+ listener(this.store.getState().user), { fireImmediately: true });
44
+ case "disconnected":
45
+ return this.store.subscribe(({ status }) => status, (status) => status === AlchemySignerStatus.DISCONNECTED &&
46
+ listener(), { fireImmediately: true });
47
+ case "statusChanged":
48
+ return this.store.subscribe(({ status }) => status, listener, { fireImmediately: true });
49
+ default:
50
+ throw new Error(`Uknown event type ${event}`);
51
+ }
52
+ }
53
+ });
54
+ Object.defineProperty(this, "authenticate", {
55
+ enumerable: true,
56
+ configurable: true,
57
+ writable: true,
58
+ value: async (params) => {
59
+ if (params.type === "email") {
60
+ return this.authenticateWithEmail(params);
61
+ }
62
+ return this.authenticateWithPasskey(params);
63
+ }
64
+ });
65
+ Object.defineProperty(this, "disconnect", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: async () => {
70
+ await this.inner.disconnect();
71
+ }
72
+ });
73
+ Object.defineProperty(this, "getAuthDetails", {
74
+ enumerable: true,
75
+ configurable: true,
76
+ writable: true,
77
+ value: async () => {
78
+ const sessionUser = await this.sessionManager.getSessionUser();
79
+ if (sessionUser != null) {
80
+ return sessionUser;
81
+ }
82
+ return this.inner.whoami();
83
+ }
84
+ });
85
+ Object.defineProperty(this, "getAddress", {
86
+ enumerable: true,
87
+ configurable: true,
88
+ writable: true,
89
+ value: async () => {
90
+ const { address } = await this.inner.whoami();
91
+ return address;
92
+ }
93
+ });
94
+ Object.defineProperty(this, "signMessage", {
95
+ enumerable: true,
96
+ configurable: true,
97
+ writable: true,
98
+ value: async (msg) => {
99
+ const messageHash = hashMessage(msg);
100
+ return this.inner.signRawMessage(messageHash);
101
+ }
102
+ });
103
+ Object.defineProperty(this, "signTypedData", {
104
+ enumerable: true,
105
+ configurable: true,
106
+ writable: true,
107
+ value: async (params) => {
108
+ const messageHash = hashTypedData(params);
109
+ return this.inner.signRawMessage(messageHash);
110
+ }
111
+ });
112
+ Object.defineProperty(this, "signTransaction", {
113
+ enumerable: true,
114
+ configurable: true,
115
+ writable: true,
116
+ value: async (tx, args) => {
117
+ const serializeFn = args?.serializer ?? serializeTransaction;
118
+ const serializedTx = serializeFn(tx);
119
+ const signatureHex = await this.inner.signRawMessage(keccak256(serializedTx));
120
+ const signature = {
121
+ r: takeBytes(signatureHex, { count: 32 }),
122
+ s: takeBytes(signatureHex, { count: 32, offset: 32 }),
123
+ v: BigInt(takeBytes(signatureHex, { count: 1, offset: 64 })),
124
+ };
125
+ return serializeFn(tx, signature);
126
+ }
127
+ });
128
+ Object.defineProperty(this, "getUser", {
129
+ enumerable: true,
130
+ configurable: true,
131
+ writable: true,
132
+ value: async (email) => {
133
+ const result = await this.inner.lookupUserByEmail(email);
134
+ if (result.orgId == null) {
135
+ return null;
136
+ }
137
+ return {
138
+ orgId: result.orgId,
139
+ };
140
+ }
141
+ });
142
+ Object.defineProperty(this, "addPasskey", {
143
+ enumerable: true,
144
+ configurable: true,
145
+ writable: true,
146
+ value: async (params) => {
147
+ return this.inner.addPasskey(params ?? {});
148
+ }
149
+ });
150
+ Object.defineProperty(this, "exportWallet", {
151
+ enumerable: true,
152
+ configurable: true,
153
+ writable: true,
154
+ value: async (params) => {
155
+ return this.inner.exportWallet(params);
156
+ }
157
+ });
158
+ Object.defineProperty(this, "toViemAccount", {
159
+ enumerable: true,
160
+ configurable: true,
161
+ writable: true,
162
+ value: () => {
163
+ if (!this.inner.getUser()) {
164
+ throw new NotAuthenticatedError();
165
+ }
166
+ return toAccount({
167
+ address: this.inner.getUser().address,
168
+ signMessage: (msg) => this.signMessage(msg.message),
169
+ signTypedData: (typedDataDefinition) => this.signTypedData(typedDataDefinition),
170
+ signTransaction: this.signTransaction,
171
+ });
172
+ }
173
+ });
174
+ Object.defineProperty(this, "authenticateWithEmail", {
175
+ enumerable: true,
176
+ configurable: true,
177
+ writable: true,
178
+ value: async (params) => {
179
+ if ("email" in params) {
180
+ const existingUser = await this.getUser(params.email);
181
+ const { orgId } = existingUser
182
+ ? await this.inner.initEmailAuth({
183
+ email: params.email,
184
+ expirationSeconds: this.sessionManager.expirationTimeMs,
185
+ redirectParams: params.redirectParams,
186
+ })
187
+ : await this.inner.createAccount({
188
+ type: "email",
189
+ email: params.email,
190
+ expirationSeconds: this.sessionManager.expirationTimeMs,
191
+ redirectParams: params.redirectParams,
192
+ });
193
+ this.sessionManager.setTemporarySession({ orgId });
194
+ this.store.setState({ status: AlchemySignerStatus.AWAITING_EMAIL_AUTH });
195
+ return new Promise((resolve) => {
196
+ const removeListener = this.sessionManager.on("connected", (session) => {
197
+ resolve(session.user);
198
+ removeListener();
199
+ });
200
+ });
201
+ }
202
+ else {
203
+ const temporarySession = params.orgId
204
+ ? { orgId: params.orgId }
205
+ : this.sessionManager.getTemporarySession();
206
+ if (!temporarySession) {
207
+ this.store.setState({ status: AlchemySignerStatus.DISCONNECTED });
208
+ throw new Error("Could not find email auth init session!");
209
+ }
210
+ const user = await this.inner.completeEmailAuth({
211
+ bundle: params.bundle,
212
+ orgId: temporarySession.orgId,
213
+ });
214
+ return user;
215
+ }
216
+ }
217
+ });
218
+ Object.defineProperty(this, "authenticateWithPasskey", {
219
+ enumerable: true,
220
+ configurable: true,
221
+ writable: true,
222
+ value: async (args) => {
223
+ let user;
224
+ if (args.createNew) {
225
+ const result = await this.inner.createAccount(args);
226
+ user = {
227
+ address: result.address,
228
+ userId: result.userId,
229
+ orgId: result.orgId,
230
+ };
231
+ }
232
+ else {
233
+ user = await this.inner.lookupUserWithPasskey();
234
+ if (!user) {
235
+ this.store.setState({ status: AlchemySignerStatus.DISCONNECTED });
236
+ throw new Error("No user found");
237
+ }
238
+ }
239
+ return user;
240
+ }
241
+ });
242
+ Object.defineProperty(this, "registerListeners", {
243
+ enumerable: true,
244
+ configurable: true,
245
+ writable: true,
246
+ value: () => {
247
+ this.sessionManager.on("connected", (session) => {
248
+ this.store.setState({
249
+ user: session.user,
250
+ status: AlchemySignerStatus.CONNECTED,
251
+ });
252
+ });
253
+ this.sessionManager.on("disconnected", () => {
254
+ this.store.setState({
255
+ user: null,
256
+ status: AlchemySignerStatus.DISCONNECTED,
257
+ });
258
+ });
259
+ this.sessionManager.on("initialized", () => {
260
+ this.store.setState((state) => ({
261
+ status: state.user
262
+ ? AlchemySignerStatus.CONNECTED
263
+ : AlchemySignerStatus.DISCONNECTED,
264
+ }));
265
+ });
266
+ this.inner.on("authenticating", () => {
267
+ this.store.setState({ status: AlchemySignerStatus.AUTHENTICATING });
268
+ });
269
+ }
270
+ });
271
+ this.inner = client;
272
+ this.store = createStore(subscribeWithSelector(() => ({
273
+ user: null,
274
+ status: AlchemySignerStatus.INITIALIZING,
275
+ })));
276
+ this.sessionManager = new SessionManager({
277
+ ...sessionConfig,
278
+ client: this.inner,
279
+ });
280
+ this.store = createStore(subscribeWithSelector(() => ({
281
+ user: null,
282
+ status: AlchemySignerStatus.INITIALIZING,
283
+ })));
284
+ this.registerListeners();
285
+ this.sessionManager.initialize();
286
+ }
287
+ }
288
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { takeBytes, type SmartAccountAuthenticator } from \"@aa-sdk/core\";\nimport {\n hashMessage,\n hashTypedData,\n keccak256,\n serializeTransaction,\n type CustomSource,\n type Hex,\n type LocalAccount,\n type SignableMessage,\n type TypedData,\n type TypedDataDefinition,\n} from \"viem\";\nimport { toAccount } from \"viem/accounts\";\nimport type { Mutate, StoreApi } from \"zustand\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { createStore } from \"zustand/vanilla\";\nimport type { BaseSignerClient } from \"./client/base\";\nimport type { User } from \"./client/types\";\nimport { NotAuthenticatedError } from \"./errors.js\";\nimport {\n SessionManager,\n type SessionManagerParams,\n} from \"./session/manager.js\";\nimport type { AuthParams } from \"./signer\";\nimport {\n AlchemySignerStatus,\n type AlchemySignerEvent,\n type AlchemySignerEvents,\n} from \"./types.js\";\n\nexport interface BaseAlchemySignerParams<TClient extends BaseSignerClient> {\n client: TClient;\n sessionConfig?: Omit<SessionManagerParams, \"client\">;\n}\n\ntype AlchemySignerStore = {\n user: User | null;\n status: AlchemySignerStatus;\n};\n\ntype InternalStore = Mutate<\n StoreApi<AlchemySignerStore>,\n [[\"zustand/subscribeWithSelector\", never]]\n>;\n\nexport abstract class BaseAlchemySigner<TClient extends BaseSignerClient>\n implements SmartAccountAuthenticator<AuthParams, User, TClient>\n{\n signerType: string = \"alchemy-signer\";\n inner: TClient;\n private sessionManager: SessionManager;\n private store: InternalStore;\n\n constructor({ client, sessionConfig }: BaseAlchemySignerParams<TClient>) {\n this.inner = client;\n this.store = createStore(\n subscribeWithSelector(\n () =>\n ({\n user: null,\n status: AlchemySignerStatus.INITIALIZING,\n } satisfies AlchemySignerStore)\n )\n );\n // NOTE: it's important that the session manager share a client\n // with the signer. The SessionManager leverages the Signer's client\n // to manage session state.\n this.sessionManager = new SessionManager({\n ...sessionConfig,\n client: this.inner,\n });\n this.store = createStore(\n subscribeWithSelector(\n () =>\n ({\n user: null,\n status: AlchemySignerStatus.INITIALIZING,\n } satisfies AlchemySignerStore)\n )\n );\n // register listeners first\n this.registerListeners();\n // then initialize so that we can catch those events\n this.sessionManager.initialize();\n }\n\n /**\n * Allows you to subscribe to events emitted by the signer\n *\n * @param event the event to subscribe to\n * @param listener the function to run when the event is emitted\n * @returns a function to remove the listener\n */\n on = <E extends AlchemySignerEvent>(\n event: E,\n listener: AlchemySignerEvents[E]\n ) => {\n // NOTE: we're using zustand here to handle this because we are able to use the fireImmediately\n // option which deals with a possible race condition where the listener is added after the event\n // is fired. In the Client and SessionManager we use EventEmitter because it's easier to handle internally\n switch (event) {\n case \"connected\":\n return this.store.subscribe(\n ({ status }) => status,\n (status) =>\n status === AlchemySignerStatus.CONNECTED &&\n (listener as AlchemySignerEvents[\"connected\"])(\n this.store.getState().user!\n ),\n { fireImmediately: true }\n );\n case \"disconnected\":\n return this.store.subscribe(\n ({ status }) => status,\n (status) =>\n status === AlchemySignerStatus.DISCONNECTED &&\n (listener as AlchemySignerEvents[\"disconnected\"])(),\n { fireImmediately: true }\n );\n case \"statusChanged\":\n return this.store.subscribe(\n ({ status }) => status,\n listener as AlchemySignerEvents[\"statusChanged\"],\n { fireImmediately: true }\n );\n default:\n throw new Error(`Uknown event type ${event}`);\n }\n };\n\n /**\n * Authenticate a user with either an email or a passkey and create a session for that user\n *\n * @param params - undefined if passkey login, otherwise an object with email and bundle to resolve\n * @returns the user that was authenticated\n */\n authenticate: (params: AuthParams) => Promise<User> = async (params) => {\n if (params.type === \"email\") {\n return this.authenticateWithEmail(params);\n }\n\n return this.authenticateWithPasskey(params);\n };\n\n /**\n * NOTE: right now this only clears the session locally.\n */\n disconnect: () => Promise<void> = async () => {\n await this.inner.disconnect();\n };\n\n /**\n * Gets the current logged in user\n * If a user has an ongoing session, it will use that session and\n * try to authenticate\n *\n * @throws if there is no user logged in\n * @returns the current user\n */\n getAuthDetails: () => Promise<User> = async () => {\n const sessionUser = await this.sessionManager.getSessionUser();\n if (sessionUser != null) {\n return sessionUser;\n }\n\n return this.inner.whoami();\n };\n\n getAddress: () => Promise<`0x${string}`> = async () => {\n const { address } = await this.inner.whoami();\n\n return address;\n };\n\n signMessage: (msg: SignableMessage) => Promise<`0x${string}`> = async (\n msg\n ) => {\n const messageHash = hashMessage(msg);\n\n return this.inner.signRawMessage(messageHash);\n };\n\n signTypedData: <\n const TTypedData extends TypedData | { [key: string]: unknown },\n TPrimaryType extends keyof TTypedData | \"EIP712Domain\" = keyof TTypedData\n >(\n params: TypedDataDefinition<TTypedData, TPrimaryType>\n ) => Promise<Hex> = async (params) => {\n const messageHash = hashTypedData(params);\n\n return this.inner.signRawMessage(messageHash);\n };\n\n signTransaction: CustomSource[\"signTransaction\"] = async (tx, args) => {\n const serializeFn = args?.serializer ?? serializeTransaction;\n const serializedTx = serializeFn(tx);\n const signatureHex = await this.inner.signRawMessage(\n keccak256(serializedTx)\n );\n\n const signature = {\n r: takeBytes(signatureHex, { count: 32 }),\n s: takeBytes(signatureHex, { count: 32, offset: 32 }),\n v: BigInt(takeBytes(signatureHex, { count: 1, offset: 64 })),\n };\n\n return serializeFn(tx, signature);\n };\n\n /**\n * Unauthenticated call to look up a user's organizationId by email\n *\n * @param email the email to lookup\n * @returns the organization id for the user if they exist\n */\n getUser: (email: string) => Promise<{ orgId: string } | null> = async (\n email\n ) => {\n const result = await this.inner.lookupUserByEmail(email);\n\n if (result.orgId == null) {\n return null;\n }\n\n return {\n orgId: result.orgId,\n };\n };\n\n /**\n * Adds a passkey to the user's account\n *\n * @param params optional parameters for the passkey creation\n * @returns an array of the authenticator ids added to the user\n */\n addPasskey: (params?: CredentialCreationOptions) => Promise<string[]> =\n async (params) => {\n return this.inner.addPasskey(params ?? {});\n };\n\n /**\n * Used to export the wallet for a given user\n * If the user is authenticated with an Email, this will return a seed phrase\n * If the user is authenticated with a Passkey, this will return a private key\n *\n * @param params export wallet parameters\n * @returns true if the wallet was exported successfully\n */\n exportWallet: (\n params: Parameters<(typeof this.inner)[\"exportWallet\"]>[0]\n ) => Promise<boolean> = async (params) => {\n return this.inner.exportWallet(params);\n };\n\n /**\n * This method lets you adapt your AlchemySigner to a viem LocalAccount, which\n * will let you use the signer as an EOA directly.\n *\n * @throws if your signer is not authenticated\n * @returns a LocalAccount object that can be used with viem's wallet client\n */\n toViemAccount: () => LocalAccount = () => {\n // if we want this method to be synchronous, then we need to do this check here\n // otherwise we can use the sessionManager to get the user\n if (!this.inner.getUser()) {\n throw new NotAuthenticatedError();\n }\n\n return toAccount({\n address: this.inner.getUser()!.address,\n signMessage: (msg) => this.signMessage(msg.message),\n signTypedData: <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData\n >(\n typedDataDefinition: TypedDataDefinition<typedData, primaryType>\n ) => this.signTypedData<typedData, primaryType>(typedDataDefinition),\n signTransaction: this.signTransaction,\n });\n };\n\n private authenticateWithEmail = async (\n params: Extract<AuthParams, { type: \"email\" }>\n ): Promise<User> => {\n if (\"email\" in params) {\n const existingUser = await this.getUser(params.email);\n\n const { orgId } = existingUser\n ? await this.inner.initEmailAuth({\n email: params.email,\n expirationSeconds: this.sessionManager.expirationTimeMs,\n redirectParams: params.redirectParams,\n })\n : await this.inner.createAccount({\n type: \"email\",\n email: params.email,\n expirationSeconds: this.sessionManager.expirationTimeMs,\n redirectParams: params.redirectParams,\n });\n\n this.sessionManager.setTemporarySession({ orgId });\n this.store.setState({ status: AlchemySignerStatus.AWAITING_EMAIL_AUTH });\n\n // We wait for the session manager to emit a connected event if\n // cross tab sessions are permitted\n return new Promise<User>((resolve) => {\n const removeListener = this.sessionManager.on(\n \"connected\",\n (session) => {\n resolve(session.user);\n removeListener();\n }\n );\n });\n } else {\n const temporarySession = params.orgId\n ? { orgId: params.orgId }\n : this.sessionManager.getTemporarySession();\n\n if (!temporarySession) {\n this.store.setState({ status: AlchemySignerStatus.DISCONNECTED });\n throw new Error(\"Could not find email auth init session!\");\n }\n\n const user = await this.inner.completeEmailAuth({\n bundle: params.bundle,\n orgId: temporarySession.orgId,\n });\n\n return user;\n }\n };\n\n private authenticateWithPasskey = async (\n args: Extract<AuthParams, { type: \"passkey\" }>\n ) => {\n let user: User;\n if (args.createNew) {\n const result = await this.inner.createAccount(args);\n // account creation for passkeys returns the whoami response so we don't have to\n // call it again after signup\n user = {\n address: result.address!,\n userId: result.userId!,\n orgId: result.orgId,\n };\n } else {\n user = await this.inner.lookupUserWithPasskey();\n if (!user) {\n this.store.setState({ status: AlchemySignerStatus.DISCONNECTED });\n throw new Error(\"No user found\");\n }\n }\n\n return user;\n };\n\n private registerListeners = () => {\n this.sessionManager.on(\"connected\", (session) => {\n this.store.setState({\n user: session.user,\n status: AlchemySignerStatus.CONNECTED,\n });\n });\n\n this.sessionManager.on(\"disconnected\", () => {\n this.store.setState({\n user: null,\n status: AlchemySignerStatus.DISCONNECTED,\n });\n });\n\n this.sessionManager.on(\"initialized\", () => {\n this.store.setState((state) => ({\n status: state.user\n ? AlchemySignerStatus.CONNECTED\n : AlchemySignerStatus.DISCONNECTED,\n }));\n });\n\n this.inner.on(\"authenticating\", () => {\n this.store.setState({ status: AlchemySignerStatus.AUTHENTICATING });\n });\n };\n}\n"]}
@@ -0,0 +1,230 @@
1
+ import { type ConnectionConfig } from "@aa-sdk/core";
2
+ import { TurnkeyClient } from "@turnkey/http";
3
+ import EventEmitter from "eventemitter3";
4
+ import type { Hex } from "viem";
5
+ import type { AlchemySignerClientEvents, CreateAccountParams, EmailAuthParams, GetWebAuthnAttestationResult, SignerBody, SignerResponse, SignupResponse, User } from "./types.js";
6
+ export interface BaseSignerClientParams {
7
+ stamper: TurnkeyClient["stamper"];
8
+ connection: ConnectionConfig;
9
+ rootOrgId?: string;
10
+ rpId?: string;
11
+ }
12
+ export type ExportWalletStamper = TurnkeyClient["stamper"] & {
13
+ injectWalletExportBundle(bundle: string): Promise<boolean>;
14
+ injectKeyExportBundle(bundle: string): Promise<boolean>;
15
+ publicKey(): string | null;
16
+ };
17
+ export declare abstract class BaseSignerClient<TExportWalletParams = unknown> {
18
+ private _user;
19
+ private connectionConfig;
20
+ protected turnkeyClient: TurnkeyClient;
21
+ protected rootOrg: string;
22
+ protected eventEmitter: EventEmitter<AlchemySignerClientEvents>;
23
+ constructor(params: BaseSignerClientParams);
24
+ protected get user(): User | undefined;
25
+ protected set user(user: User | undefined);
26
+ protected setStamper(stamper: TurnkeyClient["stamper"]): void;
27
+ protected exportWalletInner(params: {
28
+ exportStamper: ExportWalletStamper;
29
+ exportAs: "SEED_PHRASE" | "PRIVATE_KEY";
30
+ }): Promise<boolean>;
31
+ abstract createAccount(params: CreateAccountParams): Promise<SignupResponse>;
32
+ abstract initEmailAuth(params: Omit<EmailAuthParams, "targetPublicKey">): Promise<{
33
+ orgId: string;
34
+ }>;
35
+ abstract completeEmailAuth(params: {
36
+ bundle: string;
37
+ orgId: string;
38
+ }): Promise<User>;
39
+ abstract disconnect(): Promise<void>;
40
+ abstract exportWallet(params: TExportWalletParams): Promise<boolean>;
41
+ abstract lookupUserWithPasskey(user?: User): Promise<User>;
42
+ protected abstract getWebAuthnAttestation(options: CredentialCreationOptions, userDetails?: {
43
+ username: string;
44
+ }): Promise<GetWebAuthnAttestationResult>;
45
+ on: <E extends keyof AlchemySignerClientEvents>(event: E, listener: AlchemySignerClientEvents[E]) => () => EventEmitter<AlchemySignerClientEvents, any>;
46
+ addPasskey: (options: CredentialCreationOptions) => Promise<string[]>;
47
+ whoami: (orgId?: string | undefined) => Promise<User>;
48
+ lookupUserByEmail: (email: string) => Promise<{
49
+ orgId: string | null;
50
+ }>;
51
+ signRawMessage: (msg: Hex) => Promise<`0x${string}`>;
52
+ getUser: () => User | null;
53
+ request: <R extends "/v1/signup" | "/v1/whoami" | "/v1/auth" | "/v1/lookup" | "/v1/sign-payload">(route: R, body: SignerBody<R>) => Promise<SignerResponse<R>>;
54
+ private exportAsSeedPhrase;
55
+ private exportAsPrivateKey;
56
+ protected pollActivityCompletion: <T extends "createOrganizationResult" | "createAuthenticatorsResult" | "createUsersResult" | "createPrivateKeysResult" | "createInvitationsResult" | "acceptInvitationResult" | "signRawPayloadResult" | "createPolicyResult" | "disablePrivateKeyResult" | "deleteUsersResult" | "deleteAuthenticatorsResult" | "deleteInvitationResult" | "deleteOrganizationResult" | "deletePolicyResult" | "createUserTagResult" | "deleteUserTagsResult" | "signTransactionResult" | "deleteApiKeysResult" | "createApiKeysResult" | "createPrivateKeyTagResult" | "deletePrivateKeyTagsResult" | "setPaymentMethodResult" | "activateBillingTierResult" | "deletePaymentMethodResult" | "createApiOnlyUsersResult" | "updateRootQuorumResult" | "updateUserTagResult" | "updatePrivateKeyTagResult" | "createSubOrganizationResult" | "updateAllowedOriginsResult" | "createPrivateKeysResultV2" | "updateUserResult" | "updatePolicyResult" | "createSubOrganizationResultV3" | "createWalletResult" | "createWalletAccountsResult" | "initUserEmailRecoveryResult" | "recoverUserResult" | "setOrganizationFeatureResult" | "removeOrganizationFeatureResult" | "exportPrivateKeyResult" | "exportWalletResult" | "createSubOrganizationResultV4" | "emailAuthResult" | "exportWalletAccountResult">(activity: Awaited<ReturnType<(typeof this.turnkeyClient)["getActivity"]>>["activity"], organizationId: string, resultKey: T) => Promise<NonNullable<{
57
+ createOrganizationResult?: {
58
+ organizationId: string;
59
+ } | undefined;
60
+ createAuthenticatorsResult?: {
61
+ authenticatorIds: string[];
62
+ } | undefined;
63
+ createUsersResult?: {
64
+ userIds: string[];
65
+ } | undefined;
66
+ createPrivateKeysResult?: {
67
+ privateKeyIds: string[];
68
+ } | undefined;
69
+ createInvitationsResult?: {
70
+ invitationIds: string[];
71
+ } | undefined;
72
+ acceptInvitationResult?: {
73
+ invitationId: string;
74
+ userId: string;
75
+ } | undefined;
76
+ signRawPayloadResult?: {
77
+ r: string;
78
+ s: string;
79
+ v: string;
80
+ } | undefined;
81
+ createPolicyResult?: {
82
+ policyId: string;
83
+ } | undefined;
84
+ disablePrivateKeyResult?: {
85
+ privateKeyId: string;
86
+ } | undefined;
87
+ deleteUsersResult?: {
88
+ userIds: string[];
89
+ } | undefined;
90
+ deleteAuthenticatorsResult?: {
91
+ authenticatorIds: string[];
92
+ } | undefined;
93
+ deleteInvitationResult?: {
94
+ invitationId: string;
95
+ } | undefined;
96
+ deleteOrganizationResult?: {
97
+ organizationId: string;
98
+ } | undefined;
99
+ deletePolicyResult?: {
100
+ policyId: string;
101
+ } | undefined;
102
+ createUserTagResult?: {
103
+ userTagId: string;
104
+ userIds: string[];
105
+ } | undefined;
106
+ deleteUserTagsResult?: {
107
+ userTagIds: string[];
108
+ userIds: string[];
109
+ } | undefined;
110
+ signTransactionResult?: {
111
+ signedTransaction: string;
112
+ } | undefined;
113
+ deleteApiKeysResult?: {
114
+ apiKeyIds: string[];
115
+ } | undefined;
116
+ createApiKeysResult?: {
117
+ apiKeyIds: string[];
118
+ } | undefined;
119
+ createPrivateKeyTagResult?: {
120
+ privateKeyTagId: string;
121
+ privateKeyIds: string[];
122
+ } | undefined;
123
+ deletePrivateKeyTagsResult?: {
124
+ privateKeyTagIds: string[];
125
+ privateKeyIds: string[];
126
+ } | undefined;
127
+ setPaymentMethodResult?: {
128
+ lastFour: string;
129
+ cardHolderName: string;
130
+ cardHolderEmail: string;
131
+ } | undefined;
132
+ activateBillingTierResult?: {
133
+ productId: string;
134
+ } | undefined;
135
+ deletePaymentMethodResult?: {
136
+ paymentMethodId: string;
137
+ } | undefined;
138
+ createApiOnlyUsersResult?: {
139
+ userIds: string[];
140
+ } | undefined;
141
+ updateRootQuorumResult?: {
142
+ [key: string]: unknown;
143
+ } | undefined;
144
+ updateUserTagResult?: {
145
+ userTagId: string;
146
+ } | undefined;
147
+ updatePrivateKeyTagResult?: {
148
+ privateKeyTagId: string;
149
+ } | undefined;
150
+ createSubOrganizationResult?: {
151
+ subOrganizationId: string;
152
+ } | undefined;
153
+ updateAllowedOriginsResult?: {
154
+ [key: string]: unknown;
155
+ } | undefined;
156
+ createPrivateKeysResultV2?: {
157
+ privateKeys: {
158
+ privateKeyId?: string | undefined;
159
+ addresses?: {
160
+ format?: "ADDRESS_FORMAT_UNCOMPRESSED" | "ADDRESS_FORMAT_COMPRESSED" | "ADDRESS_FORMAT_ETHEREUM" | "ADDRESS_FORMAT_SOLANA" | "ADDRESS_FORMAT_COSMOS" | undefined;
161
+ address?: string | undefined;
162
+ }[] | undefined;
163
+ }[];
164
+ } | undefined;
165
+ updateUserResult?: {
166
+ userId: string;
167
+ } | undefined;
168
+ updatePolicyResult?: {
169
+ policyId: string;
170
+ } | undefined;
171
+ createSubOrganizationResultV3?: {
172
+ subOrganizationId: string;
173
+ privateKeys: {
174
+ privateKeyId?: string | undefined;
175
+ addresses?: {
176
+ format?: "ADDRESS_FORMAT_UNCOMPRESSED" | "ADDRESS_FORMAT_COMPRESSED" | "ADDRESS_FORMAT_ETHEREUM" | "ADDRESS_FORMAT_SOLANA" | "ADDRESS_FORMAT_COSMOS" | undefined;
177
+ address?: string | undefined;
178
+ }[] | undefined;
179
+ }[];
180
+ } | undefined;
181
+ createWalletResult?: {
182
+ walletId: string;
183
+ addresses: string[];
184
+ } | undefined;
185
+ createWalletAccountsResult?: {
186
+ addresses: string[];
187
+ } | undefined;
188
+ initUserEmailRecoveryResult?: {
189
+ userId: string;
190
+ } | undefined;
191
+ recoverUserResult?: {
192
+ authenticatorId: string[];
193
+ } | undefined;
194
+ setOrganizationFeatureResult?: {
195
+ features: {
196
+ name?: "FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY" | "FEATURE_NAME_WEBAUTHN_ORIGINS" | "FEATURE_NAME_EMAIL_AUTH" | "FEATURE_NAME_EMAIL_RECOVERY" | undefined;
197
+ value?: string | undefined;
198
+ }[];
199
+ } | undefined;
200
+ removeOrganizationFeatureResult?: {
201
+ features: {
202
+ name?: "FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY" | "FEATURE_NAME_WEBAUTHN_ORIGINS" | "FEATURE_NAME_EMAIL_AUTH" | "FEATURE_NAME_EMAIL_RECOVERY" | undefined;
203
+ value?: string | undefined;
204
+ }[];
205
+ } | undefined;
206
+ exportPrivateKeyResult?: {
207
+ privateKeyId: string;
208
+ exportBundle: string;
209
+ } | undefined;
210
+ exportWalletResult?: {
211
+ walletId: string;
212
+ exportBundle: string;
213
+ } | undefined;
214
+ createSubOrganizationResultV4?: {
215
+ subOrganizationId: string;
216
+ wallet?: {
217
+ walletId: string;
218
+ addresses: string[];
219
+ } | undefined;
220
+ } | undefined;
221
+ emailAuthResult?: {
222
+ userId: string;
223
+ apiKeyId: string;
224
+ } | undefined;
225
+ exportWalletAccountResult?: {
226
+ address: string;
227
+ exportBundle: string;
228
+ } | undefined;
229
+ }[T]>>;
230
+ }