@kaleidorg/wallet-engine 1.0.0-beta.4

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 (126) hide show
  1. package/README.md +236 -0
  2. package/dist/adapters/ArkadeAdapter.d.ts +48 -0
  3. package/dist/adapters/ArkadeAdapter.d.ts.map +1 -0
  4. package/dist/adapters/ArkadeAdapter.js +314 -0
  5. package/dist/adapters/ArkadeAdapter.js.map +1 -0
  6. package/dist/adapters/IProtocolAdapter.d.ts +75 -0
  7. package/dist/adapters/IProtocolAdapter.d.ts.map +1 -0
  8. package/dist/adapters/IProtocolAdapter.js +29 -0
  9. package/dist/adapters/IProtocolAdapter.js.map +1 -0
  10. package/dist/adapters/RgbAdapter.d.ts +70 -0
  11. package/dist/adapters/RgbAdapter.d.ts.map +1 -0
  12. package/dist/adapters/RgbAdapter.js +818 -0
  13. package/dist/adapters/RgbAdapter.js.map +1 -0
  14. package/dist/adapters/SparkAdapter.d.ts +47 -0
  15. package/dist/adapters/SparkAdapter.d.ts.map +1 -0
  16. package/dist/adapters/SparkAdapter.js +390 -0
  17. package/dist/adapters/SparkAdapter.js.map +1 -0
  18. package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts +78 -0
  19. package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts.map +1 -0
  20. package/dist/adapters/wdk/ArkadeWdkAdapter.js +233 -0
  21. package/dist/adapters/wdk/ArkadeWdkAdapter.js.map +1 -0
  22. package/dist/adapters/wdk/LiquidWdkAdapter.d.ts +88 -0
  23. package/dist/adapters/wdk/LiquidWdkAdapter.d.ts.map +1 -0
  24. package/dist/adapters/wdk/LiquidWdkAdapter.js +272 -0
  25. package/dist/adapters/wdk/LiquidWdkAdapter.js.map +1 -0
  26. package/dist/adapters/wdk/RlnWdkAdapter.d.ts +85 -0
  27. package/dist/adapters/wdk/RlnWdkAdapter.d.ts.map +1 -0
  28. package/dist/adapters/wdk/RlnWdkAdapter.js +308 -0
  29. package/dist/adapters/wdk/RlnWdkAdapter.js.map +1 -0
  30. package/dist/adapters/wdk/SparkWdkAdapter.d.ts +83 -0
  31. package/dist/adapters/wdk/SparkWdkAdapter.d.ts.map +1 -0
  32. package/dist/adapters/wdk/SparkWdkAdapter.js +417 -0
  33. package/dist/adapters/wdk/SparkWdkAdapter.js.map +1 -0
  34. package/dist/adapters/wdk/moduleLoader.d.ts +22 -0
  35. package/dist/adapters/wdk/moduleLoader.d.ts.map +1 -0
  36. package/dist/adapters/wdk/moduleLoader.js +31 -0
  37. package/dist/adapters/wdk/moduleLoader.js.map +1 -0
  38. package/dist/capabilities/index.d.ts +46 -0
  39. package/dist/capabilities/index.d.ts.map +1 -0
  40. package/dist/capabilities/index.js +102 -0
  41. package/dist/capabilities/index.js.map +1 -0
  42. package/dist/disclosure/index.d.ts +51 -0
  43. package/dist/disclosure/index.d.ts.map +1 -0
  44. package/dist/disclosure/index.js +64 -0
  45. package/dist/disclosure/index.js.map +1 -0
  46. package/dist/index.d.ts +35 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +44 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/lib/arkade-client-manager.d.ts +47 -0
  51. package/dist/lib/arkade-client-manager.d.ts.map +1 -0
  52. package/dist/lib/arkade-client-manager.js +121 -0
  53. package/dist/lib/arkade-client-manager.js.map +1 -0
  54. package/dist/lib/bolt11.d.ts +18 -0
  55. package/dist/lib/bolt11.d.ts.map +1 -0
  56. package/dist/lib/bolt11.js +31 -0
  57. package/dist/lib/bolt11.js.map +1 -0
  58. package/dist/lib/flashnet-client-manager.d.ts +29 -0
  59. package/dist/lib/flashnet-client-manager.d.ts.map +1 -0
  60. package/dist/lib/flashnet-client-manager.js +116 -0
  61. package/dist/lib/flashnet-client-manager.js.map +1 -0
  62. package/dist/lib/kaleido-client-manager.d.ts +26 -0
  63. package/dist/lib/kaleido-client-manager.d.ts.map +1 -0
  64. package/dist/lib/kaleido-client-manager.js +55 -0
  65. package/dist/lib/kaleido-client-manager.js.map +1 -0
  66. package/dist/lib/spark-client-manager.d.ts +41 -0
  67. package/dist/lib/spark-client-manager.d.ts.map +1 -0
  68. package/dist/lib/spark-client-manager.js +101 -0
  69. package/dist/lib/spark-client-manager.js.map +1 -0
  70. package/dist/manager/ProtocolManager.d.ts +57 -0
  71. package/dist/manager/ProtocolManager.d.ts.map +1 -0
  72. package/dist/manager/ProtocolManager.js +228 -0
  73. package/dist/manager/ProtocolManager.js.map +1 -0
  74. package/dist/ports/index.d.ts +29 -0
  75. package/dist/ports/index.d.ts.map +1 -0
  76. package/dist/ports/index.js +9 -0
  77. package/dist/ports/index.js.map +1 -0
  78. package/dist/receive/unifiedReceive.d.ts +54 -0
  79. package/dist/receive/unifiedReceive.d.ts.map +1 -0
  80. package/dist/receive/unifiedReceive.js +102 -0
  81. package/dist/receive/unifiedReceive.js.map +1 -0
  82. package/dist/registry/createWdkRegistry.d.ts +20 -0
  83. package/dist/registry/createWdkRegistry.d.ts.map +1 -0
  84. package/dist/registry/createWdkRegistry.js +32 -0
  85. package/dist/registry/createWdkRegistry.js.map +1 -0
  86. package/dist/router/destination.d.ts +28 -0
  87. package/dist/router/destination.d.ts.map +1 -0
  88. package/dist/router/destination.js +72 -0
  89. package/dist/router/destination.js.map +1 -0
  90. package/dist/router/index.d.ts +55 -0
  91. package/dist/router/index.d.ts.map +1 -0
  92. package/dist/router/index.js +67 -0
  93. package/dist/router/index.js.map +1 -0
  94. package/dist/swap/KaleidoswapSwap.d.ts +44 -0
  95. package/dist/swap/KaleidoswapSwap.d.ts.map +1 -0
  96. package/dist/swap/KaleidoswapSwap.js +123 -0
  97. package/dist/swap/KaleidoswapSwap.js.map +1 -0
  98. package/dist/types/arkade.d.ts +40 -0
  99. package/dist/types/arkade.d.ts.map +1 -0
  100. package/dist/types/arkade.js +6 -0
  101. package/dist/types/arkade.js.map +1 -0
  102. package/dist/types/base.d.ts +218 -0
  103. package/dist/types/base.d.ts.map +1 -0
  104. package/dist/types/base.js +27 -0
  105. package/dist/types/base.js.map +1 -0
  106. package/dist/types/cross-l2.d.ts +108 -0
  107. package/dist/types/cross-l2.d.ts.map +1 -0
  108. package/dist/types/cross-l2.js +16 -0
  109. package/dist/types/cross-l2.js.map +1 -0
  110. package/dist/types/flashnet.d.ts +31 -0
  111. package/dist/types/flashnet.d.ts.map +1 -0
  112. package/dist/types/flashnet.js +23 -0
  113. package/dist/types/flashnet.js.map +1 -0
  114. package/dist/types/rgb.d.ts +91 -0
  115. package/dist/types/rgb.d.ts.map +1 -0
  116. package/dist/types/rgb.js +6 -0
  117. package/dist/types/rgb.js.map +1 -0
  118. package/dist/types/spark.d.ts +59 -0
  119. package/dist/types/spark.d.ts.map +1 -0
  120. package/dist/types/spark.js +6 -0
  121. package/dist/types/spark.js.map +1 -0
  122. package/dist/utils.d.ts +10 -0
  123. package/dist/utils.d.ts.map +1 -0
  124. package/dist/utils.js +23 -0
  125. package/dist/utils.js.map +1 -0
  126. package/package.json +41 -0
@@ -0,0 +1,417 @@
1
+ /**
2
+ * SparkWdkAdapter
3
+ * ---------------
4
+ * Thin adapter mapping the WDK Spark module (@tetherto/wdk-wallet-spark) onto the
5
+ * stable `IProtocolAdapter` contract. This is the reference implementation of the
6
+ * "wrap a WDK module behind the contract" pattern (see docs/WDK_INTEGRATION_PLAN.md).
7
+ *
8
+ * Discipline rules enforced here:
9
+ * - NO WDK/SDK types cross the contract boundary — everything returned is a domain
10
+ * type from ../types/base. The WDK objects are held as `any` internally.
11
+ * - Protocol quirks (zero-fee, static address) live in the capability manifest,
12
+ * not in this interface.
13
+ *
14
+ * WDK Spark account surface (captured via Spike A, 2026-06-03):
15
+ * manager: getAccount, getAccountByPath, getFeeRates
16
+ * account: getAddress, getBalance, sendTransaction, transfer,
17
+ * getStaticDepositAddress, getSingleUseDepositAddress, quoteWithdraw,
18
+ * withdraw, createLightningInvoice, payLightningInvoice,
19
+ * createSparkSatsInvoice, createSparkTokensInvoice, paySparkInvoice,
20
+ * syncWalletBalance, dispose, cleanupConnections
21
+ *
22
+ * Status: skeleton — core receive/balance/invoice/send wired to the real WDK calls;
23
+ * remaining contract methods stubbed with explicit ProtocolError until Phase 2.
24
+ */
25
+ import { ProtocolError, } from '../../types/base';
26
+ import { getCapabilities } from '../../capabilities';
27
+ import { loadWdkModule } from './moduleLoader';
28
+ import { decodeBolt11, isBolt11 } from '../../lib/bolt11';
29
+ /** Map a spark-sdk Transfer proto status → domain TransactionStatus. */
30
+ function mapSparkStatus(s) {
31
+ const v = String(s ?? '').toUpperCase();
32
+ if (v.includes('COMPLET'))
33
+ return 'confirmed';
34
+ if (v.includes('FAIL') || v.includes('EXPIRED') || v.includes('RETURN'))
35
+ return 'failed';
36
+ return 'pending';
37
+ }
38
+ const SPARK_NETWORK_MAP = {
39
+ mainnet: 'MAINNET',
40
+ testnet: 'TESTNET',
41
+ regtest: 'REGTEST',
42
+ signet: 'SIGNET', // Spark supports SIGNET natively
43
+ };
44
+ export class SparkWdkAdapter {
45
+ constructor() {
46
+ this.protocolName = 'SPARK';
47
+ this.supportedLayers = getCapabilities('SPARK').layers;
48
+ this.version = '0.1.0-wdk';
49
+ this.manager = null;
50
+ this.account = null;
51
+ this.connected = false;
52
+ this.network = 'mainnet';
53
+ }
54
+ // --- Connection ---------------------------------------------------------
55
+ async connect(config) {
56
+ const cfg = config;
57
+ if (!cfg.mnemonic) {
58
+ throw new ProtocolError('SparkWdkAdapter requires a mnemonic', 'SPARK', 'CONFIG');
59
+ }
60
+ this.network = cfg.network ?? 'mainnet';
61
+ // Injectable loader (RN injects a static require; Node/Vite use the import fallback).
62
+ // @ts-ignore — declared as a workspace/optional dep; resolved at runtime.
63
+ const mod = await loadWdkModule('@tetherto/wdk-wallet-spark', () => import('@tetherto/wdk-wallet-spark'));
64
+ const WalletManagerSpark = mod.default ?? mod;
65
+ this.manager = new WalletManagerSpark(cfg.mnemonic, {
66
+ network: SPARK_NETWORK_MAP[this.network] ?? 'MAINNET',
67
+ });
68
+ this.account = await this.manager.getAccount(cfg.accountIndex ?? 0);
69
+ this.connected = true;
70
+ }
71
+ async disconnect() {
72
+ try {
73
+ await this.account?.dispose?.();
74
+ await this.account?.cleanupConnections?.();
75
+ }
76
+ finally {
77
+ this.account = null;
78
+ this.manager = null;
79
+ this.connected = false;
80
+ }
81
+ }
82
+ isConnected() {
83
+ return this.connected;
84
+ }
85
+ async getConnectionInfo() {
86
+ return { protocol: 'SPARK', connected: this.connected, network: this.network };
87
+ }
88
+ // --- Address / receive --------------------------------------------------
89
+ // Default → the native Spark address (`sp1…`). When the caller targets the
90
+ // BTC L1 layer (passes 'onchain' or the BTC asset id) we return a real
91
+ // on-chain Bitcoin deposit address instead. We use a SINGLE-USE deposit
92
+ // address (not the static one) so that deposits are recoverable via
93
+ // `sweepL1Deposits()` — the sweep enumerates unused single-use addresses and
94
+ // claims their confirmed UTXOs. Without this branch an "on-chain" receive
95
+ // would incorrectly surface the Spark address.
96
+ async getReceiveAddress(assetId) {
97
+ this.assertConnected();
98
+ if (assetId === 'onchain' || assetId === 'BTC') {
99
+ const address = await this.account.getSingleUseDepositAddress();
100
+ return { address, format: 'BTC_ADDRESS' };
101
+ }
102
+ const address = await this.account.getAddress();
103
+ return { address, format: 'SPARK_ADDRESS' };
104
+ }
105
+ // --- On-chain deposit claim / sweep ------------------------------------
106
+ // Spark on-chain (L1) deposits land at a single-use deposit address and must
107
+ // be CLAIMED into the wallet before they show up in the balance. These mirror
108
+ // rate-extension's claimSparkL1Deposit / sweepSparkL1Deposits, but drive the
109
+ // WDK account API: getUtxosForDepositAddress({depositAddress, …}) →
110
+ // claimDeposit(txid), and getUnusedDepositAddresses() for the sweep.
111
+ /** Claim any confirmed UTXO(s) sent to a single deposit `address`. */
112
+ async claimL1Deposit(address) {
113
+ this.assertConnected();
114
+ const depositAddress = address?.trim();
115
+ if (!depositAddress)
116
+ return { status: 'error', error: 'address is required' };
117
+ let utxos;
118
+ try {
119
+ const res = await this.account.getUtxosForDepositAddress({
120
+ depositAddress,
121
+ limit: 10,
122
+ offset: 0,
123
+ excludeClaimed: true,
124
+ });
125
+ utxos = res?.utxos ?? [];
126
+ }
127
+ catch (error) {
128
+ return { status: 'error', error: error?.message ?? 'utxo lookup failed' };
129
+ }
130
+ if (utxos.length === 0)
131
+ return { status: 'awaiting' };
132
+ const txids = [];
133
+ let lastError;
134
+ for (const utxo of utxos) {
135
+ try {
136
+ await this.account.claimDeposit(utxo.txid);
137
+ txids.push(utxo.txid);
138
+ }
139
+ catch (error) {
140
+ lastError = error?.message ?? String(error);
141
+ }
142
+ }
143
+ if (txids.length === 0)
144
+ return { status: 'error', error: lastError ?? 'no utxos claimed' };
145
+ return { status: 'claimed', txids };
146
+ }
147
+ /** Sweep every unclaimed single-use deposit address (recovers earlier deposits). */
148
+ async sweepL1Deposits() {
149
+ this.assertConnected();
150
+ let addresses;
151
+ try {
152
+ const res = await this.account.getUnusedDepositAddresses();
153
+ // WDK returns { depositAddresses: [{ depositAddress, … }], offset }.
154
+ addresses = (res?.depositAddresses ?? [])
155
+ .map((d) => (typeof d === 'string' ? d : d?.depositAddress))
156
+ .filter((a) => !!a);
157
+ }
158
+ catch (error) {
159
+ return {
160
+ addressesChecked: 0,
161
+ claimedTxids: [],
162
+ errors: [error?.message ?? 'getUnusedDepositAddresses failed'],
163
+ };
164
+ }
165
+ if (addresses.length === 0)
166
+ return { addressesChecked: 0, claimedTxids: [], errors: [] };
167
+ const claimedTxids = [];
168
+ const errors = [];
169
+ for (const addr of addresses) {
170
+ try {
171
+ const res = await this.account.getUtxosForDepositAddress({
172
+ depositAddress: addr,
173
+ limit: 10,
174
+ offset: 0,
175
+ excludeClaimed: true,
176
+ });
177
+ const utxos = res?.utxos ?? [];
178
+ for (const utxo of utxos) {
179
+ try {
180
+ await this.account.claimDeposit(utxo.txid);
181
+ claimedTxids.push(utxo.txid);
182
+ }
183
+ catch (claimErr) {
184
+ errors.push(claimErr?.message ?? String(claimErr));
185
+ }
186
+ }
187
+ }
188
+ catch (lookupErr) {
189
+ errors.push(lookupErr?.message ?? String(lookupErr));
190
+ }
191
+ }
192
+ return { addressesChecked: addresses.length, claimedTxids, errors };
193
+ }
194
+ // --- Balance ------------------------------------------------------------
195
+ async getBtcBalance() {
196
+ this.assertConnected();
197
+ // WDK: getBalance(): Promise<bigint> — sats, settled balance.
198
+ const bal = await this.account.getBalance();
199
+ const total = Number(bal);
200
+ return { confirmed: total, unconfirmed: 0, total };
201
+ }
202
+ async refreshBalances() {
203
+ this.assertConnected();
204
+ await this.account.syncWalletBalance?.();
205
+ }
206
+ async listAssets() {
207
+ this.assertConnected();
208
+ const { total } = await this.getBtcBalance();
209
+ const btc = {
210
+ id: 'BTC',
211
+ name: 'Bitcoin',
212
+ ticker: 'BTC',
213
+ precision: 8,
214
+ protocol: 'SPARK',
215
+ layer: 'BTC_SPARK',
216
+ balance: {
217
+ total,
218
+ available: total,
219
+ pending: 0,
220
+ totalDisplay: String(total),
221
+ availableDisplay: String(total),
222
+ },
223
+ capabilities: {
224
+ canSend: true,
225
+ canReceive: true,
226
+ canSwap: false,
227
+ supportsLightning: true,
228
+ supportsOnchain: true,
229
+ },
230
+ };
231
+ // TODO(Phase 2): enumerate Spark tokens from account.getBalance() token map.
232
+ return [btc];
233
+ }
234
+ async getAssetBalance(assetId) {
235
+ const assets = await this.listAssets();
236
+ const found = assets.find((a) => a.id === assetId);
237
+ if (!found)
238
+ throw new ProtocolError(`Unknown asset ${assetId}`, 'SPARK', 'NO_ASSET');
239
+ return found.balance;
240
+ }
241
+ async getAsset(assetId) {
242
+ const assets = await this.listAssets();
243
+ const found = assets.find((a) => a.id === assetId);
244
+ if (!found)
245
+ throw new ProtocolError(`Unknown asset ${assetId}`, 'SPARK', 'NO_ASSET');
246
+ return found;
247
+ }
248
+ // --- Invoices / receive amounts ----------------------------------------
249
+ async createInvoice(request) {
250
+ this.assertConnected();
251
+ const expiresAt = Date.now() + (request.expirySeconds ?? 3600) * 1000;
252
+ // 1) Lightning receive (BOLT11) — when the caller targets the LN layer.
253
+ if (request.layer === 'BTC_LN') {
254
+ // WDK createLightningInvoice({ amountSats, memo, expirySeconds }): LightningReceiveRequest
255
+ const r = await this.account.createLightningInvoice({
256
+ amountSats: request.amount ?? 0,
257
+ memo: request.description,
258
+ expirySeconds: request.expirySeconds,
259
+ });
260
+ const encoded = r?.invoice?.encodedInvoice ?? r?.encodedInvoice ?? r?.invoice ?? '';
261
+ return {
262
+ invoice: encoded,
263
+ paymentHash: r?.invoice?.paymentHash ?? r?.id ?? '',
264
+ amount: request.amount,
265
+ expiresAt,
266
+ description: request.description,
267
+ };
268
+ }
269
+ // 2) Spark token invoice — returns a SparkAddressFormat string.
270
+ if (request.asset && request.asset !== 'BTC') {
271
+ const invoice = await this.account.createSparkTokensInvoice({
272
+ tokenIdentifier: request.asset,
273
+ amount: request.assetAmount != null ? BigInt(request.assetAmount) : undefined,
274
+ memo: request.description,
275
+ });
276
+ return { invoice, paymentHash: '', amount: request.assetAmount, expiresAt, description: request.description };
277
+ }
278
+ // 3) Default: native Spark sats invoice — returns a SparkAddressFormat string.
279
+ const invoice = await this.account.createSparkSatsInvoice({
280
+ amount: request.amount,
281
+ memo: request.description,
282
+ });
283
+ return { invoice, paymentHash: '', amount: request.amount, expiresAt, description: request.description };
284
+ }
285
+ // --- Send ---------------------------------------------------------------
286
+ async sendPayment(request) {
287
+ this.assertConnected();
288
+ const dest = request.invoice.trim();
289
+ const isBolt11 = /^ln(bc|tb|bcrt)/i.test(dest);
290
+ const timestamp = Date.now();
291
+ // 1) Lightning send — WDK requires a maxFeeSats cap.
292
+ if (isBolt11) {
293
+ const r = await this.account.payLightningInvoice({
294
+ invoice: dest,
295
+ maxFeeSats: request.maxFeeSats ?? this.defaultMaxFeeSats(request.amount),
296
+ });
297
+ return {
298
+ paymentHash: r?.paymentHash ?? r?.id ?? '',
299
+ preimage: r?.preimage,
300
+ amount: Number(r?.amountSats ?? request.amount ?? 0),
301
+ fee: Number(r?.feeSats ?? 0),
302
+ status: 'confirmed',
303
+ timestamp,
304
+ };
305
+ }
306
+ // 2) Plain Spark address + explicit amount → direct transfer (zero-fee).
307
+ if (request.amount != null) {
308
+ const r = await this.account.sendTransaction({ to: dest, value: request.amount });
309
+ return {
310
+ paymentHash: r?.id ?? r?.transferId ?? '',
311
+ amount: request.amount,
312
+ fee: 0, // Spark transfers are zero-fee (capability flag)
313
+ status: 'confirmed',
314
+ timestamp,
315
+ };
316
+ }
317
+ // 3) Encoded Spark invoice (amount embedded) → fulfill. Takes an ARRAY.
318
+ const res = await this.account.paySparkInvoice([{ invoice: dest }]);
319
+ const ok = res?.satsTransactionSuccess?.[0];
320
+ return {
321
+ paymentHash: ok?.transferResponse?.id ?? '',
322
+ amount: Number(request.amount ?? 0),
323
+ fee: 0,
324
+ status: ok ? 'confirmed' : 'failed',
325
+ timestamp,
326
+ };
327
+ }
328
+ /** Conservative default LN fee cap: 0.5% of amount, min 5 sats. */
329
+ defaultMaxFeeSats(amount) {
330
+ if (!amount || amount <= 0)
331
+ return 10;
332
+ return Math.max(5, Math.ceil(amount * 0.005));
333
+ }
334
+ // --- Transactions -------------------------------------------------------
335
+ async decodeInvoice(invoice) {
336
+ const dest = invoice.trim();
337
+ if (isBolt11(dest)) {
338
+ const { amountSat } = decodeBolt11(dest);
339
+ return { paymentHash: '', amount: amountSat, expiresAt: 0, destination: dest };
340
+ }
341
+ // Spark invoice/address — no on-device decode; surface the raw value.
342
+ return { paymentHash: '', expiresAt: 0, destination: dest };
343
+ }
344
+ async getPaymentStatus(paymentHash) {
345
+ this.assertConnected();
346
+ const t = await this.account.getTransactionReceipt(paymentHash).catch(() => null);
347
+ return { paymentHash, status: mapSparkStatus(t?.status), amount: t ? Number(t.totalValue ?? 0) : undefined };
348
+ }
349
+ async listTransactions(filter) {
350
+ this.assertConnected();
351
+ const transfers = await this.account.getTransfers({ limit: filter?.limit ?? 50, skip: filter?.offset ?? 0 });
352
+ return (transfers ?? []).map((t) => this.toUnifiedTx(t));
353
+ }
354
+ async getTransaction(txId) {
355
+ this.assertConnected();
356
+ const t = await this.account.getTransactionReceipt(txId);
357
+ if (!t)
358
+ throw new ProtocolError(`Unknown tx ${txId}`, 'SPARK', 'NO_TX');
359
+ return this.toUnifiedTx(t);
360
+ }
361
+ async getNodeInfo() {
362
+ return { protocol: 'SPARK', network: this.network };
363
+ }
364
+ async listChannels() {
365
+ return []; // Spark has no LN channels
366
+ }
367
+ /**
368
+ * Escape hatch: the underlying spark-sdk SparkWallet, for integrations that need the
369
+ * raw client (e.g. the flashnet Spark-DEX, which piggybacks on a SparkWallet). Returns
370
+ * the same instance this adapter uses (no duplicate wallet). Null if not connected.
371
+ */
372
+ getUnderlyingSparkWallet() {
373
+ return this.account?._wallet ?? null;
374
+ }
375
+ async listPayments() {
376
+ // Outgoing transfers only.
377
+ const txs = await this.listTransactions();
378
+ return txs.filter((t) => t.type === 'send');
379
+ }
380
+ async listTransfers() {
381
+ this.assertConnected();
382
+ return this.account.getTransfers({ limit: 100 });
383
+ }
384
+ supportsSwaps() {
385
+ return getCapabilities('SPARK').supportsSwaps;
386
+ }
387
+ /** Map a spark-sdk Transfer (proto) → domain UnifiedTransaction (fields read defensively). */
388
+ toUnifiedTx(t) {
389
+ const dir = String(t?.transferDirection ?? t?.direction ?? '').toUpperCase();
390
+ const isReceive = dir.includes('INCOMING') || dir.includes('RECEIV');
391
+ const tsRaw = t?.createdTime ?? t?.updatedTime ?? t?.createdAt;
392
+ const timestamp = typeof tsRaw === 'number'
393
+ ? tsRaw
394
+ : tsRaw?.seconds
395
+ ? Number(tsRaw.seconds) * 1000
396
+ : tsRaw
397
+ ? new Date(tsRaw).getTime()
398
+ : 0;
399
+ return {
400
+ id: t?.id ?? t?.sparkId ?? '',
401
+ type: isReceive ? 'receive' : 'send',
402
+ status: mapSparkStatus(t?.status),
403
+ timestamp,
404
+ amount: Number(t?.totalValue ?? t?.value ?? 0),
405
+ amountDisplay: '',
406
+ asset: undefined,
407
+ protocolData: t,
408
+ };
409
+ }
410
+ // --- helpers ------------------------------------------------------------
411
+ assertConnected() {
412
+ if (!this.connected || !this.account) {
413
+ throw new ProtocolError('SparkWdkAdapter not connected', 'SPARK', 'NOT_CONNECTED');
414
+ }
415
+ }
416
+ }
417
+ //# sourceMappingURL=SparkWdkAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SparkWdkAdapter.js","sourceRoot":"","sources":["../../../src/adapters/wdk/SparkWdkAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAeL,aAAa,GAGd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEzD,wEAAwE;AACxE,SAAS,cAAc,CAAC,CAAU;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACvC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,WAAW,CAAA;IAC7C,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IACxF,OAAO,SAAS,CAAA;AAClB,CAAC;AAaD,MAAM,iBAAiB,GAAiC;IACtD,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ,EAAE,iCAAiC;CACpD,CAAA;AAED,MAAM,OAAO,eAAe;IAA5B;QACW,iBAAY,GAAiB,OAAO,CAAA;QACpC,oBAAe,GAAY,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA;QAC1D,YAAO,GAAG,WAAW,CAAA;QAEtB,YAAO,GAAQ,IAAI,CAAA;QACnB,YAAO,GAAQ,IAAI,CAAA;QACnB,cAAS,GAAG,KAAK,CAAA;QACjB,YAAO,GAAG,SAAS,CAAA;IAgY7B,CAAC;IA9XC,2EAA2E;IAC3E,KAAK,CAAC,OAAO,CAAC,MAA0B;QACtC,MAAM,GAAG,GAAG,MAA4B,CAAA;QACxC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,aAAa,CAAC,qCAAqC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QACnF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,SAAS,CAAA;QACvC,sFAAsF;QACtF,0EAA0E;QAC1E,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAA;QACzG,MAAM,kBAAkB,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAA;QAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE;YAClD,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS;SACtD,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAA;YAC/B,MAAM,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAA;QAC5C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;QACxB,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAA;IAChF,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,uEAAuE;IACvE,wEAAwE;IACxE,oEAAoE;IACpE,6EAA6E;IAC7E,0EAA0E;IAC1E,+CAA+C;IAC/C,KAAK,CAAC,iBAAiB,CAAC,OAAgB;QACtC,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAW,MAAM,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAA;YACvE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;QAC3C,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;QAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IAC7C,CAAC;IAED,0EAA0E;IAC1E,6EAA6E;IAC7E,8EAA8E;IAC9E,6EAA6E;IAC7E,oEAAoE;IACpE,qEAAqE;IAErE,sEAAsE;IACtE,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,cAAc,GAAG,OAAO,EAAE,IAAI,EAAE,CAAA;QACtC,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAA;QAE7E,IAAI,KAA4C,CAAA;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;gBAC5D,cAAc;gBACd,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,CAAC;gBACT,cAAc,EAAE,IAAI;aACrB,CAAC,CAAA;YACF,KAAK,GAAG,GAAG,EAAE,KAAK,IAAI,EAAE,CAAA;QAC1B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,oBAAoB,EAAE,CAAA;QAC3E,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;QAErD,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,SAA6B,CAAA;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACvB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,SAAS,GAAG,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,IAAI,kBAAkB,EAAE,CAAA;QAC1F,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IACrC,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,IAAI,SAAmB,CAAA;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAA;YAC/D,qEAAqE;YACrE,SAAS,GAAG,CAAC,GAAG,EAAE,gBAAgB,IAAI,EAAE,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;iBAChE,MAAM,CAAC,CAAC,CAAM,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,gBAAgB,EAAE,CAAC;gBACnB,YAAY,EAAE,EAAE;gBAChB,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,IAAI,kCAAkC,CAAC;aAC/D,CAAA;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;QAExF,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;oBAC5D,cAAc,EAAE,IAAI;oBACpB,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,CAAC;oBACT,cAAc,EAAE,IAAI;iBACrB,CAAC,CAAA;gBACF,MAAM,KAAK,GAA4B,GAAG,EAAE,KAAK,IAAI,EAAE,CAAA;gBACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBAC1C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBAC9B,CAAC;oBAAC,OAAO,QAAa,EAAE,CAAC;wBACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;oBACpD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,SAAc,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QACD,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAA;IACrE,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,8DAA8D;QAC9D,MAAM,GAAG,GAAW,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACzB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAC5C,MAAM,GAAG,GAAiB;YACxB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;gBACP,KAAK;gBACL,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,CAAC;gBACV,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC;gBAC3B,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC;aAChC;YACD,YAAY,EAAE;gBACZ,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,KAAK;gBACd,iBAAiB,EAAE,IAAI;gBACvB,eAAe,EAAE,IAAI;aACtB;SACF,CAAA;QACD,6EAA6E;QAC7E,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;QAClD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QACpF,OAAO,KAAK,CAAC,OAAO,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;QAClD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,aAAa,CAAC,iBAAiB,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QACpF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,aAAa,CAAC,OAAuB;QACzC,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,IAAI,CAAA;QAErE,wEAAwE;QACxE,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,2FAA2F;YAC3F,MAAM,CAAC,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;gBACvD,UAAU,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC;gBAC/B,IAAI,EAAE,OAAO,CAAC,WAAW;gBACzB,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,CAAA;YACnF,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE;gBACnD,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,SAAS;gBACT,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAA;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAW,MAAM,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;gBAClE,eAAe,EAAE,OAAO,CAAC,KAAK;gBAC9B,MAAM,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7E,IAAI,EAAE,OAAO,CAAC,WAAW;aAC1B,CAAC,CAAA;YACF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAA;QAC/G,CAAC;QAED,+EAA+E;QAC/E,MAAM,OAAO,GAAW,MAAM,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAChE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,WAAW;SAC1B,CAAC,CAAA;QACF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAA;IAC1G,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,WAAW,CAAC,OAAuB;QACvC,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,qDAAqD;QACrD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBACpD,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC;aACzE,CAAC,CAAA;YACF,OAAO;gBACL,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE;gBAC1C,QAAQ,EAAE,CAAC,EAAE,QAAQ;gBACrB,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;gBACpD,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;gBAC5B,MAAM,EAAE,WAAW;gBACnB,SAAS;aACV,CAAA;QACH,CAAC;QAED,yEAAyE;QACzE,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YACtF,OAAO;gBACL,WAAW,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,IAAI,EAAE;gBACzC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,EAAE,CAAC,EAAE,iDAAiD;gBACzD,MAAM,EAAE,WAAW;gBACnB,SAAS;aACV,CAAA;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACxE,MAAM,EAAE,GAAG,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3C,OAAO;YACL,WAAW,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE;YAC3C,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YACnC,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YACnC,SAAS;SACV,CAAA;IACH,CAAC;IAED,mEAAmE;IAC3D,iBAAiB,CAAC,MAAe;QACvC,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO,EAAE,CAAA;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;YACxC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;QAChF,CAAC;QACD,sEAAsE;QACtE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QACxC,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,CAAC,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACtF,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IAC9G,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAA0B;QAC/C,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,SAAS,GAAU,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAA;QACnH,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,CAAC,GAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAC7D,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,cAAc,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACvE,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAA;IACrD,CAAC;IACD,KAAK,CAAC,YAAY;QAChB,OAAO,EAAE,CAAA,CAAC,2BAA2B;IACvC,CAAC;IAED;;;;OAIG;IACH,wBAAwB;QACtB,OAAQ,IAAI,CAAC,OAAe,EAAE,OAAO,IAAI,IAAI,CAAA;IAC/C,CAAC;IACD,KAAK,CAAC,YAAY;QAChB,2BAA2B;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IAC7C,CAAC;IACD,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAClD,CAAC;IACD,aAAa;QACX,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,aAAa,CAAA;IAC/C,CAAC;IAED,8FAA8F;IACtF,WAAW,CAAC,CAAM;QACxB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,iBAAiB,IAAI,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5E,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACpE,MAAM,KAAK,GAAG,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,SAAS,CAAA;QAC9D,MAAM,SAAS,GACb,OAAO,KAAK,KAAK,QAAQ;YACvB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK,EAAE,OAAO;gBACd,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI;gBAC9B,CAAC,CAAC,KAAK;oBACL,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;oBAC3B,CAAC,CAAC,CAAC,CAAA;QACX,OAAO;YACL,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE;YAC7B,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACpC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC;YACjC,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YAC9C,aAAa,EAAE,EAAE;YACjB,KAAK,EAAE,SAAoC;YAC3C,YAAY,EAAE,CAAC;SAChB,CAAA;IACH,CAAC;IAED,2EAA2E;IACnE,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,aAAa,CAAC,+BAA+B,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;QACpF,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * WDK Module Loader (platform-injectable)
3
+ * ---------------------------------------
4
+ * WDK modules are heavy native/WASM packages. How they're loaded differs per host:
5
+ * - Node / Vite (extension): dynamic `import()` works fine.
6
+ * - React Native / Metro: dynamic import of node_modules packages is unreliable;
7
+ * the app injects a STATIC `require()` instead (mirrors rate's existing
8
+ * `setSdkFactory` pattern for the native SDKs).
9
+ *
10
+ * Adapters call `loadWdkModule(pkgName, () => import(pkgName))`. If the host has
11
+ * registered a loader for that package, it's used; otherwise the inline dynamic
12
+ * import fallback runs. The fallback's import specifier is a string literal so
13
+ * bundlers can still analyze it.
14
+ */
15
+ export type WdkModuleLoader = () => any | Promise<any>;
16
+ /** Host registers how to load a WDK package (e.g. `() => require('@tetherto/wdk-wallet-spark')`). */
17
+ export declare function registerWdkModule(pkgName: string, loader: WdkModuleLoader): void;
18
+ /** True if the host injected a loader for this package. */
19
+ export declare function hasWdkModule(pkgName: string): boolean;
20
+ /** Resolve a WDK module via the injected loader, falling back to the inline dynamic import. */
21
+ export declare function loadWdkModule(pkgName: string, fallback: () => Promise<any>): Promise<any>;
22
+ //# sourceMappingURL=moduleLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleLoader.d.ts","sourceRoot":"","sources":["../../../src/adapters/wdk/moduleLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;AAItD,qGAAqG;AACrG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAEhF;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,+FAA+F;AAC/F,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAI/F"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * WDK Module Loader (platform-injectable)
3
+ * ---------------------------------------
4
+ * WDK modules are heavy native/WASM packages. How they're loaded differs per host:
5
+ * - Node / Vite (extension): dynamic `import()` works fine.
6
+ * - React Native / Metro: dynamic import of node_modules packages is unreliable;
7
+ * the app injects a STATIC `require()` instead (mirrors rate's existing
8
+ * `setSdkFactory` pattern for the native SDKs).
9
+ *
10
+ * Adapters call `loadWdkModule(pkgName, () => import(pkgName))`. If the host has
11
+ * registered a loader for that package, it's used; otherwise the inline dynamic
12
+ * import fallback runs. The fallback's import specifier is a string literal so
13
+ * bundlers can still analyze it.
14
+ */
15
+ const registry = new Map();
16
+ /** Host registers how to load a WDK package (e.g. `() => require('@tetherto/wdk-wallet-spark')`). */
17
+ export function registerWdkModule(pkgName, loader) {
18
+ registry.set(pkgName, loader);
19
+ }
20
+ /** True if the host injected a loader for this package. */
21
+ export function hasWdkModule(pkgName) {
22
+ return registry.has(pkgName);
23
+ }
24
+ /** Resolve a WDK module via the injected loader, falling back to the inline dynamic import. */
25
+ export async function loadWdkModule(pkgName, fallback) {
26
+ const loader = registry.get(pkgName);
27
+ if (loader)
28
+ return await loader();
29
+ return await fallback();
30
+ }
31
+ //# sourceMappingURL=moduleLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleLoader.js","sourceRoot":"","sources":["../../../src/adapters/wdk/moduleLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAA;AAEnD,qGAAqG;AACrG,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAuB;IACxE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC/B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,QAA4B;IAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,MAAM;QAAE,OAAO,MAAM,MAAM,EAAE,CAAA;IACjC,OAAO,MAAM,QAAQ,EAAE,CAAA;AACzB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Protocol Capability Manifest
3
+ * ----------------------------
4
+ * The backbone of the plugin architecture: protocol *differences* are expressed
5
+ * here as DATA, never as new methods on `IProtocolAdapter`. The cross-protocol
6
+ * router and the lite/advanced UI read this manifest to decide behaviour, so
7
+ * adding or changing one protocol never edits another protocol's code.
8
+ *
9
+ * Rule: when you're tempted to add a method to the contract for a single
10
+ * protocol, add a capability flag here instead.
11
+ */
12
+ import { ProtocolType, Layer } from '../types/base';
13
+ export interface ProtocolCapabilities {
14
+ protocol: ProtocolType;
15
+ /** Layers this protocol can move value on. */
16
+ layers: Layer[];
17
+ supportsOnchain: boolean;
18
+ supportsLightning: boolean;
19
+ /** Can hold/transfer non-BTC assets (RGB assets, Liquid assets, Spark tokens). */
20
+ supportsAssets: boolean;
21
+ /** Native swap capability exposed by the protocol/module. */
22
+ supportsSwaps: boolean;
23
+ /** Spark: transfers are zero-fee. */
24
+ zeroFee: boolean;
25
+ /** Receive address is static/reusable for the wallet (Spark static, Arkade). */
26
+ staticReceiveAddress: boolean;
27
+ /** Arkade: on-chain "boarding" address to fund the off-chain account. */
28
+ boarding: boolean;
29
+ /** Invoices expire (LN / Spark / Liquid-Lightning) → needs a refresh story. */
30
+ invoiceExpiry: boolean;
31
+ /** Needs a Lightning channel / inbound liquidity before it can receive over LN. */
32
+ needsChannelLiquidity: boolean;
33
+ /** The backing WDK package, or null if still on a native SDK / not yet wired. */
34
+ wdkModule: string | null;
35
+ /** Maturity of the backing module — drives whether native fallback stays on. */
36
+ maturity: 'beta' | 'stable';
37
+ }
38
+ /**
39
+ * Single source of truth for what each protocol can do.
40
+ * Keyed by ProtocolType. 'BTC' is the abstract on-chain-only base.
41
+ */
42
+ export declare const PROTOCOL_CAPABILITIES: Record<ProtocolType, ProtocolCapabilities>;
43
+ export declare function getCapabilities(protocol: ProtocolType): ProtocolCapabilities;
44
+ /** Protocols that can settle a given layer — used by the cross-protocol router. */
45
+ export declare function protocolsForLayer(layer: Layer): ProtocolType[];
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEnD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,YAAY,CAAA;IACtB,8CAA8C;IAC9C,MAAM,EAAE,KAAK,EAAE,CAAA;IAGf,eAAe,EAAE,OAAO,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,kFAAkF;IAClF,cAAc,EAAE,OAAO,CAAA;IACvB,6DAA6D;IAC7D,aAAa,EAAE,OAAO,CAAA;IAGtB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,gFAAgF;IAChF,oBAAoB,EAAE,OAAO,CAAA;IAC7B,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAA;IACjB,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAA;IACtB,mFAAmF;IACnF,qBAAqB,EAAE,OAAO,CAAA;IAG9B,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,YAAY,EAAE,oBAAoB,CA4E5E,CAAA;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,oBAAoB,CAE5E;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,EAAE,CAI9D"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Protocol Capability Manifest
3
+ * ----------------------------
4
+ * The backbone of the plugin architecture: protocol *differences* are expressed
5
+ * here as DATA, never as new methods on `IProtocolAdapter`. The cross-protocol
6
+ * router and the lite/advanced UI read this manifest to decide behaviour, so
7
+ * adding or changing one protocol never edits another protocol's code.
8
+ *
9
+ * Rule: when you're tempted to add a method to the contract for a single
10
+ * protocol, add a capability flag here instead.
11
+ */
12
+ /**
13
+ * Single source of truth for what each protocol can do.
14
+ * Keyed by ProtocolType. 'BTC' is the abstract on-chain-only base.
15
+ */
16
+ export const PROTOCOL_CAPABILITIES = {
17
+ BTC: {
18
+ protocol: 'BTC',
19
+ layers: ['BTC_L1'],
20
+ supportsOnchain: true,
21
+ supportsLightning: false,
22
+ supportsAssets: false,
23
+ supportsSwaps: false,
24
+ zeroFee: false,
25
+ staticReceiveAddress: false,
26
+ boarding: false,
27
+ invoiceExpiry: false,
28
+ needsChannelLiquidity: false,
29
+ wdkModule: null,
30
+ maturity: 'stable',
31
+ },
32
+ SPARK: {
33
+ protocol: 'SPARK',
34
+ layers: ['BTC_SPARK', 'SPARK_SPARK', 'BTC_LN'],
35
+ supportsOnchain: true, // via static/single-use deposit addresses
36
+ supportsLightning: true,
37
+ supportsAssets: true, // Spark tokens
38
+ supportsSwaps: false, // swaps handled by the cross-protocol router / Flashnet
39
+ zeroFee: true,
40
+ staticReceiveAddress: true,
41
+ boarding: false,
42
+ invoiceExpiry: true,
43
+ needsChannelLiquidity: false, // Spark has no LN channels to manage
44
+ wdkModule: '@tetherto/wdk-wallet-spark',
45
+ maturity: 'beta',
46
+ },
47
+ ARKADE: {
48
+ protocol: 'ARKADE',
49
+ layers: ['BTC_ARKADE', 'ARKADE_ARKADE', 'BTC_LN'],
50
+ supportsOnchain: true, // boarding
51
+ supportsLightning: true, // via boltz-swap
52
+ supportsAssets: true,
53
+ supportsSwaps: false,
54
+ zeroFee: false,
55
+ staticReceiveAddress: true,
56
+ boarding: true,
57
+ invoiceExpiry: true,
58
+ needsChannelLiquidity: false,
59
+ wdkModule: '@arkade-os/wdk',
60
+ maturity: 'beta',
61
+ },
62
+ RGB: {
63
+ protocol: 'RGB',
64
+ layers: ['BTC_L1', 'BTC_LN', 'RGB_L1', 'RGB_LN'],
65
+ supportsOnchain: true,
66
+ supportsLightning: true,
67
+ supportsAssets: true, // RGB assets (USDT, XAUT)
68
+ supportsSwaps: true, // RGB-LN atomic swaps via the maker
69
+ zeroFee: false,
70
+ staticReceiveAddress: false,
71
+ boarding: false,
72
+ invoiceExpiry: true,
73
+ needsChannelLiquidity: true, // RGB-LN needs channels / LSPS1
74
+ wdkModule: '@kaleidorg/wdk-wallet-rln',
75
+ maturity: 'beta',
76
+ },
77
+ LIQUID: {
78
+ protocol: 'LIQUID',
79
+ layers: ['BTC_LIQUID', 'LIQUID_ASSET'],
80
+ supportsOnchain: true, // Liquid is its own L1
81
+ supportsLightning: false, // (Boltz could add this later → flag, not new method)
82
+ supportsAssets: true, // USDt on Liquid = lite-mode "USD"
83
+ supportsSwaps: false,
84
+ zeroFee: false,
85
+ staticReceiveAddress: false,
86
+ boarding: false,
87
+ invoiceExpiry: false,
88
+ needsChannelLiquidity: false,
89
+ wdkModule: '@kaleidorg/wdk-wallet-liquid',
90
+ maturity: 'beta',
91
+ },
92
+ };
93
+ export function getCapabilities(protocol) {
94
+ return PROTOCOL_CAPABILITIES[protocol];
95
+ }
96
+ /** Protocols that can settle a given layer — used by the cross-protocol router. */
97
+ export function protocolsForLayer(layer) {
98
+ return Object.values(PROTOCOL_CAPABILITIES)
99
+ .filter((c) => c.layers.includes(layer))
100
+ .map((c) => c.protocol);
101
+ }
102
+ //# sourceMappingURL=index.js.map