@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,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":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAI5B,4DAA4D;AAC5D,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAQnD,MAAM,wBAAwB;IAA9B;QACU,WAAM,GAAuB,IAAI,CAAC;QAC1C,gDAAgD;QACxC,iBAAY,GAAyB,IAAI,CAAC;QAClD,gDAAgD;QACxC,oBAAe,GAAG,CAAC,CAAC;QAC5B,4DAA4D;QACpD,gBAAW,GAAG,CAAC,CAAC;IAoG1B,CAAC;IAlGC;;;;;OAKG;IACH,UAAU,CAAC,MAAe,EAAE,IAA6B;QACvD,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1C,wEAAwE;QACxE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACxE,qEAAqE;YACrE,kDAAkD;YAClD,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,IAAI,IAAI,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;gBACzE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,MAAe,EACf,UAAkB,EAClB,IAA6B;QAE7B,IAAI,CAAC;YACH,MAAM,cAAc,GAClB,IAAI,EAAE,cAAc,IAAI,IAAI,uBAAuB,CAAC,IAAI,EAAE,MAAM,IAAI,eAAe,CAAC,CAAC;YACvF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC;gBACtC,MAAM;gBACN,+DAA+D;gBAC/D,mEAAmE;gBACnE,WAAW,EAAE,IAAI;gBACjB,cAAc;aACwC,CAAC,CAAC;YAC1D,qEAAqE;YACrE,wEAAwE;YACxE,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;gBACD,GAAG,CAAC,IAAI,CACN,gGAAgG,CACjG,CAAC;gBACF,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,yEAAyE;YACzE,gEAAgE;YAChE,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,CAAC;YACD,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,GAAG,CAAC,IAAI,CACN,oDAAoD,GAAG,wDAAwD,CAChH,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAC9B,CAAC;IAED,iCAAiC;IACjC,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,uEAAuE;QACvE,qDAAqD;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,wBAAwB,EAAE,CAAC"}
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arkade-vtxo-lifecycle.d.ts","sourceRoot":"","sources":["../../src/lib/arkade-vtxo-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
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
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Settings — normalized shape + sanitizers + defaults
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
/** Delegator service endpoints per network. */
|
|
24
|
+
export const ARKADE_DELEGATOR_URLS = {
|
|
25
|
+
signet: "https://delegator.mutinynet.arkade.sh",
|
|
26
|
+
mainnet: "https://delegate.arkade.money",
|
|
27
|
+
};
|
|
28
|
+
export const DEFAULT_DELEGATOR_URL = ARKADE_DELEGATOR_URLS.mainnet;
|
|
29
|
+
/** Seconds before batch expiry at which a VTXO becomes eligible for auto-renewal (3 days). */
|
|
30
|
+
export const DEFAULT_VTXO_THRESHOLD_SECONDS = 259200;
|
|
31
|
+
/**
|
|
32
|
+
* Coerce a raw delegator URL to a safe HTTPS URL, falling back to the
|
|
33
|
+
* network default when missing / non-HTTPS / unparseable.
|
|
34
|
+
*/
|
|
35
|
+
export function sanitizeDelegatorUrl(rawUrl, network = "mainnet") {
|
|
36
|
+
const defaultUrl = ARKADE_DELEGATOR_URLS[network];
|
|
37
|
+
if (typeof rawUrl !== "string")
|
|
38
|
+
return defaultUrl;
|
|
39
|
+
const trimmed = rawUrl.trim();
|
|
40
|
+
if (trimmed.length === 0)
|
|
41
|
+
return defaultUrl;
|
|
42
|
+
try {
|
|
43
|
+
const url = new URL(trimmed);
|
|
44
|
+
if (url.protocol !== "https:")
|
|
45
|
+
return defaultUrl;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return defaultUrl;
|
|
49
|
+
}
|
|
50
|
+
return trimmed;
|
|
51
|
+
}
|
|
52
|
+
/** Coerce a raw delegation-enabled flag to a boolean (defaults to true when undefined). */
|
|
53
|
+
export function sanitizeDelegationEnabled(rawValue) {
|
|
54
|
+
if (rawValue === undefined)
|
|
55
|
+
return true;
|
|
56
|
+
if (typeof rawValue === "boolean")
|
|
57
|
+
return rawValue;
|
|
58
|
+
if (typeof rawValue === "number")
|
|
59
|
+
return rawValue !== 0 && !Number.isNaN(rawValue);
|
|
60
|
+
if (typeof rawValue === "string") {
|
|
61
|
+
const normalized = rawValue.trim().toLowerCase();
|
|
62
|
+
return normalized === "true" || normalized === "1" || normalized === "yes";
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
/** Coerce a raw threshold to a positive integer of seconds, defaulting to 3 days. */
|
|
67
|
+
export function sanitizeVtxoThresholdSeconds(rawValue) {
|
|
68
|
+
const parsed = typeof rawValue === "number" ? rawValue : typeof rawValue === "string" ? Number(rawValue) : NaN;
|
|
69
|
+
return Number.isFinite(parsed) && parsed > 0
|
|
70
|
+
? Math.floor(parsed)
|
|
71
|
+
: DEFAULT_VTXO_THRESHOLD_SECONDS;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Sanitize a raw lifecycle-settings object into a clean `ArkadeLifecycleSettings`.
|
|
75
|
+
* Consumers read platform storage into a raw object and pass it here — storage
|
|
76
|
+
* key naming stays consumer-side; the normalized shape + validation lives here.
|
|
77
|
+
*/
|
|
78
|
+
export function resolveArkadeLifecycleSettings(raw) {
|
|
79
|
+
const network = raw.network ?? "mainnet";
|
|
80
|
+
return {
|
|
81
|
+
delegatorUrl: sanitizeDelegatorUrl(raw.delegatorUrl, network),
|
|
82
|
+
delegationEnabled: sanitizeDelegationEnabled(raw.delegationEnabled),
|
|
83
|
+
vtxoThresholdSeconds: sanitizeVtxoThresholdSeconds(raw.vtxoThresholdSeconds),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Delegate all currently-spendable (settled/preconfirmed) VTXOs to the
|
|
88
|
+
* configured delegator. Returns `{ delegated: 0, failed: 0 }` when delegation
|
|
89
|
+
* is not configured or there is nothing to delegate.
|
|
90
|
+
*/
|
|
91
|
+
export async function delegateSpendableVtxos(wallet) {
|
|
92
|
+
const delegatorManager = await wallet.getDelegatorManager();
|
|
93
|
+
if (!delegatorManager) {
|
|
94
|
+
return { delegated: 0, failed: 0 };
|
|
95
|
+
}
|
|
96
|
+
const vtxos = await wallet.getVtxos();
|
|
97
|
+
const spendable = vtxos.filter((v) => v.virtualStatus?.state === "settled" || v.virtualStatus?.state === "preconfirmed");
|
|
98
|
+
if (spendable.length === 0) {
|
|
99
|
+
return { delegated: 0, failed: 0 };
|
|
100
|
+
}
|
|
101
|
+
const ownAddress = await wallet.getAddress();
|
|
102
|
+
// ExtendedVirtualCoin carries all ContractVtxo fields at runtime; the SDK
|
|
103
|
+
// populates contractScript on delegation-eligible VTXOs.
|
|
104
|
+
const result = await delegatorManager.delegate(spendable, ownAddress);
|
|
105
|
+
return { delegated: result.delegated.length, failed: result.failed.length };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve delegate info from the wallet's delegator manager. Returns
|
|
109
|
+
* `{ configured: false }` when delegation is not configured.
|
|
110
|
+
*/
|
|
111
|
+
export async function getArkadeDelegateInfo(wallet) {
|
|
112
|
+
const delegatorManager = await wallet.getDelegatorManager();
|
|
113
|
+
if (!delegatorManager) {
|
|
114
|
+
return { configured: false };
|
|
115
|
+
}
|
|
116
|
+
const info = await delegatorManager.getDelegateInfo();
|
|
117
|
+
return { configured: true, ...info };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Run one pass of the VTXO lifecycle. Every stage is best-effort and isolated:
|
|
121
|
+
* a failure in one stage is recorded in `result.errors` (and reported via
|
|
122
|
+
* `callbacks.onError`) but never aborts the remaining stages.
|
|
123
|
+
*/
|
|
124
|
+
export async function runArkadeVtxoLifecycle(args) {
|
|
125
|
+
const { vtxoManager, wallet, config, callbacks } = args;
|
|
126
|
+
const result = {
|
|
127
|
+
renewed: null,
|
|
128
|
+
recoverable: null,
|
|
129
|
+
expiredBoardingCount: 0,
|
|
130
|
+
delegated: null,
|
|
131
|
+
errors: [],
|
|
132
|
+
};
|
|
133
|
+
const record = (stage, error) => {
|
|
134
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
135
|
+
result.errors.push(`${stage}: ${msg}`);
|
|
136
|
+
callbacks?.onError?.(stage, error);
|
|
137
|
+
};
|
|
138
|
+
// 1. Auto-renewal — renew VTXOs approaching expiry.
|
|
139
|
+
try {
|
|
140
|
+
const expiringVtxos = await vtxoManager.getExpiringVtxos();
|
|
141
|
+
if (expiringVtxos.length > 0) {
|
|
142
|
+
const txid = await vtxoManager.renewVtxos((event) => {
|
|
143
|
+
callbacks?.onRenewalEvent?.(event.type);
|
|
144
|
+
});
|
|
145
|
+
result.renewed = { count: expiringVtxos.length, txid };
|
|
146
|
+
callbacks?.onVtxosRenewed?.({ count: expiringVtxos.length, txid });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
record("renew", error);
|
|
151
|
+
}
|
|
152
|
+
// 2. Orphan recovery — surface recoverable balance.
|
|
153
|
+
try {
|
|
154
|
+
const balance = await vtxoManager.getRecoverableBalance();
|
|
155
|
+
result.recoverable = {
|
|
156
|
+
recoverable: balance.recoverable,
|
|
157
|
+
subdust: balance.subdust,
|
|
158
|
+
includesSubdust: balance.includesSubdust,
|
|
159
|
+
vtxoCount: balance.vtxoCount,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
record("recoverable", error);
|
|
164
|
+
}
|
|
165
|
+
// 3. Boarding UTXO expiry — surface expired boarding UTXOs.
|
|
166
|
+
try {
|
|
167
|
+
const expired = await vtxoManager.getExpiredBoardingUtxos();
|
|
168
|
+
result.expiredBoardingCount = expired.length;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
record("boarding-expiry", error);
|
|
172
|
+
}
|
|
173
|
+
// 4. Delegation — delegate spendable VTXOs when enabled + configured.
|
|
174
|
+
if (config?.delegationEnabled && config?.delegatorUrl) {
|
|
175
|
+
try {
|
|
176
|
+
result.delegated = await delegateSpendableVtxos(wallet);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
record("delegate", error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=arkade-vtxo-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arkade-vtxo-lifecycle.js","sourceRoot":"","sources":["../../src/lib/arkade-vtxo-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Flashnet Client Manager
|
|
3
|
-
*
|
|
3
|
+
* Singleton managing the lifecycle of a FlashnetClient from `@flashnet/sdk`.
|
|
4
4
|
* Requires an initialized SparkWallet to function.
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* Ported from rate-extension/src/protocols/spark/flashnet-client-manager.ts.
|
|
7
|
+
* The SDK is a value import (optional dependency) — consumers install
|
|
8
|
+
* `@flashnet/sdk` to use this manager, matching the Spark client-manager convention.
|
|
6
9
|
*/
|
|
7
|
-
import {
|
|
10
|
+
import type { SparkWallet } from '@buildonspark/spark-sdk';
|
|
11
|
+
import { FlashnetClient, type WalletBalance } from '@flashnet/sdk';
|
|
12
|
+
import { type FlashnetNetwork } from '../types/flashnet.js';
|
|
13
|
+
import type { SparkConfig } from '../types/spark.js';
|
|
8
14
|
declare class FlashnetClientManager {
|
|
9
15
|
private client;
|
|
10
16
|
private initPromise;
|
|
11
17
|
private poolId;
|
|
12
18
|
private network;
|
|
19
|
+
initialize(wallet: SparkWallet, sparkNetwork?: SparkConfig['network']): Promise<void>;
|
|
20
|
+
private doInitialize;
|
|
13
21
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
22
|
+
* Fetch the wallet's AMM swap history and persist the outgoing (token-in)
|
|
23
|
+
* legs to the sent-token outbox.
|
|
24
|
+
*
|
|
25
|
+
* A swap moves a token to the pool via an internal SDK transfer that the
|
|
26
|
+
* Spark token-transaction query cannot classify as a send. Flashnet's
|
|
27
|
+
* `GET /v1/swaps/user/{pubkey}` returns every past swap with explicit
|
|
28
|
+
* direction (assetIn / amountIn / inboundTransferId), so this both fixes
|
|
29
|
+
* future swaps and recovers ones made before any recording existed.
|
|
30
|
+
*
|
|
31
|
+
* Idempotent — records are keyed by transfer hash, so re-running on each
|
|
32
|
+
* connect simply refreshes them.
|
|
17
33
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
34
|
+
private backfillSwapHistory;
|
|
35
|
+
getClient(): FlashnetClient;
|
|
36
|
+
/** Convenience pass-through so callers don't need to await client.getBalance() through a cast. */
|
|
37
|
+
getBalance(): Promise<WalletBalance>;
|
|
21
38
|
getPoolId(): string | null;
|
|
22
39
|
getNetwork(): FlashnetNetwork | null;
|
|
23
40
|
getUsdbTokenAddress(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flashnet-client-manager.d.ts","sourceRoot":"","sources":["../../src/lib/flashnet-client-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"flashnet-client-manager.d.ts","sourceRoot":"","sources":["../../src/lib/flashnet-client-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAkBjD,cAAM,qBAAqB;IACzB,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAA+B;IAE9C,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAQvE,YAAY;IAqD1B;;;;;;;;;;;;OAYG;YACW,mBAAmB;IA4DjC,SAAS,IAAI,cAAc;IAO3B,kGAAkG;IAC5F,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAI1C,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,UAAU,IAAI,eAAe,GAAG,IAAI;IAIpC,mBAAmB,IAAI,MAAM;IAO7B,aAAa,IAAI,OAAO;IAIlB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAalC;AAED,eAAO,MAAM,qBAAqB,uBAA8B,CAAA"}
|