@haneullabs/enoki 0.1.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 (110) hide show
  1. package/CHANGELOG.md +1109 -0
  2. package/README.md +1 -0
  3. package/dist/cjs/EnokiClient/index.d.ts +36 -0
  4. package/dist/cjs/EnokiClient/index.js +196 -0
  5. package/dist/cjs/EnokiClient/index.js.map +7 -0
  6. package/dist/cjs/EnokiClient/type.d.ts +119 -0
  7. package/dist/cjs/EnokiClient/type.js +17 -0
  8. package/dist/cjs/EnokiClient/type.js.map +7 -0
  9. package/dist/cjs/EnokiFlow.d.ts +74 -0
  10. package/dist/cjs/EnokiFlow.js +279 -0
  11. package/dist/cjs/EnokiFlow.js.map +7 -0
  12. package/dist/cjs/EnokiKeypair.d.ts +20 -0
  13. package/dist/cjs/EnokiKeypair.js +87 -0
  14. package/dist/cjs/EnokiKeypair.js.map +7 -0
  15. package/dist/cjs/encryption.d.ts +15 -0
  16. package/dist/cjs/encryption.js +96 -0
  17. package/dist/cjs/encryption.js.map +7 -0
  18. package/dist/cjs/index.d.ts +12 -0
  19. package/dist/cjs/index.js +50 -0
  20. package/dist/cjs/index.js.map +7 -0
  21. package/dist/cjs/package.json +4 -0
  22. package/dist/cjs/react.d.ts +20 -0
  23. package/dist/cjs/react.js +76 -0
  24. package/dist/cjs/react.js.map +7 -0
  25. package/dist/cjs/stores.d.ts +21 -0
  26. package/dist/cjs/stores.js +67 -0
  27. package/dist/cjs/stores.js.map +7 -0
  28. package/dist/cjs/utils.d.ts +2 -0
  29. package/dist/cjs/utils.js +27 -0
  30. package/dist/cjs/utils.js.map +7 -0
  31. package/dist/cjs/wallet/features.d.ts +50 -0
  32. package/dist/cjs/wallet/features.js +27 -0
  33. package/dist/cjs/wallet/features.js.map +7 -0
  34. package/dist/cjs/wallet/initializer.d.ts +11 -0
  35. package/dist/cjs/wallet/initializer.js +41 -0
  36. package/dist/cjs/wallet/initializer.js.map +7 -0
  37. package/dist/cjs/wallet/providers.d.ts +7 -0
  38. package/dist/cjs/wallet/providers.js +51 -0
  39. package/dist/cjs/wallet/providers.js.map +7 -0
  40. package/dist/cjs/wallet/register.d.ts +7 -0
  41. package/dist/cjs/wallet/register.js +68 -0
  42. package/dist/cjs/wallet/register.js.map +7 -0
  43. package/dist/cjs/wallet/state.d.ts +18 -0
  44. package/dist/cjs/wallet/state.js +142 -0
  45. package/dist/cjs/wallet/state.js.map +7 -0
  46. package/dist/cjs/wallet/types.d.ts +82 -0
  47. package/dist/cjs/wallet/types.js +17 -0
  48. package/dist/cjs/wallet/types.js.map +7 -0
  49. package/dist/cjs/wallet/utils.d.ts +11 -0
  50. package/dist/cjs/wallet/utils.js +83 -0
  51. package/dist/cjs/wallet/utils.js.map +7 -0
  52. package/dist/cjs/wallet/wallet.d.ts +16 -0
  53. package/dist/cjs/wallet/wallet.js +466 -0
  54. package/dist/cjs/wallet/wallet.js.map +7 -0
  55. package/dist/esm/EnokiClient/index.d.ts +36 -0
  56. package/dist/esm/EnokiClient/index.js +176 -0
  57. package/dist/esm/EnokiClient/index.js.map +7 -0
  58. package/dist/esm/EnokiClient/type.d.ts +119 -0
  59. package/dist/esm/EnokiClient/type.js +1 -0
  60. package/dist/esm/EnokiClient/type.js.map +7 -0
  61. package/dist/esm/EnokiFlow.d.ts +74 -0
  62. package/dist/esm/EnokiFlow.js +259 -0
  63. package/dist/esm/EnokiFlow.js.map +7 -0
  64. package/dist/esm/EnokiKeypair.d.ts +20 -0
  65. package/dist/esm/EnokiKeypair.js +67 -0
  66. package/dist/esm/EnokiKeypair.js.map +7 -0
  67. package/dist/esm/encryption.d.ts +15 -0
  68. package/dist/esm/encryption.js +76 -0
  69. package/dist/esm/encryption.js.map +7 -0
  70. package/dist/esm/index.d.ts +12 -0
  71. package/dist/esm/index.js +41 -0
  72. package/dist/esm/index.js.map +7 -0
  73. package/dist/esm/package.json +4 -0
  74. package/dist/esm/react.d.ts +20 -0
  75. package/dist/esm/react.js +56 -0
  76. package/dist/esm/react.js.map +7 -0
  77. package/dist/esm/stores.d.ts +21 -0
  78. package/dist/esm/stores.js +47 -0
  79. package/dist/esm/stores.js.map +7 -0
  80. package/dist/esm/utils.d.ts +2 -0
  81. package/dist/esm/utils.js +7 -0
  82. package/dist/esm/utils.js.map +7 -0
  83. package/dist/esm/wallet/features.d.ts +50 -0
  84. package/dist/esm/wallet/features.js +7 -0
  85. package/dist/esm/wallet/features.js.map +7 -0
  86. package/dist/esm/wallet/initializer.d.ts +11 -0
  87. package/dist/esm/wallet/initializer.js +21 -0
  88. package/dist/esm/wallet/initializer.js.map +7 -0
  89. package/dist/esm/wallet/providers.d.ts +7 -0
  90. package/dist/esm/wallet/providers.js +31 -0
  91. package/dist/esm/wallet/providers.js.map +7 -0
  92. package/dist/esm/wallet/register.d.ts +7 -0
  93. package/dist/esm/wallet/register.js +48 -0
  94. package/dist/esm/wallet/register.js.map +7 -0
  95. package/dist/esm/wallet/state.d.ts +18 -0
  96. package/dist/esm/wallet/state.js +122 -0
  97. package/dist/esm/wallet/state.js.map +7 -0
  98. package/dist/esm/wallet/types.d.ts +82 -0
  99. package/dist/esm/wallet/types.js +1 -0
  100. package/dist/esm/wallet/types.js.map +7 -0
  101. package/dist/esm/wallet/utils.d.ts +11 -0
  102. package/dist/esm/wallet/utils.js +63 -0
  103. package/dist/esm/wallet/utils.js.map +7 -0
  104. package/dist/esm/wallet/wallet.d.ts +16 -0
  105. package/dist/esm/wallet/wallet.js +444 -0
  106. package/dist/esm/wallet/wallet.js.map +7 -0
  107. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  108. package/dist/tsconfig.tsbuildinfo +1 -0
  109. package/package.json +80 -0
  110. package/react/package.json +5 -0
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __typeError = (msg) => {
9
+ throw TypeError(msg);
10
+ };
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
+ mod
30
+ ));
31
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
33
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
34
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
35
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
36
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
37
+ var wallet_exports = {};
38
+ __export(wallet_exports, {
39
+ EnokiWallet: () => EnokiWallet
40
+ });
41
+ module.exports = __toCommonJS(wallet_exports);
42
+ var import_transactions = require("@haneullabs/haneul/transactions");
43
+ var import_utils = require("@haneullabs/haneul/utils");
44
+ var import_wallet_standard = require("@haneullabs/wallet-standard");
45
+ var import_mitt = __toESM(require("mitt"));
46
+ var import_features = require("./features.js");
47
+ var import_zklogin = require("@haneullabs/haneul/zklogin");
48
+ var import_webcrypto = require("@haneullabs/signers/webcrypto");
49
+ var import_idb_keyval = require("idb-keyval");
50
+ var import_EnokiClient = require("../EnokiClient/index.js");
51
+ var import_EnokiKeypair = require("../EnokiKeypair.js");
52
+ var import_state = require("./state.js");
53
+ var import_nanostores = require("nanostores");
54
+ var _events, _accounts, _name, _icon, _enokiClient, _state, _provider, _clientId, _redirectUrl, _extraParams, _getCurrentNetwork, _windowFeatures, _signTransaction, _signAndExecuteTransaction, _signPersonalMessage, _getMetadata, _getSession, _on, _connect, _disconnect, _EnokiWallet_instances, getAuthorizedAccounts_fn, getKeypair_fn, getSignerContext_fn, createSession_fn, getPKCEFlowContext_fn, createAuthorizationURL_fn, handleAuthCallback_fn, pkceTokenExchange_fn;
55
+ const pkceFlowProviders = {
56
+ playtron: {
57
+ tokenEndpoint: "https://oauth2.playtron.one/oauth2/token"
58
+ }
59
+ };
60
+ class EnokiWallet {
61
+ constructor({
62
+ name,
63
+ icon,
64
+ provider,
65
+ clientId,
66
+ redirectUrl,
67
+ extraParams,
68
+ windowFeatures,
69
+ getCurrentNetwork,
70
+ apiKey,
71
+ apiUrl,
72
+ additionalEpochs,
73
+ clients
74
+ }) {
75
+ __privateAdd(this, _EnokiWallet_instances);
76
+ __privateAdd(this, _events);
77
+ __privateAdd(this, _accounts);
78
+ __privateAdd(this, _name);
79
+ __privateAdd(this, _icon);
80
+ __privateAdd(this, _enokiClient);
81
+ __privateAdd(this, _state);
82
+ __privateAdd(this, _provider);
83
+ __privateAdd(this, _clientId);
84
+ __privateAdd(this, _redirectUrl);
85
+ __privateAdd(this, _extraParams);
86
+ __privateAdd(this, _getCurrentNetwork);
87
+ __privateAdd(this, _windowFeatures);
88
+ __privateAdd(this, _signTransaction, async ({ transaction, chain, account, signal }) => {
89
+ signal?.throwIfAborted();
90
+ const { client, keypair } = await __privateMethod(this, _EnokiWallet_instances, getSignerContext_fn).call(this, chain);
91
+ const parsedTransaction = import_transactions.Transaction.from(await transaction.toJSON());
92
+ const haneulAddress = keypair.toHaneulAddress();
93
+ if (haneulAddress !== account.address) {
94
+ throw new Error(
95
+ `The specified account ${account.address} does not match the currently connected Enoki address ${haneulAddress}.`
96
+ );
97
+ }
98
+ parsedTransaction.setSenderIfNotSet(haneulAddress);
99
+ return keypair.signTransaction(await parsedTransaction.build({ client }));
100
+ });
101
+ __privateAdd(this, _signAndExecuteTransaction, async ({
102
+ transaction,
103
+ chain,
104
+ account,
105
+ signal
106
+ }) => {
107
+ signal?.throwIfAborted();
108
+ const { client, keypair } = await __privateMethod(this, _EnokiWallet_instances, getSignerContext_fn).call(this, chain);
109
+ const parsedTransaction = import_transactions.Transaction.from(await transaction.toJSON());
110
+ const bytes = await parsedTransaction.build({ client });
111
+ const haneulAddress = keypair.toHaneulAddress();
112
+ if (haneulAddress !== account.address) {
113
+ throw new Error(
114
+ `The specified account ${account.address} does not match the currently connected Enoki address ${haneulAddress}.`
115
+ );
116
+ }
117
+ parsedTransaction.setSenderIfNotSet(haneulAddress);
118
+ const result = await keypair.signAndExecuteTransaction({
119
+ transaction: parsedTransaction,
120
+ client
121
+ });
122
+ return {
123
+ bytes: (0, import_utils.toBase64)(bytes),
124
+ signature: result.signatures[0],
125
+ digest: result.digest,
126
+ effects: (0, import_utils.toBase64)(result.effects.bcs)
127
+ };
128
+ });
129
+ __privateAdd(this, _signPersonalMessage, async ({ message, account, chain }) => {
130
+ const { keypair } = await __privateMethod(this, _EnokiWallet_instances, getSignerContext_fn).call(this, chain);
131
+ const haneulAddress = keypair.toHaneulAddress();
132
+ if (haneulAddress !== account.address) {
133
+ throw new Error(
134
+ `The specified account ${account.address} does not match the currently connected Enoki address ${haneulAddress}.`
135
+ );
136
+ }
137
+ return keypair.signPersonalMessage(message);
138
+ });
139
+ __privateAdd(this, _getMetadata, () => {
140
+ return {
141
+ provider: __privateGet(this, _provider)
142
+ };
143
+ });
144
+ __privateAdd(this, _getSession, async (input) => {
145
+ const sessionContext = __privateGet(this, _state).getSessionContext(
146
+ input?.network ?? __privateGet(this, _getCurrentNetwork).call(this)
147
+ );
148
+ return await __privateGet(this, _state).getSession(sessionContext);
149
+ });
150
+ __privateAdd(this, _on, (event, listener) => {
151
+ __privateGet(this, _events).on(event, listener);
152
+ return () => __privateGet(this, _events).off(event, listener);
153
+ });
154
+ __privateAdd(this, _connect, async (input) => {
155
+ await (0, import_nanostores.allTasks)();
156
+ if (input?.silent || __privateGet(this, _accounts).length > 0) {
157
+ return { accounts: __privateGet(this, _accounts) };
158
+ }
159
+ const currentNetwork = __privateGet(this, _getCurrentNetwork).call(this);
160
+ await __privateMethod(this, _EnokiWallet_instances, createSession_fn).call(this, { network: currentNetwork });
161
+ return { accounts: __privateGet(this, _accounts) };
162
+ });
163
+ __privateAdd(this, _disconnect, async () => {
164
+ await __privateGet(this, _state).logout();
165
+ __privateSet(this, _accounts, []);
166
+ __privateGet(this, _events).emit("change", { accounts: __privateGet(this, _accounts) });
167
+ });
168
+ __privateSet(this, _events, (0, import_mitt.default)());
169
+ __privateSet(this, _name, name);
170
+ __privateSet(this, _icon, icon);
171
+ __privateSet(this, _enokiClient, new import_EnokiClient.EnokiClient({ apiKey, apiUrl, additionalEpochs }));
172
+ __privateSet(this, _state, new import_state.EnokiWalletState({ apiKey, clientId, clients }));
173
+ __privateSet(this, _provider, provider);
174
+ __privateSet(this, _clientId, clientId);
175
+ __privateSet(this, _redirectUrl, redirectUrl || window.location.href.split("#")[0]);
176
+ __privateSet(this, _extraParams, extraParams);
177
+ __privateSet(this, _windowFeatures, windowFeatures);
178
+ __privateSet(this, _getCurrentNetwork, getCurrentNetwork);
179
+ __privateSet(this, _accounts, []);
180
+ __privateGet(this, _state).zkLoginState.subscribe(() => {
181
+ __privateSet(this, _accounts, __privateMethod(this, _EnokiWallet_instances, getAuthorizedAccounts_fn).call(this));
182
+ __privateGet(this, _events).emit("change", { accounts: __privateGet(this, _accounts) });
183
+ });
184
+ }
185
+ get name() {
186
+ return __privateGet(this, _name);
187
+ }
188
+ get provider() {
189
+ return __privateGet(this, _provider);
190
+ }
191
+ get icon() {
192
+ return __privateGet(this, _icon);
193
+ }
194
+ get version() {
195
+ return "1.0.0";
196
+ }
197
+ get chains() {
198
+ return [...__privateGet(this, _state).sessionContextByNetwork.keys()].map(
199
+ (network) => `sui:${network}`
200
+ );
201
+ }
202
+ get accounts() {
203
+ return __privateGet(this, _accounts);
204
+ }
205
+ get features() {
206
+ return {
207
+ [import_wallet_standard.StandardConnect]: {
208
+ version: "1.0.0",
209
+ connect: __privateGet(this, _connect)
210
+ },
211
+ [import_wallet_standard.StandardDisconnect]: {
212
+ version: "1.0.0",
213
+ disconnect: __privateGet(this, _disconnect)
214
+ },
215
+ [import_wallet_standard.StandardEvents]: {
216
+ version: "1.0.0",
217
+ on: __privateGet(this, _on)
218
+ },
219
+ [import_wallet_standard.HaneulSignTransaction]: {
220
+ version: "2.0.0",
221
+ signTransaction: __privateGet(this, _signTransaction)
222
+ },
223
+ [import_wallet_standard.HaneulSignAndExecuteTransaction]: {
224
+ version: "2.0.0",
225
+ signAndExecuteTransaction: __privateGet(this, _signAndExecuteTransaction)
226
+ },
227
+ [import_wallet_standard.HaneulSignPersonalMessage]: {
228
+ version: "1.1.0",
229
+ signPersonalMessage: __privateGet(this, _signPersonalMessage)
230
+ },
231
+ [import_features.EnokiGetMetadata]: {
232
+ version: "1.0.0",
233
+ getMetadata: __privateGet(this, _getMetadata)
234
+ },
235
+ [import_features.EnokiGetSession]: {
236
+ version: "1.0.0",
237
+ getSession: __privateGet(this, _getSession)
238
+ }
239
+ };
240
+ }
241
+ }
242
+ _events = new WeakMap();
243
+ _accounts = new WeakMap();
244
+ _name = new WeakMap();
245
+ _icon = new WeakMap();
246
+ _enokiClient = new WeakMap();
247
+ _state = new WeakMap();
248
+ _provider = new WeakMap();
249
+ _clientId = new WeakMap();
250
+ _redirectUrl = new WeakMap();
251
+ _extraParams = new WeakMap();
252
+ _getCurrentNetwork = new WeakMap();
253
+ _windowFeatures = new WeakMap();
254
+ _signTransaction = new WeakMap();
255
+ _signAndExecuteTransaction = new WeakMap();
256
+ _signPersonalMessage = new WeakMap();
257
+ _getMetadata = new WeakMap();
258
+ _getSession = new WeakMap();
259
+ _on = new WeakMap();
260
+ _connect = new WeakMap();
261
+ _disconnect = new WeakMap();
262
+ _EnokiWallet_instances = new WeakSet();
263
+ getAuthorizedAccounts_fn = function() {
264
+ const zkLoginState = __privateGet(this, _state).zkLoginState.get();
265
+ if (zkLoginState) {
266
+ return [
267
+ new import_wallet_standard.ReadonlyWalletAccount({
268
+ address: zkLoginState.address,
269
+ chains: this.chains,
270
+ icon: this.icon,
271
+ features: [import_wallet_standard.HaneulSignPersonalMessage, import_wallet_standard.HaneulSignTransaction, import_wallet_standard.HaneulSignAndExecuteTransaction],
272
+ publicKey: (0, import_utils.fromBase64)(zkLoginState.publicKey)
273
+ })
274
+ ];
275
+ }
276
+ return [];
277
+ };
278
+ getKeypair_fn = async function(sessionContext) {
279
+ const session = await __privateGet(this, _state).getSession(sessionContext);
280
+ if (!session?.jwt || Date.now() > session.expiresAt) {
281
+ await __privateMethod(this, _EnokiWallet_instances, createSession_fn).call(this, { network: sessionContext.client.network });
282
+ }
283
+ const storedNativeSigner = await (0, import_idb_keyval.get)(
284
+ "ephemeralKeyPair",
285
+ sessionContext.idbStore
286
+ );
287
+ if (!storedNativeSigner) {
288
+ throw new Error("Native signer not found in store.");
289
+ }
290
+ const updatedSession = await __privateGet(this, _state).getSession(sessionContext);
291
+ if (!updatedSession?.jwt) {
292
+ throw new Error("Failed to retrieve an active session.");
293
+ }
294
+ const ephemeralKeypair = import_webcrypto.WebCryptoSigner.import(storedNativeSigner);
295
+ const proof = updatedSession.proof ?? await __privateGet(this, _enokiClient).createZkLoginZkp({
296
+ network: sessionContext.client.network,
297
+ jwt: updatedSession.jwt,
298
+ maxEpoch: updatedSession.maxEpoch,
299
+ randomness: updatedSession.randomness,
300
+ ephemeralPublicKey: ephemeralKeypair.getPublicKey()
301
+ });
302
+ await __privateGet(this, _state).setSession(sessionContext, { ...updatedSession, proof });
303
+ return new import_EnokiKeypair.EnokiKeypair({
304
+ address: this.accounts[0].address,
305
+ maxEpoch: updatedSession.maxEpoch,
306
+ ephemeralKeypair,
307
+ proof
308
+ });
309
+ };
310
+ getSignerContext_fn = async function(chain) {
311
+ const sessionContext = chain ? __privateGet(this, _state).getSessionContext(chain.split(":")[1]) : null;
312
+ if (!sessionContext) {
313
+ throw new Error(
314
+ `A valid Haneul chain identifier was not provided in the request. Please report this issue to the dApp developer. Examples of valid Haneul chain identifiers are 'haneul:testnet' and 'haneul:mainnet'. Consider using the '@haneullabs/dapp-kit' package, which provides this value automatically.`
315
+ );
316
+ }
317
+ const keypair = await __privateMethod(this, _EnokiWallet_instances, getKeypair_fn).call(this, sessionContext);
318
+ return { client: sessionContext.client, keypair };
319
+ };
320
+ createSession_fn = async function({ network }) {
321
+ const popup = window.open(
322
+ "about:blank",
323
+ "_blank",
324
+ typeof __privateGet(this, _windowFeatures) === "function" ? __privateGet(this, _windowFeatures).call(this) : __privateGet(this, _windowFeatures)
325
+ );
326
+ if (!popup) {
327
+ throw new Error("Failed to open popup");
328
+ }
329
+ const sessionContext = __privateGet(this, _state).getSessionContext(network);
330
+ const pkceContext = await __privateMethod(this, _EnokiWallet_instances, getPKCEFlowContext_fn).call(this);
331
+ popup.location = await __privateMethod(this, _EnokiWallet_instances, createAuthorizationURL_fn).call(this, sessionContext, pkceContext);
332
+ return await new Promise((resolve, reject) => {
333
+ const interval = setInterval(() => {
334
+ try {
335
+ if (popup.closed) {
336
+ clearInterval(interval);
337
+ reject(new Error("Popup closed"));
338
+ }
339
+ if (!pkceContext && !popup.location.hash || pkceContext && !popup.location.search) {
340
+ return;
341
+ }
342
+ } catch {
343
+ return;
344
+ }
345
+ clearInterval(interval);
346
+ __privateMethod(this, _EnokiWallet_instances, handleAuthCallback_fn).call(this, {
347
+ hash: popup.location.hash,
348
+ sessionContext,
349
+ search: popup.location.search,
350
+ pkceContext
351
+ }).then(() => resolve(), reject);
352
+ try {
353
+ popup.close();
354
+ } catch (e) {
355
+ console.error(e);
356
+ }
357
+ }, 16);
358
+ });
359
+ };
360
+ getPKCEFlowContext_fn = async function() {
361
+ if (!pkceFlowProviders[__privateGet(this, _provider)]) {
362
+ return;
363
+ }
364
+ const array = new Uint8Array(64);
365
+ crypto.getRandomValues(array);
366
+ const codeVerifier = (0, import_utils.toBase64)(array).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
367
+ const codeChallenge = (0, import_utils.toBase64)(
368
+ new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(codeVerifier)))
369
+ ).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
370
+ return { codeVerifier, codeChallenge };
371
+ };
372
+ createAuthorizationURL_fn = async function(sessionContext, pkceContext) {
373
+ const ephemeralKeyPair = await import_webcrypto.WebCryptoSigner.generate();
374
+ const { nonce, randomness, maxEpoch, estimatedExpiration } = await __privateGet(this, _enokiClient).createZkLoginNonce({
375
+ network: sessionContext.client.network,
376
+ ephemeralPublicKey: ephemeralKeyPair.getPublicKey()
377
+ });
378
+ const extraParams = typeof __privateGet(this, _extraParams) === "function" ? __privateGet(this, _extraParams).call(this) : __privateGet(this, _extraParams);
379
+ const params = new URLSearchParams({
380
+ ...extraParams,
381
+ nonce,
382
+ client_id: __privateGet(this, _clientId),
383
+ redirect_uri: __privateGet(this, _redirectUrl),
384
+ response_type: "id_token",
385
+ scope: ["openid", ...extraParams?.scope ? extraParams.scope.split(" ") : []].filter(Boolean).join(" "),
386
+ ...pkceContext ? {
387
+ response_type: "code",
388
+ code_challenge_method: "S256",
389
+ code_challenge: pkceContext.codeChallenge
390
+ } : void 0
391
+ });
392
+ let oauthUrl;
393
+ switch (__privateGet(this, _provider)) {
394
+ case "google":
395
+ oauthUrl = `https://accounts.google.com/o/oauth2/v2/auth?${params}`;
396
+ break;
397
+ case "facebook":
398
+ oauthUrl = `https://www.facebook.com/v17.0/dialog/oauth?${params}`;
399
+ break;
400
+ case "twitch":
401
+ params.set("force_verify", "true");
402
+ oauthUrl = `https://id.twitch.tv/oauth2/authorize?${params}`;
403
+ break;
404
+ case "onefc":
405
+ oauthUrl = `https://login.onepassport.onefc.com/de3ee5c1-5644-4113-922d-e8336569a462/b2c_1a_prod_signupsignin_onesuizklogin/oauth2/v2.0/authorize?${params}`;
406
+ break;
407
+ case "playtron":
408
+ oauthUrl = `https://oauth2.playtron.one/oauth2/auth?${params}`;
409
+ break;
410
+ default:
411
+ throw new Error(`Invalid provider: ${__privateGet(this, _provider)}`);
412
+ }
413
+ await (0, import_idb_keyval.set)("ephemeralKeyPair", ephemeralKeyPair.export(), sessionContext.idbStore);
414
+ await __privateGet(this, _state).setSession(sessionContext, {
415
+ expiresAt: estimatedExpiration,
416
+ maxEpoch,
417
+ randomness
418
+ });
419
+ return oauthUrl;
420
+ };
421
+ handleAuthCallback_fn = async function({
422
+ hash,
423
+ sessionContext,
424
+ pkceContext,
425
+ search
426
+ }) {
427
+ const params = new URLSearchParams(hash.startsWith("#") ? hash.slice(1) : hash);
428
+ const zkp = await __privateGet(this, _state).getSession(sessionContext);
429
+ if (!zkp?.maxEpoch || !zkp.randomness) {
430
+ throw new Error(
431
+ "Start of sign-in flow could not be found. Ensure you have started the sign-in flow before calling this."
432
+ );
433
+ }
434
+ const jwt = pkceContext ? await __privateMethod(this, _EnokiWallet_instances, pkceTokenExchange_fn).call(this, search, pkceContext) : params.get("id_token");
435
+ if (!jwt) {
436
+ throw new Error("Missing ID Token");
437
+ }
438
+ (0, import_zklogin.decodeJwt)(jwt);
439
+ const { address, publicKey } = await __privateGet(this, _enokiClient).getZkLogin({ jwt });
440
+ __privateGet(this, _state).zkLoginState.set({ address, publicKey });
441
+ await __privateGet(this, _state).setSession(sessionContext, { ...zkp, jwt });
442
+ return params.get("state");
443
+ };
444
+ pkceTokenExchange_fn = async function(search, pkceContext) {
445
+ const params = new URLSearchParams(search);
446
+ const code = params.get("code");
447
+ if (!code) {
448
+ throw new Error("Missing code");
449
+ }
450
+ const tokenEndpoint = pkceFlowProviders[__privateGet(this, _provider)]?.tokenEndpoint;
451
+ if (!tokenEndpoint) {
452
+ throw new Error(`PKCE flow not supported for provider: ${__privateGet(this, _provider)}`);
453
+ }
454
+ const response = await fetch(tokenEndpoint, {
455
+ method: "POST",
456
+ body: new URLSearchParams({
457
+ grant_type: "authorization_code",
458
+ client_id: __privateGet(this, _clientId),
459
+ redirect_uri: __privateGet(this, _redirectUrl),
460
+ code,
461
+ code_verifier: pkceContext.codeVerifier
462
+ })
463
+ });
464
+ return (await response.json()).id_token;
465
+ };
466
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/wallet/wallet.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Transaction } from '@haneullabs/haneul/transactions';\nimport { fromBase64, toBase64 } from '@haneullabs/haneul/utils';\nimport type {\n\tIdentifierString,\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsOnMethod,\n\tHaneulSignAndExecuteTransactionFeature,\n\tHaneulSignAndExecuteTransactionMethod,\n\tHaneulSignPersonalMessageFeature,\n\tHaneulSignPersonalMessageMethod,\n\tHaneulSignTransactionFeature,\n\tHaneulSignTransactionMethod,\n\tWallet,\n} from '@haneullabs/wallet-standard';\nimport {\n\tReadonlyWalletAccount,\n\tStandardConnect,\n\tStandardDisconnect,\n\tStandardEvents,\n\tHaneulSignAndExecuteTransaction,\n\tHaneulSignPersonalMessage,\n\tHaneulSignTransaction,\n} from '@haneullabs/wallet-standard';\nimport type { Emitter } from 'mitt';\nimport mitt from 'mitt';\n\nimport type { AuthProvider } from '../EnokiClient/type.js';\nimport type { EnokiWalletOptions, WalletEventsMap, EnokiSessionContext } from './types.js';\nimport type {\n\tEnokiGetMetadataFeature,\n\tEnokiGetMetadataMethod,\n\tEnokiGetSessionFeature,\n\tEnokiGetSessionMethod,\n} from './features.js';\nimport { EnokiGetMetadata, EnokiGetSession } from './features.js';\nimport type { Experimental_HaneulClientTypes } from '@haneullabs/haneul/experimental';\nimport { decodeJwt } from '@haneullabs/haneul/zklogin';\nimport type { ExportedWebCryptoKeypair } from '@haneullabs/signers/webcrypto';\nimport { WebCryptoSigner } from '@haneullabs/signers/webcrypto';\nimport { get, set } from 'idb-keyval';\n\nimport { EnokiClient } from '../EnokiClient/index.js';\nimport type { EnokiNetwork } from '../EnokiClient/type.js';\nimport { EnokiKeypair } from '../EnokiKeypair.js';\n\nimport { EnokiWalletState } from './state.js';\nimport { allTasks } from 'nanostores';\n\nconst pkceFlowProviders: Partial<Record<AuthProvider, { tokenEndpoint: string }>> = {\n\tplaytron: {\n\t\ttokenEndpoint: 'https://oauth2.playtron.one/oauth2/token',\n\t},\n};\n\ntype PKCEContext = { codeChallenge: string; codeVerifier: string };\n\nexport class EnokiWallet implements Wallet {\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#name: string;\n\t#icon: Wallet['icon'];\n\t#enokiClient: EnokiClient;\n\t#state: EnokiWalletState;\n\t#provider: AuthProvider;\n\t#clientId: string;\n\t#redirectUrl: string;\n\t#extraParams: Record<string, string> | (() => Record<string, string>) | undefined;\n\t#getCurrentNetwork: () => Experimental_HaneulClientTypes.Network;\n\t#windowFeatures?: string | (() => string);\n\n\tget name() {\n\t\treturn this.#name;\n\t}\n\n\tget provider() {\n\t\treturn this.#provider;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget chains() {\n\t\treturn [...this.#state.sessionContextByNetwork.keys()].map(\n\t\t\t(network) => `sui:${network}` as const,\n\t\t);\n\t}\n\n\tget accounts() {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardDisconnectFeature &\n\t\tStandardEventsFeature &\n\t\tHaneulSignTransactionFeature &\n\t\tHaneulSignAndExecuteTransactionFeature &\n\t\tHaneulSignPersonalMessageFeature &\n\t\tEnokiGetMetadataFeature &\n\t\tEnokiGetSessionFeature {\n\t\treturn {\n\t\t\t[StandardConnect]: {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t[StandardDisconnect]: {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t[StandardEvents]: {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t[HaneulSignTransaction]: {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t[HaneulSignAndExecuteTransaction]: {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t\t[HaneulSignPersonalMessage]: {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t[EnokiGetMetadata]: {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tgetMetadata: this.#getMetadata,\n\t\t\t},\n\t\t\t[EnokiGetSession]: {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tgetSession: this.#getSession,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor({\n\t\tname,\n\t\ticon,\n\t\tprovider,\n\t\tclientId,\n\t\tredirectUrl,\n\t\textraParams,\n\t\twindowFeatures,\n\t\tgetCurrentNetwork,\n\t\tapiKey,\n\t\tapiUrl,\n\t\tadditionalEpochs,\n\t\tclients,\n\t}: EnokiWalletOptions) {\n\t\tthis.#events = mitt();\n\t\tthis.#name = name;\n\t\tthis.#icon = icon;\n\t\tthis.#enokiClient = new EnokiClient({ apiKey, apiUrl, additionalEpochs });\n\t\tthis.#state = new EnokiWalletState({ apiKey, clientId, clients });\n\t\tthis.#provider = provider;\n\t\tthis.#clientId = clientId;\n\t\tthis.#redirectUrl = redirectUrl || window.location.href.split('#')[0];\n\t\tthis.#extraParams = extraParams;\n\t\tthis.#windowFeatures = windowFeatures;\n\t\tthis.#getCurrentNetwork = getCurrentNetwork;\n\t\tthis.#accounts = [];\n\n\t\tthis.#state.zkLoginState.subscribe(() => {\n\t\t\tthis.#accounts = this.#getAuthorizedAccounts();\n\t\t\tthis.#events.emit('change', { accounts: this.#accounts });\n\t\t});\n\t}\n\n\t#signTransaction: HaneulSignTransactionMethod = async ({ transaction, chain, account, signal }) => {\n\t\tsignal?.throwIfAborted();\n\n\t\tconst { client, keypair } = await this.#getSignerContext(chain);\n\t\tconst parsedTransaction = Transaction.from(await transaction.toJSON());\n\t\tconst haneulAddress = keypair.toHaneulAddress();\n\n\t\tif (haneulAddress !== account.address) {\n\t\t\tthrow new Error(\n\t\t\t\t`The specified account ${account.address} does not match the currently connected Enoki address ${haneulAddress}.`,\n\t\t\t);\n\t\t}\n\n\t\tparsedTransaction.setSenderIfNotSet(haneulAddress);\n\t\treturn keypair.signTransaction(await parsedTransaction.build({ client }));\n\t};\n\n\t#signAndExecuteTransaction: HaneulSignAndExecuteTransactionMethod = async ({\n\t\ttransaction,\n\t\tchain,\n\t\taccount,\n\t\tsignal,\n\t}) => {\n\t\tsignal?.throwIfAborted();\n\n\t\tconst { client, keypair } = await this.#getSignerContext(chain);\n\t\tconst parsedTransaction = Transaction.from(await transaction.toJSON());\n\t\tconst bytes = await parsedTransaction.build({ client });\n\n\t\tconst haneulAddress = keypair.toHaneulAddress();\n\n\t\tif (haneulAddress !== account.address) {\n\t\t\tthrow new Error(\n\t\t\t\t`The specified account ${account.address} does not match the currently connected Enoki address ${haneulAddress}.`,\n\t\t\t);\n\t\t}\n\n\t\tparsedTransaction.setSenderIfNotSet(haneulAddress);\n\n\t\tconst result = await keypair.signAndExecuteTransaction({\n\t\t\ttransaction: parsedTransaction,\n\t\t\tclient,\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature: result.signatures[0],\n\t\t\tdigest: result.digest,\n\t\t\teffects: toBase64(result.effects.bcs!),\n\t\t};\n\t};\n\n\t#signPersonalMessage: HaneulSignPersonalMessageMethod = async ({ message, account, chain }) => {\n\t\tconst { keypair } = await this.#getSignerContext(chain);\n\t\tconst haneulAddress = keypair.toHaneulAddress();\n\n\t\tif (haneulAddress !== account.address) {\n\t\t\tthrow new Error(\n\t\t\t\t`The specified account ${account.address} does not match the currently connected Enoki address ${haneulAddress}.`,\n\t\t\t);\n\t\t}\n\n\t\treturn keypair.signPersonalMessage(message);\n\t};\n\n\t#getMetadata: EnokiGetMetadataMethod = () => {\n\t\treturn {\n\t\t\tprovider: this.#provider,\n\t\t};\n\t};\n\n\t#getSession: EnokiGetSessionMethod = async (input) => {\n\t\tconst sessionContext = this.#state.getSessionContext(\n\t\t\tinput?.network ?? this.#getCurrentNetwork(),\n\t\t);\n\t\treturn await this.#state.getSession(sessionContext);\n\t};\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#connect: StandardConnectMethod = async (input) => {\n\t\t// NOTE: This is a hackfix for the old version of dApp Kit where auto-connection logic\n\t\t// only fires on initial mount of the WalletProvider component. Since hydrating the\n\t\t// zkLogin state from IndexedDB is an asynchronous process, we need to make sure it\n\t\t// is populated before the connect logic runs.\n\t\tawait allTasks();\n\n\t\tif (input?.silent || this.#accounts.length > 0) {\n\t\t\treturn { accounts: this.#accounts };\n\t\t}\n\n\t\tconst currentNetwork = this.#getCurrentNetwork();\n\t\tawait this.#createSession({ network: currentNetwork });\n\n\t\treturn { accounts: this.#accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tawait this.#state.logout();\n\t\tthis.#accounts = [];\n\t\tthis.#events.emit('change', { accounts: this.#accounts });\n\t};\n\n\t#getAuthorizedAccounts() {\n\t\tconst zkLoginState = this.#state.zkLoginState.get();\n\t\tif (zkLoginState) {\n\t\t\treturn [\n\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\taddress: zkLoginState.address,\n\t\t\t\t\tchains: this.chains,\n\t\t\t\t\ticon: this.icon,\n\t\t\t\t\tfeatures: [HaneulSignPersonalMessage, HaneulSignTransaction, HaneulSignAndExecuteTransaction],\n\t\t\t\t\tpublicKey: fromBase64(zkLoginState.publicKey),\n\t\t\t\t}),\n\t\t\t];\n\t\t}\n\t\treturn [];\n\t}\n\n\tasync #getKeypair(sessionContext: EnokiSessionContext) {\n\t\tconst session = await this.#state.getSession(sessionContext);\n\t\tif (!session?.jwt || Date.now() > session.expiresAt) {\n\t\t\tawait this.#createSession({ network: sessionContext.client.network });\n\t\t}\n\n\t\tconst storedNativeSigner = await get<ExportedWebCryptoKeypair>(\n\t\t\t'ephemeralKeyPair',\n\t\t\tsessionContext.idbStore,\n\t\t);\n\n\t\tif (!storedNativeSigner) {\n\t\t\tthrow new Error('Native signer not found in store.');\n\t\t}\n\n\t\tconst updatedSession = await this.#state.getSession(sessionContext);\n\t\tif (!updatedSession?.jwt) {\n\t\t\tthrow new Error('Failed to retrieve an active session.');\n\t\t}\n\n\t\tconst ephemeralKeypair = WebCryptoSigner.import(storedNativeSigner);\n\t\tconst proof =\n\t\t\tupdatedSession.proof ??\n\t\t\t(await this.#enokiClient.createZkLoginZkp({\n\t\t\t\tnetwork: sessionContext.client.network as EnokiNetwork,\n\t\t\t\tjwt: updatedSession.jwt,\n\t\t\t\tmaxEpoch: updatedSession.maxEpoch,\n\t\t\t\trandomness: updatedSession.randomness,\n\t\t\t\tephemeralPublicKey: ephemeralKeypair.getPublicKey(),\n\t\t\t}));\n\n\t\tawait this.#state.setSession(sessionContext, { ...updatedSession, proof });\n\n\t\treturn new EnokiKeypair({\n\t\t\taddress: this.accounts[0].address,\n\t\t\tmaxEpoch: updatedSession.maxEpoch,\n\t\t\tephemeralKeypair,\n\t\t\tproof,\n\t\t});\n\t}\n\n\tasync #getSignerContext(chain?: IdentifierString) {\n\t\tconst sessionContext = chain ? this.#state.getSessionContext(chain.split(':')[1]) : null;\n\t\tif (!sessionContext) {\n\t\t\tthrow new Error(\n\t\t\t\t`A valid Haneul chain identifier was not provided in the request. Please report this issue to the dApp developer. Examples of valid Haneul chain identifiers are 'haneul:testnet' and 'haneul:mainnet'. Consider using the '@haneullabs/dapp-kit' package, which provides this value automatically.`,\n\t\t\t);\n\t\t}\n\n\t\tconst keypair = await this.#getKeypair(sessionContext);\n\t\treturn { client: sessionContext.client, keypair };\n\t}\n\n\tasync #createSession({ network }: { network: Experimental_HaneulClientTypes.Network }) {\n\t\tconst popup = window.open(\n\t\t\t'about:blank',\n\t\t\t'_blank',\n\t\t\ttypeof this.#windowFeatures === 'function' ? this.#windowFeatures() : this.#windowFeatures,\n\t\t);\n\n\t\tif (!popup) {\n\t\t\tthrow new Error('Failed to open popup');\n\t\t}\n\n\t\tconst sessionContext = this.#state.getSessionContext(network);\n\t\tconst pkceContext = await this.#getPKCEFlowContext();\n\n\t\tpopup.location = await this.#createAuthorizationURL(sessionContext, pkceContext);\n\n\t\treturn await new Promise<void>((resolve, reject) => {\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\ttry {\n\t\t\t\t\tif (popup.closed) {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t\treject(new Error('Popup closed'));\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((!pkceContext && !popup.location.hash) || (pkceContext && !popup.location.search)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tclearInterval(interval);\n\n\t\t\t\tthis.#handleAuthCallback({\n\t\t\t\t\thash: popup.location.hash,\n\t\t\t\t\tsessionContext,\n\t\t\t\t\tsearch: popup.location.search,\n\t\t\t\t\tpkceContext,\n\t\t\t\t}).then(() => resolve(), reject);\n\n\t\t\t\ttry {\n\t\t\t\t\tpopup.close();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t}, 16);\n\t\t});\n\t}\n\n\tasync #getPKCEFlowContext(): Promise<PKCEContext | undefined> {\n\t\tif (!pkceFlowProviders[this.#provider]) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst array = new Uint8Array(64);\n\t\tcrypto.getRandomValues(array);\n\t\tconst codeVerifier = toBase64(array).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n\t\tconst codeChallenge = toBase64(\n\t\t\tnew Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier))),\n\t\t)\n\t\t\t.replace(/=/g, '')\n\t\t\t.replace(/\\+/g, '-')\n\t\t\t.replace(/\\//g, '_');\n\n\t\treturn { codeVerifier, codeChallenge };\n\t}\n\n\tasync #createAuthorizationURL(sessionContext: EnokiSessionContext, pkceContext?: PKCEContext) {\n\t\tconst ephemeralKeyPair = await WebCryptoSigner.generate();\n\t\tconst { nonce, randomness, maxEpoch, estimatedExpiration } =\n\t\t\tawait this.#enokiClient.createZkLoginNonce({\n\t\t\t\tnetwork: sessionContext.client.network as EnokiNetwork,\n\t\t\t\tephemeralPublicKey: ephemeralKeyPair.getPublicKey(),\n\t\t\t});\n\n\t\tconst extraParams =\n\t\t\ttypeof this.#extraParams === 'function' ? this.#extraParams() : this.#extraParams;\n\n\t\tconst params = new URLSearchParams({\n\t\t\t...extraParams,\n\t\t\tnonce,\n\t\t\tclient_id: this.#clientId,\n\t\t\tredirect_uri: this.#redirectUrl,\n\t\t\tresponse_type: 'id_token',\n\t\t\tscope: ['openid', ...(extraParams?.scope ? extraParams.scope.split(' ') : [])]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(' '),\n\t\t\t...(pkceContext\n\t\t\t\t? {\n\t\t\t\t\t\tresponse_type: 'code',\n\t\t\t\t\t\tcode_challenge_method: 'S256',\n\t\t\t\t\t\tcode_challenge: pkceContext.codeChallenge,\n\t\t\t\t\t}\n\t\t\t\t: undefined),\n\t\t});\n\n\t\tlet oauthUrl: string;\n\t\tswitch (this.#provider) {\n\t\t\tcase 'google':\n\t\t\t\toauthUrl = `https://accounts.google.com/o/oauth2/v2/auth?${params}`;\n\t\t\t\tbreak;\n\t\t\tcase 'facebook':\n\t\t\t\toauthUrl = `https://www.facebook.com/v17.0/dialog/oauth?${params}`;\n\t\t\t\tbreak;\n\t\t\tcase 'twitch':\n\t\t\t\tparams.set('force_verify', 'true');\n\t\t\t\toauthUrl = `https://id.twitch.tv/oauth2/authorize?${params}`;\n\t\t\t\tbreak;\n\t\t\tcase 'onefc':\n\t\t\t\toauthUrl = `https://login.onepassport.onefc.com/de3ee5c1-5644-4113-922d-e8336569a462/b2c_1a_prod_signupsignin_onesuizklogin/oauth2/v2.0/authorize?${params}`;\n\t\t\t\tbreak;\n\t\t\tcase 'playtron':\n\t\t\t\toauthUrl = `https://oauth2.playtron.one/oauth2/auth?${params}`;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Invalid provider: ${this.#provider}`);\n\t\t}\n\n\t\tawait set('ephemeralKeyPair', ephemeralKeyPair.export(), sessionContext.idbStore);\n\t\tawait this.#state.setSession(sessionContext, {\n\t\t\texpiresAt: estimatedExpiration,\n\t\t\tmaxEpoch,\n\t\t\trandomness,\n\t\t});\n\n\t\treturn oauthUrl;\n\t}\n\n\tasync #handleAuthCallback({\n\t\thash,\n\t\tsessionContext,\n\t\tpkceContext,\n\t\tsearch,\n\t}: {\n\t\thash: string;\n\t\tsessionContext: EnokiSessionContext;\n\t\tpkceContext?: PKCEContext;\n\t\tsearch: string;\n\t}) {\n\t\tconst params = new URLSearchParams(hash.startsWith('#') ? hash.slice(1) : hash);\n\t\tconst zkp = await this.#state.getSession(sessionContext);\n\n\t\tif (!zkp?.maxEpoch || !zkp.randomness) {\n\t\t\tthrow new Error(\n\t\t\t\t'Start of sign-in flow could not be found. Ensure you have started the sign-in flow before calling this.',\n\t\t\t);\n\t\t}\n\n\t\tconst jwt = pkceContext\n\t\t\t? await this.#pkceTokenExchange(search, pkceContext)\n\t\t\t: params.get('id_token');\n\n\t\tif (!jwt) {\n\t\t\tthrow new Error('Missing ID Token');\n\t\t}\n\n\t\tdecodeJwt(jwt);\n\n\t\tconst { address, publicKey } = await this.#enokiClient.getZkLogin({ jwt });\n\n\t\tthis.#state.zkLoginState.set({ address, publicKey });\n\t\tawait this.#state.setSession(sessionContext, { ...zkp, jwt });\n\n\t\treturn params.get('state');\n\t}\n\n\tasync #pkceTokenExchange(search: string, pkceContext: PKCEContext) {\n\t\tconst params = new URLSearchParams(search);\n\t\tconst code = params.get('code');\n\n\t\tif (!code) {\n\t\t\tthrow new Error('Missing code');\n\t\t}\n\n\t\tconst tokenEndpoint = pkceFlowProviders[this.#provider]?.tokenEndpoint;\n\n\t\tif (!tokenEndpoint) {\n\t\t\tthrow new Error(`PKCE flow not supported for provider: ${this.#provider}`);\n\t\t}\n\n\t\tconst response = await fetch(tokenEndpoint, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\tclient_id: this.#clientId,\n\t\t\t\tredirect_uri: this.#redirectUrl,\n\t\t\t\tcode,\n\t\t\t\tcode_verifier: pkceContext.codeVerifier,\n\t\t\t}),\n\t\t});\n\n\t\treturn (await response.json()).id_token;\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["mitt"]
7
+ }
@@ -0,0 +1,36 @@
1
+ import type { CreateSponsoredTransactionApiInput, CreateSponsoredTransactionApiResponse, CreateSubnameApiInput, CreateSubnameApiResponse, CreateZkLoginNonceApiInput, CreateZkLoginNonceApiResponse, CreateZkLoginZkpApiInput, CreateZkLoginZkpApiResponse, DeleteSubnameApiInput, ExecuteSponsoredTransactionApiInput, ExecuteSponsoredTransactionApiResponse, GetAppApiInput, GetAppApiResponse, GetSubnamesApiInput, GetSubnamesApiResponse, GetZkLoginAddressesApiInput, GetZkLoginAddressesApiResponse, GetZkLoginApiInput, GetZkLoginApiResponse } from './type.js';
2
+ export interface EnokiClientConfig {
3
+ /** The API key for the Enoki app, available in the Enoki Portal. */
4
+ apiKey: string;
5
+ /** The API URL for Enoki. In most cases, this should not be set. */
6
+ apiUrl?: string;
7
+ /** The amount of epochs that you would like to have the nonce be valid for. Range: `0 <= value <= 30` */
8
+ additionalEpochs?: number;
9
+ }
10
+ export declare class EnokiClientError extends Error {
11
+ errors: {
12
+ code: string;
13
+ message: string;
14
+ data: unknown;
15
+ }[];
16
+ status: number;
17
+ code: string;
18
+ constructor(status: number, response: string);
19
+ }
20
+ /**
21
+ * A low-level client for interacting with the Enoki API.
22
+ */
23
+ export declare class EnokiClient {
24
+ #private;
25
+ constructor(config: EnokiClientConfig);
26
+ getApp(_input?: GetAppApiInput): Promise<GetAppApiResponse>;
27
+ getZkLogin(input: GetZkLoginApiInput): Promise<GetZkLoginApiResponse>;
28
+ getZkLoginAddresses(input: GetZkLoginAddressesApiInput): Promise<GetZkLoginAddressesApiResponse>;
29
+ createZkLoginNonce(input: CreateZkLoginNonceApiInput): Promise<CreateZkLoginNonceApiResponse>;
30
+ createZkLoginZkp(input: CreateZkLoginZkpApiInput): Promise<CreateZkLoginZkpApiResponse>;
31
+ createSponsoredTransaction(input: CreateSponsoredTransactionApiInput): Promise<CreateSponsoredTransactionApiResponse>;
32
+ executeSponsoredTransaction(input: ExecuteSponsoredTransactionApiInput): Promise<ExecuteSponsoredTransactionApiResponse>;
33
+ getSubnames(input: GetSubnamesApiInput): Promise<GetSubnamesApiResponse>;
34
+ createSubname(input: CreateSubnameApiInput): Promise<CreateSubnameApiResponse>;
35
+ deleteSubname(input: DeleteSubnameApiInput): void;
36
+ }