@kaleidorg/wallet-engine 1.0.0-beta.30 → 1.0.0-beta.32

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 (49) hide show
  1. package/dist/adapters/ArkadeAdapter.d.ts +78 -15
  2. package/dist/adapters/ArkadeAdapter.d.ts.map +1 -1
  3. package/dist/adapters/ArkadeAdapter.js +652 -162
  4. package/dist/adapters/ArkadeAdapter.js.map +1 -1
  5. package/dist/adapters/native.d.ts +1 -0
  6. package/dist/adapters/native.d.ts.map +1 -1
  7. package/dist/adapters/native.js +1 -0
  8. package/dist/adapters/native.js.map +1 -1
  9. package/dist/adapters/wdk/RgbLibWasmAdapter.d.ts +14 -0
  10. package/dist/adapters/wdk/RgbLibWasmAdapter.d.ts.map +1 -1
  11. package/dist/adapters/wdk/RgbLibWasmAdapter.js +30 -0
  12. package/dist/adapters/wdk/RgbLibWasmAdapter.js.map +1 -1
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +5 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/lib/arkade-client-manager.d.ts +64 -24
  18. package/dist/lib/arkade-client-manager.d.ts.map +1 -1
  19. package/dist/lib/arkade-client-manager.js +240 -65
  20. package/dist/lib/arkade-client-manager.js.map +1 -1
  21. package/dist/lib/arkade-converters.d.ts +39 -0
  22. package/dist/lib/arkade-converters.d.ts.map +1 -0
  23. package/dist/lib/arkade-converters.js +148 -0
  24. package/dist/lib/arkade-converters.js.map +1 -0
  25. package/dist/lib/arkade-helpers.d.ts +110 -0
  26. package/dist/lib/arkade-helpers.d.ts.map +1 -0
  27. package/dist/lib/arkade-helpers.js +227 -0
  28. package/dist/lib/arkade-helpers.js.map +1 -0
  29. package/dist/lib/arkade-swaps-client-manager.d.ts +55 -0
  30. package/dist/lib/arkade-swaps-client-manager.d.ts.map +1 -0
  31. package/dist/lib/arkade-swaps-client-manager.js +127 -0
  32. package/dist/lib/arkade-swaps-client-manager.js.map +1 -0
  33. package/dist/lib/arkade-vtxo-lifecycle.d.ts +116 -0
  34. package/dist/lib/arkade-vtxo-lifecycle.d.ts.map +1 -0
  35. package/dist/lib/arkade-vtxo-lifecycle.js +184 -0
  36. package/dist/lib/arkade-vtxo-lifecycle.js.map +1 -0
  37. package/dist/lib/ln-message-sign.d.ts +20 -0
  38. package/dist/lib/ln-message-sign.d.ts.map +1 -0
  39. package/dist/lib/ln-message-sign.js +90 -0
  40. package/dist/lib/ln-message-sign.js.map +1 -0
  41. package/dist/lib/log.d.ts +15 -0
  42. package/dist/lib/log.d.ts.map +1 -0
  43. package/dist/lib/log.js +16 -0
  44. package/dist/lib/log.js.map +1 -0
  45. package/dist/lib/zbase32.d.ts +3 -0
  46. package/dist/lib/zbase32.d.ts.map +1 -0
  47. package/dist/lib/zbase32.js +64 -0
  48. package/dist/lib/zbase32.js.map +1 -0
  49. package/package.json +8 -3
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Pure helpers for the Arkade adapter.
3
+ *
4
+ * Every function here is side-effect free, has no `this` dependencies, and is
5
+ * covered by test/arkade-helpers.test.ts. Keep helpers pure (no class state,
6
+ * no SDK calls). Anything that needs the @arkade-os/sdk client or the adapter's
7
+ * config belongs in ArkadeAdapter.ts.
8
+ */
9
+ /** Coerce a value to a finite number. Returns 0 for anything unparseable. */
10
+ export declare function toNumber(value: unknown): number;
11
+ /**
12
+ * Coerce a value to a strictly-positive bigint. Returns 0n for
13
+ * non-positive / unparseable input. Used where the SDK demands a
14
+ * bigint quantity (e.g. asset send amounts) and we don't want to
15
+ * silently send zero on a malformed numeric input.
16
+ */
17
+ export declare function toPositiveIntegerBigInt(value: unknown): bigint;
18
+ /** Coerce to a string, or empty string for any non-string. */
19
+ export declare function toStringValue(value: unknown): string;
20
+ /** Pull the metadata sub-object out of an asset-details response. */
21
+ export declare function getAssetMetadata(details: Record<string, unknown> | null): Record<string, unknown> | undefined;
22
+ /**
23
+ * Asset display precision (number of decimal places). Reads `metadata.decimals`,
24
+ * accepting both numeric and stringy values. Falls back to 0 (integer asset)
25
+ * when absent / negative / non-finite — Arkade assets without an explicit
26
+ * decimals field are integer-quantity tokens by convention.
27
+ */
28
+ export declare function getAssetPrecision(metadata: Record<string, unknown> | undefined): number;
29
+ /**
30
+ * Asset ticker for display. Uses `metadata.ticker` when present (uppercased,
31
+ * trimmed); falls back to the first 6 chars of the asset id, uppercased —
32
+ * this is the "best effort label" path for newly-issued or partially-
33
+ * documented assets.
34
+ */
35
+ export declare function getAssetTicker(assetId: string, metadata: Record<string, unknown> | undefined): string;
36
+ /**
37
+ * Asset display name. Uses `metadata.name` when present, otherwise builds a
38
+ * synthetic `"Arkade Asset <TICKER>"` label so the UI never has to render
39
+ * an empty string.
40
+ */
41
+ export declare function getAssetName(assetId: string, ticker: string, metadata: Record<string, unknown> | undefined): string;
42
+ /**
43
+ * Render a satoshi integer as BTC with exactly 8 decimals. Used for the
44
+ * Arkade BTC display strings (asset balances + tx amounts). Always emits
45
+ * 8 decimal digits — callers that want a tighter rendering must post-process.
46
+ */
47
+ export declare function formatSats(sats: number): string;
48
+ /**
49
+ * Render a raw integer amount in the asset's display precision. Mirrors
50
+ * `formatSats` semantics for arbitrary precision; integer-precision assets
51
+ * (precision <= 0) render without a decimal point.
52
+ */
53
+ export declare function formatUnits(amount: number, precision: number): string;
54
+ /**
55
+ * Sort VTXOs by batchExpiry ascending (expiry-first coin selection).
56
+ * VTXOs expiring soonest are consumed first, maximizing the lifetime
57
+ * of remaining VTXOs and reducing the need for auto-renewal rounds.
58
+ *
59
+ * Stable secondary sort on `value` (descending) so when two VTXOs share
60
+ * the same batch expiry we prefer the larger one — fewer inputs in the
61
+ * resulting transaction means a smaller fee.
62
+ */
63
+ export declare function sortVtxosByExpiry<T extends {
64
+ virtualStatus?: {
65
+ batchExpiry?: number;
66
+ };
67
+ value?: number | bigint;
68
+ }>(vtxos: T[]): T[];
69
+ /**
70
+ * Pure expiry-first selector. Picks the minimum set of VTXOs (sorted by
71
+ * expiry, value-desc tiebreaker) whose summed value covers `targetSats`.
72
+ * Returns `null` when the available VTXOs can't cover the target — the
73
+ * caller should let the SDK error so the user gets a real "insufficient
74
+ * funds" message rather than a half-formed selection.
75
+ */
76
+ export declare function selectVtxosByExpiry<T extends {
77
+ virtualStatus?: {
78
+ batchExpiry?: number;
79
+ };
80
+ value?: number | bigint;
81
+ }>(vtxos: T[], targetSats: number): T[] | null;
82
+ export interface NormalizedVtxo {
83
+ txid: string;
84
+ vout: number;
85
+ value: number;
86
+ state: string;
87
+ batchTxid?: string;
88
+ batchExpiry?: number;
89
+ createdAt?: number;
90
+ assets?: Array<{
91
+ assetId: string;
92
+ amount: number;
93
+ }>;
94
+ }
95
+ /**
96
+ * Coerce the SDK's loose `getVtxos()` response shape into the strict
97
+ * `NormalizedVtxo[]` the adapter consumes elsewhere.
98
+ *
99
+ * - Accepts both a bare array and `{ vtxos: [...] }` wrapper (the SDK
100
+ * has shipped both shapes across versions).
101
+ * - Pulls fields from the outer entry and, when missing, falls back to
102
+ * `entry.outpoint.{txid,vout}` — older shapes nested those.
103
+ * - Resolves `state` from `virtualStatus.state`, then `isSwept` /
104
+ * `isPreconfirmed` / `isSpent` flags, defaulting to "settled".
105
+ * - Drops zero-value entries, spent entries, and entries with no txid —
106
+ * callers can rely on the returned array containing only spendable-
107
+ * looking VTXOs.
108
+ */
109
+ export declare function normalizeVtxos(raw: unknown): NormalizedVtxo[];
110
+ //# sourceMappingURL=arkade-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkade-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/arkade-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ/C;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAY9D;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAOD,qEAAqE;AACrE,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAKrC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,CAYvF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5C,MAAM,CAMR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5C,MAAM,CAMR;AAID;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrE;AAID;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS;IAAE,aAAa,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAC/E,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CASjB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS;IAAE,aAAa,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAC/E,KAAK,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAW5C;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE,CAmD7D"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Pure helpers for the Arkade adapter.
3
+ *
4
+ * Every function here is side-effect free, has no `this` dependencies, and is
5
+ * covered by test/arkade-helpers.test.ts. Keep helpers pure (no class state,
6
+ * no SDK calls). Anything that needs the @arkade-os/sdk client or the adapter's
7
+ * config belongs in ArkadeAdapter.ts.
8
+ */
9
+ // ── Type coercion ──────────────────────────────────────────────────────────
10
+ // The Arkade SDK is loose about numeric types in some response shapes
11
+ // (bigint, number, numeric string). These helpers normalize without
12
+ // throwing — the alternative is sprinkling defensive `if (typeof …)` checks
13
+ // across the adapter.
14
+ /** Coerce a value to a finite number. Returns 0 for anything unparseable. */
15
+ export function toNumber(value) {
16
+ if (typeof value === "number" && Number.isFinite(value))
17
+ return value;
18
+ if (typeof value === "bigint")
19
+ return Number(value);
20
+ if (typeof value === "string" && value.trim() !== "") {
21
+ const parsed = Number(value);
22
+ return Number.isFinite(parsed) ? parsed : 0;
23
+ }
24
+ return 0;
25
+ }
26
+ /**
27
+ * Coerce a value to a strictly-positive bigint. Returns 0n for
28
+ * non-positive / unparseable input. Used where the SDK demands a
29
+ * bigint quantity (e.g. asset send amounts) and we don't want to
30
+ * silently send zero on a malformed numeric input.
31
+ */
32
+ export function toPositiveIntegerBigInt(value) {
33
+ if (typeof value === "bigint")
34
+ return value > 0n ? value : 0n;
35
+ if (typeof value === "number") {
36
+ if (!Number.isSafeInteger(value) || value <= 0)
37
+ return 0n;
38
+ return BigInt(value);
39
+ }
40
+ if (typeof value === "string") {
41
+ const trimmed = value.trim();
42
+ if (!/^[1-9]\d*$/.test(trimmed))
43
+ return 0n;
44
+ return BigInt(trimmed);
45
+ }
46
+ return 0n;
47
+ }
48
+ /** Coerce to a string, or empty string for any non-string. */
49
+ export function toStringValue(value) {
50
+ return typeof value === "string" ? value : "";
51
+ }
52
+ // ── Arkade asset metadata accessors ───────────────────────────────────────
53
+ // `details` shape comes from `wallet.assetManager.getAssetDetails(assetId)`.
54
+ // We defensively unwrap so the adapter doesn't have to spread type checks
55
+ // across every consumer.
56
+ /** Pull the metadata sub-object out of an asset-details response. */
57
+ export function getAssetMetadata(details) {
58
+ const metadata = details?.metadata;
59
+ return metadata && typeof metadata === "object"
60
+ ? metadata
61
+ : undefined;
62
+ }
63
+ /**
64
+ * Asset display precision (number of decimal places). Reads `metadata.decimals`,
65
+ * accepting both numeric and stringy values. Falls back to 0 (integer asset)
66
+ * when absent / negative / non-finite — Arkade assets without an explicit
67
+ * decimals field are integer-quantity tokens by convention.
68
+ */
69
+ export function getAssetPrecision(metadata) {
70
+ const decimals = metadata?.decimals;
71
+ if (typeof decimals === "number" && Number.isFinite(decimals) && decimals >= 0) {
72
+ return decimals;
73
+ }
74
+ if (typeof decimals === "string" && decimals.trim() !== "") {
75
+ const parsed = Number(decimals);
76
+ if (Number.isFinite(parsed) && parsed >= 0) {
77
+ return parsed;
78
+ }
79
+ }
80
+ return 0;
81
+ }
82
+ /**
83
+ * Asset ticker for display. Uses `metadata.ticker` when present (uppercased,
84
+ * trimmed); falls back to the first 6 chars of the asset id, uppercased —
85
+ * this is the "best effort label" path for newly-issued or partially-
86
+ * documented assets.
87
+ */
88
+ export function getAssetTicker(assetId, metadata) {
89
+ const ticker = metadata?.ticker;
90
+ if (typeof ticker === "string" && ticker.trim() !== "") {
91
+ return ticker.trim().toUpperCase();
92
+ }
93
+ return assetId.slice(0, 6).toUpperCase();
94
+ }
95
+ /**
96
+ * Asset display name. Uses `metadata.name` when present, otherwise builds a
97
+ * synthetic `"Arkade Asset <TICKER>"` label so the UI never has to render
98
+ * an empty string.
99
+ */
100
+ export function getAssetName(assetId, ticker, metadata) {
101
+ const name = metadata?.name;
102
+ if (typeof name === "string" && name.trim() !== "") {
103
+ return name.trim();
104
+ }
105
+ return `Arkade Asset ${ticker || assetId.slice(0, 6)}`;
106
+ }
107
+ // ── Display formatting ────────────────────────────────────────────────────
108
+ /**
109
+ * Render a satoshi integer as BTC with exactly 8 decimals. Used for the
110
+ * Arkade BTC display strings (asset balances + tx amounts). Always emits
111
+ * 8 decimal digits — callers that want a tighter rendering must post-process.
112
+ */
113
+ export function formatSats(sats) {
114
+ return (sats / 1e8).toFixed(8);
115
+ }
116
+ /**
117
+ * Render a raw integer amount in the asset's display precision. Mirrors
118
+ * `formatSats` semantics for arbitrary precision; integer-precision assets
119
+ * (precision <= 0) render without a decimal point.
120
+ */
121
+ export function formatUnits(amount, precision) {
122
+ if (precision <= 0)
123
+ return String(amount);
124
+ return (amount / Math.pow(10, precision)).toFixed(precision);
125
+ }
126
+ // ── VTXO selection (expiry-first) ──────────────────────────────────────────
127
+ /**
128
+ * Sort VTXOs by batchExpiry ascending (expiry-first coin selection).
129
+ * VTXOs expiring soonest are consumed first, maximizing the lifetime
130
+ * of remaining VTXOs and reducing the need for auto-renewal rounds.
131
+ *
132
+ * Stable secondary sort on `value` (descending) so when two VTXOs share
133
+ * the same batch expiry we prefer the larger one — fewer inputs in the
134
+ * resulting transaction means a smaller fee.
135
+ */
136
+ export function sortVtxosByExpiry(vtxos) {
137
+ return [...vtxos].sort((a, b) => {
138
+ const expiryA = a.virtualStatus?.batchExpiry ?? Infinity;
139
+ const expiryB = b.virtualStatus?.batchExpiry ?? Infinity;
140
+ if (expiryA !== expiryB)
141
+ return expiryA - expiryB;
142
+ const valueA = Number(a.value ?? 0);
143
+ const valueB = Number(b.value ?? 0);
144
+ return valueB - valueA;
145
+ });
146
+ }
147
+ /**
148
+ * Pure expiry-first selector. Picks the minimum set of VTXOs (sorted by
149
+ * expiry, value-desc tiebreaker) whose summed value covers `targetSats`.
150
+ * Returns `null` when the available VTXOs can't cover the target — the
151
+ * caller should let the SDK error so the user gets a real "insufficient
152
+ * funds" message rather than a half-formed selection.
153
+ */
154
+ export function selectVtxosByExpiry(vtxos, targetSats) {
155
+ if (targetSats <= 0)
156
+ return [];
157
+ const sorted = sortVtxosByExpiry(vtxos);
158
+ const selected = [];
159
+ let total = 0;
160
+ for (const vtxo of sorted) {
161
+ selected.push(vtxo);
162
+ total += Number(vtxo.value ?? 0);
163
+ if (total >= targetSats)
164
+ return selected;
165
+ }
166
+ return null;
167
+ }
168
+ /**
169
+ * Coerce the SDK's loose `getVtxos()` response shape into the strict
170
+ * `NormalizedVtxo[]` the adapter consumes elsewhere.
171
+ *
172
+ * - Accepts both a bare array and `{ vtxos: [...] }` wrapper (the SDK
173
+ * has shipped both shapes across versions).
174
+ * - Pulls fields from the outer entry and, when missing, falls back to
175
+ * `entry.outpoint.{txid,vout}` — older shapes nested those.
176
+ * - Resolves `state` from `virtualStatus.state`, then `isSwept` /
177
+ * `isPreconfirmed` / `isSpent` flags, defaulting to "settled".
178
+ * - Drops zero-value entries, spent entries, and entries with no txid —
179
+ * callers can rely on the returned array containing only spendable-
180
+ * looking VTXOs.
181
+ */
182
+ export function normalizeVtxos(raw) {
183
+ const entries = Array.isArray(raw)
184
+ ? raw
185
+ : Array.isArray(raw?.vtxos)
186
+ ? raw.vtxos
187
+ : [];
188
+ return entries
189
+ .filter((entry) => !!entry && typeof entry === "object")
190
+ .map((entry) => {
191
+ const outpoint = entry.outpoint ?? {};
192
+ const virtualStatus = entry.virtualStatus ?? {};
193
+ const txid = toStringValue(entry.txid) || toStringValue(outpoint.txid);
194
+ const vout = toNumber(entry.vout ?? outpoint.vout);
195
+ const value = toNumber(entry.value ?? entry.amount);
196
+ const state = toStringValue(virtualStatus.state) ||
197
+ (entry.isSwept ? "swept" : "") ||
198
+ (entry.isPreconfirmed ? "preconfirmed" : "") ||
199
+ (entry.isSpent ? "spent" : "") ||
200
+ "settled";
201
+ const batchTxid = toStringValue(virtualStatus.batchTxID) || toStringValue(virtualStatus.batchTxId);
202
+ const batchExpiry = toNumber(virtualStatus.batchExpiry);
203
+ const createdAtRaw = entry.createdAt;
204
+ const createdAt = createdAtRaw instanceof Date ? createdAtRaw.getTime() : toNumber(createdAtRaw);
205
+ const assets = Array.isArray(entry.assets)
206
+ ? entry.assets
207
+ .filter((asset) => !!asset && typeof asset === "object")
208
+ .map((asset) => ({
209
+ assetId: toStringValue(asset.assetId),
210
+ amount: toNumber(asset.amount),
211
+ }))
212
+ .filter((asset) => asset.assetId !== "" && asset.amount > 0)
213
+ : [];
214
+ return {
215
+ txid,
216
+ vout,
217
+ value,
218
+ state,
219
+ batchTxid: batchTxid || undefined,
220
+ batchExpiry: batchExpiry > 0 ? batchExpiry : undefined,
221
+ createdAt: createdAt > 0 ? createdAt : undefined,
222
+ assets: assets.length > 0 ? assets : undefined,
223
+ };
224
+ })
225
+ .filter((entry) => entry.txid !== "" && entry.value > 0 && entry.state !== "spent");
226
+ }
227
+ //# sourceMappingURL=arkade-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkade-helpers.js","sourceRoot":"","sources":["../../src/lib/arkade-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Arkade Swaps Client Manager
3
+ *
4
+ * Singleton that owns an `ArkadeSwaps` instance from `@arkade-os/boltz-swap`.
5
+ * Provides Boltz-based swaps between Arkade VTXOs and Lightning / on-chain BTC.
6
+ *
7
+ * Initialization is non-blocking: callers should attempt to use the client
8
+ * via `getClient()` and gracefully fall back when `isInitialized()` is false
9
+ * (e.g. on cold-start before the post-unlock init has finished).
10
+ *
11
+ * Lifecycle:
12
+ * - Arkade adapter connect → `initialize(wallet)`
13
+ * - Arkade adapter disconnect → `dispose()`
14
+ *
15
+ * The default repository is IndexedDB-backed so pending submarine / reverse /
16
+ * chain swaps survive a service-worker restart and are auto-claimed/refunded by
17
+ * the embedded `SwapManager`. Non-browser hosts (React Native) must inject a
18
+ * platform-appropriate `swapRepository` via `initialize(wallet, { swapRepository })`.
19
+ */
20
+ import { ArkadeSwaps } from "@arkade-os/boltz-swap";
21
+ import type { IWallet } from "@arkade-os/sdk";
22
+ type SwapsClient = InstanceType<typeof ArkadeSwaps>;
23
+ export interface ArkadeSwapsInitOptions {
24
+ dbName?: string;
25
+ /** Platform-supplied swap repository (required off-browser, e.g. React Native). */
26
+ swapRepository?: unknown;
27
+ }
28
+ declare class ArkadeSwapsClientManager {
29
+ private client;
30
+ /** Serializes concurrent initialize() calls. */
31
+ private _initPromise;
32
+ /** Generation of the in-flight _initPromise. */
33
+ private _initGeneration;
34
+ /** Bumped by dispose() to invalidate any in-flight init. */
35
+ private _generation;
36
+ /**
37
+ * Initialize the swaps client with a connected Arkade wallet.
38
+ * Concurrent calls that belong to the same generation share the in-flight
39
+ * promise. A dispose() between calls bumps the generation so the old
40
+ * in-flight is treated as stale and a fresh init is started.
41
+ */
42
+ initialize(wallet: IWallet, opts?: ArkadeSwapsInitOptions): Promise<void>;
43
+ private _doInitialize;
44
+ isInitialized(): boolean;
45
+ /** @throws if not initialized */
46
+ getClient(): SwapsClient;
47
+ /**
48
+ * Stop the embedded SwapManager and release resources. Safe to call when
49
+ * the client was never initialized.
50
+ */
51
+ dispose(): Promise<void>;
52
+ }
53
+ export declare const arkadeSwapsClientManager: ArkadeSwapsClientManager;
54
+ export {};
55
+ //# sourceMappingURL=arkade-swaps-client-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkade-swaps-client-manager.d.ts","sourceRoot":"","sources":["../../src/lib/arkade-swaps-client-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAA2B,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AAKpD,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,cAAM,wBAAwB;IAC5B,OAAO,CAAC,MAAM,CAA4B;IAC1C,gDAAgD;IAChD,OAAO,CAAC,YAAY,CAA8B;IAClD,gDAAgD;IAChD,OAAO,CAAC,eAAe,CAAK;IAC5B,4DAA4D;IAC5D,OAAO,CAAC,WAAW,CAAK;IAExB;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;YAmB3D,aAAa;IA4C3B,aAAa,IAAI,OAAO;IAIxB,iCAAiC;IACjC,SAAS,IAAI,WAAW;IAOxB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAa/B;AAED,eAAO,MAAM,wBAAwB,0BAAiC,CAAC"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Arkade Swaps Client Manager
3
+ *
4
+ * Singleton that owns an `ArkadeSwaps` instance from `@arkade-os/boltz-swap`.
5
+ * Provides Boltz-based swaps between Arkade VTXOs and Lightning / on-chain BTC.
6
+ *
7
+ * Initialization is non-blocking: callers should attempt to use the client
8
+ * via `getClient()` and gracefully fall back when `isInitialized()` is false
9
+ * (e.g. on cold-start before the post-unlock init has finished).
10
+ *
11
+ * Lifecycle:
12
+ * - Arkade adapter connect → `initialize(wallet)`
13
+ * - Arkade adapter disconnect → `dispose()`
14
+ *
15
+ * The default repository is IndexedDB-backed so pending submarine / reverse /
16
+ * chain swaps survive a service-worker restart and are auto-claimed/refunded by
17
+ * the embedded `SwapManager`. Non-browser hosts (React Native) must inject a
18
+ * platform-appropriate `swapRepository` via `initialize(wallet, { swapRepository })`.
19
+ */
20
+ import { ArkadeSwaps, IndexedDbSwapRepository } from "@arkade-os/boltz-swap";
21
+ import { log } from "./log.js";
22
+ /** Default IndexedDB database name for swap persistence. */
23
+ const DEFAULT_DB_NAME = "kaleidoswap-arkade-swaps";
24
+ class ArkadeSwapsClientManager {
25
+ constructor() {
26
+ this.client = null;
27
+ /** Serializes concurrent initialize() calls. */
28
+ this._initPromise = null;
29
+ /** Generation of the in-flight _initPromise. */
30
+ this._initGeneration = 0;
31
+ /** Bumped by dispose() to invalidate any in-flight init. */
32
+ this._generation = 0;
33
+ }
34
+ /**
35
+ * Initialize the swaps client with a connected Arkade wallet.
36
+ * Concurrent calls that belong to the same generation share the in-flight
37
+ * promise. A dispose() between calls bumps the generation so the old
38
+ * in-flight is treated as stale and a fresh init is started.
39
+ */
40
+ initialize(wallet, opts) {
41
+ if (this.client)
42
+ return Promise.resolve();
43
+ // Reuse in-flight promise only if it belongs to the current generation.
44
+ if (this._initPromise && this._initGeneration === this._generation) {
45
+ return this._initPromise;
46
+ }
47
+ const generation = this._generation;
48
+ this._initGeneration = generation;
49
+ const promise = this._doInitialize(wallet, generation, opts).finally(() => {
50
+ // Only clear if this promise is still the active one (prevents stale
51
+ // promises from clearing a newer in-flight init).
52
+ if (this._initPromise === promise && this._initGeneration === generation) {
53
+ this._initPromise = null;
54
+ }
55
+ });
56
+ this._initPromise = promise;
57
+ return this._initPromise;
58
+ }
59
+ async _doInitialize(wallet, generation, opts) {
60
+ try {
61
+ const swapRepository = opts?.swapRepository ?? new IndexedDbSwapRepository(opts?.dbName ?? DEFAULT_DB_NAME);
62
+ const client = await ArkadeSwaps.create({
63
+ wallet,
64
+ // The SwapManager monitors pending swaps in the background and
65
+ // auto-claims reverse swaps / auto-refunds failed submarine swaps.
66
+ swapManager: true,
67
+ swapRepository,
68
+ });
69
+ // Guard: dispose() may have been called while ArkadeSwaps.create was
70
+ // awaited. If the generation has changed the wallet is stale — discard.
71
+ if (generation !== this._generation) {
72
+ try {
73
+ await client.dispose();
74
+ }
75
+ catch {
76
+ /* ignore cleanup errors */
77
+ }
78
+ log.warn("[ArkadeSwapsClientManager] Stale init discarded (generation changed during ArkadeSwaps.create)");
79
+ return;
80
+ }
81
+ this.client = client;
82
+ log.info("[ArkadeSwapsClientManager] Initialized (Boltz swaps ready)");
83
+ }
84
+ catch (error) {
85
+ // Only clear client if this init's generation is still current (prevents
86
+ // a stale failed init from clearing a newer successful client).
87
+ if (generation === this._generation) {
88
+ this.client = null;
89
+ }
90
+ const msg = error instanceof Error ? error.message : String(error);
91
+ log.warn(`[ArkadeSwapsClientManager] Failed to initialize: ${msg}. Lightning swaps will be unavailable until reconnect.`);
92
+ throw error;
93
+ }
94
+ }
95
+ isInitialized() {
96
+ return this.client !== null;
97
+ }
98
+ /** @throws if not initialized */
99
+ getClient() {
100
+ if (!this.client) {
101
+ throw new Error("Arkade swaps client not initialized. Call initialize() first.");
102
+ }
103
+ return this.client;
104
+ }
105
+ /**
106
+ * Stop the embedded SwapManager and release resources. Safe to call when
107
+ * the client was never initialized.
108
+ */
109
+ async dispose() {
110
+ // Bump generation first so any in-flight _doInitialize sees the change
111
+ // even if ArkadeSwaps.create() has not returned yet.
112
+ this._generation++;
113
+ if (!this.client)
114
+ return;
115
+ try {
116
+ await this.client.dispose();
117
+ }
118
+ catch (error) {
119
+ log.warn("[ArkadeSwapsClientManager] Error during dispose:", error);
120
+ }
121
+ finally {
122
+ this.client = null;
123
+ }
124
+ }
125
+ }
126
+ export const arkadeSwapsClientManager = new ArkadeSwapsClientManager();
127
+ //# sourceMappingURL=arkade-swaps-client-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkade-swaps-client-manager.js","sourceRoot":"","sources":["../../src/lib/arkade-swaps-client-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Arkade VTXO Lifecycle + Delegator management (platform-agnostic core).
3
+ *
4
+ * This module is deliberately free of any platform API (`chrome.*`, timers,
5
+ * notifications, storage). Consumers drive it:
6
+ * - The browser extension runs `runArkadeVtxoLifecycle()` from a
7
+ * `chrome.alarms` tick and maps the result to `chrome.notifications` +
8
+ * runtime broadcasts via the `callbacks`.
9
+ * - React Native schedules it however it prefers.
10
+ *
11
+ * It covers:
12
+ * - VTXO auto-renewal — renew VTXOs approaching expiry
13
+ * - Orphan VTXO recovery — surface recoverable (swept/expired) balance
14
+ * - Boarding UTXO expiry — surface expired boarding UTXOs
15
+ * - VTXO delegation — delegate spendable VTXOs when enabled
16
+ *
17
+ * @arkade-os/sdk is referenced by TYPE only (erased at compile time), so this
18
+ * module is safe to export from the engine's root barrel.
19
+ */
20
+ import type { VtxoManager, Wallet } from "@arkade-os/sdk";
21
+ /** Delegator service endpoints per network. */
22
+ export declare const ARKADE_DELEGATOR_URLS: {
23
+ readonly signet: "https://delegator.mutinynet.arkade.sh";
24
+ readonly mainnet: "https://delegate.arkade.money";
25
+ };
26
+ export declare const DEFAULT_DELEGATOR_URL: "https://delegate.arkade.money";
27
+ /** Seconds before batch expiry at which a VTXO becomes eligible for auto-renewal (3 days). */
28
+ export declare const DEFAULT_VTXO_THRESHOLD_SECONDS = 259200;
29
+ export type ArkadeNetwork = "mainnet" | "signet";
30
+ export interface ArkadeLifecycleSettings {
31
+ delegatorUrl: string;
32
+ delegationEnabled: boolean;
33
+ vtxoThresholdSeconds: number;
34
+ }
35
+ /**
36
+ * Coerce a raw delegator URL to a safe HTTPS URL, falling back to the
37
+ * network default when missing / non-HTTPS / unparseable.
38
+ */
39
+ export declare function sanitizeDelegatorUrl(rawUrl: unknown, network?: ArkadeNetwork): string;
40
+ /** Coerce a raw delegation-enabled flag to a boolean (defaults to true when undefined). */
41
+ export declare function sanitizeDelegationEnabled(rawValue: unknown): boolean;
42
+ /** Coerce a raw threshold to a positive integer of seconds, defaulting to 3 days. */
43
+ export declare function sanitizeVtxoThresholdSeconds(rawValue: unknown): number;
44
+ /**
45
+ * Sanitize a raw lifecycle-settings object into a clean `ArkadeLifecycleSettings`.
46
+ * Consumers read platform storage into a raw object and pass it here — storage
47
+ * key naming stays consumer-side; the normalized shape + validation lives here.
48
+ */
49
+ export declare function resolveArkadeLifecycleSettings(raw: {
50
+ delegatorUrl?: unknown;
51
+ delegationEnabled?: unknown;
52
+ vtxoThresholdSeconds?: unknown;
53
+ network?: ArkadeNetwork;
54
+ }): ArkadeLifecycleSettings;
55
+ export interface ArkadeDelegateResult {
56
+ delegated: number;
57
+ failed: number;
58
+ }
59
+ export interface ArkadeDelegateInfo {
60
+ configured: boolean;
61
+ [key: string]: unknown;
62
+ }
63
+ /**
64
+ * Delegate all currently-spendable (settled/preconfirmed) VTXOs to the
65
+ * configured delegator. Returns `{ delegated: 0, failed: 0 }` when delegation
66
+ * is not configured or there is nothing to delegate.
67
+ */
68
+ export declare function delegateSpendableVtxos(wallet: Wallet): Promise<ArkadeDelegateResult>;
69
+ /**
70
+ * Resolve delegate info from the wallet's delegator manager. Returns
71
+ * `{ configured: false }` when delegation is not configured.
72
+ */
73
+ export declare function getArkadeDelegateInfo(wallet: Wallet): Promise<ArkadeDelegateInfo>;
74
+ export interface ArkadeLifecycleRunConfig {
75
+ delegationEnabled?: boolean;
76
+ delegatorUrl?: string;
77
+ }
78
+ export interface ArkadeLifecycleCallbacks {
79
+ /** Fired after a successful renewal round with the renewed count + commitment txid. */
80
+ onVtxosRenewed?(info: {
81
+ count: number;
82
+ txid: string;
83
+ }): void;
84
+ /** Fired per SDK renewal-progress event (event.type). */
85
+ onRenewalEvent?(eventType: string): void;
86
+ /** Fired for any stage error; the run continues to the next stage. */
87
+ onError?(stage: string, error: unknown): void;
88
+ }
89
+ export interface ArkadeRecoverableBalance {
90
+ recoverable: bigint;
91
+ subdust: bigint;
92
+ includesSubdust: boolean;
93
+ vtxoCount: number;
94
+ }
95
+ export interface ArkadeVtxoLifecycleResult {
96
+ renewed: {
97
+ count: number;
98
+ txid: string;
99
+ } | null;
100
+ recoverable: ArkadeRecoverableBalance | null;
101
+ expiredBoardingCount: number;
102
+ delegated: ArkadeDelegateResult | null;
103
+ errors: string[];
104
+ }
105
+ /**
106
+ * Run one pass of the VTXO lifecycle. Every stage is best-effort and isolated:
107
+ * a failure in one stage is recorded in `result.errors` (and reported via
108
+ * `callbacks.onError`) but never aborts the remaining stages.
109
+ */
110
+ export declare function runArkadeVtxoLifecycle(args: {
111
+ vtxoManager: VtxoManager;
112
+ wallet: Wallet;
113
+ config?: ArkadeLifecycleRunConfig;
114
+ callbacks?: ArkadeLifecycleCallbacks;
115
+ }): Promise<ArkadeVtxoLifecycleResult>;
116
+ //# sourceMappingURL=arkade-vtxo-lifecycle.d.ts.map