@kheopskit/core 0.0.1-alpha.0 → 0.0.1
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/CHANGELOG.md +14 -0
- package/dist/index.d.mts +70 -60
- package/dist/index.d.ts +70 -60
- package/dist/index.js +574 -227
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +613 -244
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -6
- package/src/api/accounts.ts +25 -12
- package/src/api/appKit.ts +122 -0
- package/src/api/config.ts +5 -4
- package/src/api/ethereum/accounts.ts +183 -62
- package/src/api/ethereum/wallets.ts +38 -24
- package/src/api/index.ts +1 -0
- package/src/api/kheopskit.ts +35 -13
- package/src/api/polkadot/accounts.ts +117 -29
- package/src/api/polkadot/wallets.ts +88 -68
- package/src/api/store.ts +6 -3
- package/src/api/types.ts +71 -54
- package/src/api/wallets.ts +16 -14
- package/src/index.ts +0 -2
- package/src/utils/{AccountId.ts → WalletAccountId.ts} +5 -5
- package/src/utils/WalletId.ts +1 -1
- package/src/utils/createStore.ts +1 -1
- package/src/utils/getAccountAddressType.ts +2 -1
- package/src/utils/getCachedObservable.ts +12 -0
- package/src/utils/getQuery.ts +72 -0
- package/src/utils/index.ts +1 -3
- package/src/utils/isEthereumAddress.ts +3 -1
- package/src/utils/isSs58Address.ts +2 -2
- package/src/utils/isWalletPlatform.ts +1 -1
- package/src/utils/logObservable.ts +21 -0
- package/src/utils/polkadotExtensions.ts +21 -0
- package/src/utils/sortAccounts.ts +36 -0
- package/src/utils/sortWallets.ts +14 -0
- package/src/utils/isTruthy.ts +0 -3
- package/src/utils/types.ts +0 -5
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,48 @@
|
|
|
1
|
+
// src/utils/logObservable.ts
|
|
2
|
+
import { tap } from "rxjs";
|
|
3
|
+
var logObservable = (label, opts) => tap((value) => {
|
|
4
|
+
const { printValue = false, enabled = true } = opts || {};
|
|
5
|
+
if (!label || !enabled) return;
|
|
6
|
+
const text = `[kheopskit] observable ${label} emit`;
|
|
7
|
+
if (printValue) console.debug(text, value);
|
|
8
|
+
else console.debug(text);
|
|
9
|
+
});
|
|
10
|
+
|
|
1
11
|
// src/api/kheopskit.ts
|
|
2
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
Observable as Observable8,
|
|
14
|
+
combineLatest as combineLatest8,
|
|
15
|
+
map as map9,
|
|
16
|
+
shareReplay as shareReplay8,
|
|
17
|
+
throttleTime
|
|
18
|
+
} from "rxjs";
|
|
19
|
+
|
|
20
|
+
// src/utils/sortAccounts.ts
|
|
21
|
+
var sortAccounts = (a1, a2) => {
|
|
22
|
+
if (a1.platform === "polkadot") {
|
|
23
|
+
if (a2.platform === "polkadot") {
|
|
24
|
+
if (a1.walletName !== a2.walletName) {
|
|
25
|
+
if (a1.walletName === "talisman") return -1;
|
|
26
|
+
if (a2.walletName === "talisman") return 1;
|
|
27
|
+
return a1.walletName.localeCompare(a2.walletName);
|
|
28
|
+
}
|
|
29
|
+
return a1.name !== a2.name ? (a1.name ?? "").localeCompare(a2.name ?? "") : a1.address.localeCompare(a2.address);
|
|
30
|
+
}
|
|
31
|
+
return -1;
|
|
32
|
+
}
|
|
33
|
+
if (a2.platform === "ethereum") {
|
|
34
|
+
if (a1.walletName !== a2.walletName) {
|
|
35
|
+
if (a1.walletName === "Talisman") return -1;
|
|
36
|
+
if (a2.walletName === "Talisman") return 1;
|
|
37
|
+
return a1.walletName.localeCompare(a2.walletName);
|
|
38
|
+
}
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
return 0;
|
|
42
|
+
};
|
|
3
43
|
|
|
4
44
|
// src/api/accounts.ts
|
|
5
|
-
import {
|
|
45
|
+
import { Observable as Observable3, combineLatest as combineLatest3, map as map4, of as of3, shareReplay as shareReplay3 } from "rxjs";
|
|
6
46
|
|
|
7
47
|
// src/utils/createStore.ts
|
|
8
48
|
import { BehaviorSubject, filter, fromEvent, map } from "rxjs";
|
|
@@ -40,7 +80,8 @@ var setStoredData = (key, val) => {
|
|
|
40
80
|
};
|
|
41
81
|
|
|
42
82
|
// src/utils/isEthereumAddress.ts
|
|
43
|
-
|
|
83
|
+
import { isAddress } from "viem";
|
|
84
|
+
var isEthereumAddress = (address) => isAddress(address);
|
|
44
85
|
|
|
45
86
|
// src/utils/isSs58Address.ts
|
|
46
87
|
import { AccountId } from "polkadot-api";
|
|
@@ -50,7 +91,7 @@ var isSs58Address = (address) => {
|
|
|
50
91
|
if (!address) return false;
|
|
51
92
|
accountIdEncoder(address);
|
|
52
93
|
return true;
|
|
53
|
-
} catch
|
|
94
|
+
} catch {
|
|
54
95
|
return false;
|
|
55
96
|
}
|
|
56
97
|
};
|
|
@@ -60,8 +101,8 @@ var isValidAddress = (address) => {
|
|
|
60
101
|
return address.startsWith("0x") ? isEthereumAddress(address) : isSs58Address(address);
|
|
61
102
|
};
|
|
62
103
|
|
|
63
|
-
// src/utils/
|
|
64
|
-
var
|
|
104
|
+
// src/utils/WalletAccountId.ts
|
|
105
|
+
var getWalletAccountId = (walletId, address) => {
|
|
65
106
|
if (!walletId) throw new Error("Missing walletId");
|
|
66
107
|
if (!isValidAddress(address)) throw new Error("Invalid address");
|
|
67
108
|
return `${walletId}::${address}`;
|
|
@@ -70,19 +111,335 @@ var getAccountId = (walletId, address) => {
|
|
|
70
111
|
// src/utils/isWalletPlatform.ts
|
|
71
112
|
var isWalletPlatform = (platform) => typeof platform === "string" && ["polkadot", "ethereum"].includes(platform);
|
|
72
113
|
|
|
114
|
+
// src/utils/getCachedObservable.ts
|
|
115
|
+
var CACHE = /* @__PURE__ */ new Map();
|
|
116
|
+
var getCachedObservable$ = (key, create) => {
|
|
117
|
+
if (!CACHE.has(key)) CACHE.set(key, create());
|
|
118
|
+
return CACHE.get(key);
|
|
119
|
+
};
|
|
120
|
+
|
|
73
121
|
// src/api/ethereum/accounts.ts
|
|
74
122
|
import {
|
|
123
|
+
Observable,
|
|
124
|
+
ReplaySubject,
|
|
125
|
+
combineLatest,
|
|
126
|
+
distinctUntilChanged,
|
|
127
|
+
map as map2,
|
|
128
|
+
of,
|
|
129
|
+
shareReplay,
|
|
130
|
+
switchMap
|
|
131
|
+
} from "rxjs";
|
|
132
|
+
import {
|
|
133
|
+
createWalletClient,
|
|
134
|
+
custom,
|
|
135
|
+
getAddress
|
|
136
|
+
} from "viem";
|
|
137
|
+
var getInjectedWalletAccounts$ = (wallet) => {
|
|
138
|
+
if (!wallet.isConnected) return of([]);
|
|
139
|
+
return getCachedObservable$(
|
|
140
|
+
`accounts:${wallet.id}`,
|
|
141
|
+
() => new Observable((subscriber) => {
|
|
142
|
+
const getAccount = (address, i) => {
|
|
143
|
+
const client = createWalletClient({
|
|
144
|
+
account: address,
|
|
145
|
+
transport: custom(wallet.provider)
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
id: getWalletAccountId(wallet.id, address),
|
|
149
|
+
platform: "ethereum",
|
|
150
|
+
client,
|
|
151
|
+
address: getAddress(address),
|
|
152
|
+
walletName: wallet.name,
|
|
153
|
+
walletId: wallet.id,
|
|
154
|
+
isWalletDefault: i === 0
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
const handleAccountsChanged = (addresses) => {
|
|
158
|
+
subscriber.next(addresses.map(getAccount));
|
|
159
|
+
};
|
|
160
|
+
wallet.provider.on("accountsChanged", handleAccountsChanged);
|
|
161
|
+
wallet.provider.request({ method: "eth_accounts" }).then((addresses) => {
|
|
162
|
+
subscriber.next(addresses.map(getAccount));
|
|
163
|
+
}).catch((err) => {
|
|
164
|
+
console.error("Failed to get accounts", err);
|
|
165
|
+
subscriber.next([]);
|
|
166
|
+
});
|
|
167
|
+
return () => {
|
|
168
|
+
wallet.provider.removeListener(
|
|
169
|
+
"accountsChanged",
|
|
170
|
+
handleAccountsChanged
|
|
171
|
+
);
|
|
172
|
+
};
|
|
173
|
+
}).pipe(shareReplay({ refCount: true, bufferSize: 1 }))
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
var wrapWalletConnectProvider = (provider, sessionTopic, caipNetworkId) => {
|
|
177
|
+
return new Proxy(provider, {
|
|
178
|
+
get(target, prop, receiver) {
|
|
179
|
+
if (prop !== "request") return Reflect.get(target, prop, receiver);
|
|
180
|
+
return (args) => {
|
|
181
|
+
if (args && typeof args === "object" && args.method) {
|
|
182
|
+
if (!args.topic) args.topic = sessionTopic;
|
|
183
|
+
if (!args.chainId) args.chainId = caipNetworkId;
|
|
184
|
+
}
|
|
185
|
+
return target.request(args);
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
var getAppKitAccounts$ = (wallet) => {
|
|
191
|
+
const account = wallet.appKit.getAccount("eip155");
|
|
192
|
+
const provider = wallet.appKit.getProvider("eip155");
|
|
193
|
+
if (!wallet.isConnected || !wallet.appKit || !account?.allAccounts.length || !provider?.session)
|
|
194
|
+
return of([]);
|
|
195
|
+
return getCachedObservable$(
|
|
196
|
+
"accounts:appKit",
|
|
197
|
+
() => new Observable((subscriber) => {
|
|
198
|
+
const caipNetworkId$ = new ReplaySubject(1);
|
|
199
|
+
const handleChainChanged = (chainId) => {
|
|
200
|
+
caipNetworkId$.next(`eip155:${chainId}`);
|
|
201
|
+
};
|
|
202
|
+
provider.on("chainChanged", handleChainChanged);
|
|
203
|
+
provider.request({ method: "eth_chainId" }).then(handleChainChanged);
|
|
204
|
+
const sub = caipNetworkId$.pipe(
|
|
205
|
+
distinctUntilChanged(),
|
|
206
|
+
map2(
|
|
207
|
+
(caipNetworkId) => custom(
|
|
208
|
+
wrapWalletConnectProvider(
|
|
209
|
+
provider,
|
|
210
|
+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
211
|
+
provider.session.topic,
|
|
212
|
+
caipNetworkId
|
|
213
|
+
)
|
|
214
|
+
)
|
|
215
|
+
),
|
|
216
|
+
map2(
|
|
217
|
+
(transport) => account.allAccounts.map((acc, i) => {
|
|
218
|
+
const client = createWalletClient({
|
|
219
|
+
account: acc.address,
|
|
220
|
+
transport
|
|
221
|
+
});
|
|
222
|
+
return {
|
|
223
|
+
id: getWalletAccountId(wallet.id, acc.address),
|
|
224
|
+
platform: "ethereum",
|
|
225
|
+
walletName: wallet.name,
|
|
226
|
+
walletId: wallet.id,
|
|
227
|
+
address: acc.address,
|
|
228
|
+
client,
|
|
229
|
+
isWalletDefault: i === 0
|
|
230
|
+
};
|
|
231
|
+
})
|
|
232
|
+
)
|
|
233
|
+
).subscribe(subscriber);
|
|
234
|
+
return () => {
|
|
235
|
+
provider.off("chainChanged", handleChainChanged);
|
|
236
|
+
sub.unsubscribe();
|
|
237
|
+
};
|
|
238
|
+
}).pipe(shareReplay({ refCount: true, bufferSize: 1 }))
|
|
239
|
+
);
|
|
240
|
+
};
|
|
241
|
+
var getEthereumAccounts$ = (ethereumWallets) => new Observable((subscriber) => {
|
|
242
|
+
const sub = ethereumWallets.pipe(
|
|
243
|
+
map2((wallets) => wallets.filter((w) => w.isConnected)),
|
|
244
|
+
switchMap((wallets) => {
|
|
245
|
+
return wallets.length ? combineLatest([
|
|
246
|
+
...wallets.filter((w) => w.type === "injected").map(getInjectedWalletAccounts$),
|
|
247
|
+
...wallets.filter((w) => w.type === "appKit").map(getAppKitAccounts$)
|
|
248
|
+
// todo appkit
|
|
249
|
+
]) : of([]);
|
|
250
|
+
}),
|
|
251
|
+
map2((accounts) => accounts.flat()),
|
|
252
|
+
distinctUntilChanged(isSameAccountsList)
|
|
253
|
+
).subscribe(subscriber);
|
|
254
|
+
return () => {
|
|
255
|
+
sub.unsubscribe();
|
|
256
|
+
};
|
|
257
|
+
}).pipe(
|
|
258
|
+
// logObservable("ethereumAccounts$", true),
|
|
259
|
+
shareReplay({ refCount: true, bufferSize: 1 })
|
|
260
|
+
);
|
|
261
|
+
var isSameAccountsList = (a, b) => {
|
|
262
|
+
if (a.length !== b.length) return false;
|
|
263
|
+
return a.every((account, i) => account.id === b[i]?.id);
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
// src/api/polkadot/accounts.ts
|
|
267
|
+
import {
|
|
268
|
+
getPolkadotSignerFromPjs
|
|
269
|
+
} from "polkadot-api/pjs-signer";
|
|
270
|
+
import {
|
|
271
|
+
Observable as Observable2,
|
|
75
272
|
combineLatest as combineLatest2,
|
|
273
|
+
distinctUntilChanged as distinctUntilChanged2,
|
|
76
274
|
map as map3,
|
|
77
|
-
|
|
78
|
-
of,
|
|
275
|
+
of as of2,
|
|
79
276
|
shareReplay as shareReplay2,
|
|
80
|
-
switchMap
|
|
277
|
+
switchMap as switchMap2
|
|
81
278
|
} from "rxjs";
|
|
82
|
-
|
|
279
|
+
var getInjectedWalletAccounts$2 = (wallet) => {
|
|
280
|
+
if (!wallet.isConnected) return of2([]);
|
|
281
|
+
return new Observable2((subscriber) => {
|
|
282
|
+
const getAccount = (account) => ({
|
|
283
|
+
id: getWalletAccountId(wallet.id, account.address),
|
|
284
|
+
...account,
|
|
285
|
+
platform: "polkadot",
|
|
286
|
+
walletName: wallet.name,
|
|
287
|
+
walletId: wallet.id
|
|
288
|
+
});
|
|
289
|
+
const extension = wallet.extension;
|
|
290
|
+
const unsubscribe = extension.subscribe((accounts) => {
|
|
291
|
+
subscriber.next(accounts.map(getAccount));
|
|
292
|
+
});
|
|
293
|
+
subscriber.next(extension.getAccounts().map(getAccount));
|
|
294
|
+
return () => {
|
|
295
|
+
return unsubscribe();
|
|
296
|
+
};
|
|
297
|
+
});
|
|
298
|
+
};
|
|
299
|
+
var getAppKitPolkadotSigner = (appKit, address) => {
|
|
300
|
+
const provider = appKit.getProvider("polkadot");
|
|
301
|
+
if (!provider) throw new Error("No provider found");
|
|
302
|
+
if (!provider.session) throw new Error("No session found");
|
|
303
|
+
return getPolkadotSignerFromPjs(
|
|
304
|
+
address,
|
|
305
|
+
(transactionPayload) => {
|
|
306
|
+
if (!provider.session) throw new Error("No session found");
|
|
307
|
+
return provider.client.request({
|
|
308
|
+
topic: provider.session.topic,
|
|
309
|
+
chainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,
|
|
310
|
+
request: {
|
|
311
|
+
method: "polkadot_signTransaction",
|
|
312
|
+
params: {
|
|
313
|
+
address,
|
|
314
|
+
transactionPayload
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
},
|
|
319
|
+
async ({ address: address2, data }) => {
|
|
320
|
+
if (!provider.session) throw new Error("No session found");
|
|
321
|
+
const networks = appKit.getCaipNetworks("polkadot");
|
|
322
|
+
const chainId = networks[0]?.caipNetworkId;
|
|
323
|
+
if (!chainId) throw new Error("No chainId found");
|
|
324
|
+
return provider.client.request({
|
|
325
|
+
topic: provider.session.topic,
|
|
326
|
+
chainId,
|
|
327
|
+
request: {
|
|
328
|
+
method: "polkadot_signMessage",
|
|
329
|
+
params: {
|
|
330
|
+
address: address2,
|
|
331
|
+
message: data
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
);
|
|
337
|
+
};
|
|
338
|
+
var getAppKitAccounts$2 = (wallet) => {
|
|
339
|
+
const account = wallet.appKit.getAccount("polkadot");
|
|
340
|
+
const provider = wallet.appKit.getProvider("polkadot");
|
|
341
|
+
if (!wallet.isConnected || !wallet.appKit || !account?.allAccounts.length || !provider?.session)
|
|
342
|
+
return of2([]);
|
|
343
|
+
return of2(
|
|
344
|
+
account.allAccounts.map(
|
|
345
|
+
(acc) => ({
|
|
346
|
+
id: getWalletAccountId(wallet.id, acc.address),
|
|
347
|
+
platform: "polkadot",
|
|
348
|
+
walletName: wallet.name,
|
|
349
|
+
walletId: wallet.id,
|
|
350
|
+
address: acc.address,
|
|
351
|
+
polkadotSigner: getAppKitPolkadotSigner(wallet.appKit, acc.address),
|
|
352
|
+
genesisHash: null,
|
|
353
|
+
name: `${wallet.name} Polkadot`,
|
|
354
|
+
type: "sr25519"
|
|
355
|
+
})
|
|
356
|
+
)
|
|
357
|
+
);
|
|
358
|
+
};
|
|
359
|
+
var getPolkadotAccounts$ = (polkadotWallets$) => new Observable2((subscriber) => {
|
|
360
|
+
const sub = polkadotWallets$.pipe(
|
|
361
|
+
map3((wallets) => wallets.filter((w) => w.isConnected)),
|
|
362
|
+
switchMap2(
|
|
363
|
+
(wallets) => wallets.length ? combineLatest2([
|
|
364
|
+
...wallets.filter((w) => w.type === "injected").map(getInjectedWalletAccounts$2),
|
|
365
|
+
...wallets.filter((w) => w.type === "appKit").map(getAppKitAccounts$2)
|
|
366
|
+
]) : of2([])
|
|
367
|
+
),
|
|
368
|
+
map3((accounts) => accounts.flat()),
|
|
369
|
+
distinctUntilChanged2(isSameAccountsList2)
|
|
370
|
+
).subscribe(subscriber);
|
|
371
|
+
return () => {
|
|
372
|
+
sub.unsubscribe();
|
|
373
|
+
};
|
|
374
|
+
}).pipe(shareReplay2({ refCount: true, bufferSize: 1 }));
|
|
375
|
+
var isSameAccountsList2 = (a, b) => {
|
|
376
|
+
if (a.length !== b.length) return false;
|
|
377
|
+
return a.every((account, i) => account.id === b[i]?.id);
|
|
378
|
+
};
|
|
83
379
|
|
|
84
|
-
// src/api/
|
|
85
|
-
|
|
380
|
+
// src/api/accounts.ts
|
|
381
|
+
var getAccounts$ = (config, wallets) => {
|
|
382
|
+
return new Observable3((subscriber) => {
|
|
383
|
+
const sources = config.platforms.map(
|
|
384
|
+
(platform) => {
|
|
385
|
+
switch (platform) {
|
|
386
|
+
case "polkadot":
|
|
387
|
+
return getPolkadotAccounts$(
|
|
388
|
+
wallets.pipe(
|
|
389
|
+
map4((w) => w.filter((w2) => w2.platform === "polkadot"))
|
|
390
|
+
)
|
|
391
|
+
);
|
|
392
|
+
case "ethereum":
|
|
393
|
+
return getEthereumAccounts$(
|
|
394
|
+
wallets.pipe(
|
|
395
|
+
map4((w) => w.filter((w2) => w2.platform === "ethereum"))
|
|
396
|
+
)
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
);
|
|
401
|
+
const accounts$ = sources.length ? combineLatest3(sources).pipe(
|
|
402
|
+
map4((accounts) => accounts.flat().sort(sortAccounts))
|
|
403
|
+
) : of3([]);
|
|
404
|
+
const sub = accounts$.subscribe(subscriber);
|
|
405
|
+
return () => {
|
|
406
|
+
sub.unsubscribe();
|
|
407
|
+
};
|
|
408
|
+
}).pipe(shareReplay3({ refCount: true, bufferSize: 1 }));
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// src/api/config.ts
|
|
412
|
+
var DEFAULT_CONFIG = {
|
|
413
|
+
autoReconnect: true,
|
|
414
|
+
platforms: ["polkadot"],
|
|
415
|
+
debug: false
|
|
416
|
+
};
|
|
417
|
+
var resolveConfig = (config) => {
|
|
418
|
+
return Object.assign({}, DEFAULT_CONFIG, config);
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
// src/utils/sortWallets.ts
|
|
422
|
+
var sortWallets = (w1, w2) => {
|
|
423
|
+
if (w1.platform !== w2.platform) {
|
|
424
|
+
return w1.platform === "polkadot" ? -1 : 1;
|
|
425
|
+
}
|
|
426
|
+
if (w1.name.toLowerCase() === "talisman") return -1;
|
|
427
|
+
if (w2.name.toLowerCase() === "talisman") return 1;
|
|
428
|
+
return w1.name.localeCompare(w2.name);
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
// src/api/wallets.ts
|
|
432
|
+
import {
|
|
433
|
+
Observable as Observable7,
|
|
434
|
+
combineLatest as combineLatest7,
|
|
435
|
+
distinct,
|
|
436
|
+
filter as filter2,
|
|
437
|
+
map as map8,
|
|
438
|
+
mergeMap as mergeMap2,
|
|
439
|
+
of as of6,
|
|
440
|
+
shareReplay as shareReplay7,
|
|
441
|
+
take
|
|
442
|
+
} from "rxjs";
|
|
86
443
|
|
|
87
444
|
// src/utils/WalletId.ts
|
|
88
445
|
var getWalletId = (platform, identifier) => {
|
|
@@ -99,6 +456,7 @@ var parseWalletId = (walletId) => {
|
|
|
99
456
|
};
|
|
100
457
|
|
|
101
458
|
// src/api/store.ts
|
|
459
|
+
import { uniq } from "lodash";
|
|
102
460
|
var LOCAL_STORAGE_KEY = "kheopskit";
|
|
103
461
|
var DEFAULT_SETTINGS = {};
|
|
104
462
|
var storage = createStore(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS);
|
|
@@ -125,14 +483,108 @@ var store = {
|
|
|
125
483
|
|
|
126
484
|
// src/api/ethereum/wallets.ts
|
|
127
485
|
import { createStore as createStore2 } from "mipd";
|
|
486
|
+
import {
|
|
487
|
+
BehaviorSubject as BehaviorSubject3,
|
|
488
|
+
Observable as Observable5,
|
|
489
|
+
combineLatest as combineLatest5,
|
|
490
|
+
map as map6,
|
|
491
|
+
shareReplay as shareReplay5
|
|
492
|
+
} from "rxjs";
|
|
493
|
+
|
|
494
|
+
// src/api/appKit.ts
|
|
495
|
+
import { createAppKit } from "@reown/appkit/core";
|
|
128
496
|
import {
|
|
129
497
|
BehaviorSubject as BehaviorSubject2,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
498
|
+
Observable as Observable4,
|
|
499
|
+
combineLatest as combineLatest4,
|
|
500
|
+
distinctUntilChanged as distinctUntilChanged3,
|
|
501
|
+
map as map5,
|
|
502
|
+
of as of4,
|
|
503
|
+
shareReplay as shareReplay4
|
|
134
504
|
} from "rxjs";
|
|
135
|
-
var
|
|
505
|
+
var WALLET_CONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+";
|
|
506
|
+
var cachedAppKit = null;
|
|
507
|
+
var getAppKitWallets$ = (config) => {
|
|
508
|
+
if (!config.walletConnect) return of4({});
|
|
509
|
+
const walletConnect = config.walletConnect;
|
|
510
|
+
if (!cachedAppKit) {
|
|
511
|
+
cachedAppKit = new Observable4((subscriber) => {
|
|
512
|
+
const appKit = createAppKit({
|
|
513
|
+
projectId: walletConnect.projectId,
|
|
514
|
+
metadata: walletConnect.metadata,
|
|
515
|
+
networks: walletConnect.networks,
|
|
516
|
+
universalProviderConfigOverride: {
|
|
517
|
+
methods: {
|
|
518
|
+
polkadot: ["polkadot_signTransaction", "polkadot_signMessage"]
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
const status$ = new BehaviorSubject2({
|
|
523
|
+
isPolkadotConnected: false,
|
|
524
|
+
isEthereumConnected: false
|
|
525
|
+
});
|
|
526
|
+
const unsubProviders = appKit.subscribeProviders((providers) => {
|
|
527
|
+
status$.next({
|
|
528
|
+
isPolkadotConnected: !!providers.polkadot,
|
|
529
|
+
isEthereumConnected: !!providers.eip155
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
const polkadotWallet$ = appKit.chainNamespaces.includes("polkadot") ? status$.pipe(
|
|
533
|
+
map5((s) => s.isPolkadotConnected),
|
|
534
|
+
distinctUntilChanged3(),
|
|
535
|
+
map5((isConnected) => {
|
|
536
|
+
const walletInfo = appKit.getWalletInfo();
|
|
537
|
+
return {
|
|
538
|
+
id: getWalletId("polkadot", "walletconnect"),
|
|
539
|
+
platform: "polkadot",
|
|
540
|
+
type: "appKit",
|
|
541
|
+
appKit,
|
|
542
|
+
// todo maybe we dont want to expose the appKit instance
|
|
543
|
+
name: walletInfo?.name ?? "WalletConnect",
|
|
544
|
+
icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
|
|
545
|
+
connect: async () => {
|
|
546
|
+
if (!isConnected) await appKit.open();
|
|
547
|
+
},
|
|
548
|
+
disconnect: () => {
|
|
549
|
+
if (isConnected) appKit.disconnect();
|
|
550
|
+
},
|
|
551
|
+
isConnected
|
|
552
|
+
};
|
|
553
|
+
})
|
|
554
|
+
) : of4(void 0);
|
|
555
|
+
const ethereumWallet$ = appKit.chainNamespaces.includes("eip155") ? status$.pipe(
|
|
556
|
+
map5((s) => s.isEthereumConnected),
|
|
557
|
+
distinctUntilChanged3(),
|
|
558
|
+
map5((isConnected) => {
|
|
559
|
+
const walletInfo = appKit.getWalletInfo();
|
|
560
|
+
return {
|
|
561
|
+
id: getWalletId("ethereum", "walletconnect"),
|
|
562
|
+
platform: "ethereum",
|
|
563
|
+
type: "appKit",
|
|
564
|
+
appKit,
|
|
565
|
+
name: walletInfo?.name ?? "WalletConnect",
|
|
566
|
+
icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
|
|
567
|
+
connect: () => appKit.open(),
|
|
568
|
+
disconnect: () => appKit.disconnect(),
|
|
569
|
+
isConnected
|
|
570
|
+
};
|
|
571
|
+
})
|
|
572
|
+
) : of4(void 0);
|
|
573
|
+
const sub = combineLatest4({
|
|
574
|
+
polkadot: polkadotWallet$,
|
|
575
|
+
ethereum: ethereumWallet$
|
|
576
|
+
}).subscribe(subscriber);
|
|
577
|
+
return () => {
|
|
578
|
+
sub.unsubscribe();
|
|
579
|
+
unsubProviders();
|
|
580
|
+
};
|
|
581
|
+
}).pipe(shareReplay4({ refCount: true, bufferSize: 1 }));
|
|
582
|
+
}
|
|
583
|
+
return cachedAppKit;
|
|
584
|
+
};
|
|
585
|
+
|
|
586
|
+
// src/api/ethereum/wallets.ts
|
|
587
|
+
var providersDetails$ = new Observable5(
|
|
136
588
|
(subscriber) => {
|
|
137
589
|
const store2 = createStore2();
|
|
138
590
|
const unsubscribe = store2.subscribe((providerDetails2) => {
|
|
@@ -145,17 +597,14 @@ var providersDetails$ = new Observable(
|
|
|
145
597
|
store2.destroy();
|
|
146
598
|
};
|
|
147
599
|
}
|
|
148
|
-
).pipe(
|
|
149
|
-
|
|
150
|
-
console.count("[kheopskit] providers$ emit");
|
|
151
|
-
});
|
|
152
|
-
var ethereumWallets$ = new Observable(
|
|
600
|
+
).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
|
|
601
|
+
var ethereumInjectedWallets$ = new Observable5(
|
|
153
602
|
(subscriber) => {
|
|
154
|
-
const enabledWalletIds$ = new
|
|
603
|
+
const enabledWalletIds$ = new BehaviorSubject3(/* @__PURE__ */ new Set());
|
|
155
604
|
const connectWallet = async (walletId, provider) => {
|
|
156
605
|
if (enabledWalletIds$.value.has(walletId))
|
|
157
606
|
throw new Error(`Extension ${walletId} already connected`);
|
|
158
|
-
provider.request({
|
|
607
|
+
await provider.request({
|
|
159
608
|
method: "eth_requestAccounts"
|
|
160
609
|
});
|
|
161
610
|
const newSet = new Set(enabledWalletIds$.value);
|
|
@@ -163,7 +612,7 @@ var ethereumWallets$ = new Observable(
|
|
|
163
612
|
enabledWalletIds$.next(newSet);
|
|
164
613
|
store.addEnabledWalletId(walletId);
|
|
165
614
|
};
|
|
166
|
-
const disconnectWallet = async (walletId
|
|
615
|
+
const disconnectWallet = async (walletId) => {
|
|
167
616
|
if (!enabledWalletIds$.value.has(walletId))
|
|
168
617
|
throw new Error(`Extension ${walletId} is not connected`);
|
|
169
618
|
const newSet = new Set(enabledWalletIds$.value);
|
|
@@ -171,21 +620,22 @@ var ethereumWallets$ = new Observable(
|
|
|
171
620
|
enabledWalletIds$.next(newSet);
|
|
172
621
|
store.removeEnabledWalletId(walletId);
|
|
173
622
|
};
|
|
174
|
-
const sub =
|
|
175
|
-
|
|
623
|
+
const sub = combineLatest5([providersDetails$, enabledWalletIds$]).pipe(
|
|
624
|
+
map6(([providerDetails, enabledWalletIds]) => {
|
|
176
625
|
return providerDetails.map((pd) => {
|
|
177
626
|
const walletId = getWalletId("ethereum", pd.info.rdns);
|
|
178
627
|
const provider = pd.provider;
|
|
179
628
|
return {
|
|
180
629
|
platform: "ethereum",
|
|
630
|
+
type: "injected",
|
|
181
631
|
id: walletId,
|
|
182
632
|
name: pd.info.name,
|
|
183
633
|
icon: pd.info.icon,
|
|
184
634
|
provider,
|
|
185
|
-
|
|
635
|
+
isConnected: enabledWalletIds.has(walletId),
|
|
186
636
|
providerId: pd.info.rdns,
|
|
187
637
|
connect: () => connectWallet(walletId, provider),
|
|
188
|
-
disconnect: () => disconnectWallet(walletId
|
|
638
|
+
disconnect: () => disconnectWallet(walletId)
|
|
189
639
|
};
|
|
190
640
|
});
|
|
191
641
|
})
|
|
@@ -194,66 +644,42 @@ var ethereumWallets$ = new Observable(
|
|
|
194
644
|
sub.unsubscribe();
|
|
195
645
|
};
|
|
196
646
|
}
|
|
197
|
-
).pipe(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
id: getAccountId(wallet.id, address),
|
|
208
|
-
platform: "ethereum",
|
|
209
|
-
provider: wallet.provider,
|
|
210
|
-
address: getAddress(address),
|
|
211
|
-
walletName: wallet.name,
|
|
212
|
-
walletId: wallet.id,
|
|
213
|
-
isWalletDefault: i === 0
|
|
214
|
-
});
|
|
215
|
-
const listener = (addresses) => {
|
|
216
|
-
subscriber.next(addresses.map(getAccount));
|
|
217
|
-
};
|
|
218
|
-
wallet.provider.on("accountsChanged", listener);
|
|
219
|
-
wallet.provider.request({ method: "eth_accounts" }).then((addresses) => {
|
|
220
|
-
subscriber.next(addresses.map(getAccount));
|
|
221
|
-
}).catch((err) => {
|
|
222
|
-
console.error("Failed to get accounts", err);
|
|
223
|
-
subscriber.next([]);
|
|
224
|
-
});
|
|
225
|
-
return () => {
|
|
226
|
-
wallet.provider.removeListener("accountsChanged", listener);
|
|
227
|
-
};
|
|
228
|
-
});
|
|
229
|
-
};
|
|
230
|
-
var ethereumAccounts$ = new Observable2(
|
|
231
|
-
(subscriber) => {
|
|
232
|
-
const sub = ethereumWallets$.pipe(
|
|
233
|
-
map3((wallets) => wallets.filter((w) => w.isEnabled)),
|
|
234
|
-
switchMap(
|
|
235
|
-
(wallets) => wallets.length ? combineLatest2(wallets.map(getWalletAccounts$)) : of([])
|
|
236
|
-
),
|
|
237
|
-
map3((accounts) => accounts.flat())
|
|
647
|
+
).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
|
|
648
|
+
var getEthereumWallets$ = (config) => {
|
|
649
|
+
return new Observable5((subscriber) => {
|
|
650
|
+
const subscription = combineLatest5([
|
|
651
|
+
ethereumInjectedWallets$,
|
|
652
|
+
getAppKitWallets$(config)?.pipe(map6((w) => w.ethereum))
|
|
653
|
+
]).pipe(
|
|
654
|
+
map6(
|
|
655
|
+
([injectedWallets, appKitWallet]) => appKitWallet ? [...injectedWallets, appKitWallet] : injectedWallets
|
|
656
|
+
)
|
|
238
657
|
).subscribe(subscriber);
|
|
239
658
|
return () => {
|
|
240
|
-
|
|
659
|
+
subscription.unsubscribe();
|
|
241
660
|
};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
ethereumAccounts$.subscribe(() => {
|
|
245
|
-
console.count("[kheopskit] ethereumAccounts$ emit");
|
|
246
|
-
});
|
|
661
|
+
}).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
|
|
662
|
+
};
|
|
247
663
|
|
|
248
|
-
// src/
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
664
|
+
// src/utils/polkadotExtensions.ts
|
|
665
|
+
var POLKADOT_EXTENSIONS = {
|
|
666
|
+
talisman: {
|
|
667
|
+
name: "Talisman",
|
|
668
|
+
icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K"
|
|
669
|
+
},
|
|
670
|
+
"polkadot-js": {
|
|
671
|
+
name: "Polkadot.js",
|
|
672
|
+
icon: "data:image/svg+xml;base64,ICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwNi4yIDEwNi4yIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPgogICAgICA8ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPgogICAgICAgIDxjaXJjbGUgY3g9IjUzLjEiIGN5PSI1My4xIiByPSI1My4xIiBmaWxsPSIjZjI5MjM1IiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU0LjQ3IDEzLjc2YTI4Ljg1IDI4Ljg1IDAgMDAtMjguNzMgMjguNzMgMjkuMzQgMjkuMzQgMCAwMDEuNTIgOS4zNCA0IDQgMCAxMDcuNDktMi41MkExOC42NyAxOC42NyAwIDAxMzMuNjMgNDJhMjAuNzIgMjAuNzIgMCAxMTIyIDIxLjMxcy00IC4yNS02IC40OWMtLjc0LjExLTEuNDguMjYtMi4yLjQ0YS4yOC4yOCAwIDAxLS4zOCAwIC4yNy4yNyAwIDAxMC0uMzJsLjYzLTMuNDEgMy43OS0xN2EzLjk0IDMuOTQgMCAxMC03LjcxLTEuNjVzLTkgNDEuNy05IDQyLjA4YTMuNzkgMy43OSAwIDAwMi43NCA0LjZoLjI4YTMuNzggMy43OCAwIDAwNC42MS0yLjcxLjQzLjQzIDAgMDAwLS4xMXYtLjE5Yy4xMS0uNDkgMS4yNS02IDEuMjUtNmExMC4yMyAxMC4yMyAwIDAxOC40Ni04Yy44Ny0uMTMgNC41My0uMzggNC41My0uMzhhMjguNzEgMjguNzEgMCAwMC0yLjExLTU3LjI3eiIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU2LjIxIDgwYTQuNzggNC43OCAwIDAwLTUuNjYgMy43MS4yNC4yNCAwIDAxMCAuMDggNC43NyA0Ljc3IDAgMDAzLjY1IDUuNjdoLjE0QTQuNyA0LjcgMCAwMDYwIDg2di0uMzJBNSA1IDAgMDA1Ni4yMSA4MHoiCiAgICAgICAgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvc3ZnPg=="
|
|
673
|
+
},
|
|
674
|
+
"subwallet-js": {
|
|
675
|
+
name: "SubWallet",
|
|
676
|
+
icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNODAgNGM1Ny42MyAwIDc2IDE4LjM3IDc2IDc2IDAgNTcuNjMtMTguMzcgNzYtNzYgNzYtNTcuNjMgMC03Ni0xOC4zNy03Ni03NkM0IDIyLjM3IDIyLjM3IDQgODAgNFoiIGZpbGw9InVybCgjYSkiLz48ZyBjbGlwLXBhdGg9InVybCgjYikiPjxwYXRoIGQ9Ik0xMTIuNjE1IDY2LjcyVjUzLjM5OEw1OC43NiAzMiA0OCAzNy40MTJsLjA1NyA0MS40NjQgNDAuMjkyIDE2LjA3LTIxLjUyIDkuMDc1di03LjAxOEw1Ni45NSA5My4wM2wtOC44OTMgNC4xNjN2MjUuMzk1TDU4Ljc2OSAxMjhsNTMuODQ2LTI0LjA2MlY4Ni44NjlMNjQuMTU0IDY3LjY1N1Y1NmwzOC40NDkgMTUuMjE2IDEwLjAxMi00LjQ5NloiIGZpbGw9IiNmZmYiLz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iODAiIHkxPSI0IiB4Mj0iODAiIHkyPSIxNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNENFQUFDIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGZpbGw9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4IDMyKSIgZD0iTTAgMGg2NC42MTV2OTZIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4="
|
|
677
|
+
},
|
|
678
|
+
enkrypt: {
|
|
679
|
+
name: "Enkrypt",
|
|
680
|
+
icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODEiIGhlaWdodD0iODEiIHZpZXdCb3g9IjAgMCA4MSA4MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNy4wMDU3IDE3LjAwNjJDMTguOTMwMyAxNS4wODE2IDIxLjU0MDUgMTQuMDAwNCAyNC4yNjIyIDE0LjAwMDRMNjcuMzI5NiAxNFYyMS44NzQxQzY3LjMyOTYgMjMuODMwNSA2Ni41NTIzIDI1LjcwNjcgNjUuMTY5IDI3LjA5QzYzLjc4NTcgMjguNDczMyA2MS45MDk1IDI5LjI1MDQgNTkuOTUzMiAyOS4yNTA0SDM5LjcwNDVDMzYuOTgyOCAyOS4yNTA0IDM0LjM3MjYgMzAuMzMxNiAzMi40NDggMzIuMjU2MUMzMC41MjM1IDM0LjE4MDcgMjkuNDQyMyAzNi43OTA5IDI5LjQ0MjMgMzkuNTEyNlY0Mi4xMjQyQzI5LjQ0MjMgNDQuODQ1OSAzMC41MjM1IDQ3LjQ1NjEgMzIuNDQ4IDQ5LjM4MDZDMzQuMzcyNiA1MS4zMDUxIDM2Ljk4MjggNTIuMzg2MyAzOS43MDQ1IDUyLjM4NjNINTkuOTUzMkM2MS45MDk1IDUyLjM4NjMgNjMuNzg1NyA1My4xNjM1IDY1LjE2OSA1NC41NDY4QzY2LjU1MjMgNTUuOTMwMSA2Ny4zMjk2IDU3LjgwNjMgNjcuMzI5NiA1OS43NjI2VjY3LjMzSDI0LjI2MjJDMjEuNTQwNSA2Ny4zMyAxOC45MzAzIDY2LjI0ODggMTcuMDA1NyA2NC4zMjQzQzE1LjA4MTIgNjIuMzk5NyAxNCA1OS43ODk1IDE0IDU3LjA2NzhWMjQuMjYyNkMxNCAyMS41NDA5IDE1LjA4MTIgMTguOTMwNyAxNy4wMDU3IDE3LjAwNjJaTTQwLjE0NzkgMzMuNTQyM0g2MC45MTU3QzY0LjQ1OCAzMy41NDIzIDY3LjMyOTUgMzYuNDEzOCA2Ny4zMjk1IDM5Ljk1NjFWNDEuNjgxNkM2Ny4zMjk1IDQ1LjIyMzggNjQuNDU4IDQ4LjA5NTQgNjAuOTE1NyA0OC4wOTU0SDQwLjE0NzlDMzYuNjA1NyA0OC4wOTU0IDMzLjczNDEgNDUuMjIzOCAzMy43MzQxIDQxLjY4MTZWMzkuOTU2MUMzMy43MzQxIDM2LjQxMzggMzYuNjA1NyAzMy41NDIzIDQwLjE0NzkgMzMuNTQyM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8yODdfMjM1OSkiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yODdfMjM1OSIgeDE9IjE5LjM2MDIiIHkxPSIxNCIgeDI9IjU2Ljc2OTYiIHkyPSI2OS44MDA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDNTQ5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjU0QkZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg=="
|
|
681
|
+
}
|
|
682
|
+
};
|
|
257
683
|
|
|
258
684
|
// src/api/polkadot/wallets.ts
|
|
259
685
|
import { isEqual } from "lodash";
|
|
@@ -262,183 +688,118 @@ import {
|
|
|
262
688
|
getInjectedExtensions
|
|
263
689
|
} from "polkadot-api/pjs-signer";
|
|
264
690
|
import {
|
|
265
|
-
BehaviorSubject as
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
691
|
+
BehaviorSubject as BehaviorSubject4,
|
|
692
|
+
Observable as Observable6,
|
|
693
|
+
combineLatest as combineLatest6,
|
|
694
|
+
distinctUntilChanged as distinctUntilChanged4,
|
|
695
|
+
map as map7,
|
|
269
696
|
mergeMap,
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
shareReplay as shareReplay3,
|
|
697
|
+
of as of5,
|
|
698
|
+
shareReplay as shareReplay6,
|
|
273
699
|
timer
|
|
274
700
|
} from "rxjs";
|
|
275
701
|
var getInjectedWalletsIds = () => getInjectedExtensions().map((name) => getWalletId("polkadot", name));
|
|
276
|
-
var polkadotInjectedWallets$ = new
|
|
277
|
-
(
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
702
|
+
var polkadotInjectedWallets$ = new Observable6((subscriber) => {
|
|
703
|
+
const enabledExtensions$ = new BehaviorSubject4(/* @__PURE__ */ new Map());
|
|
704
|
+
const connect = async (walletId) => {
|
|
705
|
+
if (enabledExtensions$.value.has(walletId))
|
|
706
|
+
throw new Error(`Extension ${walletId} already connected`);
|
|
707
|
+
const { identifier } = parseWalletId(walletId);
|
|
708
|
+
const extension = await connectInjectedExtension(identifier);
|
|
709
|
+
const newMap = new Map(enabledExtensions$.value);
|
|
710
|
+
newMap.set(walletId, extension);
|
|
711
|
+
enabledExtensions$.next(newMap);
|
|
712
|
+
store.addEnabledWalletId(walletId);
|
|
713
|
+
};
|
|
714
|
+
const disconnect = (walletId) => {
|
|
715
|
+
if (!enabledExtensions$.value.has(walletId))
|
|
716
|
+
throw new Error(`Extension ${walletId} is not connected`);
|
|
717
|
+
const newMap = new Map(enabledExtensions$.value);
|
|
718
|
+
newMap.delete(walletId);
|
|
719
|
+
enabledExtensions$.next(newMap);
|
|
720
|
+
store.removeEnabledWalletId(walletId);
|
|
721
|
+
};
|
|
722
|
+
const walletIds$ = of5(0, 200, 500, 1e3).pipe(
|
|
723
|
+
mergeMap((time) => timer(time)),
|
|
724
|
+
map7(() => getInjectedWalletsIds()),
|
|
725
|
+
distinctUntilChanged4(isEqual)
|
|
726
|
+
);
|
|
727
|
+
const subscription = combineLatest6([walletIds$, enabledExtensions$]).pipe(
|
|
728
|
+
map7(([walletIds, enabledExtensions]) => {
|
|
729
|
+
return walletIds.map((id) => {
|
|
730
|
+
const { identifier } = parseWalletId(id);
|
|
731
|
+
const extension = enabledExtensions.get(id);
|
|
732
|
+
const extInfo = POLKADOT_EXTENSIONS[identifier];
|
|
733
|
+
return {
|
|
734
|
+
id,
|
|
735
|
+
type: "injected",
|
|
736
|
+
platform: "polkadot",
|
|
737
|
+
name: extInfo?.name ?? identifier,
|
|
738
|
+
icon: extInfo?.icon ?? "",
|
|
739
|
+
extensionId: identifier,
|
|
740
|
+
extension,
|
|
741
|
+
isConnected: !!extension,
|
|
742
|
+
connect: () => connect(id),
|
|
743
|
+
disconnect: () => disconnect(id)
|
|
744
|
+
};
|
|
745
|
+
});
|
|
746
|
+
})
|
|
747
|
+
).subscribe(subscriber);
|
|
748
|
+
return () => {
|
|
749
|
+
subscription.unsubscribe();
|
|
750
|
+
};
|
|
751
|
+
}).pipe(
|
|
752
|
+
// logObservable("polkadotInjectedWallets$"),
|
|
753
|
+
shareReplay6({ refCount: true, bufferSize: 1 })
|
|
754
|
+
);
|
|
755
|
+
var getPolkadotWallets$ = (config) => {
|
|
756
|
+
return new Observable6((subscriber) => {
|
|
757
|
+
const subscription = combineLatest6([
|
|
758
|
+
polkadotInjectedWallets$,
|
|
759
|
+
getAppKitWallets$(config)?.pipe(map7((w) => w.polkadot))
|
|
760
|
+
]).pipe(
|
|
761
|
+
map7(
|
|
762
|
+
([injectedWallets, appKitWallet]) => appKitWallet ? [...injectedWallets, appKitWallet] : injectedWallets
|
|
763
|
+
)
|
|
325
764
|
).subscribe(subscriber);
|
|
326
765
|
return () => {
|
|
327
766
|
subscription.unsubscribe();
|
|
328
767
|
};
|
|
329
|
-
}
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
console.count("[kheopskit] polkadotWallets$ emit");
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
// src/api/polkadot/accounts.ts
|
|
337
|
-
var getWalletAccounts$2 = (wallet) => {
|
|
338
|
-
if (!wallet.isEnabled) return of3([]);
|
|
339
|
-
return new Observable4((subscriber) => {
|
|
340
|
-
const getAccount = (account) => ({
|
|
341
|
-
id: getAccountId(wallet.id, account.address),
|
|
342
|
-
...account,
|
|
343
|
-
platform: "polkadot",
|
|
344
|
-
walletName: wallet.name,
|
|
345
|
-
walletId: wallet.id
|
|
346
|
-
});
|
|
347
|
-
const unsubscribe = wallet.extension.subscribe((accounts) => {
|
|
348
|
-
subscriber.next(accounts.map(getAccount));
|
|
349
|
-
});
|
|
350
|
-
subscriber.next(wallet.extension.getAccounts().map(getAccount));
|
|
351
|
-
return () => {
|
|
352
|
-
return unsubscribe();
|
|
353
|
-
};
|
|
354
|
-
});
|
|
355
|
-
};
|
|
356
|
-
var polkadotAccounts$ = new Observable4(
|
|
357
|
-
(subscriber) => {
|
|
358
|
-
const sub = polkadotWallets$.pipe(
|
|
359
|
-
map5((wallets) => wallets.filter((w) => w.isEnabled)),
|
|
360
|
-
switchMap2(
|
|
361
|
-
(wallets) => wallets.length ? combineLatest4(wallets.map(getWalletAccounts$2)) : of3([])
|
|
362
|
-
),
|
|
363
|
-
map5((accounts) => accounts.flat())
|
|
364
|
-
).subscribe(subscriber);
|
|
365
|
-
return () => {
|
|
366
|
-
sub.unsubscribe();
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
).pipe(shareReplay4({ refCount: true, bufferSize: 1 }));
|
|
370
|
-
polkadotAccounts$.subscribe(() => {
|
|
371
|
-
console.count("[kheopskit] polkadotAccounts$ emit");
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
// src/api/accounts.ts
|
|
375
|
-
var getAccounts$ = (config) => {
|
|
376
|
-
return new Observable5((subscriber) => {
|
|
377
|
-
const observables = config.platforms.map(
|
|
378
|
-
(platform) => {
|
|
379
|
-
switch (platform) {
|
|
380
|
-
case "polkadot":
|
|
381
|
-
return polkadotAccounts$;
|
|
382
|
-
case "ethereum":
|
|
383
|
-
return ethereumAccounts$;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
);
|
|
387
|
-
const accounts$ = observables.length ? combineLatest5(observables).pipe(map6((accounts) => accounts.flat())) : of4([]);
|
|
388
|
-
const sub = accounts$.subscribe(subscriber);
|
|
389
|
-
return () => {
|
|
390
|
-
sub.unsubscribe();
|
|
391
|
-
};
|
|
392
|
-
}).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
|
|
393
|
-
};
|
|
394
|
-
|
|
395
|
-
// src/api/config.ts
|
|
396
|
-
var DEFAULT_CONFIG = {
|
|
397
|
-
autoReconnect: true,
|
|
398
|
-
platforms: ["polkadot"]
|
|
399
|
-
};
|
|
400
|
-
var resolveConfig = (config) => {
|
|
401
|
-
return Object.assign({}, DEFAULT_CONFIG, config);
|
|
768
|
+
}).pipe(
|
|
769
|
+
// logObservable("getPolkadotWallets$"),
|
|
770
|
+
shareReplay6({ refCount: true, bufferSize: 1 })
|
|
771
|
+
);
|
|
402
772
|
};
|
|
403
773
|
|
|
404
774
|
// src/api/wallets.ts
|
|
405
|
-
import {
|
|
406
|
-
combineLatest as combineLatest6,
|
|
407
|
-
distinct,
|
|
408
|
-
filter as filter2,
|
|
409
|
-
map as map7,
|
|
410
|
-
mergeMap as mergeMap2,
|
|
411
|
-
Observable as Observable6,
|
|
412
|
-
of as of5,
|
|
413
|
-
shareReplay as shareReplay6,
|
|
414
|
-
take
|
|
415
|
-
} from "rxjs";
|
|
416
775
|
var autoReconnectWalletIds$ = store.observable.pipe(
|
|
417
|
-
|
|
776
|
+
map8((s) => s.autoReconnect ?? []),
|
|
418
777
|
take(1),
|
|
419
|
-
|
|
778
|
+
shareReplay7(1)
|
|
420
779
|
);
|
|
421
780
|
var getWallets$ = (config) => {
|
|
422
|
-
return new
|
|
781
|
+
return new Observable7((subscriber) => {
|
|
423
782
|
const observables = config.platforms.map(
|
|
424
783
|
(platform) => {
|
|
425
784
|
switch (platform) {
|
|
426
785
|
case "polkadot":
|
|
427
|
-
return
|
|
786
|
+
return getPolkadotWallets$(config);
|
|
428
787
|
case "ethereum":
|
|
429
|
-
return
|
|
788
|
+
return getEthereumWallets$(config);
|
|
430
789
|
}
|
|
431
790
|
}
|
|
432
791
|
);
|
|
433
|
-
const wallets$ = observables.length ?
|
|
434
|
-
|
|
792
|
+
const wallets$ = observables.length ? combineLatest7(observables).pipe(
|
|
793
|
+
map8((wallets) => wallets.flat().sort(sortWallets))
|
|
794
|
+
) : of6([]);
|
|
795
|
+
const subAutoReconnect = combineLatest7([wallets$, autoReconnectWalletIds$]).pipe(
|
|
435
796
|
filter2(([, walletIds]) => config.autoReconnect && !!walletIds?.length),
|
|
436
797
|
mergeMap2(
|
|
437
798
|
([wallets, walletIds]) => wallets.filter((wallet) => walletIds?.includes(wallet.id))
|
|
438
799
|
),
|
|
439
800
|
distinct((w) => w.id)
|
|
440
801
|
).subscribe(async (wallet) => {
|
|
441
|
-
if (wallet.
|
|
802
|
+
if (wallet.isConnected) {
|
|
442
803
|
console.warn("Wallet %s already connected", wallet.id);
|
|
443
804
|
return;
|
|
444
805
|
}
|
|
@@ -453,22 +814,30 @@ var getWallets$ = (config) => {
|
|
|
453
814
|
subAutoReconnect.unsubscribe();
|
|
454
815
|
subWallets.unsubscribe();
|
|
455
816
|
};
|
|
456
|
-
}).pipe(
|
|
817
|
+
}).pipe(shareReplay7({ refCount: true, bufferSize: 1 }));
|
|
457
818
|
};
|
|
458
819
|
|
|
459
820
|
// src/api/kheopskit.ts
|
|
460
821
|
var getKheopskit$ = (config) => {
|
|
461
|
-
const
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
}
|
|
469
|
-
|
|
822
|
+
const kc = resolveConfig(config);
|
|
823
|
+
console.debug("[kheopskit] config", kc);
|
|
824
|
+
return new Observable8((subscriber) => {
|
|
825
|
+
const wallets$ = getWallets$(kc);
|
|
826
|
+
const subscription = combineLatest8({
|
|
827
|
+
wallets: wallets$,
|
|
828
|
+
accounts: getAccounts$(kc, wallets$)
|
|
829
|
+
}).pipe(map9(({ wallets, accounts }) => ({ config: kc, wallets, accounts }))).subscribe(subscriber);
|
|
830
|
+
return () => {
|
|
831
|
+
subscription.unsubscribe();
|
|
832
|
+
};
|
|
833
|
+
}).pipe(
|
|
834
|
+
throttleTime(50, void 0, { leading: true, trailing: true }),
|
|
835
|
+
logObservable("kheopskit$", { enabled: kc.debug, printValue: true }),
|
|
836
|
+
shareReplay8({ bufferSize: 1, refCount: true })
|
|
837
|
+
);
|
|
470
838
|
};
|
|
471
839
|
export {
|
|
472
|
-
getKheopskit
|
|
840
|
+
getKheopskit$,
|
|
841
|
+
resolveConfig
|
|
473
842
|
};
|
|
474
843
|
//# sourceMappingURL=index.mjs.map
|