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