@kheopskit/core 5.0.1 → 5.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/errors-Caq2csKx.mjs +181 -0
- package/dist/errors-Caq2csKx.mjs.map +1 -0
- package/dist/errors-DPw6pc2H.js +222 -0
- package/dist/errors-DPw6pc2H.js.map +1 -0
- package/dist/ethereum.d.mts +39 -38
- package/dist/ethereum.d.ts +39 -38
- package/dist/ethereum.js +216 -343
- package/dist/ethereum.js.map +1 -1
- package/dist/ethereum.mjs +213 -344
- package/dist/ethereum.mjs.map +1 -1
- package/dist/{getCachedObservable-C4E8dfMp.d.ts → getCachedObservable-LUq9IfEx.d.mts} +5 -2
- package/dist/{getCachedObservable-C4E8dfMp.d.mts → getCachedObservable-LUq9IfEx.d.ts} +5 -2
- package/dist/iconCache-BSa42Sui.mjs +343 -0
- package/dist/iconCache-BSa42Sui.mjs.map +1 -0
- package/dist/iconCache-DS4zNiP1.js +396 -0
- package/dist/iconCache-DS4zNiP1.js.map +1 -0
- package/dist/index.d.mts +98 -36
- package/dist/index.d.ts +98 -36
- package/dist/index.js +897 -630
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +881 -631
- package/dist/index.mjs.map +1 -1
- package/dist/injectedWallets-B1MCxAE9.js +148 -0
- package/dist/injectedWallets-B1MCxAE9.js.map +1 -0
- package/dist/injectedWallets-B3Vysfvr.mjs +119 -0
- package/dist/injectedWallets-B3Vysfvr.mjs.map +1 -0
- package/dist/internal.d.mts +18 -53
- package/dist/internal.d.ts +18 -53
- package/dist/internal.js +9 -32
- package/dist/internal.mjs +3 -32
- package/dist/polkadot.d.mts +37 -36
- package/dist/polkadot.d.ts +37 -36
- package/dist/polkadot.js +179 -294
- package/dist/polkadot.js.map +1 -1
- package/dist/polkadot.mjs +176 -295
- package/dist/polkadot.mjs.map +1 -1
- package/dist/polkadotExtensions-BoVKhNU_.mjs +23 -0
- package/dist/polkadotExtensions-BoVKhNU_.mjs.map +1 -0
- package/dist/polkadotExtensions-y4J9UzYl.js +28 -0
- package/dist/polkadotExtensions-y4J9UzYl.js.map +1 -0
- package/dist/solana.d.mts +50 -48
- package/dist/solana.d.ts +50 -48
- package/dist/solana.js +323 -449
- package/dist/solana.js.map +1 -1
- package/dist/solana.mjs +316 -449
- package/dist/solana.mjs.map +1 -1
- package/dist/types-Cb-vuEru.d.mts +330 -0
- package/dist/types-Cb-vuEru.d.ts +330 -0
- package/dist/types-DKU-SNio.js +169 -0
- package/dist/types-DKU-SNio.js.map +1 -0
- package/dist/types-jnifAAA0.mjs +104 -0
- package/dist/types-jnifAAA0.mjs.map +1 -0
- package/package.json +12 -12
- package/dist/chunk-4ENHC7G4.js +0 -210
- package/dist/chunk-4ENHC7G4.js.map +0 -1
- package/dist/chunk-6XAZANB5.mjs +0 -450
- package/dist/chunk-6XAZANB5.mjs.map +0 -1
- package/dist/chunk-7QSGAJ4A.mjs +0 -210
- package/dist/chunk-7QSGAJ4A.mjs.map +0 -1
- package/dist/chunk-B4L6GAYD.js +0 -179
- package/dist/chunk-B4L6GAYD.js.map +0 -1
- package/dist/chunk-BWUUHUDK.mjs +0 -24
- package/dist/chunk-BWUUHUDK.mjs.map +0 -1
- package/dist/chunk-D3EQMFZ2.js +0 -24
- package/dist/chunk-D3EQMFZ2.js.map +0 -1
- package/dist/chunk-XQWJM3KC.js +0 -450
- package/dist/chunk-XQWJM3KC.js.map +0 -1
- package/dist/chunk-YDLCHYHH.mjs +0 -179
- package/dist/chunk-YDLCHYHH.mjs.map +0 -1
- package/dist/internal.js.map +0 -1
- package/dist/internal.mjs.map +0 -1
- package/dist/types-C7V7DGlg.d.mts +0 -349
- package/dist/types-C7V7DGlg.d.ts +0 -349
package/dist/solana.js
CHANGED
|
@@ -1,461 +1,335 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// src/api/solana/chains.ts
|
|
16
|
-
var DEFAULT_SOLANA_CHAIN = "solana:mainnet";
|
|
17
|
-
var SOLANA_CHAIN_IDS = [
|
|
18
|
-
"solana:mainnet",
|
|
19
|
-
"solana:devnet",
|
|
20
|
-
"solana:testnet",
|
|
21
|
-
"solana:localnet"
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_types = require("./types-DKU-SNio.js");
|
|
3
|
+
const require_errors = require("./errors-DPw6pc2H.js");
|
|
4
|
+
const require_injectedWallets = require("./injectedWallets-B1MCxAE9.js");
|
|
5
|
+
let rxjs = require("rxjs");
|
|
6
|
+
let _solana_kit = require("@solana/kit");
|
|
7
|
+
let _wallet_standard_app = require("@wallet-standard/app");
|
|
8
|
+
//#region src/api/solana/chains.ts
|
|
9
|
+
const DEFAULT_SOLANA_CHAIN = "solana:mainnet";
|
|
10
|
+
const SOLANA_CHAIN_IDS = [
|
|
11
|
+
"solana:mainnet",
|
|
12
|
+
"solana:devnet",
|
|
13
|
+
"solana:testnet",
|
|
14
|
+
"solana:localnet"
|
|
22
15
|
];
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
};
|
|
38
|
-
var DEPRECATED_CAIP2_TO_SOLANA_CHAIN = {
|
|
39
|
-
"solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ": "solana:mainnet",
|
|
40
|
-
"solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K": "solana:devnet"
|
|
16
|
+
const isSolanaChainId = (value) => typeof value === "string" && SOLANA_CHAIN_IDS.includes(value);
|
|
17
|
+
/**
|
|
18
|
+
* Maps Wallet Standard chain ids to the CAIP-2 chain ids used by WalletConnect.
|
|
19
|
+
*
|
|
20
|
+
* CAIP-2 ids use the first 32 characters of the cluster's genesis hash as the
|
|
21
|
+
* reference. The values below match `@reown/appkit/networks` (solana,
|
|
22
|
+
* solanaDevnet, solanaTestnet), which is what AppKit puts in session namespaces.
|
|
23
|
+
*
|
|
24
|
+
* `localnet` has no canonical CAIP-2 id and cannot be used over WalletConnect.
|
|
25
|
+
*/
|
|
26
|
+
const SOLANA_CHAIN_TO_CAIP2 = {
|
|
27
|
+
"solana:mainnet": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
28
|
+
"solana:devnet": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
|
|
29
|
+
"solana:testnet": "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"
|
|
41
30
|
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// src/api/solana/accounts.ts
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
var _rxjs = require('rxjs');
|
|
63
|
-
|
|
64
|
-
// src/api/solana/signer.ts
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
var _kit = require('@solana/kit');
|
|
74
|
-
var SOLANA_SIGN_MESSAGE = "solana:signMessage";
|
|
75
|
-
var SOLANA_SIGN_TRANSACTION = "solana:signTransaction";
|
|
76
|
-
var SOLANA_SIGN_AND_SEND_TRANSACTION = "solana:signAndSendTransaction";
|
|
77
|
-
var requireFeature = (wallet, name) => {
|
|
78
|
-
const feature = wallet.features[name];
|
|
79
|
-
if (!feature)
|
|
80
|
-
throw new (0, _chunkXQWJM3KCjs.KheopskitError)(
|
|
81
|
-
"FEATURE_NOT_SUPPORTED",
|
|
82
|
-
`wallet "${wallet.name}" does not support ${name}`
|
|
83
|
-
);
|
|
84
|
-
return feature;
|
|
31
|
+
/**
|
|
32
|
+
* Returns the CAIP-2 chain id for a Solana chain, for use in WalletConnect
|
|
33
|
+
* requests and when reading WalletConnect session namespaces.
|
|
34
|
+
*
|
|
35
|
+
* @throws if the chain has no canonical CAIP-2 id (e.g. localnet)
|
|
36
|
+
*/
|
|
37
|
+
const getSolanaCaip2 = (chain) => {
|
|
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).`);
|
|
40
|
+
return caip2;
|
|
85
41
|
};
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
...messages.map((m) => ({ account, message: m.content }))
|
|
97
|
-
);
|
|
98
|
-
return messages.map((m, i) => {
|
|
99
|
-
const output = outputs[i];
|
|
100
|
-
if (!output) throw new Error("[kheopskit] missing signMessage output");
|
|
101
|
-
return {
|
|
102
|
-
content: output.signedMessage,
|
|
103
|
-
signatures: {
|
|
104
|
-
...m.signatures,
|
|
105
|
-
[signerAddress]: output.signature
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
});
|
|
109
|
-
},
|
|
110
|
-
modifyAndSignTransactions: async (transactions) => {
|
|
111
|
-
const feature = requireFeature(
|
|
112
|
-
wallet,
|
|
113
|
-
SOLANA_SIGN_TRANSACTION
|
|
114
|
-
);
|
|
115
|
-
const encoder = _kit.getTransactionEncoder.call(void 0, );
|
|
116
|
-
const decoder = _kit.getTransactionDecoder.call(void 0, );
|
|
117
|
-
const outputs = await feature.signTransaction(
|
|
118
|
-
...transactions.map((tx) => ({
|
|
119
|
-
account,
|
|
120
|
-
transaction: new Uint8Array(encoder.encode(tx)),
|
|
121
|
-
chain
|
|
122
|
-
}))
|
|
123
|
-
);
|
|
124
|
-
return transactions.map((_tx, i) => {
|
|
125
|
-
const output = outputs[i];
|
|
126
|
-
if (!output)
|
|
127
|
-
throw new Error("[kheopskit] missing signTransaction output");
|
|
128
|
-
return decoder.decode(output.signedTransaction);
|
|
129
|
-
});
|
|
130
|
-
},
|
|
131
|
-
signAndSendTransactions: async (transactions) => {
|
|
132
|
-
const feature = requireFeature(
|
|
133
|
-
wallet,
|
|
134
|
-
SOLANA_SIGN_AND_SEND_TRANSACTION
|
|
135
|
-
);
|
|
136
|
-
const encoder = _kit.getTransactionEncoder.call(void 0, );
|
|
137
|
-
const outputs = await feature.signAndSendTransaction(
|
|
138
|
-
...transactions.map((tx) => ({
|
|
139
|
-
account,
|
|
140
|
-
transaction: new Uint8Array(encoder.encode(tx)),
|
|
141
|
-
chain
|
|
142
|
-
}))
|
|
143
|
-
);
|
|
144
|
-
return outputs.map((output) => output.signature);
|
|
145
|
-
}
|
|
146
|
-
};
|
|
42
|
+
/**
|
|
43
|
+
* AppKit's *deprecated* CAIP-2 cluster ids (its `deprecatedCaipNetworkId`
|
|
44
|
+
* values). Some wallets still place accounts in the WC session under these, so
|
|
45
|
+
* map them back to a {@link SolanaChainId} instead of silently falling back to
|
|
46
|
+
* the configured chain. Requests always use the current ids from
|
|
47
|
+
* {@link SOLANA_CHAIN_TO_CAIP2}; testnet has no deprecated id.
|
|
48
|
+
*/
|
|
49
|
+
const DEPRECATED_CAIP2_TO_SOLANA_CHAIN = {
|
|
50
|
+
"solana:4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ": "solana:mainnet",
|
|
51
|
+
"solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K": "solana:devnet"
|
|
147
52
|
};
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (!provider.session)
|
|
152
|
-
throw new (0, _chunkXQWJM3KCjs.KheopskitError)("NO_SESSION", "No session found");
|
|
153
|
-
return provider.client.request({
|
|
154
|
-
topic: provider.session.topic,
|
|
155
|
-
chainId: getSolanaCaip2(chain),
|
|
156
|
-
request: { method, params }
|
|
157
|
-
});
|
|
158
|
-
};
|
|
159
|
-
return {
|
|
160
|
-
address: signerAddress,
|
|
161
|
-
modifyAndSignMessages: async (messages) => {
|
|
162
|
-
const toBase58 = _kit.getBase58Decoder.call(void 0, );
|
|
163
|
-
const fromBase58 = _kit.getBase58Encoder.call(void 0, );
|
|
164
|
-
return Promise.all(
|
|
165
|
-
messages.map(async (m) => {
|
|
166
|
-
const { signature } = await request(
|
|
167
|
-
"solana_signMessage",
|
|
168
|
-
{ pubkey: accountAddress, message: toBase58.decode(m.content) }
|
|
169
|
-
);
|
|
170
|
-
return {
|
|
171
|
-
content: m.content,
|
|
172
|
-
signatures: {
|
|
173
|
-
...m.signatures,
|
|
174
|
-
[signerAddress]: fromBase58.encode(signature)
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
})
|
|
178
|
-
);
|
|
179
|
-
},
|
|
180
|
-
modifyAndSignTransactions: async (transactions) => {
|
|
181
|
-
const encoder = _kit.getTransactionEncoder.call(void 0, );
|
|
182
|
-
const decoder = _kit.getTransactionDecoder.call(void 0, );
|
|
183
|
-
const toBase64 = _kit.getBase64Decoder.call(void 0, );
|
|
184
|
-
const fromBase64 = _kit.getBase64Encoder.call(void 0, );
|
|
185
|
-
const fromBase58 = _kit.getBase58Encoder.call(void 0, );
|
|
186
|
-
const signed = await Promise.all(
|
|
187
|
-
transactions.map(async (tx) => {
|
|
188
|
-
const result = await request("solana_signTransaction", {
|
|
189
|
-
transaction: toBase64.decode(encoder.encode(tx))
|
|
190
|
-
});
|
|
191
|
-
if (result.transaction)
|
|
192
|
-
return decoder.decode(fromBase64.encode(result.transaction));
|
|
193
|
-
if (result.signature)
|
|
194
|
-
return {
|
|
195
|
-
...tx,
|
|
196
|
-
signatures: {
|
|
197
|
-
...tx.signatures,
|
|
198
|
-
[signerAddress]: fromBase58.encode(
|
|
199
|
-
result.signature
|
|
200
|
-
)
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
throw new Error(
|
|
204
|
-
"[kheopskit] solana_signTransaction returned no transaction or signature"
|
|
205
|
-
);
|
|
206
|
-
})
|
|
207
|
-
);
|
|
208
|
-
return signed;
|
|
209
|
-
},
|
|
210
|
-
signAndSendTransactions: async (transactions) => {
|
|
211
|
-
const encoder = _kit.getTransactionEncoder.call(void 0, );
|
|
212
|
-
const toBase64 = _kit.getBase64Decoder.call(void 0, );
|
|
213
|
-
const fromBase58 = _kit.getBase58Encoder.call(void 0, );
|
|
214
|
-
return Promise.all(
|
|
215
|
-
transactions.map(async (tx) => {
|
|
216
|
-
const { signature } = await request(
|
|
217
|
-
"solana_signAndSendTransaction",
|
|
218
|
-
{ transaction: toBase64.decode(encoder.encode(tx)) }
|
|
219
|
-
);
|
|
220
|
-
return fromBase58.encode(signature);
|
|
221
|
-
})
|
|
222
|
-
);
|
|
223
|
-
}
|
|
224
|
-
};
|
|
53
|
+
const CAIP2_TO_SOLANA_CHAIN = {
|
|
54
|
+
...Object.fromEntries(Object.entries(SOLANA_CHAIN_TO_CAIP2).map(([chain, caip2]) => [caip2, chain])),
|
|
55
|
+
...DEPRECATED_CAIP2_TO_SOLANA_CHAIN
|
|
225
56
|
};
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
signer: createInjectedSolanaSigner(standardWallet, account, chain),
|
|
241
|
-
getSigner: (c) => createInjectedSolanaSigner(standardWallet, account, c),
|
|
242
|
-
walletName: wallet.name,
|
|
243
|
-
walletId: wallet.id
|
|
244
|
-
})
|
|
245
|
-
);
|
|
246
|
-
subscriber.next(buildAccounts());
|
|
247
|
-
const eventsFeature = standardWallet.features["standard:events"];
|
|
248
|
-
const off = _optionalChain([eventsFeature, 'optionalAccess', _ => _.on, 'call', _2 => _2(
|
|
249
|
-
"change",
|
|
250
|
-
() => subscriber.next(buildAccounts())
|
|
251
|
-
)]);
|
|
252
|
-
return () => {
|
|
253
|
-
_optionalChain([off, 'optionalCall', _3 => _3()]);
|
|
254
|
-
};
|
|
255
|
-
}).pipe(_rxjs.shareReplay.call(void 0, { refCount: true, bufferSize: 1 }))
|
|
256
|
-
);
|
|
57
|
+
/**
|
|
58
|
+
* Maps a CAIP-2 chain id (as found in WalletConnect session namespaces) back to
|
|
59
|
+
* its {@link SolanaChainId}, or `undefined` if it isn't a recognised cluster.
|
|
60
|
+
*/
|
|
61
|
+
const getSolanaChainIdFromCaip2 = (caip2) => CAIP2_TO_SOLANA_CHAIN[caip2];
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/api/solana/signer.ts
|
|
64
|
+
const SOLANA_SIGN_MESSAGE = "solana:signMessage";
|
|
65
|
+
const SOLANA_SIGN_TRANSACTION = "solana:signTransaction";
|
|
66
|
+
const SOLANA_SIGN_AND_SEND_TRANSACTION = "solana:signAndSendTransaction";
|
|
67
|
+
const requireFeature = (wallet, name) => {
|
|
68
|
+
const feature = wallet.features[name];
|
|
69
|
+
if (!feature) throw new require_errors.KheopskitError("FEATURE_NOT_SUPPORTED", `wallet "${wallet.name}" does not support ${name}`);
|
|
70
|
+
return feature;
|
|
257
71
|
};
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Builds a {@link SolanaSigner} backed by a Wallet Standard wallet's
|
|
74
|
+
* `solana:*` features (injected wallets).
|
|
75
|
+
*
|
|
76
|
+
* Transactions are exchanged as wire bytes; messages and signatures as raw
|
|
77
|
+
* bytes. Calling a method whose feature the wallet does not advertise throws.
|
|
78
|
+
*/
|
|
79
|
+
const createInjectedSolanaSigner = (wallet, account, chain) => {
|
|
80
|
+
const signerAddress = (0, _solana_kit.address)(account.address);
|
|
81
|
+
return {
|
|
82
|
+
address: signerAddress,
|
|
83
|
+
modifyAndSignMessages: async (messages) => {
|
|
84
|
+
const outputs = await requireFeature(wallet, SOLANA_SIGN_MESSAGE).signMessage(...messages.map((m) => ({
|
|
85
|
+
account,
|
|
86
|
+
message: m.content
|
|
87
|
+
})));
|
|
88
|
+
return messages.map((m, i) => {
|
|
89
|
+
const output = outputs[i];
|
|
90
|
+
if (!output) throw new Error("[kheopskit] missing signMessage output");
|
|
91
|
+
return {
|
|
92
|
+
content: output.signedMessage,
|
|
93
|
+
signatures: {
|
|
94
|
+
...m.signatures,
|
|
95
|
+
[signerAddress]: output.signature
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
modifyAndSignTransactions: async (transactions) => {
|
|
101
|
+
const feature = requireFeature(wallet, SOLANA_SIGN_TRANSACTION);
|
|
102
|
+
const encoder = (0, _solana_kit.getTransactionEncoder)();
|
|
103
|
+
const decoder = (0, _solana_kit.getTransactionDecoder)();
|
|
104
|
+
const outputs = await feature.signTransaction(...transactions.map((tx) => ({
|
|
105
|
+
account,
|
|
106
|
+
transaction: new Uint8Array(encoder.encode(tx)),
|
|
107
|
+
chain
|
|
108
|
+
})));
|
|
109
|
+
return transactions.map((_tx, i) => {
|
|
110
|
+
const output = outputs[i];
|
|
111
|
+
if (!output) throw new Error("[kheopskit] missing signTransaction output");
|
|
112
|
+
return decoder.decode(output.signedTransaction);
|
|
113
|
+
});
|
|
114
|
+
},
|
|
115
|
+
signAndSendTransactions: async (transactions) => {
|
|
116
|
+
const feature = requireFeature(wallet, SOLANA_SIGN_AND_SEND_TRANSACTION);
|
|
117
|
+
const encoder = (0, _solana_kit.getTransactionEncoder)();
|
|
118
|
+
return (await feature.signAndSendTransaction(...transactions.map((tx) => ({
|
|
119
|
+
account,
|
|
120
|
+
transaction: new Uint8Array(encoder.encode(tx)),
|
|
121
|
+
chain
|
|
122
|
+
})))).map((output) => output.signature);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
306
125
|
};
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Builds a {@link SolanaSigner} backed by a WalletConnect session, adapting the
|
|
128
|
+
* `solana_*` RPC methods to the same interface as the injected signer.
|
|
129
|
+
*
|
|
130
|
+
* The CAIP-2 chain id is derived from {@link SolanaChainId}; transactions are
|
|
131
|
+
* base64-encoded and messages/signatures base58-encoded, per the WalletConnect
|
|
132
|
+
* Solana spec.
|
|
133
|
+
*/
|
|
134
|
+
const createWalletConnectSolanaSigner = (provider, accountAddress, chain) => {
|
|
135
|
+
const signerAddress = (0, _solana_kit.address)(accountAddress);
|
|
136
|
+
const request = (method, params) => {
|
|
137
|
+
if (!provider.session) throw new require_errors.KheopskitError("NO_SESSION", "No session found");
|
|
138
|
+
return provider.client.request({
|
|
139
|
+
topic: provider.session.topic,
|
|
140
|
+
chainId: getSolanaCaip2(chain),
|
|
141
|
+
request: {
|
|
142
|
+
method,
|
|
143
|
+
params
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
return {
|
|
148
|
+
address: signerAddress,
|
|
149
|
+
modifyAndSignMessages: async (messages) => {
|
|
150
|
+
const toBase58 = (0, _solana_kit.getBase58Decoder)();
|
|
151
|
+
const fromBase58 = (0, _solana_kit.getBase58Encoder)();
|
|
152
|
+
return Promise.all(messages.map(async (m) => {
|
|
153
|
+
const { signature } = await request("solana_signMessage", {
|
|
154
|
+
pubkey: accountAddress,
|
|
155
|
+
message: toBase58.decode(m.content)
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
content: m.content,
|
|
159
|
+
signatures: {
|
|
160
|
+
...m.signatures,
|
|
161
|
+
[signerAddress]: fromBase58.encode(signature)
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}));
|
|
165
|
+
},
|
|
166
|
+
modifyAndSignTransactions: async (transactions) => {
|
|
167
|
+
const encoder = (0, _solana_kit.getTransactionEncoder)();
|
|
168
|
+
const decoder = (0, _solana_kit.getTransactionDecoder)();
|
|
169
|
+
const toBase64 = (0, _solana_kit.getBase64Decoder)();
|
|
170
|
+
const fromBase64 = (0, _solana_kit.getBase64Encoder)();
|
|
171
|
+
const fromBase58 = (0, _solana_kit.getBase58Encoder)();
|
|
172
|
+
return await Promise.all(transactions.map(async (tx) => {
|
|
173
|
+
const result = await request("solana_signTransaction", { transaction: toBase64.decode(encoder.encode(tx)) });
|
|
174
|
+
if (result.transaction) return decoder.decode(fromBase64.encode(result.transaction));
|
|
175
|
+
if (result.signature) return {
|
|
176
|
+
...tx,
|
|
177
|
+
signatures: {
|
|
178
|
+
...tx.signatures,
|
|
179
|
+
[signerAddress]: fromBase58.encode(result.signature)
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
throw new Error("[kheopskit] solana_signTransaction returned no transaction or signature");
|
|
183
|
+
}));
|
|
184
|
+
},
|
|
185
|
+
signAndSendTransactions: async (transactions) => {
|
|
186
|
+
const encoder = (0, _solana_kit.getTransactionEncoder)();
|
|
187
|
+
const toBase64 = (0, _solana_kit.getBase64Decoder)();
|
|
188
|
+
const fromBase58 = (0, _solana_kit.getBase58Encoder)();
|
|
189
|
+
return Promise.all(transactions.map(async (tx) => {
|
|
190
|
+
const { signature } = await request("solana_signAndSendTransaction", { transaction: toBase64.decode(encoder.encode(tx)) });
|
|
191
|
+
return fromBase58.encode(signature);
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
};
|
|
331
195
|
};
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
);
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
const { get, on } = _app.getWallets.call(void 0, );
|
|
358
|
-
const emit = () => subscriber.next(get().filter(isSolanaWallet));
|
|
359
|
-
emit();
|
|
360
|
-
const offRegister = on("register", emit);
|
|
361
|
-
const offUnregister = on("unregister", emit);
|
|
362
|
-
return () => {
|
|
363
|
-
offRegister();
|
|
364
|
-
offUnregister();
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
).pipe(_rxjs.shareReplay.call(void 0, { refCount: true, bufferSize: 1 }));
|
|
368
|
-
var createSolanaInjectedWallets$ = (store2) => new (0, _rxjs.Observable)((subscriber) => {
|
|
369
|
-
const enabledWalletIds$ = new (0, _rxjs.BehaviorSubject)(/* @__PURE__ */ new Set());
|
|
370
|
-
const connect = async (wallet, walletId) => {
|
|
371
|
-
if (enabledWalletIds$.value.has(walletId))
|
|
372
|
-
throw new (0, _chunkXQWJM3KCjs.KheopskitError)(
|
|
373
|
-
"WALLET_ALREADY_CONNECTED",
|
|
374
|
-
`wallet ${walletId} is already connected`,
|
|
375
|
-
{ walletId }
|
|
376
|
-
);
|
|
377
|
-
const feature = wallet.features["standard:connect"];
|
|
378
|
-
if (!feature)
|
|
379
|
-
throw new (0, _chunkXQWJM3KCjs.KheopskitError)(
|
|
380
|
-
"FEATURE_NOT_SUPPORTED",
|
|
381
|
-
`wallet ${walletId} does not support standard:connect`,
|
|
382
|
-
{ walletId }
|
|
383
|
-
);
|
|
384
|
-
await feature.connect();
|
|
385
|
-
const newSet = new Set(enabledWalletIds$.value);
|
|
386
|
-
newSet.add(walletId);
|
|
387
|
-
enabledWalletIds$.next(newSet);
|
|
388
|
-
store2.addEnabledWalletId(walletId);
|
|
389
|
-
};
|
|
390
|
-
const disconnect = async (wallet, walletId) => {
|
|
391
|
-
if (!enabledWalletIds$.value.has(walletId))
|
|
392
|
-
throw new (0, _chunkXQWJM3KCjs.KheopskitError)(
|
|
393
|
-
"WALLET_NOT_CONNECTED",
|
|
394
|
-
`wallet ${walletId} is not connected`,
|
|
395
|
-
{ walletId }
|
|
396
|
-
);
|
|
397
|
-
const feature = wallet.features["standard:disconnect"];
|
|
398
|
-
await _optionalChain([feature, 'optionalAccess', _5 => _5.disconnect, 'call', _6 => _6()]);
|
|
399
|
-
const newSet = new Set(enabledWalletIds$.value);
|
|
400
|
-
newSet.delete(walletId);
|
|
401
|
-
enabledWalletIds$.next(newSet);
|
|
402
|
-
store2.removeEnabledWalletId(walletId);
|
|
403
|
-
_chunk4ENHC7G4js.clearCachedObservablesByPrefix.call(void 0, `accounts:${walletId}:`);
|
|
404
|
-
};
|
|
405
|
-
const sub = _rxjs.combineLatest.call(void 0, [walletStandardWallets$, enabledWalletIds$]).pipe(
|
|
406
|
-
_rxjs.map.call(void 0,
|
|
407
|
-
([wallets, enabledWalletIds]) => wallets.map((wallet) => {
|
|
408
|
-
const walletId = _chunk4ENHC7G4js.getWalletId.call(void 0, "solana", wallet.name);
|
|
409
|
-
return {
|
|
410
|
-
platform: "solana",
|
|
411
|
-
type: "injected",
|
|
412
|
-
id: walletId,
|
|
413
|
-
sourceId: wallet.name,
|
|
414
|
-
wallet,
|
|
415
|
-
chains: getSolanaChains(wallet),
|
|
416
|
-
name: wallet.name,
|
|
417
|
-
icon: wallet.icon,
|
|
418
|
-
isConnected: enabledWalletIds.has(walletId),
|
|
419
|
-
connect: () => connect(wallet, walletId),
|
|
420
|
-
disconnect: () => disconnect(wallet, walletId)
|
|
421
|
-
};
|
|
422
|
-
})
|
|
423
|
-
),
|
|
424
|
-
_rxjs.distinctUntilChanged.call(void 0, walletsEqual)
|
|
425
|
-
).subscribe(subscriber);
|
|
426
|
-
return () => {
|
|
427
|
-
sub.unsubscribe();
|
|
428
|
-
};
|
|
429
|
-
}).pipe(_rxjs.shareReplay.call(void 0, { refCount: true, bufferSize: 1 }));
|
|
430
|
-
var getSolanaWallets$ = (store2 = _chunkXQWJM3KCjs.store) => createSolanaInjectedWallets$(store2);
|
|
431
|
-
var walletsEqual = (a, b) => {
|
|
432
|
-
if (a.length !== b.length) return false;
|
|
433
|
-
return a.every(
|
|
434
|
-
(w, i) => w.id === _optionalChain([b, 'access', _7 => _7[i], 'optionalAccess', _8 => _8.id]) && w.isConnected === _optionalChain([b, 'access', _9 => _9[i], 'optionalAccess', _10 => _10.isConnected]) && w.name === _optionalChain([b, 'access', _11 => _11[i], 'optionalAccess', _12 => _12.name])
|
|
435
|
-
);
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/api/solana/accounts.ts
|
|
198
|
+
const getInjectedWalletAccounts$ = (wallet, chain) => {
|
|
199
|
+
if (!wallet.isConnected) return (0, rxjs.of)([]);
|
|
200
|
+
return require_types.getCachedObservable$(`accounts:${wallet.id}:${chain}`, () => new rxjs.Observable((subscriber) => {
|
|
201
|
+
const standardWallet = wallet.wallet;
|
|
202
|
+
const buildAccounts = () => standardWallet.accounts.map((account) => ({
|
|
203
|
+
id: require_errors.getWalletAccountId(wallet.id, account.address),
|
|
204
|
+
platform: "solana",
|
|
205
|
+
address: account.address,
|
|
206
|
+
chains: wallet.chains,
|
|
207
|
+
signer: createInjectedSolanaSigner(standardWallet, account, chain),
|
|
208
|
+
getSigner: (c) => createInjectedSolanaSigner(standardWallet, account, c),
|
|
209
|
+
walletName: wallet.name,
|
|
210
|
+
walletId: wallet.id
|
|
211
|
+
}));
|
|
212
|
+
subscriber.next(buildAccounts());
|
|
213
|
+
const off = standardWallet.features["standard:events"]?.on("change", () => subscriber.next(buildAccounts()));
|
|
214
|
+
return () => {
|
|
215
|
+
off?.();
|
|
216
|
+
};
|
|
217
|
+
}).pipe((0, rxjs.shareReplay)({
|
|
218
|
+
refCount: true,
|
|
219
|
+
bufferSize: 1
|
|
220
|
+
})));
|
|
436
221
|
};
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
222
|
+
const getWalletConnectAccounts$ = (wallet, chain) => require_injectedWallets.getWalletConnectSessionAccounts$({
|
|
223
|
+
wallet,
|
|
224
|
+
platform: "solana",
|
|
225
|
+
namespace: "solana",
|
|
226
|
+
cacheKey: `accounts:${wallet.id}:solana:${chain}`,
|
|
227
|
+
buildAccounts: (provider) => {
|
|
228
|
+
const session = provider.session;
|
|
229
|
+
if (!session) return [];
|
|
230
|
+
const solanaCaip10s = require_injectedWallets.getSessionCaip10s(session, "solana");
|
|
231
|
+
const addresses = require_injectedWallets.getCaip10Addresses(solanaCaip10s);
|
|
232
|
+
const advertisedChains = [...new Set(solanaCaip10s.map((account) => account.split(":").slice(0, 2).join(":")).map(getSolanaChainIdFromCaip2).filter((c) => !!c))];
|
|
233
|
+
const chains = advertisedChains.length ? advertisedChains : [chain];
|
|
234
|
+
return addresses.map((accountAddress) => ({
|
|
235
|
+
id: require_errors.getWalletAccountId(wallet.id, accountAddress),
|
|
236
|
+
platform: "solana",
|
|
237
|
+
address: accountAddress,
|
|
238
|
+
chains,
|
|
239
|
+
signer: createWalletConnectSolanaSigner(provider, accountAddress, chain),
|
|
240
|
+
getSigner: (c) => createWalletConnectSolanaSigner(provider, accountAddress, c),
|
|
241
|
+
walletName: wallet.name,
|
|
242
|
+
walletId: wallet.id
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
const getSolanaAccounts$ = (solanaWallets$, solanaChain) => require_injectedWallets.createPlatformAccounts$({
|
|
247
|
+
wallets$: solanaWallets$,
|
|
248
|
+
getInjectedAccounts$: (wallet) => getInjectedWalletAccounts$(wallet, solanaChain),
|
|
249
|
+
getWalletConnectAccounts$: (wallet) => getWalletConnectAccounts$(wallet, solanaChain),
|
|
250
|
+
accountChangeKey: (account) => `${account.id}|${account.chains.join(",")}`
|
|
251
|
+
});
|
|
252
|
+
//#endregion
|
|
253
|
+
//#region src/api/solana/wallets.ts
|
|
254
|
+
const SOLANA_NAMESPACE_PREFIX = "solana:";
|
|
255
|
+
/** A Wallet Standard wallet is Solana-capable if it advertises a solana chain or feature. */
|
|
256
|
+
const isSolanaWallet = (wallet) => wallet.chains.some((chain) => chain.startsWith(SOLANA_NAMESPACE_PREFIX)) || Object.keys(wallet.features).some((feature) => feature.startsWith(SOLANA_NAMESPACE_PREFIX));
|
|
257
|
+
const getSolanaChains = (wallet) => wallet.chains.filter((chain) => isSolanaChainId(chain));
|
|
258
|
+
/**
|
|
259
|
+
* Observable of Solana-capable Wallet Standard wallets, updated as wallets
|
|
260
|
+
* register/unregister. Returns an empty array during SSR.
|
|
261
|
+
*/
|
|
262
|
+
const walletStandardWallets$ = new rxjs.Observable((subscriber) => {
|
|
263
|
+
if (typeof window === "undefined") {
|
|
264
|
+
subscriber.next([]);
|
|
265
|
+
return () => {};
|
|
266
|
+
}
|
|
267
|
+
const { get, on } = (0, _wallet_standard_app.getWallets)();
|
|
268
|
+
const emit = () => subscriber.next(get().filter(isSolanaWallet));
|
|
269
|
+
emit();
|
|
270
|
+
const offRegister = on("register", emit);
|
|
271
|
+
const offUnregister = on("unregister", emit);
|
|
272
|
+
return () => {
|
|
273
|
+
offRegister();
|
|
274
|
+
offUnregister();
|
|
275
|
+
};
|
|
276
|
+
}).pipe((0, rxjs.shareReplay)({
|
|
277
|
+
refCount: true,
|
|
278
|
+
bufferSize: 1
|
|
279
|
+
}));
|
|
280
|
+
const getSolanaWallets$ = (store) => require_injectedWallets.createInjectedWallets$(store, {
|
|
281
|
+
sources$: walletStandardWallets$,
|
|
282
|
+
getWalletId: (wallet) => require_types.getWalletId("solana", wallet.name),
|
|
283
|
+
connect: async (wallet, walletId) => {
|
|
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 });
|
|
286
|
+
await feature.connect();
|
|
287
|
+
},
|
|
288
|
+
disconnect: async (wallet) => {
|
|
289
|
+
await wallet.features["standard:disconnect"]?.disconnect();
|
|
290
|
+
},
|
|
291
|
+
onDisconnected: (walletId) => require_types.clearCachedObservablesByPrefix(`accounts:${walletId}:`),
|
|
292
|
+
buildWallet: ({ source: wallet, walletId, isConnected, connect, disconnect }) => ({
|
|
293
|
+
platform: "solana",
|
|
294
|
+
type: "injected",
|
|
295
|
+
id: walletId,
|
|
296
|
+
sourceId: wallet.name,
|
|
297
|
+
wallet,
|
|
298
|
+
chains: getSolanaChains(wallet),
|
|
299
|
+
name: wallet.name,
|
|
300
|
+
icon: wallet.icon,
|
|
301
|
+
isConnected,
|
|
302
|
+
connect,
|
|
303
|
+
disconnect
|
|
304
|
+
})
|
|
305
|
+
});
|
|
306
|
+
//#endregion
|
|
307
|
+
//#region src/api/solana/plugin.ts
|
|
308
|
+
/**
|
|
309
|
+
* Solana platform plugin. Pass to `getKheopskit$({ platforms: [solana()] })`.
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* ```ts
|
|
313
|
+
* import { solana } from "@kheopskit/core/solana";
|
|
314
|
+
* solana({ chain: "solana:mainnet" });
|
|
315
|
+
* ```
|
|
316
|
+
*/
|
|
317
|
+
const solana = (options = {}) => {
|
|
318
|
+
const chain = options.chain ?? "solana:mainnet";
|
|
319
|
+
if (!isSolanaChainId(chain)) console.warn(`[kheopskit] Unknown solana chain: ${JSON.stringify(chain)}. Valid values: "solana:mainnet", "solana:devnet", "solana:testnet", "solana:localnet".`);
|
|
320
|
+
return {
|
|
321
|
+
platform: "solana",
|
|
322
|
+
getWallets$: (ctx) => getSolanaWallets$(ctx.store),
|
|
323
|
+
getAccounts$: (wallets$) => getSolanaAccounts$(wallets$, chain)
|
|
324
|
+
};
|
|
451
325
|
};
|
|
326
|
+
//#endregion
|
|
327
|
+
exports.DEFAULT_SOLANA_CHAIN = DEFAULT_SOLANA_CHAIN;
|
|
328
|
+
exports.getSolanaCaip2 = getSolanaCaip2;
|
|
329
|
+
exports.isInjectedWallet = require_types.isInjectedWallet;
|
|
330
|
+
exports.isSolanaAddress = require_errors.isSolanaAddress;
|
|
331
|
+
exports.isSolanaChainId = isSolanaChainId;
|
|
332
|
+
exports.isWalletConnectWallet = require_types.isWalletConnectWallet;
|
|
333
|
+
exports.solana = solana;
|
|
452
334
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
exports.DEFAULT_SOLANA_CHAIN = DEFAULT_SOLANA_CHAIN; exports.getSolanaCaip2 = getSolanaCaip2; exports.isInjectedWallet = _chunk4ENHC7G4js.isInjectedWallet; exports.isSolanaAddress = _chunkXQWJM3KCjs.isSolanaAddress; exports.isSolanaChainId = isSolanaChainId; exports.isWalletConnectWallet = _chunk4ENHC7G4js.isWalletConnectWallet; exports.solana = solana;
|
|
461
335
|
//# sourceMappingURL=solana.js.map
|