@aksumite/react-providers 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,946 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+ var __async = (__this, __arguments, generator) => {
47
+ return new Promise((resolve, reject) => {
48
+ var fulfilled = (value) => {
49
+ try {
50
+ step(generator.next(value));
51
+ } catch (e) {
52
+ reject(e);
53
+ }
54
+ };
55
+ var rejected = (value) => {
56
+ try {
57
+ step(generator.throw(value));
58
+ } catch (e) {
59
+ reject(e);
60
+ }
61
+ };
62
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
63
+ step((generator = generator.apply(__this, __arguments)).next());
64
+ });
65
+ };
66
+
67
+ // src/index.ts
68
+ var src_exports = {};
69
+ __export(src_exports, {
70
+ Context: () => Context,
71
+ ExtensionAccountsContext: () => ExtensionAccountsContext,
72
+ ExtensionAccountsProvider: () => ExtensionAccountsProvider,
73
+ ExtensionsContext: () => ExtensionsContext,
74
+ ExtensionsProvider: () => ExtensionsProvider,
75
+ LocalAccountsContext: () => LocalAccountsContext,
76
+ TransactionManagerProvider: () => TransactionManagerProvider,
77
+ UserAccountsProvider: () => UserAccountsProvider,
78
+ defaultExtensionAccountsContext: () => defaultExtensionAccountsContext,
79
+ defaultExtensionsContext: () => defaultExtensionsContext,
80
+ defaultHandleImportExtension: () => defaultHandleImportExtension,
81
+ useExtensionAccounts: () => useExtensionAccounts,
82
+ useExtensions: () => useExtensions,
83
+ useTransactionManager: () => useTransactionManager,
84
+ useUserAccounts: () => useUserAccounts
85
+ });
86
+ module.exports = __toCommonJS(src_exports);
87
+
88
+ // src/ExtensionAccountsProvider/provider.tsx
89
+ var import_react3 = require("react");
90
+ var import_sdk_utils5 = require("@aksumite/sdk-utils");
91
+ var import_react_hooks = require("@mitratrade/react-hooks");
92
+
93
+ // src/ExtensionsProvider/provider.tsx
94
+ var import_react = require("react");
95
+ var import_sdk_utils2 = require("@aksumite/sdk-utils");
96
+ var import_extensions = require("@polkadot-cloud/assets/extensions");
97
+
98
+ // src/ExtensionsProvider/constants.ts
99
+ var defaultExtensionsContext = {
100
+ checkingInjectedWeb3: false,
101
+ extensionsStatus: {},
102
+ setExtensionStatus: (id, status) => {
103
+ },
104
+ removeExtensionStatus: (id) => {
105
+ },
106
+ extensionInstalled: (id) => false,
107
+ extensionCanConnect: (id) => false,
108
+ extensionHasFeature: (id, feature) => false
109
+ };
110
+
111
+ // src/ExtensionsProvider/utils.ts
112
+ var import_sdk_utils = require("@aksumite/sdk-utils");
113
+ function hasMetaMask() {
114
+ if (!window.ethereum) {
115
+ return false;
116
+ }
117
+ return window.ethereum.isMetaMask;
118
+ }
119
+ var getWalletSnaps = () => __async(void 0, null, function* () {
120
+ var _a;
121
+ const ethRequest = !!((_a = window == null ? void 0 : window.ethereum) == null ? void 0 : _a.request);
122
+ if (ethRequest) {
123
+ const response = yield (0, import_sdk_utils.withTimeout)(
124
+ window.ethereum.request,
125
+ [
126
+ {
127
+ method: "wallet_getSnaps"
128
+ }
129
+ ],
130
+ 200
131
+ );
132
+ return response;
133
+ }
134
+ });
135
+ var polkadexSnapAvailable = () => __async(void 0, null, function* () {
136
+ if (!hasMetaMask())
137
+ return false;
138
+ try {
139
+ yield getWalletSnaps();
140
+ return true;
141
+ } catch (e) {
142
+ return false;
143
+ }
144
+ });
145
+
146
+ // src/ExtensionsProvider/provider.tsx
147
+ var import_jsx_runtime = require("react/jsx-runtime");
148
+ var ExtensionsContext = (0, import_react.createContext)(
149
+ defaultExtensionsContext
150
+ );
151
+ var ExtensionsProvider = ({ children }) => {
152
+ const [checkingInjectedWeb3, setCheckingInjectedWeb3] = (0, import_react.useState)(true);
153
+ const checkingInjectedWeb3Ref = (0, import_react.useRef)(checkingInjectedWeb3);
154
+ const intervalInitialisedRef = (0, import_react.useRef)(false);
155
+ const [extensionsStatus, setExtensionsStatus] = (0, import_react.useState)({});
156
+ const extensionsStatusRef = (0, import_react.useRef)(extensionsStatus);
157
+ const injectCounter = (0, import_react.useRef)(0);
158
+ const setExtensionStatus = (id, status) => {
159
+ (0, import_sdk_utils2.setStateWithRef)(
160
+ __spreadProps(__spreadValues({}, extensionsStatusRef.current), {
161
+ [id]: status
162
+ }),
163
+ setExtensionsStatus,
164
+ extensionsStatusRef
165
+ );
166
+ };
167
+ const removeExtensionStatus = (id) => {
168
+ const newExtensionsStatus = __spreadValues({}, extensionsStatusRef.current);
169
+ delete newExtensionsStatus[id];
170
+ (0, import_sdk_utils2.setStateWithRef)(
171
+ newExtensionsStatus,
172
+ setExtensionsStatus,
173
+ extensionsStatusRef
174
+ );
175
+ };
176
+ const getExtensionsStatus = (0, import_react.useCallback)(
177
+ (snapAvailable) => {
178
+ const { injectedWeb3 } = window;
179
+ const newExtensionsStatus = __spreadValues({}, extensionsStatus);
180
+ if (snapAvailable)
181
+ newExtensionsStatus["metamask-polkadex-snap"] = "installed";
182
+ import_extensions.ExtensionsArray.forEach((e) => {
183
+ if (injectedWeb3[e.id] !== void 0) {
184
+ newExtensionsStatus[e.id] = "installed";
185
+ }
186
+ });
187
+ return newExtensionsStatus;
188
+ },
189
+ [extensionsStatus]
190
+ );
191
+ const handleSnapInjection = (0, import_react.useCallback)(
192
+ (hasInjectedWeb3) => __async(void 0, null, function* () {
193
+ const snapAvailable = yield polkadexSnapAvailable();
194
+ if (hasInjectedWeb3 || snapAvailable)
195
+ (0, import_sdk_utils2.setStateWithRef)(
196
+ getExtensionsStatus(snapAvailable),
197
+ setExtensionsStatus,
198
+ extensionsStatusRef
199
+ );
200
+ (0, import_sdk_utils2.setStateWithRef)(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);
201
+ }),
202
+ [getExtensionsStatus]
203
+ );
204
+ const handleClearInterval = (0, import_react.useCallback)(
205
+ (interval, hasInjectedWeb3) => {
206
+ clearInterval(interval);
207
+ handleSnapInjection(hasInjectedWeb3);
208
+ },
209
+ [handleSnapInjection]
210
+ );
211
+ const extensionInstalled = (id) => extensionsStatus[id] !== void 0;
212
+ const extensionCanConnect = (id) => extensionInstalled(id) && extensionsStatus[id] !== "connected";
213
+ const extensionHasFeature = (id, feature) => {
214
+ const features = import_extensions.Extensions[id].features;
215
+ if (features === "*" || features.includes(feature))
216
+ return true;
217
+ else
218
+ return false;
219
+ };
220
+ const checkEveryMs = 500;
221
+ const totalChecks = 10;
222
+ (0, import_react.useEffect)(() => {
223
+ let injectedWeb3Interval;
224
+ if (!intervalInitialisedRef.current) {
225
+ intervalInitialisedRef.current = true;
226
+ injectedWeb3Interval = setInterval(() => {
227
+ injectCounter.current++;
228
+ if (injectCounter.current === totalChecks)
229
+ handleClearInterval(injectedWeb3Interval, false);
230
+ else {
231
+ const injectedWeb3 = (window == null ? void 0 : window.injectedWeb3) || null;
232
+ if (injectedWeb3 !== null)
233
+ handleClearInterval(injectedWeb3Interval, true);
234
+ }
235
+ }, checkEveryMs);
236
+ }
237
+ return () => {
238
+ clearInterval(injectedWeb3Interval);
239
+ };
240
+ }, [handleClearInterval]);
241
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
242
+ ExtensionsContext.Provider,
243
+ {
244
+ value: {
245
+ extensionsStatus: extensionsStatusRef.current,
246
+ checkingInjectedWeb3: checkingInjectedWeb3Ref.current,
247
+ setExtensionStatus,
248
+ removeExtensionStatus,
249
+ extensionInstalled,
250
+ extensionCanConnect,
251
+ extensionHasFeature
252
+ },
253
+ children
254
+ }
255
+ );
256
+ };
257
+
258
+ // src/ExtensionsProvider/useExtensions.tsx
259
+ var import_react2 = require("react");
260
+ var useExtensions = () => {
261
+ var _a;
262
+ const state = (0, import_react2.useContext)(ExtensionsContext);
263
+ if (!ExtensionsContext) {
264
+ const error = new Error("ExtensionsContext context is undefined");
265
+ error.name = "ContextError";
266
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, import_react2.useContext);
267
+ throw error;
268
+ }
269
+ return __spreadValues({}, state);
270
+ };
271
+
272
+ // src/ExtensionAccountsProvider/useImportExtension.tsx
273
+ var import_keyring2 = __toESM(require("@polkadot/keyring"));
274
+ var import_sdk_utils4 = require("@aksumite/sdk-utils");
275
+
276
+ // src/ExtensionAccountsProvider/constants.ts
277
+ var defaultExtensionAccountsContext = {
278
+ connectExtensionAccounts: () => Promise.resolve(false),
279
+ extensionAccountsSynced: "unsynced",
280
+ extensionAccounts: []
281
+ };
282
+ var defaultHandleImportExtension = {
283
+ newAccounts: [],
284
+ meta: {
285
+ removedActiveAccount: null
286
+ }
287
+ };
288
+
289
+ // src/ExtensionAccountsProvider/utils.ts
290
+ var import_keyring = __toESM(require("@polkadot/keyring"));
291
+ var import_sdk_utils3 = require("@aksumite/sdk-utils");
292
+ var getActiveAccountLocal = (network, ss58) => {
293
+ const keyring = new import_keyring.default();
294
+ keyring.setSS58Format(ss58);
295
+ let account = (0, import_sdk_utils3.localStorageOrDefault)(`${network}_active_account`, null);
296
+ if (account !== null) {
297
+ account = keyring.addFromAddress(account).address;
298
+ }
299
+ return account;
300
+ };
301
+ var addToLocalExtensions = (id) => {
302
+ const localExtensions = (0, import_sdk_utils3.localStorageOrDefault)(
303
+ `active_extensions`,
304
+ [],
305
+ true
306
+ );
307
+ if (Array.isArray(localExtensions)) {
308
+ if (!localExtensions.includes(id)) {
309
+ localExtensions.push(id);
310
+ localStorage.setItem(
311
+ "active_extensions",
312
+ JSON.stringify(localExtensions)
313
+ );
314
+ }
315
+ }
316
+ };
317
+ var extensionIsLocal = (id) => {
318
+ const localExtensions = (0, import_sdk_utils3.localStorageOrDefault)(
319
+ `active_extensions`,
320
+ [],
321
+ true
322
+ );
323
+ let foundExtensionLocally = false;
324
+ if (Array.isArray(localExtensions)) {
325
+ foundExtensionLocally = localExtensions.find((l) => l === id) !== void 0;
326
+ }
327
+ return foundExtensionLocally;
328
+ };
329
+ var removeFromLocalExtensions = (id) => {
330
+ let localExtensions = (0, import_sdk_utils3.localStorageOrDefault)(
331
+ `active_extensions`,
332
+ [],
333
+ true
334
+ );
335
+ if (Array.isArray(localExtensions)) {
336
+ localExtensions = localExtensions.filter((l) => l !== id);
337
+ localStorage.setItem("active_extensions", JSON.stringify(localExtensions));
338
+ }
339
+ };
340
+
341
+ // src/ExtensionAccountsProvider/useImportExtension.tsx
342
+ var useImportExtension = () => {
343
+ const { setExtensionStatus } = useExtensions();
344
+ const handleImportExtension = (id, currentAccounts, extension, newAccounts, forget, {
345
+ network,
346
+ ss58
347
+ }) => {
348
+ setExtensionStatus(id, "connected");
349
+ addToLocalExtensions(id);
350
+ if (newAccounts.length) {
351
+ return handleInjectedAccounts(
352
+ id,
353
+ currentAccounts,
354
+ extension,
355
+ newAccounts,
356
+ forget,
357
+ { network, ss58 }
358
+ );
359
+ }
360
+ return defaultHandleImportExtension;
361
+ };
362
+ const handleInjectedAccounts = (id, currentAccounts, extension, newAccounts, forget, {
363
+ ss58,
364
+ network
365
+ }) => {
366
+ var _a;
367
+ const keyring = new import_keyring2.default();
368
+ keyring.setSS58Format(ss58);
369
+ newAccounts = newAccounts.filter(
370
+ ({ address }) => (0, import_sdk_utils4.isValidAddress)(address) || (0, import_sdk_utils4.isValidEvmAddress)(address)
371
+ );
372
+ newAccounts.forEach((account) => __async(void 0, null, function* () {
373
+ if ((0, import_sdk_utils4.isValidEvmAddress)(account.address))
374
+ return account;
375
+ const { address } = keyring.addFromAddress(account.address);
376
+ account.address = address;
377
+ return account;
378
+ }));
379
+ const goneFromExtension = currentAccounts.filter((j) => j.source === id).filter((j) => !newAccounts.find((i) => i.address === j.address));
380
+ const activeGoneFromExtension = goneFromExtension.find(
381
+ ({ address }) => address === getActiveAccountLocal(network, ss58)
382
+ );
383
+ forget(goneFromExtension);
384
+ newAccounts = newAccounts.filter(
385
+ (i) => !currentAccounts.find(
386
+ (j) => j.address === i.address && j.source !== "external"
387
+ )
388
+ );
389
+ newAccounts = newAccounts.map(({ address, name, type }) => ({
390
+ address,
391
+ source: id,
392
+ name,
393
+ signer: extension.signer,
394
+ type
395
+ }));
396
+ return {
397
+ newAccounts,
398
+ meta: {
399
+ removedActiveAccount: (_a = activeGoneFromExtension == null ? void 0 : activeGoneFromExtension.address) != null ? _a : null
400
+ }
401
+ };
402
+ };
403
+ const getActiveExtensionAccount = ({
404
+ network,
405
+ ss58
406
+ }, accounts) => {
407
+ var _a;
408
+ return (_a = accounts.find(
409
+ ({ address }) => address === getActiveAccountLocal(network, ss58)
410
+ )) != null ? _a : null;
411
+ };
412
+ const connectActiveExtensionAccount = (account, callback) => {
413
+ if (account !== null) {
414
+ callback(account);
415
+ }
416
+ };
417
+ return {
418
+ handleImportExtension,
419
+ getActiveExtensionAccount,
420
+ connectActiveExtensionAccount
421
+ };
422
+ };
423
+
424
+ // src/ExtensionAccountsProvider/provider.tsx
425
+ var import_jsx_runtime2 = require("react/jsx-runtime");
426
+ var ExtensionAccountsContext = (0, import_react3.createContext)(
427
+ defaultExtensionAccountsContext
428
+ );
429
+ var ExtensionAccountsProvider = ({
430
+ children,
431
+ network,
432
+ ss58,
433
+ dappName,
434
+ activeAccount,
435
+ setActiveAccount,
436
+ onExtensionEnabled
437
+ }) => {
438
+ const {
439
+ handleImportExtension,
440
+ getActiveExtensionAccount,
441
+ connectActiveExtensionAccount
442
+ } = useImportExtension();
443
+ const {
444
+ extensionsStatus,
445
+ setExtensionStatus,
446
+ removeExtensionStatus,
447
+ checkingInjectedWeb3,
448
+ extensionHasFeature
449
+ } = useExtensions();
450
+ const [extensionAccounts, setExtensionAccounts] = (0, import_react3.useState)([]);
451
+ const extensionAccountsRef = (0, import_react3.useRef)(extensionAccounts);
452
+ const [extensionAccountsSynced, setExtensionAccountsSynced] = (0, import_react3.useState)("unsynced");
453
+ const [extensionsInitialised, setExtensionsInitialised] = (0, import_react3.useState)(
454
+ []
455
+ );
456
+ const extensionsInitialisedRef = (0, import_react3.useRef)(extensionsInitialised);
457
+ const unsubs = (0, import_react3.useRef)({});
458
+ const maybeSetActiveAccount = (0, import_react3.useCallback)(
459
+ (address) => {
460
+ if (typeof setActiveAccount === "function")
461
+ setActiveAccount(address != null ? address : null);
462
+ },
463
+ [setActiveAccount]
464
+ );
465
+ const maybeOnExtensionEnabled = (id) => {
466
+ if (typeof onExtensionEnabled === "function")
467
+ onExtensionEnabled(id);
468
+ };
469
+ const connectToAccount = (0, import_react3.useCallback)(
470
+ (account) => {
471
+ var _a;
472
+ maybeSetActiveAccount((_a = account == null ? void 0 : account.address) != null ? _a : null);
473
+ },
474
+ [maybeSetActiveAccount]
475
+ );
476
+ const connectExtensionAccounts = (id) => __async(void 0, null, function* () {
477
+ const extensionKeys = Object.keys(extensionsStatus);
478
+ const exists = extensionKeys.find((key) => key === id) || void 0;
479
+ if (!exists) {
480
+ updateInitialisedExtensions(
481
+ `unknown_extension_${extensionsInitialisedRef.current.length + 1}`
482
+ );
483
+ } else {
484
+ try {
485
+ const { enable } = window.injectedWeb3[id];
486
+ const extension = yield enable(dappName);
487
+ if (extension !== void 0) {
488
+ maybeOnExtensionEnabled(id);
489
+ const handleAccounts = (a) => {
490
+ const { newAccounts, meta } = handleImportExtension(
491
+ id,
492
+ extensionAccountsRef.current,
493
+ extension,
494
+ a,
495
+ forgetAccounts,
496
+ { network, ss58 }
497
+ );
498
+ if (!activeAccount) {
499
+ const activeExtensionAccount = getActiveExtensionAccount(
500
+ { network, ss58 },
501
+ newAccounts
502
+ );
503
+ if ((activeExtensionAccount == null ? void 0 : activeExtensionAccount.address) !== meta.removedActiveAccount && meta.removedActiveAccount !== null)
504
+ connectActiveExtensionAccount(
505
+ activeExtensionAccount,
506
+ connectToAccount
507
+ );
508
+ }
509
+ addExtensionAccount(newAccounts);
510
+ updateInitialisedExtensions(id);
511
+ };
512
+ if (!extensionHasFeature(id, "subscribeAccounts")) {
513
+ const accounts = yield extension.accounts.get();
514
+ handleAccounts(accounts);
515
+ } else {
516
+ const unsub = extension.accounts.subscribe((accounts) => {
517
+ if (accounts)
518
+ handleAccounts(accounts);
519
+ });
520
+ addToUnsubscribe(id, unsub);
521
+ }
522
+ return true;
523
+ }
524
+ } catch (err) {
525
+ handleExtensionError(id, String(err));
526
+ }
527
+ }
528
+ return false;
529
+ });
530
+ const handleExtensionError = (0, import_react3.useCallback)(
531
+ (id, err) => {
532
+ if (err.startsWith("Error")) {
533
+ removeFromLocalExtensions(id);
534
+ if (err.substring(0, 17) === "NotInstalledError") {
535
+ removeExtensionStatus(id);
536
+ } else {
537
+ setExtensionStatus(id, "not_authenticated");
538
+ }
539
+ }
540
+ updateInitialisedExtensions(id);
541
+ },
542
+ [removeExtensionStatus, setExtensionStatus]
543
+ );
544
+ const forgetAccounts = (0, import_react3.useCallback)(
545
+ (forget) => {
546
+ if (forget.length) {
547
+ for (const { address } of forget) {
548
+ if (extensionAccountsRef.current.find((a) => a.address === address)) {
549
+ const unsub = unsubs.current[address];
550
+ if (unsub) {
551
+ unsub();
552
+ delete unsubs.current[address];
553
+ }
554
+ }
555
+ }
556
+ (0, import_sdk_utils5.setStateWithRef)(
557
+ [...extensionAccountsRef.current].filter(
558
+ (a) => forget.find((s) => s.address === a.address) === void 0
559
+ ),
560
+ setExtensionAccounts,
561
+ extensionAccountsRef
562
+ );
563
+ if (activeAccount) {
564
+ if (forget.find(({ address }) => address === activeAccount) !== void 0)
565
+ maybeSetActiveAccount(null);
566
+ }
567
+ }
568
+ },
569
+ [activeAccount, maybeSetActiveAccount]
570
+ );
571
+ const connectActiveExtensions = (0, import_react3.useCallback)(() => __async(void 0, null, function* () {
572
+ var _a;
573
+ const extensionKeys = Object.keys(extensionsStatus);
574
+ if (!extensionKeys.length)
575
+ return;
576
+ const total = (_a = extensionKeys == null ? void 0 : extensionKeys.length) != null ? _a : 0;
577
+ let activeWalletAccount = null;
578
+ let i = 0;
579
+ for (const id of extensionKeys) {
580
+ i++;
581
+ const isLocal = extensionIsLocal(id != null ? id : "0");
582
+ if (!id || !isLocal) {
583
+ updateInitialisedExtensions(
584
+ id || `unknown_extension_${extensionsInitialisedRef.current.length + 1}`
585
+ );
586
+ } else {
587
+ try {
588
+ const { enable } = window.injectedWeb3[id];
589
+ const extension = yield enable(dappName);
590
+ if (extension !== void 0) {
591
+ const handleAccounts = (accounts) => {
592
+ const { newAccounts, meta } = handleImportExtension(
593
+ id,
594
+ extensionAccountsRef.current,
595
+ extension,
596
+ accounts,
597
+ forgetAccounts,
598
+ {
599
+ network,
600
+ ss58
601
+ }
602
+ );
603
+ if (newAccounts.length) {
604
+ if (!activeWalletAccount)
605
+ activeWalletAccount = getActiveExtensionAccount(
606
+ { network, ss58 },
607
+ newAccounts
608
+ );
609
+ }
610
+ if (i === total && !activeAccount) {
611
+ const activeAccountRemoved = (activeWalletAccount == null ? void 0 : activeWalletAccount.address) !== meta.removedActiveAccount && meta.removedActiveAccount !== null;
612
+ if (!activeAccountRemoved) {
613
+ connectActiveExtensionAccount(
614
+ activeWalletAccount,
615
+ connectToAccount
616
+ );
617
+ }
618
+ }
619
+ addExtensionAccount(newAccounts);
620
+ updateInitialisedExtensions(id);
621
+ };
622
+ if (!extensionHasFeature(id, "subscribeAccounts")) {
623
+ const accounts = yield extension.accounts.get();
624
+ handleAccounts(accounts);
625
+ } else {
626
+ const unsub = extension.accounts.subscribe((accounts) => {
627
+ if (accounts)
628
+ handleAccounts(accounts);
629
+ });
630
+ addToUnsubscribe(id, unsub);
631
+ }
632
+ }
633
+ } catch (err) {
634
+ handleExtensionError(id, String(err));
635
+ }
636
+ }
637
+ }
638
+ }), [
639
+ activeAccount,
640
+ connectActiveExtensionAccount,
641
+ connectToAccount,
642
+ dappName,
643
+ extensionHasFeature,
644
+ extensionsStatus,
645
+ forgetAccounts,
646
+ getActiveExtensionAccount,
647
+ handleExtensionError,
648
+ handleImportExtension,
649
+ network,
650
+ ss58
651
+ ]);
652
+ const updateInitialisedExtensions = (id) => {
653
+ if (!extensionsInitialisedRef.current.includes(id)) {
654
+ (0, import_sdk_utils5.setStateWithRef)(
655
+ [...extensionsInitialisedRef.current].concat(id),
656
+ setExtensionsInitialised,
657
+ extensionsInitialisedRef
658
+ );
659
+ }
660
+ };
661
+ const addExtensionAccount = (a) => {
662
+ (0, import_sdk_utils5.setStateWithRef)(
663
+ [...extensionAccountsRef.current].concat(a),
664
+ setExtensionAccounts,
665
+ extensionAccountsRef
666
+ );
667
+ };
668
+ const addToUnsubscribe = (id, unsub) => {
669
+ unsubs.current[id] = unsub;
670
+ };
671
+ const unsubscribe = () => {
672
+ Object.values(unsubs.current).forEach((unsub) => {
673
+ unsub();
674
+ });
675
+ };
676
+ (0, import_react3.useEffect)(() => {
677
+ if (!checkingInjectedWeb3 && extensionAccountsSynced === "unsynced") {
678
+ unsubscribe();
679
+ (0, import_sdk_utils5.setStateWithRef)([], setExtensionAccounts, extensionAccountsRef);
680
+ (0, import_sdk_utils5.setStateWithRef)([], setExtensionsInitialised, extensionsInitialisedRef);
681
+ if (Object.keys(extensionsStatus).length) {
682
+ const localExtensions = (0, import_sdk_utils5.localStorageOrDefault)(
683
+ `active_extensions`,
684
+ [],
685
+ true
686
+ );
687
+ if (Object.keys(extensionsStatus).length && localExtensions.length) {
688
+ setExtensionAccountsSynced("syncing");
689
+ connectActiveExtensions();
690
+ } else
691
+ setExtensionAccountsSynced("synced");
692
+ }
693
+ }
694
+ return () => unsubscribe();
695
+ }, [
696
+ extensionsStatus,
697
+ checkingInjectedWeb3,
698
+ extensionAccountsSynced,
699
+ connectActiveExtensions
700
+ ]);
701
+ (0, import_react_hooks.useEffectIgnoreInitial)(() => {
702
+ setExtensionAccountsSynced("unsynced");
703
+ }, [ss58]);
704
+ (0, import_react_hooks.useEffectIgnoreInitial)(() => {
705
+ if (!checkingInjectedWeb3 && extensionsInitialised.length === Object.keys(extensionsStatus).length) {
706
+ setExtensionAccountsSynced("synced");
707
+ }
708
+ }, [checkingInjectedWeb3, extensionsInitialised]);
709
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
710
+ ExtensionAccountsContext.Provider,
711
+ {
712
+ value: {
713
+ connectExtensionAccounts,
714
+ extensionAccountsSynced,
715
+ extensionAccounts: extensionAccountsRef.current
716
+ },
717
+ children
718
+ }
719
+ );
720
+ };
721
+
722
+ // src/ExtensionAccountsProvider/useExtensionAccounts.tsx
723
+ var import_react4 = require("react");
724
+ var useExtensionAccounts = () => {
725
+ var _a;
726
+ const state = (0, import_react4.useContext)(ExtensionAccountsContext);
727
+ if (!ExtensionAccountsContext) {
728
+ const error = new Error("ExtensionAccountsContext context is undefined");
729
+ error.name = "ContextError";
730
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, import_react4.useContext);
731
+ throw error;
732
+ }
733
+ return __spreadValues({}, state);
734
+ };
735
+
736
+ // src/LocalAccountsProvider/provider.tsx
737
+ var import_react5 = require("react");
738
+ var import_local_wallets = require("@aksumite/local-wallets");
739
+ var import_jsx_runtime3 = require("react/jsx-runtime");
740
+ var wallet = new import_local_wallets.BrowserWallet();
741
+ var LocalAccountsContext = (0, import_react5.createContext)(
742
+ {
743
+ wallet,
744
+ isReady: false,
745
+ localAddresses: []
746
+ }
747
+ );
748
+ var UserAccountsProvider = ({
749
+ children
750
+ }) => {
751
+ const [localAddresses, setLocalAddresses] = (0, import_react5.useState)([]);
752
+ (0, import_react5.useEffect)(() => {
753
+ if (!wallet.isReady()) {
754
+ wallet.init().then(() => {
755
+ wallet.subscribeAddresses((addresses) => {
756
+ setLocalAddresses(addresses);
757
+ });
758
+ });
759
+ }
760
+ });
761
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
762
+ LocalAccountsContext.Provider,
763
+ {
764
+ value: {
765
+ wallet,
766
+ isReady: wallet.isReady(),
767
+ localAddresses
768
+ },
769
+ children
770
+ }
771
+ );
772
+ };
773
+
774
+ // src/LocalAccountsProvider/useLocalAccounts.tsx
775
+ var import_react6 = require("react");
776
+ var useUserAccounts = () => {
777
+ var _a;
778
+ const state = (0, import_react6.useContext)(LocalAccountsContext);
779
+ if (!LocalAccountsContext) {
780
+ const error = new Error("UserAccountsContext context is undefined");
781
+ error.name = "ContextError";
782
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, import_react6.useContext);
783
+ throw error;
784
+ }
785
+ return __spreadValues({}, state);
786
+ };
787
+
788
+ // src/TransactionManagerProvider/provider.tsx
789
+ var import_react7 = require("react");
790
+
791
+ // src/TransactionManagerProvider/utils.ts
792
+ var getStatus = (status) => {
793
+ const statusMap = {
794
+ isError: "error",
795
+ isBroadcast: "broadcasted",
796
+ isInBlock: "inblock",
797
+ isFinalized: "finalized"
798
+ };
799
+ for (const key of Object.keys(statusMap).reverse())
800
+ if (status[key])
801
+ return statusMap[key];
802
+ return "ongoing";
803
+ };
804
+
805
+ // src/TransactionManagerProvider/provider.tsx
806
+ var import_jsx_runtime4 = require("react/jsx-runtime");
807
+ var TransactionManagerProvider = ({
808
+ children
809
+ }) => {
810
+ const [txQueue, _setTxQueue] = (0, import_react7.useState)([]);
811
+ const [txStatus, _setTxStatus] = (0, import_react7.useState)([]);
812
+ const stRef = (0, import_react7.useRef)(txStatus);
813
+ const txRef = (0, import_react7.useRef)(txQueue);
814
+ const setStQueue = (0, import_react7.useCallback)((st) => {
815
+ stRef.current = st;
816
+ _setTxStatus(st);
817
+ }, []);
818
+ const setTxQueue = (0, import_react7.useCallback)((txs) => {
819
+ txRef.current = txs;
820
+ _setTxQueue(txs);
821
+ }, []);
822
+ const updateTxStatus = (0, import_react7.useCallback)(
823
+ (extrinsic, hash, result) => {
824
+ const updatedTxStatus = stRef.current.map((e) => {
825
+ if (e.hash === hash) {
826
+ if (e.error)
827
+ return e;
828
+ let error = "";
829
+ const { status, isError, dispatchError } = result;
830
+ const { isFinalized, isInBlock, isBroadcast } = status;
831
+ if (dispatchError) {
832
+ if (dispatchError.isModule) {
833
+ const { docs, name, section } = extrinsic.registry.findMetaError(
834
+ dispatchError.asModule
835
+ );
836
+ error = `${section}.${name}: ${docs.join(" ")}`;
837
+ } else {
838
+ error = dispatchError.toString();
839
+ }
840
+ }
841
+ const statusText = getStatus({
842
+ isError,
843
+ isBroadcast,
844
+ isInBlock,
845
+ isFinalized
846
+ });
847
+ return {
848
+ hash,
849
+ result: [...e.result, result],
850
+ status: statusText,
851
+ error
852
+ };
853
+ }
854
+ return e;
855
+ });
856
+ setStQueue(updatedTxStatus);
857
+ if (!result || result.isError || result.dispatchError || result.status.isFinalized) {
858
+ const validTxs = txRef.current.filter(
859
+ (t) => t.hash.toHex().toString() !== hash
860
+ );
861
+ setTxQueue(validTxs);
862
+ }
863
+ },
864
+ [setStQueue, setTxQueue]
865
+ );
866
+ const sendExtrinsicToChain = (0, import_react7.useCallback)(
867
+ (ext) => __async(void 0, null, function* () {
868
+ const hash = ext.hash.toHex().toString();
869
+ try {
870
+ yield ext.send((result) => updateTxStatus(ext, hash, result));
871
+ } catch (error) {
872
+ throw new Error(error);
873
+ }
874
+ }),
875
+ [updateTxStatus]
876
+ );
877
+ const addToTxQueue = (tx) => {
878
+ setTxQueue([...txQueue, tx]);
879
+ setStQueue([
880
+ ...txStatus,
881
+ {
882
+ hash: tx.hash.toHex().toString(),
883
+ result: [],
884
+ status: "ongoing"
885
+ }
886
+ ]);
887
+ };
888
+ const getTxStatus = (0, import_react7.useCallback)(
889
+ (hash) => {
890
+ return txStatus.find((s) => s.hash === hash);
891
+ },
892
+ [txStatus]
893
+ );
894
+ (0, import_react7.useEffect)(() => {
895
+ if (txQueue.length) {
896
+ const started = txStatus.filter((s) => !s.error).find((s) => s.status === "broadcasted" || s.status === "inblock");
897
+ if (!started)
898
+ sendExtrinsicToChain(txQueue[0]);
899
+ }
900
+ }, [txStatus, txQueue, sendExtrinsicToChain]);
901
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Provider, { value: { addToTxQueue, getTxStatus, txStatus }, children });
902
+ };
903
+ var Context = (0, import_react7.createContext)({
904
+ addToTxQueue: () => {
905
+ },
906
+ getTxStatus: () => void 0,
907
+ txStatus: []
908
+ });
909
+ var Provider = ({
910
+ value,
911
+ children
912
+ }) => {
913
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Context.Provider, { value, children });
914
+ };
915
+
916
+ // src/TransactionManagerProvider/useTransactionManager.ts
917
+ var import_react8 = require("react");
918
+ var useTransactionManager = () => {
919
+ var _a;
920
+ const state = (0, import_react8.useContext)(Context);
921
+ if (!state) {
922
+ const error = new Error("useTransactionManager context is undefined");
923
+ error.name = "ContextError";
924
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, import_react8.useContext);
925
+ throw error;
926
+ }
927
+ return __spreadValues({}, state);
928
+ };
929
+ // Annotate the CommonJS export names for ESM import in node:
930
+ 0 && (module.exports = {
931
+ Context,
932
+ ExtensionAccountsContext,
933
+ ExtensionAccountsProvider,
934
+ ExtensionsContext,
935
+ ExtensionsProvider,
936
+ LocalAccountsContext,
937
+ TransactionManagerProvider,
938
+ UserAccountsProvider,
939
+ defaultExtensionAccountsContext,
940
+ defaultExtensionsContext,
941
+ defaultHandleImportExtension,
942
+ useExtensionAccounts,
943
+ useExtensions,
944
+ useTransactionManager,
945
+ useUserAccounts
946
+ });