@kheopskit/core 5.2.1 → 6.0.0-rc.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/CHANGELOG.md +426 -0
- package/MIGRATING_TO_V6.md +837 -0
- package/README.md +628 -11
- package/dist/ethereum.d.mts +12 -6
- package/dist/ethereum.d.ts +12 -6
- package/dist/ethereum.js +13 -10
- package/dist/ethereum.js.map +1 -1
- package/dist/ethereum.mjs +7 -4
- package/dist/ethereum.mjs.map +1 -1
- package/dist/{iconCache-pP2ES4pJ.mjs → iconCache-C-U3IEbP.mjs} +21 -40
- package/dist/iconCache-C-U3IEbP.mjs.map +1 -0
- package/dist/{iconCache-DUtkJlaX.js → iconCache-FR4iy6go.js} +21 -40
- package/dist/iconCache-FR4iy6go.js.map +1 -0
- package/dist/index.d.mts +17 -63
- package/dist/index.d.ts +17 -63
- package/dist/index.js +387 -373
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +384 -369
- package/dist/index.mjs.map +1 -1
- package/dist/injectedWallets-48L-AL1I.mjs +173 -0
- package/dist/injectedWallets-48L-AL1I.mjs.map +1 -0
- package/dist/injectedWallets-Dy8YGKL-.js +178 -0
- package/dist/injectedWallets-Dy8YGKL-.js.map +1 -0
- package/dist/internal.d.mts +3 -27
- package/dist/internal.d.ts +3 -27
- package/dist/internal.js +2 -2
- package/dist/internal.mjs +2 -2
- package/dist/pageLoad-BZ7o8p5R.mjs +24 -0
- package/dist/pageLoad-BZ7o8p5R.mjs.map +1 -0
- package/dist/pageLoad-D1wLeuFG.js +28 -0
- package/dist/pageLoad-D1wLeuFG.js.map +1 -0
- package/dist/platformAccounts-BjIeRcFN.js +321 -0
- package/dist/platformAccounts-BjIeRcFN.js.map +1 -0
- package/dist/platformAccounts-yyRUrnel.mjs +256 -0
- package/dist/platformAccounts-yyRUrnel.mjs.map +1 -0
- package/dist/polkadot.d.mts +127 -11
- package/dist/polkadot.d.ts +127 -11
- package/dist/polkadot.js +171 -107
- package/dist/polkadot.js.map +1 -1
- package/dist/polkadot.mjs +164 -100
- package/dist/polkadot.mjs.map +1 -1
- package/dist/solana.d.mts +11 -5
- package/dist/solana.d.ts +11 -5
- package/dist/solana.js +18 -15
- package/dist/solana.js.map +1 -1
- package/dist/solana.mjs +7 -4
- package/dist/solana.mjs.map +1 -1
- package/dist/storage-D3AwNgqc.d.mts +27 -0
- package/dist/storage-D3AwNgqc.d.ts +27 -0
- package/dist/testing.d.mts +71 -0
- package/dist/testing.d.ts +71 -0
- package/dist/testing.js +136 -0
- package/dist/testing.js.map +1 -0
- package/dist/testing.mjs +131 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/{types-DKU-SNio.js → types-BWHvNFlN.js} +149 -2
- package/dist/types-BWHvNFlN.js.map +1 -0
- package/dist/types-Dkyt9bf4.d.mts +683 -0
- package/dist/types-Dkyt9bf4.d.ts +683 -0
- package/dist/types-Yor672md.mjs +215 -0
- package/dist/types-Yor672md.mjs.map +1 -0
- package/dist/walletconnect.d.mts +41 -0
- package/dist/walletconnect.d.ts +41 -0
- package/dist/walletconnect.js +219 -0
- package/dist/walletconnect.js.map +1 -0
- package/dist/walletconnect.mjs +216 -0
- package/dist/walletconnect.mjs.map +1 -0
- package/package.json +33 -9
- package/dist/errors-BLFP1dQI.mjs +0 -181
- package/dist/errors-BLFP1dQI.mjs.map +0 -1
- package/dist/errors-DYWVPHrR.js +0 -222
- package/dist/errors-DYWVPHrR.js.map +0 -1
- package/dist/iconCache-DUtkJlaX.js.map +0 -1
- package/dist/iconCache-pP2ES4pJ.mjs.map +0 -1
- package/dist/injectedWallets-BqR-_aAy.js +0 -148
- package/dist/injectedWallets-BqR-_aAy.js.map +0 -1
- package/dist/injectedWallets-Uz4hPuoW.mjs +0 -119
- package/dist/injectedWallets-Uz4hPuoW.mjs.map +0 -1
- package/dist/types-Cb-vuEru.d.mts +0 -330
- package/dist/types-Cb-vuEru.d.ts +0 -330
- package/dist/types-DKU-SNio.js.map +0 -1
- package/dist/types-jnifAAA0.mjs +0 -104
- package/dist/types-jnifAAA0.mjs.map +0 -1
package/dist/polkadot.mjs
CHANGED
|
@@ -1,31 +1,140 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as isSs58Address,
|
|
1
|
+
import { f as parseWalletId, n as isWalletConnectWallet, o as isRefusalMessage, r as KheopskitError, t as isInjectedWallet, u as getWalletId } from "./types-Yor672md.mjs";
|
|
2
|
+
import { a as getWalletConnectSessionAccounts$, i as getSessionCaip10s, l as isSs58Address, o as getWalletAccountId, r as getCaip10Addresses, t as createPlatformAccounts$ } from "./platformAccounts-yyRUrnel.mjs";
|
|
3
3
|
import { t as POLKADOT_EXTENSIONS } from "./polkadotExtensions-BoVKhNU_.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { t as pageLoaded$ } from "./pageLoad-BZ7o8p5R.mjs";
|
|
5
|
+
import { t as createInjectedWallets$ } from "./injectedWallets-48L-AL1I.mjs";
|
|
6
|
+
import { hex } from "@scure/base";
|
|
7
|
+
import { Observable, distinctUntilChanged, of, shareReplay, skip } from "rxjs";
|
|
6
8
|
import { isEqual } from "lodash-es";
|
|
7
9
|
import * as pjs from "polkadot-api/pjs-signer";
|
|
8
|
-
import {
|
|
10
|
+
import { getInjectedExtensions } from "polkadot-api/pjs-signer";
|
|
11
|
+
//#region src/api/polkadot/wallets.ts
|
|
12
|
+
const isPolkadotInjected = (injected) => typeof injected?.accounts?.get === "function" && typeof injected.accounts.subscribe === "function" && typeof injected.signer?.signPayload === "function" && typeof injected.signer.signRaw === "function";
|
|
13
|
+
/**
|
|
14
|
+
* The list each extension last reported: read when its connect was granted,
|
|
15
|
+
* so the emission that first shows the wallet connected already lists it, and
|
|
16
|
+
* updated by every `subscribe` callback, so an accounts stream that restarts
|
|
17
|
+
* resumes from the current list rather than the connect-time one.
|
|
18
|
+
*/
|
|
19
|
+
const latestAccounts = /* @__PURE__ */ new WeakMap();
|
|
20
|
+
const connectExtension = async (identifier, appName) => {
|
|
21
|
+
const entry = globalThis.injectedWeb3?.[identifier];
|
|
22
|
+
if (!entry) throw new Error(`Unavailable extension: "${identifier}"`);
|
|
23
|
+
const injected = await entry.enable(appName);
|
|
24
|
+
if (!isPolkadotInjected(injected)) throw new Error(`Unsupported extension: "${identifier}"`);
|
|
25
|
+
latestAccounts.set(injected, await injected.accounts.get());
|
|
26
|
+
return injected;
|
|
27
|
+
};
|
|
28
|
+
const getInjectedWalletsIds = () => typeof window === "undefined" ? [] : getInjectedExtensions().map((name) => getWalletId("polkadot", name));
|
|
29
|
+
const createWalletIdsPoller$ = () => {
|
|
30
|
+
return new Observable((subscriber) => {
|
|
31
|
+
subscriber.next(getInjectedWalletsIds());
|
|
32
|
+
const intervals = [
|
|
33
|
+
100,
|
|
34
|
+
200,
|
|
35
|
+
300,
|
|
36
|
+
500
|
|
37
|
+
];
|
|
38
|
+
let index = 0;
|
|
39
|
+
let timer;
|
|
40
|
+
const poll = () => {
|
|
41
|
+
subscriber.next(getInjectedWalletsIds());
|
|
42
|
+
if (index < intervals.length) {
|
|
43
|
+
const delay = intervals[index++];
|
|
44
|
+
timer = setTimeout(poll, delay);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
if (intervals.length > 0) timer = setTimeout(poll, intervals[index++] ?? 100);
|
|
48
|
+
let loadTimer;
|
|
49
|
+
const loadSub = pageLoaded$.pipe(skip(1)).subscribe(() => {
|
|
50
|
+
loadTimer = setTimeout(() => subscriber.next(getInjectedWalletsIds()), 100);
|
|
51
|
+
subscriber.next(getInjectedWalletsIds());
|
|
52
|
+
});
|
|
53
|
+
return () => {
|
|
54
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
55
|
+
clearTimeout(loadTimer);
|
|
56
|
+
loadSub.unsubscribe();
|
|
57
|
+
};
|
|
58
|
+
}).pipe(distinctUntilChanged(isEqual), shareReplay({
|
|
59
|
+
refCount: true,
|
|
60
|
+
bufferSize: 1
|
|
61
|
+
}));
|
|
62
|
+
};
|
|
63
|
+
const getPolkadotWallets$ = (store, config) => createInjectedWallets$(store, {
|
|
64
|
+
sources$: createWalletIdsPoller$(),
|
|
65
|
+
getWalletId: (walletId) => walletId,
|
|
66
|
+
connect: (walletId) => connectExtension(parseWalletId(walletId).identifier, config.appName || config.walletConnect?.metadata.name || window.location.hostname),
|
|
67
|
+
isUserRejection: isRefusalMessage,
|
|
68
|
+
buildWallet: ({ walletId, handle, status, error, isConnected, connect, disconnect }) => {
|
|
69
|
+
const { identifier } = parseWalletId(walletId);
|
|
70
|
+
const extInfo = POLKADOT_EXTENSIONS[identifier];
|
|
71
|
+
return {
|
|
72
|
+
id: walletId,
|
|
73
|
+
type: "injected",
|
|
74
|
+
platform: "polkadot",
|
|
75
|
+
name: extInfo?.name ?? identifier,
|
|
76
|
+
icon: extInfo?.icon ?? "",
|
|
77
|
+
sourceId: identifier,
|
|
78
|
+
extension: handle,
|
|
79
|
+
status,
|
|
80
|
+
error,
|
|
81
|
+
isConnected,
|
|
82
|
+
connect,
|
|
83
|
+
disconnect
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
//#endregion
|
|
9
88
|
//#region src/api/polkadot/accounts.ts
|
|
89
|
+
const encodeRawData = (data, type) => typeof data === "string" ? {
|
|
90
|
+
data,
|
|
91
|
+
type: type ?? "payload"
|
|
92
|
+
} : {
|
|
93
|
+
data: `0x${hex.encode(data)}`,
|
|
94
|
+
type: type ?? "bytes"
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an
|
|
98
|
+
* `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.
|
|
99
|
+
*/
|
|
100
|
+
const toSignerType = (type) => type === "ethereum" ? "ecdsa" : type;
|
|
10
101
|
const getInjectedWalletAccounts$ = (wallet) => {
|
|
11
|
-
|
|
102
|
+
const injected = wallet.extension;
|
|
103
|
+
if (!wallet.isConnected || !injected) return of([]);
|
|
12
104
|
return new Observable((subscriber) => {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
105
|
+
const signPayload = injected.signer.signPayload.bind(injected.signer);
|
|
106
|
+
const signRaw = injected.signer.signRaw.bind(injected.signer);
|
|
107
|
+
const { field, factory } = getPjsSignerField();
|
|
108
|
+
const toAccount = (account) => {
|
|
109
|
+
const { address } = account;
|
|
110
|
+
const type = account.type ?? "sr25519";
|
|
111
|
+
return {
|
|
112
|
+
...account,
|
|
113
|
+
id: getWalletAccountId(wallet.id, address),
|
|
114
|
+
type,
|
|
115
|
+
platform: "polkadot",
|
|
116
|
+
walletName: wallet.name,
|
|
117
|
+
walletId: wallet.id,
|
|
118
|
+
[field]: factory(address, signPayload, signRaw, toSignerType(type)),
|
|
119
|
+
signRaw: async (data, options) => (await signRaw({
|
|
120
|
+
address,
|
|
121
|
+
...encodeRawData(data, options?.type)
|
|
122
|
+
})).signature
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const toAccounts = (accounts) => accounts.flatMap((account) => {
|
|
126
|
+
try {
|
|
127
|
+
return [toAccount(account)];
|
|
128
|
+
} catch {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
24
131
|
});
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
132
|
+
const emit = (accounts) => {
|
|
133
|
+
latestAccounts.set(injected, accounts);
|
|
134
|
+
subscriber.next(toAccounts(accounts));
|
|
28
135
|
};
|
|
136
|
+
emit(latestAccounts.get(injected) ?? []);
|
|
137
|
+
return injected.accounts.subscribe(emit);
|
|
29
138
|
});
|
|
30
139
|
};
|
|
31
140
|
/**
|
|
@@ -34,21 +143,38 @@ const getInjectedWalletAccounts$ = (wallet) => {
|
|
|
34
143
|
* runtime so a single @kheopskit/core release supports both.
|
|
35
144
|
*/
|
|
36
145
|
const getPjsSignerField = () => {
|
|
37
|
-
const
|
|
38
|
-
if (getTxCreatorFromPjs) return {
|
|
146
|
+
const module = pjs;
|
|
147
|
+
if (module.getTxCreatorFromPjs) return {
|
|
39
148
|
field: "txCreator",
|
|
40
|
-
factory: getTxCreatorFromPjs
|
|
149
|
+
factory: module.getTxCreatorFromPjs
|
|
41
150
|
};
|
|
42
|
-
if (getPolkadotSignerFromPjs) return {
|
|
151
|
+
if (module.getPolkadotSignerFromPjs) return {
|
|
43
152
|
field: "polkadotSigner",
|
|
44
|
-
factory: getPolkadotSignerFromPjs
|
|
153
|
+
factory: module.getPolkadotSignerFromPjs
|
|
45
154
|
};
|
|
46
155
|
throw new KheopskitError("UNSUPPORTED_VERSION", "Unsupported polkadot-api/pjs-signer version");
|
|
47
156
|
};
|
|
48
|
-
const
|
|
157
|
+
const requestSignMessage = (appKit, provider, address, message) => {
|
|
158
|
+
if (!provider.session) throw new KheopskitError("NO_SESSION", "No session found");
|
|
159
|
+
const chainId = appKit.getCaipNetworks("polkadot")[0]?.caipNetworkId;
|
|
160
|
+
if (!chainId) throw new KheopskitError("NO_SESSION", "No CAIP network available for polkadot");
|
|
161
|
+
return provider.client.request({
|
|
162
|
+
topic: provider.session.topic,
|
|
163
|
+
chainId,
|
|
164
|
+
request: {
|
|
165
|
+
method: "polkadot_signMessage",
|
|
166
|
+
params: {
|
|
167
|
+
address,
|
|
168
|
+
message
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
const getAppKitPolkadotSigning = (appKit, address) => {
|
|
49
174
|
const provider = appKit.getProvider("polkadot");
|
|
50
175
|
if (!provider) throw new KheopskitError("NO_PROVIDER", "No provider found");
|
|
51
176
|
if (!provider.session) throw new KheopskitError("NO_SESSION", "No session found");
|
|
177
|
+
const signMessage = (message) => requestSignMessage(appKit, provider, address, message);
|
|
52
178
|
const { field, factory } = getPjsSignerField();
|
|
53
179
|
const signer = factory(address, (transactionPayload) => {
|
|
54
180
|
if (!provider.session) throw new KheopskitError("NO_SESSION", "No session found");
|
|
@@ -63,23 +189,15 @@ const getAppKitPolkadotSigner = (appKit, address) => {
|
|
|
63
189
|
}
|
|
64
190
|
}
|
|
65
191
|
});
|
|
66
|
-
}, async ({
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
params: {
|
|
76
|
-
address,
|
|
77
|
-
message: data
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
return { [field]: signer };
|
|
192
|
+
}, async ({ data }) => ({
|
|
193
|
+
id: 0,
|
|
194
|
+
signature: (await signMessage(data)).signature
|
|
195
|
+
}), "sr25519");
|
|
196
|
+
const signRaw = async (data) => (await signMessage(encodeRawData(data).data)).signature;
|
|
197
|
+
return {
|
|
198
|
+
[field]: signer,
|
|
199
|
+
signRaw
|
|
200
|
+
};
|
|
83
201
|
};
|
|
84
202
|
const getWalletConnectAccounts$ = (wallet) => getWalletConnectSessionAccounts$({
|
|
85
203
|
wallet,
|
|
@@ -95,7 +213,7 @@ const getWalletConnectAccounts$ = (wallet) => getWalletConnectSessionAccounts$({
|
|
|
95
213
|
walletName: wallet.name,
|
|
96
214
|
walletId: wallet.id,
|
|
97
215
|
address,
|
|
98
|
-
...
|
|
216
|
+
...getAppKitPolkadotSigning(wallet.appKit, address),
|
|
99
217
|
genesisHash: null,
|
|
100
218
|
name: `${wallet.name} Polkadot`,
|
|
101
219
|
type: "sr25519"
|
|
@@ -103,7 +221,7 @@ const getWalletConnectAccounts$ = (wallet) => getWalletConnectSessionAccounts$({
|
|
|
103
221
|
}
|
|
104
222
|
});
|
|
105
223
|
const getPolkadotAccounts$ = (polkadotWallets$, polkadotAccountTypes) => {
|
|
106
|
-
if (polkadotAccountTypes.length === 0) console.warn("[kheopskit]
|
|
224
|
+
if (polkadotAccountTypes.length === 0) console.warn("[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.");
|
|
107
225
|
return createPlatformAccounts$({
|
|
108
226
|
wallets$: polkadotWallets$,
|
|
109
227
|
getInjectedAccounts$: getInjectedWalletAccounts$,
|
|
@@ -112,60 +230,6 @@ const getPolkadotAccounts$ = (polkadotWallets$, polkadotAccountTypes) => {
|
|
|
112
230
|
});
|
|
113
231
|
};
|
|
114
232
|
//#endregion
|
|
115
|
-
//#region src/api/polkadot/wallets.ts
|
|
116
|
-
const getInjectedWalletsIds = () => typeof window === "undefined" ? [] : getInjectedExtensions().map((name) => getWalletId("polkadot", name));
|
|
117
|
-
const createWalletIdsPoller$ = () => {
|
|
118
|
-
return new Observable((subscriber) => {
|
|
119
|
-
subscriber.next(getInjectedWalletsIds());
|
|
120
|
-
const intervals = [
|
|
121
|
-
100,
|
|
122
|
-
200,
|
|
123
|
-
300,
|
|
124
|
-
500
|
|
125
|
-
];
|
|
126
|
-
let index = 0;
|
|
127
|
-
let timer;
|
|
128
|
-
const poll = () => {
|
|
129
|
-
subscriber.next(getInjectedWalletsIds());
|
|
130
|
-
if (index < intervals.length) {
|
|
131
|
-
const delay = intervals[index++];
|
|
132
|
-
timer = setTimeout(poll, delay);
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
if (intervals.length > 0) timer = setTimeout(poll, intervals[index++] ?? 100);
|
|
136
|
-
return () => {
|
|
137
|
-
if (timer !== void 0) clearTimeout(timer);
|
|
138
|
-
};
|
|
139
|
-
}).pipe(distinctUntilChanged(isEqual), shareReplay({
|
|
140
|
-
refCount: true,
|
|
141
|
-
bufferSize: 1
|
|
142
|
-
}));
|
|
143
|
-
};
|
|
144
|
-
const getPolkadotWallets$ = (store) => createInjectedWallets$(store, {
|
|
145
|
-
sources$: createWalletIdsPoller$(),
|
|
146
|
-
getWalletId: (walletId) => walletId,
|
|
147
|
-
connect: (walletId) => {
|
|
148
|
-
const { identifier } = parseWalletId(walletId);
|
|
149
|
-
return connectInjectedExtension(identifier);
|
|
150
|
-
},
|
|
151
|
-
buildWallet: ({ walletId, handle, isConnected, connect, disconnect }) => {
|
|
152
|
-
const { identifier } = parseWalletId(walletId);
|
|
153
|
-
const extInfo = POLKADOT_EXTENSIONS[identifier];
|
|
154
|
-
return {
|
|
155
|
-
id: walletId,
|
|
156
|
-
type: "injected",
|
|
157
|
-
platform: "polkadot",
|
|
158
|
-
name: extInfo?.name ?? identifier,
|
|
159
|
-
icon: extInfo?.icon ?? "",
|
|
160
|
-
sourceId: identifier,
|
|
161
|
-
extension: handle,
|
|
162
|
-
isConnected,
|
|
163
|
-
connect,
|
|
164
|
-
disconnect
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
//#endregion
|
|
169
233
|
//#region src/api/polkadot/plugin.ts
|
|
170
234
|
const DEFAULT_ACCOUNT_TYPES = [
|
|
171
235
|
"sr25519",
|
|
@@ -193,7 +257,7 @@ const polkadot = (options = {}) => {
|
|
|
193
257
|
if (invalid.length > 0) console.warn(`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: "sr25519", "ed25519", "ecdsa", "ethereum".`);
|
|
194
258
|
return {
|
|
195
259
|
platform: "polkadot",
|
|
196
|
-
getWallets$: (ctx) => getPolkadotWallets$(ctx.store),
|
|
260
|
+
getWallets$: (ctx) => getPolkadotWallets$(ctx.store, ctx.config),
|
|
197
261
|
getAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),
|
|
198
262
|
acceptsCachedAccount: (cached) => accountTypes.includes(cached.polkadotAccountType ?? "sr25519")
|
|
199
263
|
};
|
package/dist/polkadot.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polkadot.mjs","names":[],"sources":["../src/api/polkadot/accounts.ts","../src/api/polkadot/wallets.ts","../src/api/polkadot/plugin.ts"],"sourcesContent":["import type {\n\tInjectedExtension,\n\tInjectedPolkadotAccount,\n\tSignPayload,\n\tSignRaw,\n} from \"polkadot-api/pjs-signer\";\nimport * as pjs from \"polkadot-api/pjs-signer\";\nimport { Observable, of } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { KheopskitError } from \"../errors\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n} from \"../platformAccounts\";\nimport type {\n\tAppKitInstance,\n\tPolkadotAccountType,\n\tWalletConnectWallet,\n} from \"../types\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotInjectedWallet,\n\tPolkadotWallet,\n} from \"./types\";\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst getAccount = (account: InjectedPolkadotAccount): PolkadotAccount => ({\n\t\t\tid: getWalletAccountId(wallet.id, account.address),\n\t\t\t...account,\n\t\t\ttype: account.type ?? \"sr25519\",\n\t\t\tplatform: \"polkadot\",\n\t\t\twalletName: wallet.name,\n\t\t\twalletId: wallet.id,\n\t\t});\n\n\t\tconst extension = wallet.extension as InjectedExtension;\n\n\t\t// subscribe to changes\n\t\tconst unsubscribe = extension.subscribe((accounts) => {\n\t\t\tsubscriber.next(accounts.map(getAccount));\n\t\t});\n\n\t\t// initial value\n\t\tsubscriber.next(extension.getAccounts().map(getAccount));\n\n\t\treturn () => {\n\t\t\treturn unsubscribe();\n\t\t};\n\t});\n};\n\ntype PjsSignerFactory = (\n\taddress: string,\n\tsignPayload: SignPayload,\n\tsignRaw: SignRaw,\n) => unknown;\n\ntype PjsSignerModule = {\n\tgetTxCreatorFromPjs?: PjsSignerFactory;\n\tgetPolkadotSignerFromPjs?: PjsSignerFactory;\n};\n\n/**\n * polkadot-api v3 replaced `polkadotSigner` (PolkadotSigner) with `txCreator`\n * (TxCreator). Which one the app's installed version provides is detected at\n * runtime so a single @kheopskit/core release supports both.\n */\nconst getPjsSignerField = (): {\n\tfield: \"txCreator\" | \"polkadotSigner\";\n\tfactory: PjsSignerFactory;\n} => {\n\tconst { getTxCreatorFromPjs, getPolkadotSignerFromPjs } =\n\t\tpjs as PjsSignerModule;\n\tif (getTxCreatorFromPjs)\n\t\treturn { field: \"txCreator\", factory: getTxCreatorFromPjs };\n\tif (getPolkadotSignerFromPjs)\n\t\treturn { field: \"polkadotSigner\", factory: getPolkadotSignerFromPjs };\n\tthrow new KheopskitError(\n\t\t\"UNSUPPORTED_VERSION\",\n\t\t\"Unsupported polkadot-api/pjs-signer version\",\n\t);\n};\n\nconst getAppKitPolkadotSigner = (appKit: AppKitInstance, address: string) => {\n\tconst provider = appKit.getProvider(\"polkadot\");\n\tif (!provider) throw new KheopskitError(\"NO_PROVIDER\", \"No provider found\");\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\tconst { field, factory } = getPjsSignerField();\n\n\tconst signer = factory(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ address, data }) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\t\t\tconst networks = appKit.getCaipNetworks(\"polkadot\");\n\t\t\tconst chainId = networks[0]?.caipNetworkId;\n\t\t\tif (!chainId)\n\t\t\t\tthrow new KheopskitError(\n\t\t\t\t\t\"NO_SESSION\",\n\t\t\t\t\t\"No CAIP network available for polkadot\",\n\t\t\t\t);\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tmessage: data,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t);\n\n\treturn { [field]: signer };\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: WalletConnectWallet,\n): Observable<PolkadotAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"polkadot\",\n\t\tnamespace: \"polkadot\",\n\t\tcacheKey: `accounts:${wallet.id}:polkadot:`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst addresses = getCaip10Addresses(\n\t\t\t\tgetSessionCaip10s(session, \"polkadot\"),\n\t\t\t);\n\n\t\t\treturn addresses.map(\n\t\t\t\t(address) =>\n\t\t\t\t\t({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\t...getAppKitPolkadotSigner(wallet.appKit, address),\n\t\t\t\t\t\tgenesisHash: null,\n\t\t\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\t\t\t// WalletConnect (Reown AppKit) doesn't expose account key type;\n\t\t\t\t\t\t// default to sr25519, which is the most common Polkadot key type.\n\t\t\t\t\t\ttype: \"sr25519\",\n\t\t\t\t\t}) as PolkadotAccount,\n\t\t\t);\n\t\t},\n\t});\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<(PolkadotWallet | WalletConnectWallet)[]>,\n\tpolkadotAccountTypes: PolkadotAccountType[],\n) => {\n\tif (polkadotAccountTypes.length === 0) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] config.polkadotAccountTypes is empty; all Polkadot accounts will be filtered out.\",\n\t\t);\n\t}\n\n\treturn createPlatformAccounts$({\n\t\twallets$: polkadotWallets$,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\tmapAccounts: (accounts) =>\n\t\t\taccounts.filter((account) => polkadotAccountTypes.includes(account.type)),\n\t});\n};\n","import { isEqual } from \"lodash-es\";\nimport {\n\tconnectInjectedExtension,\n\tgetInjectedExtensions,\n\ttype InjectedExtension,\n} from \"polkadot-api/pjs-signer\";\nimport { distinctUntilChanged, Observable, shareReplay } from \"rxjs\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { PolkadotInjectedWallet } from \"./types\";\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// Create a polling observable that starts immediately and polls at intervals\nconst createWalletIdsPoller$ = () => {\n\treturn new Observable<WalletId[]>((subscriber) => {\n\t\t// Emit immediately on subscribe\n\t\tsubscriber.next(getInjectedWalletsIds());\n\n\t\t// Poll at shorter intervals initially, then slow down\n\t\tconst intervals = [100, 200, 300, 500];\n\t\tlet index = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst poll = () => {\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t\tif (index < intervals.length) {\n\t\t\t\tconst delay = intervals[index++];\n\t\t\t\ttimer = setTimeout(poll, delay);\n\t\t\t}\n\t\t};\n\n\t\t// Start polling after first immediate emission\n\t\tif (intervals.length > 0) {\n\t\t\ttimer = setTimeout(poll, intervals[index++] ?? 100);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Cancel any pending poll so it can't fire after unsubscribe.\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n};\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getPolkadotWallets$ = (store: KheopskitStore) =>\n\tcreateInjectedWallets$<WalletId, PolkadotInjectedWallet, InjectedExtension>(\n\t\tstore,\n\t\t{\n\t\t\tsources$: createWalletIdsPoller$(),\n\t\t\tgetWalletId: (walletId) => walletId,\n\t\t\tconnect: (walletId) => {\n\t\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\t\treturn connectInjectedExtension(identifier);\n\t\t\t},\n\t\t\tbuildWallet: ({ walletId, handle, isConnected, connect, disconnect }) => {\n\t\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\treturn {\n\t\t\t\t\tid: walletId,\n\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\tsourceId: identifier,\n\t\t\t\t\textension: handle,\n\t\t\t\t\tisConnected,\n\t\t\t\t\tconnect,\n\t\t\t\t\tdisconnect,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t);\n","import type {\n\tKheopskitPlatform,\n\tPlatformContext,\n\tPolkadotAccountType,\n} from \"../types\";\nimport { getPolkadotAccounts$ } from \"./accounts\";\nimport type { PolkadotAccount, PolkadotWallet } from \"./types\";\nimport { getPolkadotWallets$ } from \"./wallets\";\n\nconst DEFAULT_ACCOUNT_TYPES: PolkadotAccountType[] = [\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n];\n\nconst VALID_ACCOUNT_TYPES = new Set<string>([\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n\t\"ethereum\",\n]);\n\nexport type PolkadotPluginOptions = {\n\t/**\n\t * Allowed Polkadot account key types. Accounts with other key types are\n\t * filtered out from kheopskit state.\n\t *\n\t * @default [\"sr25519\", \"ed25519\", \"ecdsa\"]\n\t */\n\taccountTypes?: PolkadotAccountType[];\n};\n\n/**\n * Polkadot platform plugin. Pass to `getKheopskit$({ platforms: [polkadot()] })`.\n *\n * @example\n * ```ts\n * import { polkadot } from \"@kheopskit/core/polkadot\";\n * polkadot({ accountTypes: [\"sr25519\", \"ed25519\", \"ecdsa\"] });\n * ```\n */\nexport const polkadot = (\n\toptions: PolkadotPluginOptions = {},\n): KheopskitPlatform<\"polkadot\", PolkadotWallet, PolkadotAccount> => {\n\tconst accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;\n\n\tconst invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));\n\tif (invalid.length > 0) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: \"sr25519\", \"ed25519\", \"ecdsa\", \"ethereum\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"polkadot\",\n\t\tgetWallets$: (ctx: PlatformContext) => getPolkadotWallets$(ctx.store),\n\t\tgetAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),\n\t\tacceptsCachedAccount: (cached) =>\n\t\t\taccountTypes.includes(cached.polkadotAccountType ?? \"sr25519\"),\n\t};\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"polkadot.mjs","names":[],"sources":["../src/api/polkadot/wallets.ts","../src/api/polkadot/accounts.ts","../src/api/polkadot/plugin.ts"],"sourcesContent":["import { isEqual } from \"lodash-es\";\nimport { getInjectedExtensions } from \"polkadot-api/pjs-signer\";\nimport { distinctUntilChanged, Observable, shareReplay, skip } from \"rxjs\";\nimport { pageLoaded$ } from \"../../utils/pageLoad\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { isRefusalMessage } from \"../errors\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { KheopskitConfig } from \"../types\";\nimport type {\n\tPolkadotInjected,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n} from \"./types\";\n\ntype EnableResult = {\n\taccounts?: Partial<PolkadotInjected[\"accounts\"]>;\n\tsigner?: Partial<PolkadotInjected[\"signer\"]>;\n\tmetadata?: unknown;\n\tprovider?: unknown;\n};\n\ntype InjectedWeb3Window = {\n\tinjectedWeb3?: Record<\n\t\tstring,\n\t\t| { enable(appName: string): Promise<EnableResult | null | undefined> }\n\t\t| undefined\n\t>;\n};\n\nconst isPolkadotInjected = (\n\tinjected: EnableResult | null | undefined,\n): injected is PolkadotInjected =>\n\ttypeof injected?.accounts?.get === \"function\" &&\n\ttypeof injected.accounts.subscribe === \"function\" &&\n\ttypeof injected.signer?.signPayload === \"function\" &&\n\ttypeof injected.signer.signRaw === \"function\";\n\n/**\n * The list each extension last reported: read when its connect was granted,\n * so the emission that first shows the wallet connected already lists it, and\n * updated by every `subscribe` callback, so an accounts stream that restarts\n * resumes from the current list rather than the connect-time one.\n */\nexport const latestAccounts = new WeakMap<\n\tPolkadotInjected,\n\tPolkadotInjectedAccount[]\n>();\n\nconst connectExtension = async (identifier: string, appName: string) => {\n\tconst entry = (globalThis as InjectedWeb3Window).injectedWeb3?.[identifier];\n\tif (!entry) throw new Error(`Unavailable extension: \"${identifier}\"`);\n\tconst injected = await entry.enable(appName);\n\tif (!isPolkadotInjected(injected))\n\t\tthrow new Error(`Unsupported extension: \"${identifier}\"`);\n\tlatestAccounts.set(injected, await injected.accounts.get());\n\treturn injected;\n};\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// Create a polling observable that starts immediately and polls at intervals\nconst createWalletIdsPoller$ = () => {\n\treturn new Observable<WalletId[]>((subscriber) => {\n\t\t// Emit immediately on subscribe\n\t\tsubscriber.next(getInjectedWalletsIds());\n\n\t\t// Poll at shorter intervals initially, then slow down\n\t\tconst intervals = [100, 200, 300, 500];\n\t\tlet index = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst poll = () => {\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t\tif (index < intervals.length) {\n\t\t\t\tconst delay = intervals[index++];\n\t\t\t\ttimer = setTimeout(poll, delay);\n\t\t\t}\n\t\t};\n\n\t\t// Start polling after first immediate emission\n\t\tif (intervals.length > 0) {\n\t\t\ttimer = setTimeout(poll, intervals[index++] ?? 100);\n\t\t}\n\n\t\tlet loadTimer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst loadSub = pageLoaded$.pipe(skip(1)).subscribe(() => {\n\t\t\tloadTimer = setTimeout(\n\t\t\t\t() => subscriber.next(getInjectedWalletsIds()),\n\t\t\t\t100,\n\t\t\t);\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t});\n\n\t\treturn () => {\n\t\t\t// Cancel any pending poll so it can't fire after unsubscribe.\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tclearTimeout(loadTimer);\n\t\t\tloadSub.unsubscribe();\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n};\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getPolkadotWallets$ = (\n\tstore: KheopskitStore,\n\tconfig: Pick<KheopskitConfig, \"appName\" | \"walletConnect\">,\n) =>\n\tcreateInjectedWallets$<WalletId, PolkadotInjectedWallet, PolkadotInjected>(\n\t\tstore,\n\t\t{\n\t\t\tsources$: createWalletIdsPoller$(),\n\t\t\tgetWalletId: (walletId) => walletId,\n\t\t\tconnect: (walletId) =>\n\t\t\t\tconnectExtension(\n\t\t\t\t\tparseWalletId(walletId).identifier,\n\t\t\t\t\tconfig.appName ||\n\t\t\t\t\t\tconfig.walletConnect?.metadata.name ||\n\t\t\t\t\t\twindow.location.hostname,\n\t\t\t\t),\n\t\t\tisUserRejection: isRefusalMessage,\n\t\t\tbuildWallet: ({\n\t\t\t\twalletId,\n\t\t\t\thandle,\n\t\t\t\tstatus,\n\t\t\t\terror,\n\t\t\t\tisConnected,\n\t\t\t\tconnect,\n\t\t\t\tdisconnect,\n\t\t\t}) => {\n\t\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\treturn {\n\t\t\t\t\tid: walletId,\n\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\tsourceId: identifier,\n\t\t\t\t\textension: handle,\n\t\t\t\t\tstatus,\n\t\t\t\t\terror,\n\t\t\t\t\tisConnected,\n\t\t\t\t\tconnect,\n\t\t\t\t\tdisconnect,\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t);\n","import { hex } from \"@scure/base\";\nimport type {\n\tKeypairType,\n\tSignPayload,\n\tSignRaw,\n} from \"polkadot-api/pjs-signer\";\nimport * as pjs from \"polkadot-api/pjs-signer\";\nimport { Observable, of } from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { KheopskitError } from \"../errors\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n\tgetWalletConnectSessionAccounts$,\n\ttype LiveWalletConnectWallet,\n} from \"../platformAccounts\";\nimport type {\n\tAppKitInstance,\n\tPolkadotAccountType,\n\tWalletConnectProvider,\n\tWalletConnectWallet,\n} from \"../types\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotInjectedAccount,\n\tPolkadotInjectedWallet,\n\tPolkadotSignRawType,\n\tPolkadotWallet,\n} from \"./types\";\nimport { latestAccounts } from \"./wallets\";\n\ntype RawSignature = `0x${string}`;\n\nconst encodeRawData = (\n\tdata: string | Uint8Array,\n\ttype?: PolkadotSignRawType,\n): { data: string; type: PolkadotSignRawType } =>\n\ttypeof data === \"string\"\n\t\t? { data, type: type ?? \"payload\" }\n\t\t: { data: `0x${hex.encode(data)}`, type: type ?? \"bytes\" };\n\n/**\n * pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an\n * `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.\n */\nconst toSignerType = (type: PolkadotAccountType): KeypairType =>\n\ttype === \"ethereum\" ? \"ecdsa\" : type;\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tconst injected = wallet.extension;\n\tif (!wallet.isConnected || !injected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst signPayload = injected.signer.signPayload.bind(injected.signer);\n\t\tconst signRaw = injected.signer.signRaw.bind(injected.signer);\n\t\tconst { field, factory } = getPjsSignerField();\n\n\t\tconst toAccount = (account: PolkadotInjectedAccount): PolkadotAccount => {\n\t\t\tconst { address } = account;\n\t\t\tconst type = account.type ?? \"sr25519\";\n\t\t\treturn {\n\t\t\t\t...account,\n\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\ttype,\n\t\t\t\tplatform: \"polkadot\",\n\t\t\t\twalletName: wallet.name,\n\t\t\t\twalletId: wallet.id,\n\t\t\t\t[field]: factory(address, signPayload, signRaw, toSignerType(type)),\n\t\t\t\tsignRaw: async (data, options) =>\n\t\t\t\t\t(await signRaw({ address, ...encodeRawData(data, options?.type) }))\n\t\t\t\t\t\t.signature,\n\t\t\t} as Exclude<PolkadotAccount, { isPlaceholder: true }>;\n\t\t};\n\n\t\tconst toAccounts = (accounts: PolkadotInjectedAccount[]) =>\n\t\t\taccounts.flatMap((account) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn [toAccount(account)];\n\t\t\t\t} catch {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst emit = (accounts: PolkadotInjectedAccount[]) => {\n\t\t\tlatestAccounts.set(injected, accounts);\n\t\t\tsubscriber.next(toAccounts(accounts));\n\t\t};\n\n\t\temit(latestAccounts.get(injected) ?? []);\n\t\treturn injected.accounts.subscribe(emit);\n\t});\n};\n\n/**\n * polkadot-api v2's `getPolkadotSignerFromPjs` takes three parameters and\n * ignores the fourth at runtime.\n */\ntype PjsSignerFactory = (\n\taddress: string,\n\tsignPayload: SignPayload,\n\tsignRaw: SignRaw,\n\ttype?: KeypairType,\n) => unknown;\n\ntype PjsSignerModule = {\n\tgetTxCreatorFromPjs?: PjsSignerFactory;\n\tgetPolkadotSignerFromPjs?: PjsSignerFactory;\n};\n\n/**\n * polkadot-api v3 replaced `polkadotSigner` (PolkadotSigner) with `txCreator`\n * (TxCreator). Which one the app's installed version provides is detected at\n * runtime so a single @kheopskit/core release supports both.\n */\nconst getPjsSignerField = (): {\n\tfield: \"txCreator\" | \"polkadotSigner\";\n\tfactory: PjsSignerFactory;\n} => {\n\tconst module = pjs as PjsSignerModule;\n\tif (module.getTxCreatorFromPjs)\n\t\treturn { field: \"txCreator\", factory: module.getTxCreatorFromPjs };\n\tif (module.getPolkadotSignerFromPjs)\n\t\treturn {\n\t\t\tfield: \"polkadotSigner\",\n\t\t\tfactory: module.getPolkadotSignerFromPjs,\n\t\t};\n\tthrow new KheopskitError(\n\t\t\"UNSUPPORTED_VERSION\",\n\t\t\"Unsupported polkadot-api/pjs-signer version\",\n\t);\n};\n\nconst requestSignMessage = (\n\tappKit: AppKitInstance,\n\tprovider: WalletConnectProvider,\n\taddress: string,\n\tmessage: string,\n) => {\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\tconst chainId = appKit.getCaipNetworks(\"polkadot\")[0]?.caipNetworkId;\n\tif (!chainId)\n\t\tthrow new KheopskitError(\n\t\t\t\"NO_SESSION\",\n\t\t\t\"No CAIP network available for polkadot\",\n\t\t);\n\n\treturn provider.client.request<{ signature: RawSignature }>({\n\t\ttopic: provider.session.topic,\n\t\tchainId,\n\t\trequest: {\n\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\tparams: { address, message },\n\t\t},\n\t});\n};\n\nconst getAppKitPolkadotSigning = (appKit: AppKitInstance, address: string) => {\n\tconst provider = appKit.getProvider(\"polkadot\");\n\tif (!provider) throw new KheopskitError(\"NO_PROVIDER\", \"No provider found\");\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\tconst signMessage = (message: string) =>\n\t\trequestSignMessage(appKit, provider, address, message);\n\n\tconst { field, factory } = getPjsSignerField();\n\n\tconst signer = factory(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ data }) => ({\n\t\t\tid: 0,\n\t\t\tsignature: (await signMessage(data)).signature,\n\t\t}),\n\t\t\"sr25519\",\n\t);\n\n\tconst signRaw: PolkadotAccount[\"signRaw\"] = async (data) =>\n\t\t(await signMessage(encodeRawData(data).data)).signature;\n\n\treturn { [field]: signer, signRaw };\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: LiveWalletConnectWallet,\n): Observable<PolkadotAccount[]> =>\n\tgetWalletConnectSessionAccounts$({\n\t\twallet,\n\t\tplatform: \"polkadot\",\n\t\tnamespace: \"polkadot\",\n\t\tcacheKey: `accounts:${wallet.id}:polkadot:`,\n\t\tbuildAccounts: (provider) => {\n\t\t\tconst session = provider.session;\n\t\t\tif (!session) return [];\n\n\t\t\tconst addresses = getCaip10Addresses(\n\t\t\t\tgetSessionCaip10s(session, \"polkadot\"),\n\t\t\t);\n\n\t\t\treturn addresses.map(\n\t\t\t\t(address) =>\n\t\t\t\t\t({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\t...getAppKitPolkadotSigning(wallet.appKit, address),\n\t\t\t\t\t\tgenesisHash: null,\n\t\t\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\t\t\t// WalletConnect (Reown AppKit) doesn't expose account key type;\n\t\t\t\t\t\t// default to sr25519, which is the most common Polkadot key type.\n\t\t\t\t\t\ttype: \"sr25519\",\n\t\t\t\t\t}) as PolkadotAccount,\n\t\t\t);\n\t\t},\n\t});\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<(PolkadotWallet | WalletConnectWallet)[]>,\n\tpolkadotAccountTypes: PolkadotAccountType[],\n) => {\n\tif (polkadotAccountTypes.length === 0) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.\",\n\t\t);\n\t}\n\n\treturn createPlatformAccounts$({\n\t\twallets$: polkadotWallets$,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\tmapAccounts: (accounts) =>\n\t\t\taccounts.filter((account) => polkadotAccountTypes.includes(account.type)),\n\t});\n};\n","import type {\n\tKheopskitPlatform,\n\tPlatformContext,\n\tPolkadotAccountType,\n} from \"../types\";\nimport { getPolkadotAccounts$ } from \"./accounts\";\nimport type { PolkadotAccount, PolkadotWallet } from \"./types\";\nimport { getPolkadotWallets$ } from \"./wallets\";\n\nconst DEFAULT_ACCOUNT_TYPES: PolkadotAccountType[] = [\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n];\n\nconst VALID_ACCOUNT_TYPES = new Set<string>([\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n\t\"ethereum\",\n]);\n\nexport type PolkadotPluginOptions = {\n\t/**\n\t * Allowed Polkadot account key types. Accounts with other key types are\n\t * filtered out from kheopskit state.\n\t *\n\t * @default [\"sr25519\", \"ed25519\", \"ecdsa\"]\n\t */\n\taccountTypes?: PolkadotAccountType[];\n};\n\n/**\n * Polkadot platform plugin. Pass to `getKheopskit$({ platforms: [polkadot()] })`.\n *\n * @example\n * ```ts\n * import { polkadot } from \"@kheopskit/core/polkadot\";\n * polkadot({ accountTypes: [\"sr25519\", \"ed25519\", \"ecdsa\"] });\n * ```\n */\nexport const polkadot = (\n\toptions: PolkadotPluginOptions = {},\n): KheopskitPlatform<\"polkadot\", PolkadotWallet, PolkadotAccount> => {\n\tconst accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;\n\n\tconst invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));\n\tif (invalid.length > 0) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: \"sr25519\", \"ed25519\", \"ecdsa\", \"ethereum\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"polkadot\",\n\t\tgetWallets$: (ctx: PlatformContext) =>\n\t\t\tgetPolkadotWallets$(ctx.store, ctx.config),\n\t\tgetAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),\n\t\tacceptsCachedAccount: (cached) =>\n\t\t\taccountTypes.includes(cached.polkadotAccountType ?? \"sr25519\"),\n\t};\n};\n"],"mappings":"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"}
|
package/dist/solana.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { E as isWalletConnectWallet, N as WalletAccountId, T as isInjectedWallet, b as WalletConnectWallet, k as WalletId, l as KheopskitPlatform, m as PlaceholderWallet, p as Placeholder, r as BaseWallet } from "./types-Dkyt9bf4.mjs";
|
|
2
2
|
import { MessageModifyingSigner, TransactionModifyingSigner, TransactionSendingSigner } from "@solana/kit";
|
|
3
3
|
import { Wallet } from "@wallet-standard/base";
|
|
4
4
|
//#region src/utils/isSolanaAddress.d.ts
|
|
@@ -39,7 +39,8 @@ export declare const getSolanaCaip2: (chain: SolanaChainId) => string;
|
|
|
39
39
|
* (e.g. `signAndSendTransactionMessageWithSigners`).
|
|
40
40
|
*/
|
|
41
41
|
type SolanaSigner = MessageModifyingSigner & TransactionModifyingSigner & TransactionSendingSigner;
|
|
42
|
-
type
|
|
42
|
+
type LiveSolanaInjectedWallet = {
|
|
43
|
+
isPlaceholder?: false;
|
|
43
44
|
platform: "solana";
|
|
44
45
|
type: "injected";
|
|
45
46
|
id: WalletId;
|
|
@@ -55,12 +56,16 @@ type SolanaInjectedWallet = {
|
|
|
55
56
|
chains: SolanaChainId[];
|
|
56
57
|
name: string;
|
|
57
58
|
icon: string;
|
|
59
|
+
status: BaseWallet["status"];
|
|
60
|
+
error?: BaseWallet["error"];
|
|
58
61
|
isConnected: boolean;
|
|
59
|
-
connect:
|
|
60
|
-
disconnect:
|
|
62
|
+
connect: BaseWallet["connect"];
|
|
63
|
+
disconnect: BaseWallet["disconnect"];
|
|
61
64
|
};
|
|
65
|
+
type SolanaInjectedWallet = LiveSolanaInjectedWallet | PlaceholderWallet<LiveSolanaInjectedWallet, "sourceId" | "wallet" | "chains">;
|
|
62
66
|
type SolanaWallet = SolanaInjectedWallet;
|
|
63
|
-
type
|
|
67
|
+
type LiveSolanaAccount = {
|
|
68
|
+
isPlaceholder?: false;
|
|
64
69
|
id: WalletAccountId;
|
|
65
70
|
platform: "solana";
|
|
66
71
|
/** Base58-encoded address. */
|
|
@@ -74,6 +79,7 @@ type SolanaAccount = {
|
|
|
74
79
|
walletName: string;
|
|
75
80
|
walletId: WalletId;
|
|
76
81
|
};
|
|
82
|
+
type SolanaAccount = LiveSolanaAccount | Placeholder<LiveSolanaAccount, "signer" | "getSigner">;
|
|
77
83
|
//#endregion
|
|
78
84
|
//#region src/api/solana/plugin.d.ts
|
|
79
85
|
type SolanaPluginOptions = {
|
package/dist/solana.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { E as isWalletConnectWallet, N as WalletAccountId, T as isInjectedWallet, b as WalletConnectWallet, k as WalletId, l as KheopskitPlatform, m as PlaceholderWallet, p as Placeholder, r as BaseWallet } from "./types-Dkyt9bf4.js";
|
|
2
2
|
import { MessageModifyingSigner, TransactionModifyingSigner, TransactionSendingSigner } from "@solana/kit";
|
|
3
3
|
import { Wallet } from "@wallet-standard/base";
|
|
4
4
|
//#region src/utils/isSolanaAddress.d.ts
|
|
@@ -39,7 +39,8 @@ export declare const getSolanaCaip2: (chain: SolanaChainId) => string;
|
|
|
39
39
|
* (e.g. `signAndSendTransactionMessageWithSigners`).
|
|
40
40
|
*/
|
|
41
41
|
type SolanaSigner = MessageModifyingSigner & TransactionModifyingSigner & TransactionSendingSigner;
|
|
42
|
-
type
|
|
42
|
+
type LiveSolanaInjectedWallet = {
|
|
43
|
+
isPlaceholder?: false;
|
|
43
44
|
platform: "solana";
|
|
44
45
|
type: "injected";
|
|
45
46
|
id: WalletId;
|
|
@@ -55,12 +56,16 @@ type SolanaInjectedWallet = {
|
|
|
55
56
|
chains: SolanaChainId[];
|
|
56
57
|
name: string;
|
|
57
58
|
icon: string;
|
|
59
|
+
status: BaseWallet["status"];
|
|
60
|
+
error?: BaseWallet["error"];
|
|
58
61
|
isConnected: boolean;
|
|
59
|
-
connect:
|
|
60
|
-
disconnect:
|
|
62
|
+
connect: BaseWallet["connect"];
|
|
63
|
+
disconnect: BaseWallet["disconnect"];
|
|
61
64
|
};
|
|
65
|
+
type SolanaInjectedWallet = LiveSolanaInjectedWallet | PlaceholderWallet<LiveSolanaInjectedWallet, "sourceId" | "wallet" | "chains">;
|
|
62
66
|
type SolanaWallet = SolanaInjectedWallet;
|
|
63
|
-
type
|
|
67
|
+
type LiveSolanaAccount = {
|
|
68
|
+
isPlaceholder?: false;
|
|
64
69
|
id: WalletAccountId;
|
|
65
70
|
platform: "solana";
|
|
66
71
|
/** Base58-encoded address. */
|
|
@@ -74,6 +79,7 @@ type SolanaAccount = {
|
|
|
74
79
|
walletName: string;
|
|
75
80
|
walletId: WalletId;
|
|
76
81
|
};
|
|
82
|
+
type SolanaAccount = LiveSolanaAccount | Placeholder<LiveSolanaAccount, "signer" | "getSigner">;
|
|
77
83
|
//#endregion
|
|
78
84
|
//#region src/api/solana/plugin.d.ts
|
|
79
85
|
type SolanaPluginOptions = {
|
package/dist/solana.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_types = require("./types-
|
|
3
|
-
const
|
|
4
|
-
const require_injectedWallets = require("./injectedWallets-
|
|
2
|
+
const require_types = require("./types-BWHvNFlN.js");
|
|
3
|
+
const require_platformAccounts = require("./platformAccounts-BjIeRcFN.js");
|
|
4
|
+
const require_injectedWallets = require("./injectedWallets-Dy8YGKL-.js");
|
|
5
5
|
let rxjs = require("rxjs");
|
|
6
6
|
let _solana_kit = require("@solana/kit");
|
|
7
7
|
let _wallet_standard_app = require("@wallet-standard/app");
|
|
@@ -36,7 +36,7 @@ const SOLANA_CHAIN_TO_CAIP2 = {
|
|
|
36
36
|
*/
|
|
37
37
|
const getSolanaCaip2 = (chain) => {
|
|
38
38
|
const caip2 = SOLANA_CHAIN_TO_CAIP2[chain];
|
|
39
|
-
if (!caip2) throw new
|
|
39
|
+
if (!caip2) throw new require_types.KheopskitError("UNSUPPORTED_CHAIN", `Solana chain "${chain}" cannot be used over WalletConnect (no CAIP-2 id).`);
|
|
40
40
|
return caip2;
|
|
41
41
|
};
|
|
42
42
|
/**
|
|
@@ -66,7 +66,7 @@ const SOLANA_SIGN_TRANSACTION = "solana:signTransaction";
|
|
|
66
66
|
const SOLANA_SIGN_AND_SEND_TRANSACTION = "solana:signAndSendTransaction";
|
|
67
67
|
const requireFeature = (wallet, name) => {
|
|
68
68
|
const feature = wallet.features[name];
|
|
69
|
-
if (!feature) throw new
|
|
69
|
+
if (!feature) throw new require_types.KheopskitError("FEATURE_NOT_SUPPORTED", `wallet "${wallet.name}" does not support ${name}`);
|
|
70
70
|
return feature;
|
|
71
71
|
};
|
|
72
72
|
/**
|
|
@@ -134,7 +134,7 @@ const createInjectedSolanaSigner = (wallet, account, chain) => {
|
|
|
134
134
|
const createWalletConnectSolanaSigner = (provider, accountAddress, chain) => {
|
|
135
135
|
const signerAddress = (0, _solana_kit.address)(accountAddress);
|
|
136
136
|
const request = (method, params) => {
|
|
137
|
-
if (!provider.session) throw new
|
|
137
|
+
if (!provider.session) throw new require_types.KheopskitError("NO_SESSION", "No session found");
|
|
138
138
|
return provider.client.request({
|
|
139
139
|
topic: provider.session.topic,
|
|
140
140
|
chainId: getSolanaCaip2(chain),
|
|
@@ -200,7 +200,7 @@ const getInjectedWalletAccounts$ = (wallet, chain) => {
|
|
|
200
200
|
return require_types.getCachedObservable$(`accounts:${wallet.id}:${chain}`, () => new rxjs.Observable((subscriber) => {
|
|
201
201
|
const standardWallet = wallet.wallet;
|
|
202
202
|
const buildAccounts = () => standardWallet.accounts.map((account) => ({
|
|
203
|
-
id:
|
|
203
|
+
id: require_platformAccounts.getWalletAccountId(wallet.id, account.address),
|
|
204
204
|
platform: "solana",
|
|
205
205
|
address: account.address,
|
|
206
206
|
chains: wallet.chains,
|
|
@@ -219,7 +219,7 @@ const getInjectedWalletAccounts$ = (wallet, chain) => {
|
|
|
219
219
|
bufferSize: 1
|
|
220
220
|
})));
|
|
221
221
|
};
|
|
222
|
-
const getWalletConnectAccounts$ = (wallet, chain) =>
|
|
222
|
+
const getWalletConnectAccounts$ = (wallet, chain) => require_platformAccounts.getWalletConnectSessionAccounts$({
|
|
223
223
|
wallet,
|
|
224
224
|
platform: "solana",
|
|
225
225
|
namespace: "solana",
|
|
@@ -227,12 +227,12 @@ const getWalletConnectAccounts$ = (wallet, chain) => require_injectedWallets.get
|
|
|
227
227
|
buildAccounts: (provider) => {
|
|
228
228
|
const session = provider.session;
|
|
229
229
|
if (!session) return [];
|
|
230
|
-
const solanaCaip10s =
|
|
231
|
-
const addresses =
|
|
230
|
+
const solanaCaip10s = require_platformAccounts.getSessionCaip10s(session, "solana");
|
|
231
|
+
const addresses = require_platformAccounts.getCaip10Addresses(solanaCaip10s);
|
|
232
232
|
const advertisedChains = [...new Set(solanaCaip10s.map((account) => account.split(":").slice(0, 2).join(":")).map(getSolanaChainIdFromCaip2).filter((c) => !!c))];
|
|
233
233
|
const chains = advertisedChains.length ? advertisedChains : [chain];
|
|
234
234
|
return addresses.map((accountAddress) => ({
|
|
235
|
-
id:
|
|
235
|
+
id: require_platformAccounts.getWalletAccountId(wallet.id, accountAddress),
|
|
236
236
|
platform: "solana",
|
|
237
237
|
address: accountAddress,
|
|
238
238
|
chains,
|
|
@@ -243,7 +243,7 @@ const getWalletConnectAccounts$ = (wallet, chain) => require_injectedWallets.get
|
|
|
243
243
|
}));
|
|
244
244
|
}
|
|
245
245
|
});
|
|
246
|
-
const getSolanaAccounts$ = (solanaWallets$, solanaChain) =>
|
|
246
|
+
const getSolanaAccounts$ = (solanaWallets$, solanaChain) => require_platformAccounts.createPlatformAccounts$({
|
|
247
247
|
wallets$: solanaWallets$,
|
|
248
248
|
getInjectedAccounts$: (wallet) => getInjectedWalletAccounts$(wallet, solanaChain),
|
|
249
249
|
getWalletConnectAccounts$: (wallet) => getWalletConnectAccounts$(wallet, solanaChain),
|
|
@@ -282,14 +282,15 @@ const getSolanaWallets$ = (store) => require_injectedWallets.createInjectedWalle
|
|
|
282
282
|
getWalletId: (wallet) => require_types.getWalletId("solana", wallet.name),
|
|
283
283
|
connect: async (wallet, walletId) => {
|
|
284
284
|
const feature = wallet.features["standard:connect"];
|
|
285
|
-
if (!feature) throw new
|
|
285
|
+
if (!feature) throw new require_types.KheopskitError("FEATURE_NOT_SUPPORTED", `wallet ${walletId} does not support standard:connect`, { walletId });
|
|
286
286
|
await feature.connect();
|
|
287
287
|
},
|
|
288
|
+
isUserRejection: (error) => require_types.isEip1193UserRejection(error) || require_types.isRefusalMessage(error),
|
|
288
289
|
disconnect: async (wallet) => {
|
|
289
290
|
await wallet.features["standard:disconnect"]?.disconnect();
|
|
290
291
|
},
|
|
291
292
|
onDisconnected: (walletId) => require_types.clearCachedObservablesByPrefix(`accounts:${walletId}:`),
|
|
292
|
-
buildWallet: ({ source: wallet, walletId, isConnected, connect, disconnect }) => ({
|
|
293
|
+
buildWallet: ({ source: wallet, walletId, status, error, isConnected, connect, disconnect }) => ({
|
|
293
294
|
platform: "solana",
|
|
294
295
|
type: "injected",
|
|
295
296
|
id: walletId,
|
|
@@ -298,6 +299,8 @@ const getSolanaWallets$ = (store) => require_injectedWallets.createInjectedWalle
|
|
|
298
299
|
chains: getSolanaChains(wallet),
|
|
299
300
|
name: wallet.name,
|
|
300
301
|
icon: wallet.icon,
|
|
302
|
+
status,
|
|
303
|
+
error,
|
|
301
304
|
isConnected,
|
|
302
305
|
connect,
|
|
303
306
|
disconnect
|
|
@@ -327,7 +330,7 @@ const solana = (options = {}) => {
|
|
|
327
330
|
exports.DEFAULT_SOLANA_CHAIN = DEFAULT_SOLANA_CHAIN;
|
|
328
331
|
exports.getSolanaCaip2 = getSolanaCaip2;
|
|
329
332
|
exports.isInjectedWallet = require_types.isInjectedWallet;
|
|
330
|
-
exports.isSolanaAddress =
|
|
333
|
+
exports.isSolanaAddress = require_platformAccounts.isSolanaAddress;
|
|
331
334
|
exports.isSolanaChainId = isSolanaChainId;
|
|
332
335
|
exports.isWalletConnectWallet = require_types.isWalletConnectWallet;
|
|
333
336
|
exports.solana = solana;
|