@kaleidorg/wallet-engine 1.0.0-beta.4 → 1.0.0-beta.42
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/LICENSE +21 -0
- package/README.md +29 -10
- package/dist/adapters/ArkadeAdapter.d.ts +78 -14
- package/dist/adapters/ArkadeAdapter.d.ts.map +1 -1
- package/dist/adapters/ArkadeAdapter.js +653 -161
- package/dist/adapters/ArkadeAdapter.js.map +1 -1
- package/dist/adapters/IProtocolAdapter.d.ts +195 -18
- package/dist/adapters/IProtocolAdapter.d.ts.map +1 -1
- package/dist/adapters/IProtocolAdapter.js +6 -2
- package/dist/adapters/IProtocolAdapter.js.map +1 -1
- package/dist/adapters/RgbAdapter.d.ts +70 -27
- package/dist/adapters/RgbAdapter.d.ts.map +1 -1
- package/dist/adapters/RgbAdapter.js +464 -370
- package/dist/adapters/RgbAdapter.js.map +1 -1
- package/dist/adapters/SparkAdapter.d.ts +93 -15
- package/dist/adapters/SparkAdapter.d.ts.map +1 -1
- package/dist/adapters/SparkAdapter.js +833 -168
- package/dist/adapters/SparkAdapter.js.map +1 -1
- package/dist/adapters/arkade.d.ts +15 -0
- package/dist/adapters/arkade.d.ts.map +1 -0
- package/dist/adapters/arkade.js +15 -0
- package/dist/adapters/arkade.js.map +1 -0
- package/dist/adapters/flashnet.d.ts +15 -0
- package/dist/adapters/flashnet.d.ts.map +1 -0
- package/dist/adapters/flashnet.js +17 -0
- package/dist/adapters/flashnet.js.map +1 -0
- package/dist/adapters/native.d.ts +17 -0
- package/dist/adapters/native.d.ts.map +1 -0
- package/dist/adapters/native.js +17 -0
- package/dist/adapters/native.js.map +1 -0
- package/dist/adapters/rgb.d.ts +11 -0
- package/dist/adapters/rgb.d.ts.map +1 -0
- package/dist/adapters/rgb.js +11 -0
- package/dist/adapters/rgb.js.map +1 -0
- package/dist/adapters/spark.d.ts +12 -0
- package/dist/adapters/spark.d.ts.map +1 -0
- package/dist/adapters/spark.js +14 -0
- package/dist/adapters/spark.js.map +1 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts +53 -19
- package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts.map +1 -1
- package/dist/adapters/wdk/ArkadeWdkAdapter.js +366 -90
- package/dist/adapters/wdk/ArkadeWdkAdapter.js.map +1 -1
- package/dist/adapters/wdk/BaseWdkAdapter.d.ts +40 -0
- package/dist/adapters/wdk/BaseWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/BaseWdkAdapter.js +71 -0
- package/dist/adapters/wdk/BaseWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.d.ts +6 -13
- package/dist/adapters/wdk/LiquidWdkAdapter.d.ts.map +1 -1
- package/dist/adapters/wdk/LiquidWdkAdapter.js +14 -32
- package/dist/adapters/wdk/LiquidWdkAdapter.js.map +1 -1
- package/dist/adapters/wdk/RgbCore.d.ts +64 -0
- package/dist/adapters/wdk/RgbCore.d.ts.map +1 -0
- package/dist/adapters/wdk/RgbCore.js +111 -0
- package/dist/adapters/wdk/RgbCore.js.map +1 -0
- package/dist/adapters/wdk/RgbLibWasmAdapter.d.ts +277 -0
- package/dist/adapters/wdk/RgbLibWasmAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/RgbLibWasmAdapter.js +731 -0
- package/dist/adapters/wdk/RgbLibWasmAdapter.js.map +1 -0
- package/dist/adapters/wdk/RgbLibWdkAdapter.d.ts +104 -0
- package/dist/adapters/wdk/RgbLibWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/RgbLibWdkAdapter.js +249 -0
- package/dist/adapters/wdk/RgbLibWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/RlnWdkAdapter.d.ts +27 -14
- package/dist/adapters/wdk/RlnWdkAdapter.d.ts.map +1 -1
- package/dist/adapters/wdk/RlnWdkAdapter.js +124 -89
- package/dist/adapters/wdk/RlnWdkAdapter.js.map +1 -1
- package/dist/adapters/wdk/SparkWdkAdapter.d.ts +74 -41
- package/dist/adapters/wdk/SparkWdkAdapter.d.ts.map +1 -1
- package/dist/adapters/wdk/SparkWdkAdapter.js +706 -249
- package/dist/adapters/wdk/SparkWdkAdapter.js.map +1 -1
- package/dist/adapters/wdk/index.d.ts +17 -0
- package/dist/adapters/wdk/index.d.ts.map +1 -0
- package/dist/adapters/wdk/index.js +17 -0
- package/dist/adapters/wdk/index.js.map +1 -0
- package/dist/adapters/wdk/wasm-rgb.d.ts +15 -0
- package/dist/adapters/wdk/wasm-rgb.d.ts.map +1 -0
- package/dist/adapters/wdk/wasm-rgb.js +15 -0
- package/dist/adapters/wdk/wasm-rgb.js.map +1 -0
- package/dist/capabilities/index.d.ts +1 -1
- package/dist/capabilities/index.d.ts.map +1 -1
- package/dist/capabilities/index.js +17 -2
- package/dist/capabilities/index.js.map +1 -1
- package/dist/capabilities/operations.d.ts +22 -0
- package/dist/capabilities/operations.d.ts.map +1 -0
- package/dist/capabilities/operations.js +62 -0
- package/dist/capabilities/operations.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/disclosure/index.d.ts +1 -1
- package/dist/disclosure/index.js +1 -1
- package/dist/disclosure/index.js.map +1 -1
- package/dist/format.d.ts +11 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +10 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +21 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -32
- package/dist/index.js.map +1 -1
- package/dist/lib/arkade-client-manager.d.ts +64 -24
- package/dist/lib/arkade-client-manager.d.ts.map +1 -1
- package/dist/lib/arkade-client-manager.js +240 -65
- package/dist/lib/arkade-client-manager.js.map +1 -1
- package/dist/lib/arkade-converters.d.ts +39 -0
- package/dist/lib/arkade-converters.d.ts.map +1 -0
- package/dist/lib/arkade-converters.js +148 -0
- package/dist/lib/arkade-converters.js.map +1 -0
- package/dist/lib/arkade-helpers.d.ts +110 -0
- package/dist/lib/arkade-helpers.d.ts.map +1 -0
- package/dist/lib/arkade-helpers.js +227 -0
- package/dist/lib/arkade-helpers.js.map +1 -0
- package/dist/lib/arkade-swaps-client-manager.d.ts +55 -0
- package/dist/lib/arkade-swaps-client-manager.d.ts.map +1 -0
- package/dist/lib/arkade-swaps-client-manager.js +127 -0
- package/dist/lib/arkade-swaps-client-manager.js.map +1 -0
- package/dist/lib/arkade-vtxo-lifecycle.d.ts +116 -0
- package/dist/lib/arkade-vtxo-lifecycle.d.ts.map +1 -0
- package/dist/lib/arkade-vtxo-lifecycle.js +184 -0
- package/dist/lib/arkade-vtxo-lifecycle.js.map +1 -0
- package/dist/lib/flashnet-client-manager.d.ts +26 -9
- package/dist/lib/flashnet-client-manager.d.ts.map +1 -1
- package/dist/lib/flashnet-client-manager.js +97 -13
- package/dist/lib/flashnet-client-manager.js.map +1 -1
- package/dist/lib/kaleido-client-manager.d.ts +38 -3
- package/dist/lib/kaleido-client-manager.d.ts.map +1 -1
- package/dist/lib/kaleido-client-manager.js +79 -10
- package/dist/lib/kaleido-client-manager.js.map +1 -1
- package/dist/lib/ln-message-sign.d.ts +20 -0
- package/dist/lib/ln-message-sign.d.ts.map +1 -0
- package/dist/lib/ln-message-sign.js +90 -0
- package/dist/lib/ln-message-sign.js.map +1 -0
- package/dist/lib/log.d.ts +15 -0
- package/dist/lib/log.d.ts.map +1 -0
- package/dist/lib/log.js +16 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/lib/orchestra-client.d.ts +149 -0
- package/dist/lib/orchestra-client.d.ts.map +1 -0
- package/dist/lib/orchestra-client.js +178 -0
- package/dist/lib/orchestra-client.js.map +1 -0
- package/dist/lib/psbt-signer.d.ts +60 -0
- package/dist/lib/psbt-signer.d.ts.map +1 -0
- package/dist/lib/psbt-signer.js +161 -0
- package/dist/lib/psbt-signer.js.map +1 -0
- package/dist/lib/rgb-converters.d.ts +62 -0
- package/dist/lib/rgb-converters.d.ts.map +1 -0
- package/dist/lib/rgb-converters.js +179 -0
- package/dist/lib/rgb-converters.js.map +1 -0
- package/dist/lib/rgb-fee-policy.d.ts +41 -0
- package/dist/lib/rgb-fee-policy.d.ts.map +1 -0
- package/dist/lib/rgb-fee-policy.js +52 -0
- package/dist/lib/rgb-fee-policy.js.map +1 -0
- package/dist/lib/rgb-helpers.d.ts +54 -0
- package/dist/lib/rgb-helpers.d.ts.map +1 -0
- package/dist/lib/rgb-helpers.js +89 -0
- package/dist/lib/rgb-helpers.js.map +1 -0
- package/dist/lib/spark-activity.d.ts +5 -0
- package/dist/lib/spark-activity.d.ts.map +1 -0
- package/dist/lib/spark-activity.js +11 -0
- package/dist/lib/spark-activity.js.map +1 -0
- package/dist/lib/spark-balance-cache.d.ts +58 -0
- package/dist/lib/spark-balance-cache.d.ts.map +1 -0
- package/dist/lib/spark-balance-cache.js +86 -0
- package/dist/lib/spark-balance-cache.js.map +1 -0
- package/dist/lib/spark-client-manager.d.ts +64 -10
- package/dist/lib/spark-client-manager.d.ts.map +1 -1
- package/dist/lib/spark-client-manager.js +191 -35
- package/dist/lib/spark-client-manager.js.map +1 -1
- package/dist/lib/spark-converters.d.ts +64 -0
- package/dist/lib/spark-converters.d.ts.map +1 -0
- package/dist/lib/spark-converters.js +242 -0
- package/dist/lib/spark-converters.js.map +1 -0
- package/dist/lib/spark-helpers.d.ts +72 -0
- package/dist/lib/spark-helpers.d.ts.map +1 -0
- package/dist/lib/spark-helpers.js +151 -0
- package/dist/lib/spark-helpers.js.map +1 -0
- package/dist/lib/spark-sent-token-records.d.ts +43 -0
- package/dist/lib/spark-sent-token-records.d.ts.map +1 -0
- package/dist/lib/spark-sent-token-records.js +105 -0
- package/dist/lib/spark-sent-token-records.js.map +1 -0
- package/dist/lib/wallet-seed.d.ts +31 -0
- package/dist/lib/wallet-seed.d.ts.map +1 -0
- package/dist/lib/wallet-seed.js +58 -0
- package/dist/lib/wallet-seed.js.map +1 -0
- package/dist/lib/zbase32.d.ts +3 -0
- package/dist/lib/zbase32.d.ts.map +1 -0
- package/dist/lib/zbase32.js +64 -0
- package/dist/lib/zbase32.js.map +1 -0
- package/dist/manager/ProtocolManager.d.ts +54 -3
- package/dist/manager/ProtocolManager.d.ts.map +1 -1
- package/dist/manager/ProtocolManager.js +118 -41
- package/dist/manager/ProtocolManager.js.map +1 -1
- package/dist/ports/index.d.ts +20 -0
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +23 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/receive/unifiedReceive.d.ts +12 -0
- package/dist/receive/unifiedReceive.d.ts.map +1 -1
- package/dist/receive/unifiedReceive.js +35 -4
- package/dist/receive/unifiedReceive.js.map +1 -1
- package/dist/registry/createWdkRegistry.d.ts +10 -2
- package/dist/registry/createWdkRegistry.d.ts.map +1 -1
- package/dist/registry/createWdkRegistry.js +14 -7
- package/dist/registry/createWdkRegistry.js.map +1 -1
- package/dist/router/destination.d.ts +2 -2
- package/dist/router/destination.d.ts.map +1 -1
- package/dist/router/destination.js +34 -11
- package/dist/router/destination.js.map +1 -1
- package/dist/router/index.d.ts +39 -3
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +113 -4
- package/dist/router/index.js.map +1 -1
- package/dist/router/preference.d.ts +53 -0
- package/dist/router/preference.d.ts.map +1 -0
- package/dist/router/preference.js +81 -0
- package/dist/router/preference.js.map +1 -0
- package/dist/swap/KaleidoswapSwap.d.ts +1 -1
- package/dist/swap/KaleidoswapSwap.d.ts.map +1 -1
- package/dist/swap/KaleidoswapSwap.js +37 -20
- package/dist/swap/KaleidoswapSwap.js.map +1 -1
- package/dist/swap/index.d.ts +8 -0
- package/dist/swap/index.d.ts.map +1 -0
- package/dist/swap/index.js +8 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/types/arkade.d.ts +1 -1
- package/dist/types/base.d.ts +35 -25
- package/dist/types/base.d.ts.map +1 -1
- package/dist/types/base.js +28 -2
- package/dist/types/base.js.map +1 -1
- package/dist/types/cross-l2.d.ts +1 -1
- package/dist/types/flashnet.d.ts +20 -0
- package/dist/types/flashnet.d.ts.map +1 -1
- package/dist/types/flashnet.js +34 -6
- package/dist/types/flashnet.js.map +1 -1
- package/dist/types/rgb.d.ts +18 -4
- package/dist/types/rgb.d.ts.map +1 -1
- package/dist/types/spark.d.ts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +2 -2
- package/dist/utils.js.map +1 -1
- package/package.json +68 -14
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK ↔ unified-shape converters for the RGB adapter.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from src/protocols/rgb/adapter.ts so the conversion logic lives
|
|
5
|
+
* in one place and the adapter is closer to "what RPCs do I call". Every
|
|
6
|
+
* function here is side-effect free, has no `this` dependencies, and only
|
|
7
|
+
* imports types — no SDK client, no module state.
|
|
8
|
+
*
|
|
9
|
+
* Covered by tests/unit/rgb-converters.test.ts.
|
|
10
|
+
*/
|
|
11
|
+
import { formatAmount, mapPaymentStatus, mapSwapStatus, mapTransferStatus, mapTransferType, } from "./rgb-helpers.js";
|
|
12
|
+
// ── Balance shape converters ──────────────────────────────────────────────
|
|
13
|
+
// Three slightly different upstream shapes; the unified `UnifiedAsset["balance"]`
|
|
14
|
+
// is the projection we render. Each converter is the *only* place that
|
|
15
|
+
// knows the field names of its specific SDK response — anything downstream
|
|
16
|
+
// reads the unified shape.
|
|
17
|
+
/**
|
|
18
|
+
* `wallet.getBtcBalance()` returns BTC split into "vanilla" (regular) and
|
|
19
|
+
* "colored" (RGB-allocated) sub-balances. The wallet UI only surfaces the
|
|
20
|
+
* vanilla portion as the BTC asset's balance — colored sats are accounted
|
|
21
|
+
* for under each RGB asset's own balance. Locks the policy: don't show
|
|
22
|
+
* colored sats as spendable BTC.
|
|
23
|
+
*/
|
|
24
|
+
export function convertBtcBalance(btcBalance) {
|
|
25
|
+
const vanilla = btcBalance.vanilla ?? { settled: 0, future: 0, spendable: 0 };
|
|
26
|
+
return {
|
|
27
|
+
total: vanilla.settled || 0,
|
|
28
|
+
available: vanilla.spendable || 0,
|
|
29
|
+
pending: vanilla.future || 0,
|
|
30
|
+
totalDisplay: formatAmount(vanilla.settled || 0, 8),
|
|
31
|
+
availableDisplay: formatAmount(vanilla.spendable || 0, 8),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* `wallet.getAssetBalance(assetId)` returns the per-asset SDK balance.
|
|
36
|
+
* Exposes the off-chain inbound/outbound capacities — both shown in the
|
|
37
|
+
* channel-aware balance breakdown — and treats `offchain_outbound` as
|
|
38
|
+
* `locked` for legacy callers that don't know about the off-chain split.
|
|
39
|
+
*/
|
|
40
|
+
export function convertSdkBalance(balance, precision = 8) {
|
|
41
|
+
return {
|
|
42
|
+
total: balance.settled || 0,
|
|
43
|
+
available: balance.spendable || 0,
|
|
44
|
+
pending: balance.future || 0,
|
|
45
|
+
locked: balance.offchain_outbound || 0,
|
|
46
|
+
offchain_outbound: balance.offchain_outbound || 0,
|
|
47
|
+
offchain_inbound: balance.offchain_inbound || 0,
|
|
48
|
+
totalDisplay: formatAmount(balance.settled || 0, precision),
|
|
49
|
+
availableDisplay: formatAmount(balance.spendable || 0, precision),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* `client.rln.listAssets()` returns balance as a plain `Record<string, number>`
|
|
54
|
+
* — same field names as the SDK shape but flatter and `undefined`-safe.
|
|
55
|
+
* Same projection as `convertSdkBalance` but no required-field assumptions.
|
|
56
|
+
*/
|
|
57
|
+
export function convertNodeBalance(balance, precision = 8) {
|
|
58
|
+
const total = balance?.settled || 0;
|
|
59
|
+
const available = balance?.spendable || 0;
|
|
60
|
+
const pending = balance?.future || 0;
|
|
61
|
+
return {
|
|
62
|
+
total,
|
|
63
|
+
available,
|
|
64
|
+
pending,
|
|
65
|
+
locked: balance?.offchain_outbound || 0,
|
|
66
|
+
offchain_outbound: balance?.offchain_outbound || 0,
|
|
67
|
+
offchain_inbound: balance?.offchain_inbound || 0,
|
|
68
|
+
totalDisplay: formatAmount(total, precision),
|
|
69
|
+
availableDisplay: formatAmount(available, precision),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// ── Asset converter ──────────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Build a `UnifiedAsset` from the raw `client.rln.listAssets()` payload.
|
|
75
|
+
* Precision defaults to 8 (BTC convention) when the node omits it —
|
|
76
|
+
* legacy assets pre-RGB20 sometimes don't carry an explicit precision.
|
|
77
|
+
*/
|
|
78
|
+
export function convertNodeAssetToUnified(asset) {
|
|
79
|
+
const precision = asset.precision ?? 8;
|
|
80
|
+
return {
|
|
81
|
+
id: asset.asset_id,
|
|
82
|
+
name: asset.name,
|
|
83
|
+
ticker: asset.ticker,
|
|
84
|
+
precision,
|
|
85
|
+
protocol: "RGB_LN",
|
|
86
|
+
layer: "RGB_LN",
|
|
87
|
+
balance: convertNodeBalance(asset.balance, precision),
|
|
88
|
+
capabilities: {
|
|
89
|
+
canSend: true,
|
|
90
|
+
canReceive: true,
|
|
91
|
+
canSwap: false,
|
|
92
|
+
supportsLightning: true,
|
|
93
|
+
supportsOnchain: true,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// ── Transaction converters ───────────────────────────────────────────────
|
|
98
|
+
// Three sources of RGB activity — on-chain transfers, lightning payments,
|
|
99
|
+
// and maker/taker swaps — project into the same `UnifiedTransaction` shape
|
|
100
|
+
// so the activity view doesn't have to render-switch on protocol details.
|
|
101
|
+
/**
|
|
102
|
+
* On-chain RGB transfer from `client.rln.listTransfers()`. `asset` is left
|
|
103
|
+
* as an empty placeholder; the caller (Activity view) joins on `asset_id`
|
|
104
|
+
* to populate it via the asset inventory.
|
|
105
|
+
*/
|
|
106
|
+
export function convertTransferToTransaction(transfer) {
|
|
107
|
+
return {
|
|
108
|
+
id: transfer.txid || `tx_${Date.now()}`,
|
|
109
|
+
type: mapTransferType(transfer.kind),
|
|
110
|
+
status: mapTransferStatus(transfer.status),
|
|
111
|
+
timestamp: transfer.created_at || Date.now(),
|
|
112
|
+
amount: transfer.amount || 0,
|
|
113
|
+
amountDisplay: formatAmount(transfer.amount || 0, 8),
|
|
114
|
+
fee: transfer.fee,
|
|
115
|
+
feeDisplay: formatAmount(transfer.fee || 0, 8),
|
|
116
|
+
asset: {}, // Would need to be populated
|
|
117
|
+
from: transfer.sender,
|
|
118
|
+
to: transfer.recipient,
|
|
119
|
+
protocolData: transfer,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Maker/taker swap entry from `client.rln.listSwaps()`. The same swap
|
|
124
|
+
* appears once per side — `side` distinguishes them in the rendered id
|
|
125
|
+
* so a maker and taker view of the same swap don't collide.
|
|
126
|
+
*
|
|
127
|
+
* Timestamp resolution: prefer `completed_at`, then `initiated_at`, then
|
|
128
|
+
* `requested_at` (all in seconds — converted to ms here).
|
|
129
|
+
*/
|
|
130
|
+
export function convertSwapToTransaction(swap, side) {
|
|
131
|
+
const paymentHash = swap.payment_hash || `swap_${Date.now()}`;
|
|
132
|
+
const requestedAt = swap.requested_at ?? 0;
|
|
133
|
+
const completedAt = swap.completed_at ?? null;
|
|
134
|
+
const initiatedAt = swap.initiated_at ?? null;
|
|
135
|
+
const tsSec = completedAt ?? initiatedAt ?? requestedAt;
|
|
136
|
+
const timestamp = tsSec ? tsSec * 1000 : Date.now();
|
|
137
|
+
const qtyFrom = Number(swap.qty_from ?? 0);
|
|
138
|
+
return {
|
|
139
|
+
id: `swap_${side}_${paymentHash}`,
|
|
140
|
+
type: "swap",
|
|
141
|
+
status: mapSwapStatus(swap.status),
|
|
142
|
+
timestamp,
|
|
143
|
+
amount: qtyFrom,
|
|
144
|
+
amountDisplay: formatAmount(qtyFrom, 8),
|
|
145
|
+
fee: 0,
|
|
146
|
+
feeDisplay: formatAmount(0, 8),
|
|
147
|
+
asset: {},
|
|
148
|
+
protocolData: { ...swap, side },
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Lightning payment entry from `client.rln.listPayments()`. Inbound vs
|
|
153
|
+
* outbound is determined by the `inbound` flag (we render as receive vs
|
|
154
|
+
* send). Amount resolution prefers `asset_amount` (for RGB-asset payments)
|
|
155
|
+
* then falls back to converting the BTC msat figure to sats.
|
|
156
|
+
*/
|
|
157
|
+
export function convertPaymentToTransaction(payment) {
|
|
158
|
+
const inbound = Boolean(payment.inbound);
|
|
159
|
+
const assetAmount = payment.asset_amount ?? null;
|
|
160
|
+
const amtMsat = payment.amt_msat ?? null;
|
|
161
|
+
const amount = assetAmount ?? (amtMsat ? Math.floor(amtMsat / 1000) : 0);
|
|
162
|
+
const timestamp = payment.created_at
|
|
163
|
+
? payment.created_at * 1000
|
|
164
|
+
: Date.now();
|
|
165
|
+
return {
|
|
166
|
+
id: payment.payment_hash || `pmt_${Date.now()}`,
|
|
167
|
+
type: inbound ? "receive" : "send",
|
|
168
|
+
status: mapPaymentStatus(payment.status),
|
|
169
|
+
timestamp,
|
|
170
|
+
amount,
|
|
171
|
+
amountDisplay: formatAmount(amount, 8),
|
|
172
|
+
fee: 0,
|
|
173
|
+
feeDisplay: formatAmount(0, 8),
|
|
174
|
+
asset: {},
|
|
175
|
+
to: payment.payee_pubkey,
|
|
176
|
+
protocolData: payment,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=rgb-converters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb-converters.js","sourceRoot":"","sources":["../../src/lib/rgb-converters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure fee-rate policy for RGB on-chain operations.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `RgbAdapter#resolveFeeRate` so the priority order +
|
|
5
|
+
* mainnet floors are unit-testable without a live RGB client.
|
|
6
|
+
*
|
|
7
|
+
* The policy ([GL #26]):
|
|
8
|
+
* 1. If the caller passed a positive `provided` rate, honour it. The
|
|
9
|
+
* advanced UI can override the floor when the user knows what they
|
|
10
|
+
* want.
|
|
11
|
+
* 2. Non-mainnet networks (regtest/signet/testnet/null/unknown):
|
|
12
|
+
* return `1 sat/vB`. Cheap, always confirms locally.
|
|
13
|
+
* 3. Mainnet: ask the node for an estimate at the urgency-mapped block
|
|
14
|
+
* target, floor at `MAINNET_FEE_FLOOR[urgency]` so a cold-started
|
|
15
|
+
* node returning `1 sat/vB` doesn't strand mainnet transactions.
|
|
16
|
+
* 4. Mainnet + estimate failure: return the floor.
|
|
17
|
+
*/
|
|
18
|
+
export type FeeUrgency = "low" | "normal" | "high";
|
|
19
|
+
/**
|
|
20
|
+
* Conservative mainnet floors (sat/vB). Well above the dust-attack rate
|
|
21
|
+
* but still cheap relative to any user-facing payment. Tuned for a
|
|
22
|
+
* typical 10-min-block target at "normal" urgency. Adjust here if
|
|
23
|
+
* mainnet conditions shift — every call site reads from this table.
|
|
24
|
+
*/
|
|
25
|
+
export declare const MAINNET_FEE_FLOOR: Record<FeeUrgency, number>;
|
|
26
|
+
export interface ResolveRgbFeeRateInput {
|
|
27
|
+
/** Caller-provided rate (advanced UI override). Wins when > 0. */
|
|
28
|
+
provided: number | undefined;
|
|
29
|
+
/** Urgency tier; maps to a block target + floor. */
|
|
30
|
+
urgency: FeeUrgency;
|
|
31
|
+
/** Active network from the adapter config. `null` = unknown / not connected. */
|
|
32
|
+
network: string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Async estimator. Receives the urgency-mapped block target. Should return
|
|
35
|
+
* the node's `fee_rate` in sat/vB, or `null` on failure. Failures must
|
|
36
|
+
* not throw — the policy needs a value to fall back on.
|
|
37
|
+
*/
|
|
38
|
+
estimateFn: (blocks: number) => Promise<number | null>;
|
|
39
|
+
}
|
|
40
|
+
export declare function resolveRgbFeeRatePolicy(input: ResolveRgbFeeRateInput): Promise<number>;
|
|
41
|
+
//# sourceMappingURL=rgb-fee-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb-fee-policy.d.ts","sourceRoot":"","sources":["../../src/lib/rgb-fee-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AASnD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIxD,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,oDAAoD;IACpD,OAAO,EAAE,UAAU,CAAC;IACpB,gFAAgF;IAChF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;OAIG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACxD;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5F"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure fee-rate policy for RGB on-chain operations.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `RgbAdapter#resolveFeeRate` so the priority order +
|
|
5
|
+
* mainnet floors are unit-testable without a live RGB client.
|
|
6
|
+
*
|
|
7
|
+
* The policy ([GL #26]):
|
|
8
|
+
* 1. If the caller passed a positive `provided` rate, honour it. The
|
|
9
|
+
* advanced UI can override the floor when the user knows what they
|
|
10
|
+
* want.
|
|
11
|
+
* 2. Non-mainnet networks (regtest/signet/testnet/null/unknown):
|
|
12
|
+
* return `1 sat/vB`. Cheap, always confirms locally.
|
|
13
|
+
* 3. Mainnet: ask the node for an estimate at the urgency-mapped block
|
|
14
|
+
* target, floor at `MAINNET_FEE_FLOOR[urgency]` so a cold-started
|
|
15
|
+
* node returning `1 sat/vB` doesn't strand mainnet transactions.
|
|
16
|
+
* 4. Mainnet + estimate failure: return the floor.
|
|
17
|
+
*/
|
|
18
|
+
/** Block-target mapping per urgency. high = next block, low = ~2 hours. */
|
|
19
|
+
const URGENCY_BLOCKS = {
|
|
20
|
+
high: 1,
|
|
21
|
+
normal: 6,
|
|
22
|
+
low: 12,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Conservative mainnet floors (sat/vB). Well above the dust-attack rate
|
|
26
|
+
* but still cheap relative to any user-facing payment. Tuned for a
|
|
27
|
+
* typical 10-min-block target at "normal" urgency. Adjust here if
|
|
28
|
+
* mainnet conditions shift — every call site reads from this table.
|
|
29
|
+
*/
|
|
30
|
+
export const MAINNET_FEE_FLOOR = {
|
|
31
|
+
low: 5,
|
|
32
|
+
normal: 10,
|
|
33
|
+
high: 25,
|
|
34
|
+
};
|
|
35
|
+
export async function resolveRgbFeeRatePolicy(input) {
|
|
36
|
+
const { provided, urgency, network, estimateFn } = input;
|
|
37
|
+
if (typeof provided === "number" && Number.isFinite(provided) && provided > 0) {
|
|
38
|
+
return provided;
|
|
39
|
+
}
|
|
40
|
+
const isMainnet = network === "mainnet";
|
|
41
|
+
if (!isMainnet) {
|
|
42
|
+
return 1;
|
|
43
|
+
}
|
|
44
|
+
const floor = MAINNET_FEE_FLOOR[urgency];
|
|
45
|
+
const blocks = URGENCY_BLOCKS[urgency];
|
|
46
|
+
const estimate = await estimateFn(blocks);
|
|
47
|
+
if (estimate == null || !Number.isFinite(estimate) || estimate <= 0) {
|
|
48
|
+
return floor;
|
|
49
|
+
}
|
|
50
|
+
return Math.max(Math.floor(estimate), floor);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=rgb-fee-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb-fee-policy.js","sourceRoot":"","sources":["../../src/lib/rgb-fee-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,2EAA2E;AAC3E,MAAM,cAAc,GAA+B;IACjD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,EAAE;CACR,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA+B;IAC3D,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;CACT,CAAC;AAiBF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAA6B;IACzE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACzD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for the RGB adapter.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from src/protocols/rgb/adapter.ts so the adapter file can stay
|
|
5
|
+
* focused on the IProtocolAdapter surface + SDK orchestration. Everything in
|
|
6
|
+
* this module is side-effect free, has no `this` dependencies, and is
|
|
7
|
+
* covered by tests/unit/rgb-helpers.test.ts.
|
|
8
|
+
*
|
|
9
|
+
* Adding to this module: keep helpers pure (no class state, no SDK calls).
|
|
10
|
+
* Anything that needs the kaleido SDK client or the adapter's own config
|
|
11
|
+
* belongs in adapter.ts.
|
|
12
|
+
*/
|
|
13
|
+
import type { TransactionStatus, TransactionType } from "../types/base.js";
|
|
14
|
+
/**
|
|
15
|
+
* Render a raw integer amount in the asset's display precision.
|
|
16
|
+
* Always emits `precision` fractional digits — the caller can trim trailing
|
|
17
|
+
* zeros if it wants a tighter rendering.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatAmount(amount: number, precision: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* Map the SDK's transfer `kind` field to our unified TransactionType.
|
|
22
|
+
*
|
|
23
|
+
* The SDK is inconsistent about case + naming — both raw lowercase strings
|
|
24
|
+
* and PascalCase ("ReceiveAsset", "SendAsset") have been observed. Defaults
|
|
25
|
+
* to "send" for unknown / undefined input so legacy entries don't display
|
|
26
|
+
* as a confusing third state.
|
|
27
|
+
*/
|
|
28
|
+
export declare function mapTransferType(kind?: string): TransactionType;
|
|
29
|
+
/**
|
|
30
|
+
* Map the SDK's transfer status string to our unified TransactionStatus.
|
|
31
|
+
*
|
|
32
|
+
* SDK casing has drifted between releases; we accept both. "WaitingCounterparty"
|
|
33
|
+
* is RGB-specific (lightning transfer waiting on the receiver) and maps to
|
|
34
|
+
* pending so the UI keeps showing the spinner rather than green-checking too
|
|
35
|
+
* early.
|
|
36
|
+
*/
|
|
37
|
+
export declare function mapTransferStatus(status?: string): TransactionStatus;
|
|
38
|
+
/**
|
|
39
|
+
* Map a Lightning-payment status string to our unified TransactionStatus.
|
|
40
|
+
*
|
|
41
|
+
* Three variants of "succeeded" have shown up in the SDK across versions —
|
|
42
|
+
* we accept all three to insulate the wallet UI from upstream churn.
|
|
43
|
+
*/
|
|
44
|
+
export declare function mapPaymentStatus(status?: string): TransactionStatus;
|
|
45
|
+
/**
|
|
46
|
+
* Map a maker/taker swap status string to our unified TransactionStatus.
|
|
47
|
+
*
|
|
48
|
+
* The SDK historically returned PascalCase ("Completed") and lowercase
|
|
49
|
+
* ("completed", "success", "error") interchangeably depending on whether
|
|
50
|
+
* the response came from the maker or taker side. The mapper accepts both
|
|
51
|
+
* so a refactor of the SDK doesn't quietly flip swaps to "pending".
|
|
52
|
+
*/
|
|
53
|
+
export declare function mapSwapStatus(status?: string): TransactionStatus;
|
|
54
|
+
//# sourceMappingURL=rgb-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/rgb-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAKnE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAKhE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for the RGB adapter.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from src/protocols/rgb/adapter.ts so the adapter file can stay
|
|
5
|
+
* focused on the IProtocolAdapter surface + SDK orchestration. Everything in
|
|
6
|
+
* this module is side-effect free, has no `this` dependencies, and is
|
|
7
|
+
* covered by tests/unit/rgb-helpers.test.ts.
|
|
8
|
+
*
|
|
9
|
+
* Adding to this module: keep helpers pure (no class state, no SDK calls).
|
|
10
|
+
* Anything that needs the kaleido SDK client or the adapter's own config
|
|
11
|
+
* belongs in adapter.ts.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Render a raw integer amount in the asset's display precision.
|
|
15
|
+
* Always emits `precision` fractional digits — the caller can trim trailing
|
|
16
|
+
* zeros if it wants a tighter rendering.
|
|
17
|
+
*/
|
|
18
|
+
export function formatAmount(amount, precision) {
|
|
19
|
+
return (amount / Math.pow(10, precision)).toFixed(precision);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Map the SDK's transfer `kind` field to our unified TransactionType.
|
|
23
|
+
*
|
|
24
|
+
* The SDK is inconsistent about case + naming — both raw lowercase strings
|
|
25
|
+
* and PascalCase ("ReceiveAsset", "SendAsset") have been observed. Defaults
|
|
26
|
+
* to "send" for unknown / undefined input so legacy entries don't display
|
|
27
|
+
* as a confusing third state.
|
|
28
|
+
*/
|
|
29
|
+
export function mapTransferType(kind) {
|
|
30
|
+
if (!kind)
|
|
31
|
+
return "send";
|
|
32
|
+
if (kind.includes("receive") || kind.includes("ReceiveAsset"))
|
|
33
|
+
return "receive";
|
|
34
|
+
if (kind.includes("send") || kind.includes("SendAsset"))
|
|
35
|
+
return "send";
|
|
36
|
+
return "send";
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Map the SDK's transfer status string to our unified TransactionStatus.
|
|
40
|
+
*
|
|
41
|
+
* SDK casing has drifted between releases; we accept both. "WaitingCounterparty"
|
|
42
|
+
* is RGB-specific (lightning transfer waiting on the receiver) and maps to
|
|
43
|
+
* pending so the UI keeps showing the spinner rather than green-checking too
|
|
44
|
+
* early.
|
|
45
|
+
*/
|
|
46
|
+
export function mapTransferStatus(status) {
|
|
47
|
+
if (!status)
|
|
48
|
+
return "pending";
|
|
49
|
+
if (status === "Settled" || status === "settled")
|
|
50
|
+
return "confirmed";
|
|
51
|
+
if (status === "Failed" || status === "failed")
|
|
52
|
+
return "failed";
|
|
53
|
+
if (status === "WaitingCounterparty")
|
|
54
|
+
return "pending";
|
|
55
|
+
return "pending";
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Map a Lightning-payment status string to our unified TransactionStatus.
|
|
59
|
+
*
|
|
60
|
+
* Three variants of "succeeded" have shown up in the SDK across versions —
|
|
61
|
+
* we accept all three to insulate the wallet UI from upstream churn.
|
|
62
|
+
*/
|
|
63
|
+
export function mapPaymentStatus(status) {
|
|
64
|
+
if (!status)
|
|
65
|
+
return "pending";
|
|
66
|
+
if (status === "succeeded" || status === "success" || status === "Succeeded")
|
|
67
|
+
return "confirmed";
|
|
68
|
+
if (status === "failed" || status === "Failed")
|
|
69
|
+
return "failed";
|
|
70
|
+
return "pending";
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Map a maker/taker swap status string to our unified TransactionStatus.
|
|
74
|
+
*
|
|
75
|
+
* The SDK historically returned PascalCase ("Completed") and lowercase
|
|
76
|
+
* ("completed", "success", "error") interchangeably depending on whether
|
|
77
|
+
* the response came from the maker or taker side. The mapper accepts both
|
|
78
|
+
* so a refactor of the SDK doesn't quietly flip swaps to "pending".
|
|
79
|
+
*/
|
|
80
|
+
export function mapSwapStatus(status) {
|
|
81
|
+
if (!status)
|
|
82
|
+
return "pending";
|
|
83
|
+
if (status === "completed" || status === "success" || status === "Completed")
|
|
84
|
+
return "confirmed";
|
|
85
|
+
if (status === "failed" || status === "error" || status === "Failed")
|
|
86
|
+
return "failed";
|
|
87
|
+
return "pending";
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=rgb-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb-helpers.js","sourceRoot":"","sources":["../../src/lib/rgb-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,SAAiB;IAC5D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,SAAS,CAAC;IAChF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,MAAM,CAAC;IACvE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IACrE,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAChE,IAAI,MAAM,KAAK,qBAAqB;QAAE,OAAO,SAAS,CAAC;IACvD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACjG,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAChE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACjG,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACtF,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TransactionFilter } from '../types/base.js';
|
|
2
|
+
export declare const DEFAULT_SPARK_ACTIVITY_LIMIT = 50;
|
|
3
|
+
export declare const DEFAULT_SPARK_ACTIVITY_LOOKBACK_DAYS = 180;
|
|
4
|
+
export declare function buildSparkActivityFilter(overrides?: Partial<TransactionFilter>): TransactionFilter;
|
|
5
|
+
//# sourceMappingURL=spark-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spark-activity.d.ts","sourceRoot":"","sources":["../../src/lib/spark-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAItD,eAAO,MAAM,4BAA4B,KAAK,CAAA;AAC9C,eAAO,MAAM,oCAAoC,MAAM,CAAA;AAEvD,wBAAgB,wBAAwB,CACtC,SAAS,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACzC,iBAAiB,CAMnB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
2
|
+
export const DEFAULT_SPARK_ACTIVITY_LIMIT = 50;
|
|
3
|
+
export const DEFAULT_SPARK_ACTIVITY_LOOKBACK_DAYS = 180;
|
|
4
|
+
export function buildSparkActivityFilter(overrides = {}) {
|
|
5
|
+
return {
|
|
6
|
+
limit: DEFAULT_SPARK_ACTIVITY_LIMIT,
|
|
7
|
+
fromTimestamp: Date.now() - DEFAULT_SPARK_ACTIVITY_LOOKBACK_DAYS * DAY_MS,
|
|
8
|
+
...overrides,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=spark-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spark-activity.js","sourceRoot":"","sources":["../../src/lib/spark-activity.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAElC,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAA;AAC9C,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAA;AAEvD,MAAM,UAAU,wBAAwB,CACtC,YAAwC,EAAE;IAE1C,OAAO;QACL,KAAK,EAAE,4BAA4B;QACnC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,oCAAoC,GAAG,MAAM;QACzE,GAAG,SAAS;KACb,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-adapter cache for `wallet.getBalance()`.
|
|
3
|
+
*
|
|
4
|
+
* The dashboard render issues `getNodeInfo`, `getBtcBalance` and
|
|
5
|
+
* `listAssets` back-to-back, and all three want the same balance snapshot.
|
|
6
|
+
* Without this cache, three sequential Spark hangs is the worst-case
|
|
7
|
+
* load latency when the gateway is slow. With it, concurrent callers within
|
|
8
|
+
* a 3 s window share a single RPC.
|
|
9
|
+
*
|
|
10
|
+
* Errors are NOT cached — the next caller after a failure retries fresh.
|
|
11
|
+
* Empty snapshots (Spark still syncing on cold start) get a much shorter
|
|
12
|
+
* TTL than populated ones, so the UI doesn't get stuck on "0 sats" while
|
|
13
|
+
* the wallet syncs.
|
|
14
|
+
*/
|
|
15
|
+
import { sparkClientManager } from './spark-client-manager.js';
|
|
16
|
+
/**
|
|
17
|
+
* Default timeout (ms) for Spark RPC calls that hit the Flashnet/Spark
|
|
18
|
+
* gateway. The Spark SDK's own timeout is 30 s; that's too long when the
|
|
19
|
+
* upstream returns HTTP 520/524 — it freezes the wallet UI. Fail fast so
|
|
20
|
+
* callers can recover.
|
|
21
|
+
*/
|
|
22
|
+
export declare const SPARK_RPC_TIMEOUT_MS = 8000;
|
|
23
|
+
/**
|
|
24
|
+
* Short coalescing window for `wallet.getBalance()`. Collapses the burst of
|
|
25
|
+
* simultaneous reads from a single dashboard render into one RPC.
|
|
26
|
+
*/
|
|
27
|
+
export declare const SPARK_BALANCE_CACHE_TTL_MS = 3000;
|
|
28
|
+
/**
|
|
29
|
+
* Cold-start TTL for an empty balance snapshot. The Spark SDK reports
|
|
30
|
+
* `{ balance: 0n, tokenBalances: empty }` while it's still syncing the
|
|
31
|
+
* wallet — caching that for the full 3 s window strands the UI on
|
|
32
|
+
* "0 sats" even after the sync completes. Using a tighter TTL for empty
|
|
33
|
+
* results lets the next dashboard render re-query quickly.
|
|
34
|
+
*/
|
|
35
|
+
export declare const SPARK_EMPTY_BALANCE_TTL_MS = 500;
|
|
36
|
+
export type SparkWalletInstance = ReturnType<typeof sparkClientManager.getWallet>;
|
|
37
|
+
export type SparkBalanceSnapshot = Awaited<ReturnType<SparkWalletInstance['getBalance']>>;
|
|
38
|
+
/**
|
|
39
|
+
* Fetch `wallet.getBalance()` with same-tick dedupe + a small TTL cache.
|
|
40
|
+
* Concurrent callers within the active TTL share the same RPC, so a single
|
|
41
|
+
* dashboard render only ever hits the gateway once.
|
|
42
|
+
*
|
|
43
|
+
* Empty-balance snapshots (Spark still syncing) get a much shorter TTL
|
|
44
|
+
* than populated ones — see SPARK_EMPTY_BALANCE_TTL_MS.
|
|
45
|
+
*
|
|
46
|
+
* Errors are NOT cached — the next caller after a failure retries fresh.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getSparkBalanceCached(wallet: SparkWalletInstance): Promise<SparkBalanceSnapshot>;
|
|
49
|
+
/** Drop the in-adapter balance cache (call after a send/receive completes). */
|
|
50
|
+
export declare function invalidateSparkBalanceCache(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Test-only: drop both the cached value and any in-flight request.
|
|
53
|
+
* Production code should use `invalidateSparkBalanceCache()` — it leaves
|
|
54
|
+
* an in-flight request running so its eventual settlement re-populates the
|
|
55
|
+
* cache instead of double-fetching.
|
|
56
|
+
*/
|
|
57
|
+
export declare function _resetSparkBalanceCacheForTests(): void;
|
|
58
|
+
//# sourceMappingURL=spark-balance-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spark-balance-cache.d.ts","sourceRoot":"","sources":["../../src/lib/spark-balance-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAG3D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,OAAQ,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,0BAA0B,OAAQ,CAAA;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAE7C,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAA;AACjF,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;AAKzF;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAuB/B;AAED,+EAA+E;AAC/E,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAGtD"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-adapter cache for `wallet.getBalance()`.
|
|
3
|
+
*
|
|
4
|
+
* The dashboard render issues `getNodeInfo`, `getBtcBalance` and
|
|
5
|
+
* `listAssets` back-to-back, and all three want the same balance snapshot.
|
|
6
|
+
* Without this cache, three sequential Spark hangs is the worst-case
|
|
7
|
+
* load latency when the gateway is slow. With it, concurrent callers within
|
|
8
|
+
* a 3 s window share a single RPC.
|
|
9
|
+
*
|
|
10
|
+
* Errors are NOT cached — the next caller after a failure retries fresh.
|
|
11
|
+
* Empty snapshots (Spark still syncing on cold start) get a much shorter
|
|
12
|
+
* TTL than populated ones, so the UI doesn't get stuck on "0 sats" while
|
|
13
|
+
* the wallet syncs.
|
|
14
|
+
*/
|
|
15
|
+
import { isEmptyBalance, withTimeout } from './spark-helpers.js';
|
|
16
|
+
/**
|
|
17
|
+
* Default timeout (ms) for Spark RPC calls that hit the Flashnet/Spark
|
|
18
|
+
* gateway. The Spark SDK's own timeout is 30 s; that's too long when the
|
|
19
|
+
* upstream returns HTTP 520/524 — it freezes the wallet UI. Fail fast so
|
|
20
|
+
* callers can recover.
|
|
21
|
+
*/
|
|
22
|
+
export const SPARK_RPC_TIMEOUT_MS = 8000;
|
|
23
|
+
/**
|
|
24
|
+
* Short coalescing window for `wallet.getBalance()`. Collapses the burst of
|
|
25
|
+
* simultaneous reads from a single dashboard render into one RPC.
|
|
26
|
+
*/
|
|
27
|
+
export const SPARK_BALANCE_CACHE_TTL_MS = 3000;
|
|
28
|
+
/**
|
|
29
|
+
* Cold-start TTL for an empty balance snapshot. The Spark SDK reports
|
|
30
|
+
* `{ balance: 0n, tokenBalances: empty }` while it's still syncing the
|
|
31
|
+
* wallet — caching that for the full 3 s window strands the UI on
|
|
32
|
+
* "0 sats" even after the sync completes. Using a tighter TTL for empty
|
|
33
|
+
* results lets the next dashboard render re-query quickly.
|
|
34
|
+
*/
|
|
35
|
+
export const SPARK_EMPTY_BALANCE_TTL_MS = 500;
|
|
36
|
+
let cachedBalance = null;
|
|
37
|
+
let inflightBalance = null;
|
|
38
|
+
/**
|
|
39
|
+
* Fetch `wallet.getBalance()` with same-tick dedupe + a small TTL cache.
|
|
40
|
+
* Concurrent callers within the active TTL share the same RPC, so a single
|
|
41
|
+
* dashboard render only ever hits the gateway once.
|
|
42
|
+
*
|
|
43
|
+
* Empty-balance snapshots (Spark still syncing) get a much shorter TTL
|
|
44
|
+
* than populated ones — see SPARK_EMPTY_BALANCE_TTL_MS.
|
|
45
|
+
*
|
|
46
|
+
* Errors are NOT cached — the next caller after a failure retries fresh.
|
|
47
|
+
*/
|
|
48
|
+
export async function getSparkBalanceCached(wallet) {
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
if (cachedBalance) {
|
|
51
|
+
const ttl = isEmptyBalance(cachedBalance.value)
|
|
52
|
+
? SPARK_EMPTY_BALANCE_TTL_MS
|
|
53
|
+
: SPARK_BALANCE_CACHE_TTL_MS;
|
|
54
|
+
if (now - cachedBalance.fetchedAt < ttl) {
|
|
55
|
+
return cachedBalance.value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (inflightBalance)
|
|
59
|
+
return inflightBalance;
|
|
60
|
+
inflightBalance = (async () => {
|
|
61
|
+
try {
|
|
62
|
+
const value = await withTimeout(wallet.getBalance(), SPARK_RPC_TIMEOUT_MS, 'spark.getBalance');
|
|
63
|
+
cachedBalance = { value, fetchedAt: Date.now() };
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
inflightBalance = null;
|
|
68
|
+
}
|
|
69
|
+
})();
|
|
70
|
+
return inflightBalance;
|
|
71
|
+
}
|
|
72
|
+
/** Drop the in-adapter balance cache (call after a send/receive completes). */
|
|
73
|
+
export function invalidateSparkBalanceCache() {
|
|
74
|
+
cachedBalance = null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Test-only: drop both the cached value and any in-flight request.
|
|
78
|
+
* Production code should use `invalidateSparkBalanceCache()` — it leaves
|
|
79
|
+
* an in-flight request running so its eventual settlement re-populates the
|
|
80
|
+
* cache instead of double-fetching.
|
|
81
|
+
*/
|
|
82
|
+
export function _resetSparkBalanceCacheForTests() {
|
|
83
|
+
cachedBalance = null;
|
|
84
|
+
inflightBalance = null;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=spark-balance-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spark-balance-cache.js","sourceRoot":"","sources":["../../src/lib/spark-balance-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAK,CAAA;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAK,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAA;AAK7C,IAAI,aAAa,GAA8D,IAAI,CAAA;AACnF,IAAI,eAAe,GAAyC,IAAI,CAAA;AAEhE;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC;YAC7C,CAAC,CAAC,0BAA0B;YAC5B,CAAC,CAAC,0BAA0B,CAAA;QAC9B,IAAI,GAAG,GAAG,aAAa,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC,KAAK,CAAA;QAC5B,CAAC;IACH,CAAC;IACD,IAAI,eAAe;QAAE,OAAO,eAAe,CAAA;IAE3C,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,oBAAoB,EAAE,kBAAkB,CAAC,CAAA;YAC9F,aAAa,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;YAChD,OAAO,KAAK,CAAA;QACd,CAAC;gBAAS,CAAC;YACT,eAAe,GAAG,IAAI,CAAA;QACxB,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,2BAA2B;IACzC,aAAa,GAAG,IAAI,CAAA;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B;IAC7C,aAAa,GAAG,IAAI,CAAA;IACpB,eAAe,GAAG,IAAI,CAAA;AACxB,CAAC"}
|