@kheopskit/core 5.3.0 → 6.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +432 -0
  2. package/MIGRATING_TO_V6.md +840 -0
  3. package/README.md +629 -12
  4. package/dist/ethereum.d.mts +12 -6
  5. package/dist/ethereum.d.ts +12 -6
  6. package/dist/ethereum.js +13 -10
  7. package/dist/ethereum.js.map +1 -1
  8. package/dist/ethereum.mjs +7 -4
  9. package/dist/ethereum.mjs.map +1 -1
  10. package/dist/{iconCache-pP2ES4pJ.mjs → iconCache-C-U3IEbP.mjs} +21 -40
  11. package/dist/iconCache-C-U3IEbP.mjs.map +1 -0
  12. package/dist/{iconCache-DUtkJlaX.js → iconCache-FR4iy6go.js} +21 -40
  13. package/dist/iconCache-FR4iy6go.js.map +1 -0
  14. package/dist/index.d.mts +17 -63
  15. package/dist/index.d.ts +17 -63
  16. package/dist/index.js +387 -373
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +384 -369
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/injectedWallets-48L-AL1I.mjs +173 -0
  21. package/dist/injectedWallets-48L-AL1I.mjs.map +1 -0
  22. package/dist/injectedWallets-Dy8YGKL-.js +178 -0
  23. package/dist/injectedWallets-Dy8YGKL-.js.map +1 -0
  24. package/dist/internal.d.mts +3 -27
  25. package/dist/internal.d.ts +3 -27
  26. package/dist/internal.js +2 -2
  27. package/dist/internal.mjs +2 -2
  28. package/dist/pageLoad-BZ7o8p5R.mjs +24 -0
  29. package/dist/pageLoad-BZ7o8p5R.mjs.map +1 -0
  30. package/dist/pageLoad-D1wLeuFG.js +28 -0
  31. package/dist/pageLoad-D1wLeuFG.js.map +1 -0
  32. package/dist/platformAccounts-BjIeRcFN.js +321 -0
  33. package/dist/platformAccounts-BjIeRcFN.js.map +1 -0
  34. package/dist/platformAccounts-yyRUrnel.mjs +256 -0
  35. package/dist/platformAccounts-yyRUrnel.mjs.map +1 -0
  36. package/dist/polkadot.d.mts +127 -11
  37. package/dist/polkadot.d.ts +127 -11
  38. package/dist/polkadot.js +187 -106
  39. package/dist/polkadot.js.map +1 -1
  40. package/dist/polkadot.mjs +180 -99
  41. package/dist/polkadot.mjs.map +1 -1
  42. package/dist/solana.d.mts +11 -5
  43. package/dist/solana.d.ts +11 -5
  44. package/dist/solana.js +18 -15
  45. package/dist/solana.js.map +1 -1
  46. package/dist/solana.mjs +7 -4
  47. package/dist/solana.mjs.map +1 -1
  48. package/dist/storage-D3AwNgqc.d.mts +27 -0
  49. package/dist/storage-D3AwNgqc.d.ts +27 -0
  50. package/dist/testing.d.mts +71 -0
  51. package/dist/testing.d.ts +71 -0
  52. package/dist/testing.js +136 -0
  53. package/dist/testing.js.map +1 -0
  54. package/dist/testing.mjs +131 -0
  55. package/dist/testing.mjs.map +1 -0
  56. package/dist/{types-DKU-SNio.js → types-BWHvNFlN.js} +149 -2
  57. package/dist/types-BWHvNFlN.js.map +1 -0
  58. package/dist/types-Yor672md.mjs +215 -0
  59. package/dist/types-Yor672md.mjs.map +1 -0
  60. package/dist/types-lkMXVJNG.d.mts +685 -0
  61. package/dist/types-lkMXVJNG.d.ts +685 -0
  62. package/dist/walletconnect.d.mts +41 -0
  63. package/dist/walletconnect.d.ts +41 -0
  64. package/dist/walletconnect.js +219 -0
  65. package/dist/walletconnect.js.map +1 -0
  66. package/dist/walletconnect.mjs +216 -0
  67. package/dist/walletconnect.mjs.map +1 -0
  68. package/package.json +30 -6
  69. package/dist/errors-BLFP1dQI.mjs +0 -181
  70. package/dist/errors-BLFP1dQI.mjs.map +0 -1
  71. package/dist/errors-DYWVPHrR.js +0 -222
  72. package/dist/errors-DYWVPHrR.js.map +0 -1
  73. package/dist/iconCache-DUtkJlaX.js.map +0 -1
  74. package/dist/iconCache-pP2ES4pJ.mjs.map +0 -1
  75. package/dist/injectedWallets-BqR-_aAy.js +0 -148
  76. package/dist/injectedWallets-BqR-_aAy.js.map +0 -1
  77. package/dist/injectedWallets-Uz4hPuoW.mjs +0 -119
  78. package/dist/injectedWallets-Uz4hPuoW.mjs.map +0 -1
  79. package/dist/types-AxUDtkR-.d.mts +0 -338
  80. package/dist/types-AxUDtkR-.d.ts +0 -338
  81. package/dist/types-DKU-SNio.js.map +0 -1
  82. package/dist/types-jnifAAA0.mjs +0 -104
  83. package/dist/types-jnifAAA0.mjs.map +0 -1
package/dist/polkadot.mjs CHANGED
@@ -1,31 +1,157 @@
1
- import { i as getWalletId, n as isWalletConnectWallet, o as parseWalletId, t as isInjectedWallet } from "./types-jnifAAA0.mjs";
2
- import { a as isSs58Address, n as getWalletAccountId, t as KheopskitError } from "./errors-BLFP1dQI.mjs";
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 { a as getWalletConnectSessionAccounts$, i as getSessionCaip10s, n as createPlatformAccounts$, r as getCaip10Addresses, t as createInjectedWallets$ } from "./injectedWallets-Uz4hPuoW.mjs";
5
- import { Observable, distinctUntilChanged, of, shareReplay } from "rxjs";
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 { connectInjectedExtension, getInjectedExtensions } from "polkadot-api/pjs-signer";
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
+ /**
21
+ * The connect each extension is still answering. An extension keeps its
22
+ * prompt open after kheopskit abandons the attempt, and a second `enable()`
23
+ * meanwhile fails (polkadot-js: "Pending authorisation request already
24
+ * exists") or resolves unauthorised (Talisman), so a new attempt joins this
25
+ * one instead.
26
+ */
27
+ const pendingConnects = /* @__PURE__ */ new WeakMap();
28
+ const enableExtension = async (identifier, entry, appName) => {
29
+ const injected = await entry.enable(appName);
30
+ if (!isPolkadotInjected(injected)) throw new Error(`Unsupported extension: "${identifier}"`);
31
+ latestAccounts.set(injected, await injected.accounts.get());
32
+ return injected;
33
+ };
34
+ const connectExtension = (identifier, appName) => {
35
+ const entry = globalThis.injectedWeb3?.[identifier];
36
+ if (!entry) return Promise.reject(/* @__PURE__ */ new Error(`Unavailable extension: "${identifier}"`));
37
+ const pending = pendingConnects.get(entry);
38
+ if (pending) return pending;
39
+ const connecting = enableExtension(identifier, entry, appName);
40
+ pendingConnects.set(entry, connecting);
41
+ const settle = () => pendingConnects.delete(entry);
42
+ connecting.then(settle, settle);
43
+ return connecting;
44
+ };
45
+ const getInjectedWalletsIds = () => typeof window === "undefined" ? [] : getInjectedExtensions().map((name) => getWalletId("polkadot", name));
46
+ const createWalletIdsPoller$ = () => {
47
+ return new Observable((subscriber) => {
48
+ subscriber.next(getInjectedWalletsIds());
49
+ const intervals = [
50
+ 100,
51
+ 200,
52
+ 300,
53
+ 500
54
+ ];
55
+ let index = 0;
56
+ let timer;
57
+ const poll = () => {
58
+ subscriber.next(getInjectedWalletsIds());
59
+ if (index < intervals.length) {
60
+ const delay = intervals[index++];
61
+ timer = setTimeout(poll, delay);
62
+ }
63
+ };
64
+ if (intervals.length > 0) timer = setTimeout(poll, intervals[index++] ?? 100);
65
+ let loadTimer;
66
+ const loadSub = pageLoaded$.pipe(skip(1)).subscribe(() => {
67
+ loadTimer = setTimeout(() => subscriber.next(getInjectedWalletsIds()), 100);
68
+ subscriber.next(getInjectedWalletsIds());
69
+ });
70
+ return () => {
71
+ if (timer !== void 0) clearTimeout(timer);
72
+ clearTimeout(loadTimer);
73
+ loadSub.unsubscribe();
74
+ };
75
+ }).pipe(distinctUntilChanged(isEqual), shareReplay({
76
+ refCount: true,
77
+ bufferSize: 1
78
+ }));
79
+ };
80
+ const getPolkadotWallets$ = (store, config) => createInjectedWallets$(store, {
81
+ sources$: createWalletIdsPoller$(),
82
+ getWalletId: (walletId) => walletId,
83
+ connect: (walletId) => connectExtension(parseWalletId(walletId).identifier, config.appName || config.walletConnect?.metadata.name || window.location.hostname),
84
+ isUserRejection: isRefusalMessage,
85
+ buildWallet: ({ walletId, handle, status, error, isConnected, connect, disconnect }) => {
86
+ const { identifier } = parseWalletId(walletId);
87
+ const extInfo = POLKADOT_EXTENSIONS[identifier];
88
+ return {
89
+ id: walletId,
90
+ type: "injected",
91
+ platform: "polkadot",
92
+ name: extInfo?.name ?? identifier,
93
+ icon: extInfo?.icon ?? "",
94
+ sourceId: identifier,
95
+ extension: handle,
96
+ status,
97
+ error,
98
+ isConnected,
99
+ connect,
100
+ disconnect
101
+ };
102
+ }
103
+ });
104
+ //#endregion
9
105
  //#region src/api/polkadot/accounts.ts
106
+ const encodeRawData = (data, type) => typeof data === "string" ? {
107
+ data,
108
+ type: type ?? "payload"
109
+ } : {
110
+ data: `0x${hex.encode(data)}`,
111
+ type: type ?? "bytes"
112
+ };
113
+ /**
114
+ * pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an
115
+ * `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.
116
+ */
117
+ const toSignerType = (type) => type === "ethereum" ? "ecdsa" : type;
10
118
  const getInjectedWalletAccounts$ = (wallet) => {
11
- if (!wallet.isConnected) return of([]);
119
+ const injected = wallet.extension;
120
+ if (!wallet.isConnected || !injected) return of([]);
12
121
  return new Observable((subscriber) => {
13
- const getAccount = (account) => ({
14
- id: getWalletAccountId(wallet.id, account.address),
15
- ...account,
16
- type: account.type ?? "sr25519",
17
- platform: "polkadot",
18
- walletName: wallet.name,
19
- walletId: wallet.id
20
- });
21
- const extension = wallet.extension;
22
- const unsubscribe = extension.subscribe((accounts) => {
23
- subscriber.next(accounts.map(getAccount));
122
+ const signPayload = injected.signer.signPayload.bind(injected.signer);
123
+ const signRaw = injected.signer.signRaw.bind(injected.signer);
124
+ const { field, factory } = getPjsSignerField();
125
+ const toAccount = (account) => {
126
+ const { address } = account;
127
+ const type = account.type ?? "sr25519";
128
+ return {
129
+ ...account,
130
+ id: getWalletAccountId(wallet.id, address),
131
+ type,
132
+ platform: "polkadot",
133
+ walletName: wallet.name,
134
+ walletId: wallet.id,
135
+ [field]: factory(address, signPayload, signRaw, toSignerType(type)),
136
+ signRaw: async (data, options) => (await signRaw({
137
+ address,
138
+ ...encodeRawData(data, options?.type)
139
+ })).signature
140
+ };
141
+ };
142
+ const toAccounts = (accounts) => accounts.flatMap((account) => {
143
+ try {
144
+ return [toAccount(account)];
145
+ } catch {
146
+ return [];
147
+ }
24
148
  });
25
- subscriber.next(extension.getAccounts().map(getAccount));
26
- return () => {
27
- return unsubscribe();
149
+ const emit = (accounts) => {
150
+ latestAccounts.set(injected, accounts);
151
+ subscriber.next(toAccounts(accounts));
28
152
  };
153
+ emit(latestAccounts.get(injected) ?? []);
154
+ return injected.accounts.subscribe(emit);
29
155
  });
30
156
  };
31
157
  /**
@@ -34,21 +160,38 @@ const getInjectedWalletAccounts$ = (wallet) => {
34
160
  * runtime so a single @kheopskit/core release supports both.
35
161
  */
36
162
  const getPjsSignerField = () => {
37
- const { getTxCreatorFromPjs, getPolkadotSignerFromPjs } = pjs;
38
- if (getTxCreatorFromPjs) return {
163
+ const module = pjs;
164
+ if (module.getTxCreatorFromPjs) return {
39
165
  field: "txCreator",
40
- factory: getTxCreatorFromPjs
166
+ factory: module.getTxCreatorFromPjs
41
167
  };
42
- if (getPolkadotSignerFromPjs) return {
168
+ if (module.getPolkadotSignerFromPjs) return {
43
169
  field: "polkadotSigner",
44
- factory: getPolkadotSignerFromPjs
170
+ factory: module.getPolkadotSignerFromPjs
45
171
  };
46
172
  throw new KheopskitError("UNSUPPORTED_VERSION", "Unsupported polkadot-api/pjs-signer version");
47
173
  };
48
- const getAppKitPolkadotSigner = (appKit, address) => {
174
+ const requestSignMessage = (appKit, provider, address, message) => {
175
+ if (!provider.session) throw new KheopskitError("NO_SESSION", "No session found");
176
+ const chainId = appKit.getCaipNetworks("polkadot")[0]?.caipNetworkId;
177
+ if (!chainId) throw new KheopskitError("NO_SESSION", "No CAIP network available for polkadot");
178
+ return provider.client.request({
179
+ topic: provider.session.topic,
180
+ chainId,
181
+ request: {
182
+ method: "polkadot_signMessage",
183
+ params: {
184
+ address,
185
+ message
186
+ }
187
+ }
188
+ });
189
+ };
190
+ const getAppKitPolkadotSigning = (appKit, address) => {
49
191
  const provider = appKit.getProvider("polkadot");
50
192
  if (!provider) throw new KheopskitError("NO_PROVIDER", "No provider found");
51
193
  if (!provider.session) throw new KheopskitError("NO_SESSION", "No session found");
194
+ const signMessage = (message) => requestSignMessage(appKit, provider, address, message);
52
195
  const { field, factory } = getPjsSignerField();
53
196
  const signer = factory(address, (transactionPayload) => {
54
197
  if (!provider.session) throw new KheopskitError("NO_SESSION", "No session found");
@@ -63,23 +206,15 @@ const getAppKitPolkadotSigner = (appKit, address) => {
63
206
  }
64
207
  }
65
208
  });
66
- }, async ({ address, data }) => {
67
- if (!provider.session) throw new KheopskitError("NO_SESSION", "No session found");
68
- const chainId = appKit.getCaipNetworks("polkadot")[0]?.caipNetworkId;
69
- if (!chainId) throw new KheopskitError("NO_SESSION", "No CAIP network available for polkadot");
70
- return provider.client.request({
71
- topic: provider.session.topic,
72
- chainId,
73
- request: {
74
- method: "polkadot_signMessage",
75
- params: {
76
- address,
77
- message: data
78
- }
79
- }
80
- });
81
- });
82
- return { [field]: signer };
209
+ }, async ({ data }) => ({
210
+ id: 0,
211
+ signature: (await signMessage(data)).signature
212
+ }), "sr25519");
213
+ const signRaw = async (data) => (await signMessage(encodeRawData(data).data)).signature;
214
+ return {
215
+ [field]: signer,
216
+ signRaw
217
+ };
83
218
  };
84
219
  const getWalletConnectAccounts$ = (wallet) => getWalletConnectSessionAccounts$({
85
220
  wallet,
@@ -95,7 +230,7 @@ const getWalletConnectAccounts$ = (wallet) => getWalletConnectSessionAccounts$({
95
230
  walletName: wallet.name,
96
231
  walletId: wallet.id,
97
232
  address,
98
- ...getAppKitPolkadotSigner(wallet.appKit, address),
233
+ ...getAppKitPolkadotSigning(wallet.appKit, address),
99
234
  genesisHash: null,
100
235
  name: `${wallet.name} Polkadot`,
101
236
  type: "sr25519"
@@ -103,7 +238,7 @@ const getWalletConnectAccounts$ = (wallet) => getWalletConnectSessionAccounts$({
103
238
  }
104
239
  });
105
240
  const getPolkadotAccounts$ = (polkadotWallets$, polkadotAccountTypes) => {
106
- if (polkadotAccountTypes.length === 0) console.warn("[kheopskit] config.polkadotAccountTypes is empty; all Polkadot accounts will be filtered out.");
241
+ if (polkadotAccountTypes.length === 0) console.warn("[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.");
107
242
  return createPlatformAccounts$({
108
243
  wallets$: polkadotWallets$,
109
244
  getInjectedAccounts$: getInjectedWalletAccounts$,
@@ -112,60 +247,6 @@ const getPolkadotAccounts$ = (polkadotWallets$, polkadotAccountTypes) => {
112
247
  });
113
248
  };
114
249
  //#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, config) => createInjectedWallets$(store, {
145
- sources$: createWalletIdsPoller$(),
146
- getWalletId: (walletId) => walletId,
147
- connect: (walletId) => {
148
- const { identifier } = parseWalletId(walletId);
149
- return connectInjectedExtension(identifier, config.appName || config.walletConnect?.metadata.name || window.location.hostname);
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
250
  //#region src/api/polkadot/plugin.ts
170
251
  const DEFAULT_ACCOUNT_TYPES = [
171
252
  "sr25519",
@@ -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 { KheopskitConfig } from \"../types\";\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$ = (\n\tstore: KheopskitStore,\n\tconfig: Pick<KheopskitConfig, \"appName\" | \"walletConnect\">,\n) =>\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(\n\t\t\t\t\tidentifier,\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\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) =>\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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"}
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\ntype InjectedWeb3Entry = NonNullable<\n\tNonNullable<InjectedWeb3Window[\"injectedWeb3\"]>[string]\n>;\n\n/**\n * The connect each extension is still answering. An extension keeps its\n * prompt open after kheopskit abandons the attempt, and a second `enable()`\n * meanwhile fails (polkadot-js: \"Pending authorisation request already\n * exists\") or resolves unauthorised (Talisman), so a new attempt joins this\n * one instead.\n */\nconst pendingConnects = new WeakMap<\n\tInjectedWeb3Entry,\n\tPromise<PolkadotInjected>\n>();\n\nconst enableExtension = async (\n\tidentifier: string,\n\tentry: InjectedWeb3Entry,\n\tappName: string,\n) => {\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 connectExtension = (\n\tidentifier: string,\n\tappName: string,\n): Promise<PolkadotInjected> => {\n\tconst entry = (globalThis as InjectedWeb3Window).injectedWeb3?.[identifier];\n\tif (!entry)\n\t\treturn Promise.reject(new Error(`Unavailable extension: \"${identifier}\"`));\n\tconst pending = pendingConnects.get(entry);\n\tif (pending) return pending;\n\tconst connecting = enableExtension(identifier, entry, appName);\n\tpendingConnects.set(entry, connecting);\n\tconst settle = () => pendingConnects.delete(entry);\n\tconnecting.then(settle, settle);\n\treturn connecting;\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 { C as WalletId, D as WalletAccountId, S as isWalletConnectWallet, _ as WalletConnectWallet, c as KheopskitPlatform, x as isInjectedWallet } from "./types-AxUDtkR-.mjs";
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-lkMXVJNG.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 SolanaInjectedWallet = {
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: () => Promise<void>;
60
- disconnect: () => Promise<void>;
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 SolanaAccount = {
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 { C as WalletId, D as WalletAccountId, S as isWalletConnectWallet, _ as WalletConnectWallet, c as KheopskitPlatform, x as isInjectedWallet } from "./types-AxUDtkR-.js";
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-lkMXVJNG.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 SolanaInjectedWallet = {
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: () => Promise<void>;
60
- disconnect: () => Promise<void>;
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 SolanaAccount = {
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-DKU-SNio.js");
3
- const require_errors = require("./errors-DYWVPHrR.js");
4
- const require_injectedWallets = require("./injectedWallets-BqR-_aAy.js");
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 require_errors.KheopskitError("UNSUPPORTED_CHAIN", `Solana chain "${chain}" cannot be used over WalletConnect (no CAIP-2 id).`);
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 require_errors.KheopskitError("FEATURE_NOT_SUPPORTED", `wallet "${wallet.name}" does not support ${name}`);
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 require_errors.KheopskitError("NO_SESSION", "No session found");
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: require_errors.getWalletAccountId(wallet.id, account.address),
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) => require_injectedWallets.getWalletConnectSessionAccounts$({
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 = require_injectedWallets.getSessionCaip10s(session, "solana");
231
- const addresses = require_injectedWallets.getCaip10Addresses(solanaCaip10s);
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: require_errors.getWalletAccountId(wallet.id, accountAddress),
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) => require_injectedWallets.createPlatformAccounts$({
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 require_errors.KheopskitError("FEATURE_NOT_SUPPORTED", `wallet ${walletId} does not support standard:connect`, { walletId });
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 = require_errors.isSolanaAddress;
333
+ exports.isSolanaAddress = require_platformAccounts.isSolanaAddress;
331
334
  exports.isSolanaChainId = isSolanaChainId;
332
335
  exports.isWalletConnectWallet = require_types.isWalletConnectWallet;
333
336
  exports.solana = solana;