@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.js CHANGED
@@ -21,34 +21,160 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- const require_types = require("./types-DKU-SNio.js");
25
- const require_errors = require("./errors-DYWVPHrR.js");
24
+ const require_types = require("./types-BWHvNFlN.js");
25
+ const require_platformAccounts = require("./platformAccounts-BjIeRcFN.js");
26
26
  const require_polkadotExtensions = require("./polkadotExtensions-y4J9UzYl.js");
27
- const require_injectedWallets = require("./injectedWallets-BqR-_aAy.js");
27
+ const require_pageLoad = require("./pageLoad-D1wLeuFG.js");
28
+ const require_injectedWallets = require("./injectedWallets-Dy8YGKL-.js");
29
+ let _scure_base = require("@scure/base");
28
30
  let rxjs = require("rxjs");
29
31
  let lodash_es = require("lodash-es");
30
32
  let polkadot_api_pjs_signer = require("polkadot-api/pjs-signer");
31
33
  polkadot_api_pjs_signer = __toESM(polkadot_api_pjs_signer);
34
+ //#region src/api/polkadot/wallets.ts
35
+ const isPolkadotInjected = (injected) => typeof injected?.accounts?.get === "function" && typeof injected.accounts.subscribe === "function" && typeof injected.signer?.signPayload === "function" && typeof injected.signer.signRaw === "function";
36
+ /**
37
+ * The list each extension last reported: read when its connect was granted,
38
+ * so the emission that first shows the wallet connected already lists it, and
39
+ * updated by every `subscribe` callback, so an accounts stream that restarts
40
+ * resumes from the current list rather than the connect-time one.
41
+ */
42
+ const latestAccounts = /* @__PURE__ */ new WeakMap();
43
+ /**
44
+ * The connect each extension is still answering. An extension keeps its
45
+ * prompt open after kheopskit abandons the attempt, and a second `enable()`
46
+ * meanwhile fails (polkadot-js: "Pending authorisation request already
47
+ * exists") or resolves unauthorised (Talisman), so a new attempt joins this
48
+ * one instead.
49
+ */
50
+ const pendingConnects = /* @__PURE__ */ new WeakMap();
51
+ const enableExtension = async (identifier, entry, appName) => {
52
+ const injected = await entry.enable(appName);
53
+ if (!isPolkadotInjected(injected)) throw new Error(`Unsupported extension: "${identifier}"`);
54
+ latestAccounts.set(injected, await injected.accounts.get());
55
+ return injected;
56
+ };
57
+ const connectExtension = (identifier, appName) => {
58
+ const entry = globalThis.injectedWeb3?.[identifier];
59
+ if (!entry) return Promise.reject(/* @__PURE__ */ new Error(`Unavailable extension: "${identifier}"`));
60
+ const pending = pendingConnects.get(entry);
61
+ if (pending) return pending;
62
+ const connecting = enableExtension(identifier, entry, appName);
63
+ pendingConnects.set(entry, connecting);
64
+ const settle = () => pendingConnects.delete(entry);
65
+ connecting.then(settle, settle);
66
+ return connecting;
67
+ };
68
+ const getInjectedWalletsIds = () => typeof window === "undefined" ? [] : (0, polkadot_api_pjs_signer.getInjectedExtensions)().map((name) => require_types.getWalletId("polkadot", name));
69
+ const createWalletIdsPoller$ = () => {
70
+ return new rxjs.Observable((subscriber) => {
71
+ subscriber.next(getInjectedWalletsIds());
72
+ const intervals = [
73
+ 100,
74
+ 200,
75
+ 300,
76
+ 500
77
+ ];
78
+ let index = 0;
79
+ let timer;
80
+ const poll = () => {
81
+ subscriber.next(getInjectedWalletsIds());
82
+ if (index < intervals.length) {
83
+ const delay = intervals[index++];
84
+ timer = setTimeout(poll, delay);
85
+ }
86
+ };
87
+ if (intervals.length > 0) timer = setTimeout(poll, intervals[index++] ?? 100);
88
+ let loadTimer;
89
+ const loadSub = require_pageLoad.pageLoaded$.pipe((0, rxjs.skip)(1)).subscribe(() => {
90
+ loadTimer = setTimeout(() => subscriber.next(getInjectedWalletsIds()), 100);
91
+ subscriber.next(getInjectedWalletsIds());
92
+ });
93
+ return () => {
94
+ if (timer !== void 0) clearTimeout(timer);
95
+ clearTimeout(loadTimer);
96
+ loadSub.unsubscribe();
97
+ };
98
+ }).pipe((0, rxjs.distinctUntilChanged)(lodash_es.isEqual), (0, rxjs.shareReplay)({
99
+ refCount: true,
100
+ bufferSize: 1
101
+ }));
102
+ };
103
+ const getPolkadotWallets$ = (store, config) => require_injectedWallets.createInjectedWallets$(store, {
104
+ sources$: createWalletIdsPoller$(),
105
+ getWalletId: (walletId) => walletId,
106
+ connect: (walletId) => connectExtension(require_types.parseWalletId(walletId).identifier, config.appName || config.walletConnect?.metadata.name || window.location.hostname),
107
+ isUserRejection: require_types.isRefusalMessage,
108
+ buildWallet: ({ walletId, handle, status, error, isConnected, connect, disconnect }) => {
109
+ const { identifier } = require_types.parseWalletId(walletId);
110
+ const extInfo = require_polkadotExtensions.POLKADOT_EXTENSIONS[identifier];
111
+ return {
112
+ id: walletId,
113
+ type: "injected",
114
+ platform: "polkadot",
115
+ name: extInfo?.name ?? identifier,
116
+ icon: extInfo?.icon ?? "",
117
+ sourceId: identifier,
118
+ extension: handle,
119
+ status,
120
+ error,
121
+ isConnected,
122
+ connect,
123
+ disconnect
124
+ };
125
+ }
126
+ });
127
+ //#endregion
32
128
  //#region src/api/polkadot/accounts.ts
129
+ const encodeRawData = (data, type) => typeof data === "string" ? {
130
+ data,
131
+ type: type ?? "payload"
132
+ } : {
133
+ data: `0x${_scure_base.hex.encode(data)}`,
134
+ type: type ?? "bytes"
135
+ };
136
+ /**
137
+ * pjs-signer's signature-type map knows ed25519, sr25519 and ecdsa only, so an
138
+ * `ethereum` type would get a 64-byte mock signature where ecdsa needs 65.
139
+ */
140
+ const toSignerType = (type) => type === "ethereum" ? "ecdsa" : type;
33
141
  const getInjectedWalletAccounts$ = (wallet) => {
34
- if (!wallet.isConnected) return (0, rxjs.of)([]);
142
+ const injected = wallet.extension;
143
+ if (!wallet.isConnected || !injected) return (0, rxjs.of)([]);
35
144
  return new rxjs.Observable((subscriber) => {
36
- const getAccount = (account) => ({
37
- id: require_errors.getWalletAccountId(wallet.id, account.address),
38
- ...account,
39
- type: account.type ?? "sr25519",
40
- platform: "polkadot",
41
- walletName: wallet.name,
42
- walletId: wallet.id
43
- });
44
- const extension = wallet.extension;
45
- const unsubscribe = extension.subscribe((accounts) => {
46
- subscriber.next(accounts.map(getAccount));
145
+ const signPayload = injected.signer.signPayload.bind(injected.signer);
146
+ const signRaw = injected.signer.signRaw.bind(injected.signer);
147
+ const { field, factory } = getPjsSignerField();
148
+ const toAccount = (account) => {
149
+ const { address } = account;
150
+ const type = account.type ?? "sr25519";
151
+ return {
152
+ ...account,
153
+ id: require_platformAccounts.getWalletAccountId(wallet.id, address),
154
+ type,
155
+ platform: "polkadot",
156
+ walletName: wallet.name,
157
+ walletId: wallet.id,
158
+ [field]: factory(address, signPayload, signRaw, toSignerType(type)),
159
+ signRaw: async (data, options) => (await signRaw({
160
+ address,
161
+ ...encodeRawData(data, options?.type)
162
+ })).signature
163
+ };
164
+ };
165
+ const toAccounts = (accounts) => accounts.flatMap((account) => {
166
+ try {
167
+ return [toAccount(account)];
168
+ } catch {
169
+ return [];
170
+ }
47
171
  });
48
- subscriber.next(extension.getAccounts().map(getAccount));
49
- return () => {
50
- return unsubscribe();
172
+ const emit = (accounts) => {
173
+ latestAccounts.set(injected, accounts);
174
+ subscriber.next(toAccounts(accounts));
51
175
  };
176
+ emit(latestAccounts.get(injected) ?? []);
177
+ return injected.accounts.subscribe(emit);
52
178
  });
53
179
  };
54
180
  /**
@@ -57,24 +183,41 @@ const getInjectedWalletAccounts$ = (wallet) => {
57
183
  * runtime so a single @kheopskit/core release supports both.
58
184
  */
59
185
  const getPjsSignerField = () => {
60
- const { getTxCreatorFromPjs, getPolkadotSignerFromPjs } = polkadot_api_pjs_signer;
61
- if (getTxCreatorFromPjs) return {
186
+ const module = polkadot_api_pjs_signer;
187
+ if (module.getTxCreatorFromPjs) return {
62
188
  field: "txCreator",
63
- factory: getTxCreatorFromPjs
189
+ factory: module.getTxCreatorFromPjs
64
190
  };
65
- if (getPolkadotSignerFromPjs) return {
191
+ if (module.getPolkadotSignerFromPjs) return {
66
192
  field: "polkadotSigner",
67
- factory: getPolkadotSignerFromPjs
193
+ factory: module.getPolkadotSignerFromPjs
68
194
  };
69
- throw new require_errors.KheopskitError("UNSUPPORTED_VERSION", "Unsupported polkadot-api/pjs-signer version");
195
+ throw new require_types.KheopskitError("UNSUPPORTED_VERSION", "Unsupported polkadot-api/pjs-signer version");
70
196
  };
71
- const getAppKitPolkadotSigner = (appKit, address) => {
197
+ const requestSignMessage = (appKit, provider, address, message) => {
198
+ if (!provider.session) throw new require_types.KheopskitError("NO_SESSION", "No session found");
199
+ const chainId = appKit.getCaipNetworks("polkadot")[0]?.caipNetworkId;
200
+ if (!chainId) throw new require_types.KheopskitError("NO_SESSION", "No CAIP network available for polkadot");
201
+ return provider.client.request({
202
+ topic: provider.session.topic,
203
+ chainId,
204
+ request: {
205
+ method: "polkadot_signMessage",
206
+ params: {
207
+ address,
208
+ message
209
+ }
210
+ }
211
+ });
212
+ };
213
+ const getAppKitPolkadotSigning = (appKit, address) => {
72
214
  const provider = appKit.getProvider("polkadot");
73
- if (!provider) throw new require_errors.KheopskitError("NO_PROVIDER", "No provider found");
74
- if (!provider.session) throw new require_errors.KheopskitError("NO_SESSION", "No session found");
215
+ if (!provider) throw new require_types.KheopskitError("NO_PROVIDER", "No provider found");
216
+ if (!provider.session) throw new require_types.KheopskitError("NO_SESSION", "No session found");
217
+ const signMessage = (message) => requestSignMessage(appKit, provider, address, message);
75
218
  const { field, factory } = getPjsSignerField();
76
219
  const signer = factory(address, (transactionPayload) => {
77
- if (!provider.session) throw new require_errors.KheopskitError("NO_SESSION", "No session found");
220
+ if (!provider.session) throw new require_types.KheopskitError("NO_SESSION", "No session found");
78
221
  return provider.client.request({
79
222
  topic: provider.session.topic,
80
223
  chainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,
@@ -86,25 +229,17 @@ const getAppKitPolkadotSigner = (appKit, address) => {
86
229
  }
87
230
  }
88
231
  });
89
- }, async ({ address, data }) => {
90
- if (!provider.session) throw new require_errors.KheopskitError("NO_SESSION", "No session found");
91
- const chainId = appKit.getCaipNetworks("polkadot")[0]?.caipNetworkId;
92
- if (!chainId) throw new require_errors.KheopskitError("NO_SESSION", "No CAIP network available for polkadot");
93
- return provider.client.request({
94
- topic: provider.session.topic,
95
- chainId,
96
- request: {
97
- method: "polkadot_signMessage",
98
- params: {
99
- address,
100
- message: data
101
- }
102
- }
103
- });
104
- });
105
- return { [field]: signer };
232
+ }, async ({ data }) => ({
233
+ id: 0,
234
+ signature: (await signMessage(data)).signature
235
+ }), "sr25519");
236
+ const signRaw = async (data) => (await signMessage(encodeRawData(data).data)).signature;
237
+ return {
238
+ [field]: signer,
239
+ signRaw
240
+ };
106
241
  };
107
- const getWalletConnectAccounts$ = (wallet) => require_injectedWallets.getWalletConnectSessionAccounts$({
242
+ const getWalletConnectAccounts$ = (wallet) => require_platformAccounts.getWalletConnectSessionAccounts$({
108
243
  wallet,
109
244
  platform: "polkadot",
110
245
  namespace: "polkadot",
@@ -112,13 +247,13 @@ const getWalletConnectAccounts$ = (wallet) => require_injectedWallets.getWalletC
112
247
  buildAccounts: (provider) => {
113
248
  const session = provider.session;
114
249
  if (!session) return [];
115
- return require_injectedWallets.getCaip10Addresses(require_injectedWallets.getSessionCaip10s(session, "polkadot")).map((address) => ({
116
- id: require_errors.getWalletAccountId(wallet.id, address),
250
+ return require_platformAccounts.getCaip10Addresses(require_platformAccounts.getSessionCaip10s(session, "polkadot")).map((address) => ({
251
+ id: require_platformAccounts.getWalletAccountId(wallet.id, address),
117
252
  platform: "polkadot",
118
253
  walletName: wallet.name,
119
254
  walletId: wallet.id,
120
255
  address,
121
- ...getAppKitPolkadotSigner(wallet.appKit, address),
256
+ ...getAppKitPolkadotSigning(wallet.appKit, address),
122
257
  genesisHash: null,
123
258
  name: `${wallet.name} Polkadot`,
124
259
  type: "sr25519"
@@ -126,8 +261,8 @@ const getWalletConnectAccounts$ = (wallet) => require_injectedWallets.getWalletC
126
261
  }
127
262
  });
128
263
  const getPolkadotAccounts$ = (polkadotWallets$, polkadotAccountTypes) => {
129
- if (polkadotAccountTypes.length === 0) console.warn("[kheopskit] config.polkadotAccountTypes is empty; all Polkadot accounts will be filtered out.");
130
- return require_injectedWallets.createPlatformAccounts$({
264
+ if (polkadotAccountTypes.length === 0) console.warn("[kheopskit] polkadot({ accountTypes }) is empty; all Polkadot accounts will be filtered out.");
265
+ return require_platformAccounts.createPlatformAccounts$({
131
266
  wallets$: polkadotWallets$,
132
267
  getInjectedAccounts$: getInjectedWalletAccounts$,
133
268
  getWalletConnectAccounts$,
@@ -135,60 +270,6 @@ const getPolkadotAccounts$ = (polkadotWallets$, polkadotAccountTypes) => {
135
270
  });
136
271
  };
137
272
  //#endregion
138
- //#region src/api/polkadot/wallets.ts
139
- const getInjectedWalletsIds = () => typeof window === "undefined" ? [] : (0, polkadot_api_pjs_signer.getInjectedExtensions)().map((name) => require_types.getWalletId("polkadot", name));
140
- const createWalletIdsPoller$ = () => {
141
- return new rxjs.Observable((subscriber) => {
142
- subscriber.next(getInjectedWalletsIds());
143
- const intervals = [
144
- 100,
145
- 200,
146
- 300,
147
- 500
148
- ];
149
- let index = 0;
150
- let timer;
151
- const poll = () => {
152
- subscriber.next(getInjectedWalletsIds());
153
- if (index < intervals.length) {
154
- const delay = intervals[index++];
155
- timer = setTimeout(poll, delay);
156
- }
157
- };
158
- if (intervals.length > 0) timer = setTimeout(poll, intervals[index++] ?? 100);
159
- return () => {
160
- if (timer !== void 0) clearTimeout(timer);
161
- };
162
- }).pipe((0, rxjs.distinctUntilChanged)(lodash_es.isEqual), (0, rxjs.shareReplay)({
163
- refCount: true,
164
- bufferSize: 1
165
- }));
166
- };
167
- const getPolkadotWallets$ = (store, config) => require_injectedWallets.createInjectedWallets$(store, {
168
- sources$: createWalletIdsPoller$(),
169
- getWalletId: (walletId) => walletId,
170
- connect: (walletId) => {
171
- const { identifier } = require_types.parseWalletId(walletId);
172
- return (0, polkadot_api_pjs_signer.connectInjectedExtension)(identifier, config.appName || config.walletConnect?.metadata.name || window.location.hostname);
173
- },
174
- buildWallet: ({ walletId, handle, isConnected, connect, disconnect }) => {
175
- const { identifier } = require_types.parseWalletId(walletId);
176
- const extInfo = require_polkadotExtensions.POLKADOT_EXTENSIONS[identifier];
177
- return {
178
- id: walletId,
179
- type: "injected",
180
- platform: "polkadot",
181
- name: extInfo?.name ?? identifier,
182
- icon: extInfo?.icon ?? "",
183
- sourceId: identifier,
184
- extension: handle,
185
- isConnected,
186
- connect,
187
- disconnect
188
- };
189
- }
190
- });
191
- //#endregion
192
273
  //#region src/api/polkadot/plugin.ts
193
274
  const DEFAULT_ACCOUNT_TYPES = [
194
275
  "sr25519",
@@ -223,7 +304,7 @@ const polkadot = (options = {}) => {
223
304
  };
224
305
  //#endregion
225
306
  exports.isInjectedWallet = require_types.isInjectedWallet;
226
- exports.isSs58Address = require_errors.isSs58Address;
307
+ exports.isSs58Address = require_platformAccounts.isSs58Address;
227
308
  exports.isWalletConnectWallet = require_types.isWalletConnectWallet;
228
309
  exports.polkadot = polkadot;
229
310
 
@@ -1 +1 @@
1
- {"version":3,"file":"polkadot.js","names":["of","Observable","getWalletAccountId","pjs","KheopskitError","getWalletConnectSessionAccounts$","getCaip10Addresses","getSessionCaip10s","createPlatformAccounts$","getInjectedExtensions","getWalletId","Observable","distinctUntilChanged","isEqual","shareReplay","createInjectedWallets$","parseWalletId","connectInjectedExtension","POLKADOT_EXTENSIONS"],"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.js","names":["getInjectedExtensions","getWalletId","Observable","pageLoaded$","skip","distinctUntilChanged","isEqual","shareReplay","createInjectedWallets$","parseWalletId","isRefusalMessage","POLKADOT_EXTENSIONS","hex","of","Observable","getWalletAccountId","pjs","KheopskitError","getWalletConnectSessionAccounts$","getCaip10Addresses","getSessionCaip10s","createPlatformAccounts$"],"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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"}