@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.
- package/README.md +236 -0
- package/dist/adapters/ArkadeAdapter.d.ts +48 -0
- package/dist/adapters/ArkadeAdapter.d.ts.map +1 -0
- package/dist/adapters/ArkadeAdapter.js +314 -0
- package/dist/adapters/ArkadeAdapter.js.map +1 -0
- package/dist/adapters/IProtocolAdapter.d.ts +75 -0
- package/dist/adapters/IProtocolAdapter.d.ts.map +1 -0
- package/dist/adapters/IProtocolAdapter.js +29 -0
- package/dist/adapters/IProtocolAdapter.js.map +1 -0
- package/dist/adapters/RgbAdapter.d.ts +70 -0
- package/dist/adapters/RgbAdapter.d.ts.map +1 -0
- package/dist/adapters/RgbAdapter.js +818 -0
- package/dist/adapters/RgbAdapter.js.map +1 -0
- package/dist/adapters/SparkAdapter.d.ts +47 -0
- package/dist/adapters/SparkAdapter.d.ts.map +1 -0
- package/dist/adapters/SparkAdapter.js +390 -0
- package/dist/adapters/SparkAdapter.js.map +1 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts +78 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.js +233 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.d.ts +88 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.js +272 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/RlnWdkAdapter.d.ts +85 -0
- package/dist/adapters/wdk/RlnWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/RlnWdkAdapter.js +308 -0
- package/dist/adapters/wdk/RlnWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/SparkWdkAdapter.d.ts +83 -0
- package/dist/adapters/wdk/SparkWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/SparkWdkAdapter.js +417 -0
- package/dist/adapters/wdk/SparkWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/moduleLoader.d.ts +22 -0
- package/dist/adapters/wdk/moduleLoader.d.ts.map +1 -0
- package/dist/adapters/wdk/moduleLoader.js +31 -0
- package/dist/adapters/wdk/moduleLoader.js.map +1 -0
- package/dist/capabilities/index.d.ts +46 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +102 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/disclosure/index.d.ts +51 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/disclosure/index.js +64 -0
- package/dist/disclosure/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/arkade-client-manager.d.ts +47 -0
- package/dist/lib/arkade-client-manager.d.ts.map +1 -0
- package/dist/lib/arkade-client-manager.js +121 -0
- package/dist/lib/arkade-client-manager.js.map +1 -0
- package/dist/lib/bolt11.d.ts +18 -0
- package/dist/lib/bolt11.d.ts.map +1 -0
- package/dist/lib/bolt11.js +31 -0
- package/dist/lib/bolt11.js.map +1 -0
- package/dist/lib/flashnet-client-manager.d.ts +29 -0
- package/dist/lib/flashnet-client-manager.d.ts.map +1 -0
- package/dist/lib/flashnet-client-manager.js +116 -0
- package/dist/lib/flashnet-client-manager.js.map +1 -0
- package/dist/lib/kaleido-client-manager.d.ts +26 -0
- package/dist/lib/kaleido-client-manager.d.ts.map +1 -0
- package/dist/lib/kaleido-client-manager.js +55 -0
- package/dist/lib/kaleido-client-manager.js.map +1 -0
- package/dist/lib/spark-client-manager.d.ts +41 -0
- package/dist/lib/spark-client-manager.d.ts.map +1 -0
- package/dist/lib/spark-client-manager.js +101 -0
- package/dist/lib/spark-client-manager.js.map +1 -0
- package/dist/manager/ProtocolManager.d.ts +57 -0
- package/dist/manager/ProtocolManager.d.ts.map +1 -0
- package/dist/manager/ProtocolManager.js +228 -0
- package/dist/manager/ProtocolManager.js.map +1 -0
- package/dist/ports/index.d.ts +29 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +9 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/receive/unifiedReceive.d.ts +54 -0
- package/dist/receive/unifiedReceive.d.ts.map +1 -0
- package/dist/receive/unifiedReceive.js +102 -0
- package/dist/receive/unifiedReceive.js.map +1 -0
- package/dist/registry/createWdkRegistry.d.ts +20 -0
- package/dist/registry/createWdkRegistry.d.ts.map +1 -0
- package/dist/registry/createWdkRegistry.js +32 -0
- package/dist/registry/createWdkRegistry.js.map +1 -0
- package/dist/router/destination.d.ts +28 -0
- package/dist/router/destination.d.ts.map +1 -0
- package/dist/router/destination.js +72 -0
- package/dist/router/destination.js.map +1 -0
- package/dist/router/index.d.ts +55 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +67 -0
- package/dist/router/index.js.map +1 -0
- package/dist/swap/KaleidoswapSwap.d.ts +44 -0
- package/dist/swap/KaleidoswapSwap.d.ts.map +1 -0
- package/dist/swap/KaleidoswapSwap.js +123 -0
- package/dist/swap/KaleidoswapSwap.js.map +1 -0
- package/dist/types/arkade.d.ts +40 -0
- package/dist/types/arkade.d.ts.map +1 -0
- package/dist/types/arkade.js +6 -0
- package/dist/types/arkade.js.map +1 -0
- package/dist/types/base.d.ts +218 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +27 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/cross-l2.d.ts +108 -0
- package/dist/types/cross-l2.d.ts.map +1 -0
- package/dist/types/cross-l2.js +16 -0
- package/dist/types/cross-l2.js.map +1 -0
- package/dist/types/flashnet.d.ts +31 -0
- package/dist/types/flashnet.d.ts.map +1 -0
- package/dist/types/flashnet.js +23 -0
- package/dist/types/flashnet.js.map +1 -0
- package/dist/types/rgb.d.ts +91 -0
- package/dist/types/rgb.d.ts.map +1 -0
- package/dist/types/rgb.js +6 -0
- package/dist/types/rgb.js.map +1 -0
- package/dist/types/spark.d.ts +59 -0
- package/dist/types/spark.d.ts.map +1 -0
- package/dist/types/spark.js +6 -0
- package/dist/types/spark.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +23 -0
- package/dist/utils.js.map +1 -0
- 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":"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"}
|
|
@@ -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
|