@kheopskit/core 0.0.10 → 0.0.11
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 +6 -0
- package/dist/index.d.mts +104 -0
- package/dist/index.d.ts +104 -0
- package/dist/index.js +805 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +843 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +1 -1
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,843 @@
|
|
|
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
|
+
|
|
11
|
+
// src/api/kheopskit.ts
|
|
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
|
+
};
|
|
43
|
+
|
|
44
|
+
// src/api/accounts.ts
|
|
45
|
+
import { Observable as Observable3, combineLatest as combineLatest3, map as map4, of as of3, shareReplay as shareReplay3 } from "rxjs";
|
|
46
|
+
|
|
47
|
+
// src/utils/createStore.ts
|
|
48
|
+
import { BehaviorSubject, filter, fromEvent, map } from "rxjs";
|
|
49
|
+
var createStore = (key, defaultValue) => {
|
|
50
|
+
const subject = new BehaviorSubject(getStoredData(key, defaultValue));
|
|
51
|
+
fromEvent(window, "storage").pipe(
|
|
52
|
+
filter((event) => event.key === key),
|
|
53
|
+
map((event) => parseData(event.newValue, defaultValue))
|
|
54
|
+
).subscribe((newValue) => subject.next(newValue));
|
|
55
|
+
const update = (val) => {
|
|
56
|
+
setStoredData(key, val);
|
|
57
|
+
subject.next(val);
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
observable: subject.asObservable(),
|
|
61
|
+
set: (val) => update(val),
|
|
62
|
+
mutate: (transform) => update(transform(subject.getValue())),
|
|
63
|
+
get: () => structuredClone(subject.getValue())
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
var parseData = (str, defaultValue) => {
|
|
67
|
+
try {
|
|
68
|
+
if (str) return JSON.parse(str);
|
|
69
|
+
} catch {
|
|
70
|
+
}
|
|
71
|
+
return defaultValue;
|
|
72
|
+
};
|
|
73
|
+
var getStoredData = (key, defaultValue) => {
|
|
74
|
+
const str = localStorage.getItem(key);
|
|
75
|
+
return parseData(str, defaultValue);
|
|
76
|
+
};
|
|
77
|
+
var setStoredData = (key, val) => {
|
|
78
|
+
const str = JSON.stringify(val);
|
|
79
|
+
localStorage.setItem(key, str);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// src/utils/isEthereumAddress.ts
|
|
83
|
+
import { isAddress } from "viem";
|
|
84
|
+
var isEthereumAddress = (address) => isAddress(address);
|
|
85
|
+
|
|
86
|
+
// src/utils/isSs58Address.ts
|
|
87
|
+
import { AccountId } from "polkadot-api";
|
|
88
|
+
var accountIdEncoder = AccountId().enc;
|
|
89
|
+
var isSs58Address = (address) => {
|
|
90
|
+
try {
|
|
91
|
+
if (!address) return false;
|
|
92
|
+
accountIdEncoder(address);
|
|
93
|
+
return true;
|
|
94
|
+
} catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// src/utils/isValidAddress.ts
|
|
100
|
+
var isValidAddress = (address) => {
|
|
101
|
+
return address.startsWith("0x") ? isEthereumAddress(address) : isSs58Address(address);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// src/utils/WalletAccountId.ts
|
|
105
|
+
var getWalletAccountId = (walletId, address) => {
|
|
106
|
+
if (!walletId) throw new Error("Missing walletId");
|
|
107
|
+
if (!isValidAddress(address)) throw new Error("Invalid address");
|
|
108
|
+
return `${walletId}::${address}`;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// src/utils/isWalletPlatform.ts
|
|
112
|
+
var isWalletPlatform = (platform) => typeof platform === "string" && ["polkadot", "ethereum"].includes(platform);
|
|
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
|
+
|
|
121
|
+
// src/api/ethereum/accounts.ts
|
|
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,
|
|
272
|
+
combineLatest as combineLatest2,
|
|
273
|
+
distinctUntilChanged as distinctUntilChanged2,
|
|
274
|
+
map as map3,
|
|
275
|
+
of as of2,
|
|
276
|
+
shareReplay as shareReplay2,
|
|
277
|
+
switchMap as switchMap2
|
|
278
|
+
} from "rxjs";
|
|
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
|
+
};
|
|
379
|
+
|
|
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";
|
|
443
|
+
|
|
444
|
+
// src/utils/WalletId.ts
|
|
445
|
+
var getWalletId = (platform, identifier) => {
|
|
446
|
+
if (!isWalletPlatform(platform)) throw new Error("Invalid platform");
|
|
447
|
+
if (!identifier) throw new Error("Invalid name");
|
|
448
|
+
return `${platform}:${identifier}`;
|
|
449
|
+
};
|
|
450
|
+
var parseWalletId = (walletId) => {
|
|
451
|
+
if (!walletId) throw new Error("Invalid walletId");
|
|
452
|
+
const [platform, identifier] = walletId.split(":");
|
|
453
|
+
if (!isWalletPlatform(platform)) throw new Error("Invalid platform");
|
|
454
|
+
if (!identifier) throw new Error("Invalid address");
|
|
455
|
+
return { platform, identifier };
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
// src/api/store.ts
|
|
459
|
+
import { uniq } from "lodash";
|
|
460
|
+
var LOCAL_STORAGE_KEY = "kheopskit";
|
|
461
|
+
var DEFAULT_SETTINGS = {};
|
|
462
|
+
var storage = createStore(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS);
|
|
463
|
+
var addEnabledWalletId = (walletId) => {
|
|
464
|
+
parseWalletId(walletId);
|
|
465
|
+
storage.mutate((prev) => ({
|
|
466
|
+
...prev,
|
|
467
|
+
autoReconnect: uniq((prev.autoReconnect ?? []).concat(walletId))
|
|
468
|
+
}));
|
|
469
|
+
};
|
|
470
|
+
var removeEnabledWalletId = (walletId) => {
|
|
471
|
+
storage.mutate((prev) => ({
|
|
472
|
+
...prev,
|
|
473
|
+
autoReconnect: uniq(
|
|
474
|
+
(prev.autoReconnect ?? []).filter((id) => id !== walletId)
|
|
475
|
+
)
|
|
476
|
+
}));
|
|
477
|
+
};
|
|
478
|
+
var store = {
|
|
479
|
+
observable: storage.observable,
|
|
480
|
+
addEnabledWalletId,
|
|
481
|
+
removeEnabledWalletId
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
// src/api/ethereum/wallets.ts
|
|
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";
|
|
496
|
+
import {
|
|
497
|
+
BehaviorSubject as BehaviorSubject2,
|
|
498
|
+
Observable as Observable4,
|
|
499
|
+
combineLatest as combineLatest4,
|
|
500
|
+
distinctUntilChanged as distinctUntilChanged3,
|
|
501
|
+
map as map5,
|
|
502
|
+
of as of4,
|
|
503
|
+
shareReplay as shareReplay4
|
|
504
|
+
} from "rxjs";
|
|
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(
|
|
588
|
+
(subscriber) => {
|
|
589
|
+
const store2 = createStore2();
|
|
590
|
+
const unsubscribe = store2.subscribe((providerDetails2) => {
|
|
591
|
+
subscriber.next(providerDetails2);
|
|
592
|
+
});
|
|
593
|
+
const providerDetails = store2.getProviders();
|
|
594
|
+
subscriber.next(providerDetails);
|
|
595
|
+
return () => {
|
|
596
|
+
unsubscribe();
|
|
597
|
+
store2.destroy();
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
|
|
601
|
+
var ethereumInjectedWallets$ = new Observable5(
|
|
602
|
+
(subscriber) => {
|
|
603
|
+
const enabledWalletIds$ = new BehaviorSubject3(/* @__PURE__ */ new Set());
|
|
604
|
+
const connectWallet = async (walletId, provider) => {
|
|
605
|
+
if (enabledWalletIds$.value.has(walletId))
|
|
606
|
+
throw new Error(`Extension ${walletId} already connected`);
|
|
607
|
+
await provider.request({
|
|
608
|
+
method: "eth_requestAccounts"
|
|
609
|
+
});
|
|
610
|
+
const newSet = new Set(enabledWalletIds$.value);
|
|
611
|
+
newSet.add(walletId);
|
|
612
|
+
enabledWalletIds$.next(newSet);
|
|
613
|
+
store.addEnabledWalletId(walletId);
|
|
614
|
+
};
|
|
615
|
+
const disconnectWallet = async (walletId) => {
|
|
616
|
+
if (!enabledWalletIds$.value.has(walletId))
|
|
617
|
+
throw new Error(`Extension ${walletId} is not connected`);
|
|
618
|
+
const newSet = new Set(enabledWalletIds$.value);
|
|
619
|
+
newSet.delete(walletId);
|
|
620
|
+
enabledWalletIds$.next(newSet);
|
|
621
|
+
store.removeEnabledWalletId(walletId);
|
|
622
|
+
};
|
|
623
|
+
const sub = combineLatest5([providersDetails$, enabledWalletIds$]).pipe(
|
|
624
|
+
map6(([providerDetails, enabledWalletIds]) => {
|
|
625
|
+
return providerDetails.map((pd) => {
|
|
626
|
+
const walletId = getWalletId("ethereum", pd.info.rdns);
|
|
627
|
+
const provider = pd.provider;
|
|
628
|
+
return {
|
|
629
|
+
platform: "ethereum",
|
|
630
|
+
type: "injected",
|
|
631
|
+
id: walletId,
|
|
632
|
+
name: pd.info.name,
|
|
633
|
+
icon: pd.info.icon,
|
|
634
|
+
provider,
|
|
635
|
+
isConnected: enabledWalletIds.has(walletId),
|
|
636
|
+
providerId: pd.info.rdns,
|
|
637
|
+
connect: () => connectWallet(walletId, provider),
|
|
638
|
+
disconnect: () => disconnectWallet(walletId)
|
|
639
|
+
};
|
|
640
|
+
});
|
|
641
|
+
})
|
|
642
|
+
).subscribe(subscriber);
|
|
643
|
+
return () => {
|
|
644
|
+
sub.unsubscribe();
|
|
645
|
+
};
|
|
646
|
+
}
|
|
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
|
+
)
|
|
657
|
+
).subscribe(subscriber);
|
|
658
|
+
return () => {
|
|
659
|
+
subscription.unsubscribe();
|
|
660
|
+
};
|
|
661
|
+
}).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
|
|
662
|
+
};
|
|
663
|
+
|
|
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
|
+
};
|
|
683
|
+
|
|
684
|
+
// src/api/polkadot/wallets.ts
|
|
685
|
+
import { isEqual } from "lodash";
|
|
686
|
+
import {
|
|
687
|
+
connectInjectedExtension,
|
|
688
|
+
getInjectedExtensions
|
|
689
|
+
} from "polkadot-api/pjs-signer";
|
|
690
|
+
import {
|
|
691
|
+
BehaviorSubject as BehaviorSubject4,
|
|
692
|
+
Observable as Observable6,
|
|
693
|
+
combineLatest as combineLatest6,
|
|
694
|
+
distinctUntilChanged as distinctUntilChanged4,
|
|
695
|
+
map as map7,
|
|
696
|
+
mergeMap,
|
|
697
|
+
of as of5,
|
|
698
|
+
shareReplay as shareReplay6,
|
|
699
|
+
timer
|
|
700
|
+
} from "rxjs";
|
|
701
|
+
var getInjectedWalletsIds = () => getInjectedExtensions().map((name) => getWalletId("polkadot", name));
|
|
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
|
+
)
|
|
764
|
+
).subscribe(subscriber);
|
|
765
|
+
return () => {
|
|
766
|
+
subscription.unsubscribe();
|
|
767
|
+
};
|
|
768
|
+
}).pipe(
|
|
769
|
+
// logObservable("getPolkadotWallets$"),
|
|
770
|
+
shareReplay6({ refCount: true, bufferSize: 1 })
|
|
771
|
+
);
|
|
772
|
+
};
|
|
773
|
+
|
|
774
|
+
// src/api/wallets.ts
|
|
775
|
+
var autoReconnectWalletIds$ = store.observable.pipe(
|
|
776
|
+
map8((s) => s.autoReconnect ?? []),
|
|
777
|
+
take(1),
|
|
778
|
+
shareReplay7(1)
|
|
779
|
+
);
|
|
780
|
+
var getWallets$ = (config) => {
|
|
781
|
+
return new Observable7((subscriber) => {
|
|
782
|
+
const observables = config.platforms.map(
|
|
783
|
+
(platform) => {
|
|
784
|
+
switch (platform) {
|
|
785
|
+
case "polkadot":
|
|
786
|
+
return getPolkadotWallets$(config);
|
|
787
|
+
case "ethereum":
|
|
788
|
+
return getEthereumWallets$(config);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
);
|
|
792
|
+
const wallets$ = observables.length ? combineLatest7(observables).pipe(
|
|
793
|
+
map8((wallets) => wallets.flat().sort(sortWallets))
|
|
794
|
+
) : of6([]);
|
|
795
|
+
const subAutoReconnect = combineLatest7([wallets$, autoReconnectWalletIds$]).pipe(
|
|
796
|
+
filter2(([, walletIds]) => config.autoReconnect && !!walletIds?.length),
|
|
797
|
+
mergeMap2(
|
|
798
|
+
([wallets, walletIds]) => wallets.filter((wallet) => walletIds?.includes(wallet.id))
|
|
799
|
+
),
|
|
800
|
+
distinct((w) => w.id)
|
|
801
|
+
).subscribe(async (wallet) => {
|
|
802
|
+
if (wallet.isConnected) {
|
|
803
|
+
console.warn("Wallet %s already connected", wallet.id);
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
try {
|
|
807
|
+
await wallet.connect();
|
|
808
|
+
} catch (err) {
|
|
809
|
+
console.error("Failed to reconnect wallet %s", wallet.id, { err });
|
|
810
|
+
}
|
|
811
|
+
});
|
|
812
|
+
const subWallets = wallets$.subscribe(subscriber);
|
|
813
|
+
return () => {
|
|
814
|
+
subAutoReconnect.unsubscribe();
|
|
815
|
+
subWallets.unsubscribe();
|
|
816
|
+
};
|
|
817
|
+
}).pipe(shareReplay7({ refCount: true, bufferSize: 1 }));
|
|
818
|
+
};
|
|
819
|
+
|
|
820
|
+
// src/api/kheopskit.ts
|
|
821
|
+
var getKheopskit$ = (config) => {
|
|
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
|
+
);
|
|
838
|
+
};
|
|
839
|
+
export {
|
|
840
|
+
getKheopskit$,
|
|
841
|
+
resolveConfig
|
|
842
|
+
};
|
|
843
|
+
//# sourceMappingURL=index.mjs.map
|