@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,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flashnet Orchestra REST API Client
|
|
3
|
+
*
|
|
4
|
+
* Cross-chain swap orchestration: stablecoins (USDC/USDT) and native assets
|
|
5
|
+
* (ETH/SOL/TRX) on EVM/Solana/Tron ↔ BTC/USDB on Spark.
|
|
6
|
+
*
|
|
7
|
+
* API docs: https://docs.flashnet.xyz/products/orchestration/overview
|
|
8
|
+
* Base URL: https://orchestration.flashnet.xyz
|
|
9
|
+
*
|
|
10
|
+
* Ported from rate-extension/src/protocols/spark/orchestra-client.ts. The API
|
|
11
|
+
* key is NOT read from a build-time env var here — the engine is platform-
|
|
12
|
+
* agnostic, so the consumer injects it once at startup via `setOrchestraApiKey()`
|
|
13
|
+
* (the extension supplies its inlined `VITE_FLASHNET_ORCHESTRA_KEY`).
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Register the Orchestra API key. Call once at startup. Warns if given an
|
|
17
|
+
* empty value so a misconfigured build is obvious instead of surfacing as a
|
|
18
|
+
* runtime 401 that looks like a network failure.
|
|
19
|
+
*/
|
|
20
|
+
export declare function setOrchestraApiKey(key: string | null | undefined): void;
|
|
21
|
+
/**
|
|
22
|
+
* Stable marker embedded in the auth-error message. Only `Error.message`
|
|
23
|
+
* survives the background-SW → UI message boundary (see background-protocol.ts:
|
|
24
|
+
* `sendResponse({ error: error?.message })`), so the UI matches on this token
|
|
25
|
+
* rather than `instanceof OrchestraAuthError`.
|
|
26
|
+
*/
|
|
27
|
+
export declare const ORCHESTRA_AUTH_ERROR_CODE = "ORCHESTRA_AUTH_FAILED";
|
|
28
|
+
/**
|
|
29
|
+
* Thrown when an authed Orchestra call fails due to a missing/invalid API key
|
|
30
|
+
* (HTTP 401/403). Callers can detect this to show a "Bridge unavailable /
|
|
31
|
+
* not configured" message instead of a generic "Quote failed".
|
|
32
|
+
*/
|
|
33
|
+
export declare class OrchestraAuthError extends Error {
|
|
34
|
+
readonly status: number;
|
|
35
|
+
constructor(status: number);
|
|
36
|
+
}
|
|
37
|
+
export interface OrchestraRouteAsset {
|
|
38
|
+
chain: string;
|
|
39
|
+
asset: string;
|
|
40
|
+
contractAddress?: string;
|
|
41
|
+
decimals: number;
|
|
42
|
+
chainId?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface OrchestraRoute {
|
|
45
|
+
sourceChain: string;
|
|
46
|
+
sourceAsset: string;
|
|
47
|
+
destinationChain: string;
|
|
48
|
+
destinationAsset: string;
|
|
49
|
+
source?: OrchestraRouteAsset;
|
|
50
|
+
destination?: OrchestraRouteAsset;
|
|
51
|
+
}
|
|
52
|
+
export interface OrchestraEstimate {
|
|
53
|
+
estimatedOut: string;
|
|
54
|
+
feeAmount: string;
|
|
55
|
+
feeBps: number;
|
|
56
|
+
totalFeeAmount: string;
|
|
57
|
+
feeAsset: string;
|
|
58
|
+
route: OrchestraRoute;
|
|
59
|
+
}
|
|
60
|
+
export interface OrchestraQuote {
|
|
61
|
+
quoteId: string;
|
|
62
|
+
depositAddress: string;
|
|
63
|
+
amountIn: string;
|
|
64
|
+
estimatedOut: string;
|
|
65
|
+
feeAmount: string;
|
|
66
|
+
feeBps: number;
|
|
67
|
+
totalFeeAmount: string;
|
|
68
|
+
feeAsset: string;
|
|
69
|
+
route: OrchestraRoute;
|
|
70
|
+
expiresAt: string;
|
|
71
|
+
}
|
|
72
|
+
export type OrchestraOrderStatus = 'processing' | 'confirming' | 'bridging' | 'swapping' | 'awaiting_approval' | 'refunding' | 'delivering' | 'completed' | 'failed' | 'refunded';
|
|
73
|
+
export interface OrchestraOrderStage {
|
|
74
|
+
stage: string;
|
|
75
|
+
timestamp: string;
|
|
76
|
+
}
|
|
77
|
+
export interface OrchestraOrder {
|
|
78
|
+
id: string;
|
|
79
|
+
quoteId: string;
|
|
80
|
+
status: OrchestraOrderStatus;
|
|
81
|
+
amountIn?: string;
|
|
82
|
+
amountOut?: string;
|
|
83
|
+
depositAddress?: string;
|
|
84
|
+
recipientAddress?: string;
|
|
85
|
+
route?: OrchestraRoute;
|
|
86
|
+
stages?: OrchestraOrderStage[];
|
|
87
|
+
createdAt?: string;
|
|
88
|
+
updatedAt?: string;
|
|
89
|
+
}
|
|
90
|
+
export interface OrchestraOrderLookup {
|
|
91
|
+
quote: OrchestraQuote | null;
|
|
92
|
+
order: OrchestraOrder | null;
|
|
93
|
+
stages?: OrchestraOrderStage[];
|
|
94
|
+
}
|
|
95
|
+
export interface CreateQuoteParams {
|
|
96
|
+
sourceChain: string;
|
|
97
|
+
sourceAsset: string;
|
|
98
|
+
destinationChain: string;
|
|
99
|
+
destinationAsset: string;
|
|
100
|
+
amount: string;
|
|
101
|
+
recipientAddress: string;
|
|
102
|
+
slippageBps?: number;
|
|
103
|
+
}
|
|
104
|
+
export interface SubmitOrderParams {
|
|
105
|
+
quoteId: string;
|
|
106
|
+
txHash?: string;
|
|
107
|
+
sourceAddress?: string;
|
|
108
|
+
sparkTxHash?: string;
|
|
109
|
+
sourceSparkAddress?: string;
|
|
110
|
+
bitcoinTxid?: string;
|
|
111
|
+
bitcoinVout?: number;
|
|
112
|
+
}
|
|
113
|
+
export interface EstimateParams {
|
|
114
|
+
sourceChain: string;
|
|
115
|
+
sourceAsset: string;
|
|
116
|
+
destinationChain: string;
|
|
117
|
+
destinationAsset: string;
|
|
118
|
+
amount: string;
|
|
119
|
+
}
|
|
120
|
+
/** List all available cross-chain routes. No auth required. */
|
|
121
|
+
export declare function getRoutes(): Promise<OrchestraRoute[]>;
|
|
122
|
+
/** Get a lightweight price estimate. No auth required. */
|
|
123
|
+
export declare function getEstimate(params: EstimateParams): Promise<OrchestraEstimate>;
|
|
124
|
+
/** Create a durable quote with deposit address. Auth required. TTL ~30 min. */
|
|
125
|
+
export declare function createQuote(params: CreateQuoteParams): Promise<OrchestraQuote>;
|
|
126
|
+
/** Look up a quote and its associated order (if any). Auth required. */
|
|
127
|
+
export declare function getOrder(quoteId: string): Promise<OrchestraOrderLookup>;
|
|
128
|
+
/** Submit deposit proof to create an order from a quote. Auth required. */
|
|
129
|
+
export declare function submitOrder(params: SubmitOrderParams): Promise<{
|
|
130
|
+
orderId: string;
|
|
131
|
+
status: string;
|
|
132
|
+
}>;
|
|
133
|
+
/**
|
|
134
|
+
* Check order status by ID, quoteId, or txHash.
|
|
135
|
+
*
|
|
136
|
+
* The Flashnet orchestration `/v1/orchestration/status` endpoint historically
|
|
137
|
+
* returned a flat `OrchestraOrder`, but the live API now wraps the response
|
|
138
|
+
* as `{ order: OrchestraOrder, stages?: OrchestraOrderStage[] }` (same shape
|
|
139
|
+
* as `/order`). Both forms have been observed in the wild — we unwrap defensively
|
|
140
|
+
* so the bridge tracking poller sees a real `status` field either way.
|
|
141
|
+
* Without this, `status` is `undefined`, the poller silently keeps showing
|
|
142
|
+
* the stale local status (e.g. "swapping") even after the order completes.
|
|
143
|
+
*/
|
|
144
|
+
export declare function getStatus(query: {
|
|
145
|
+
id?: string;
|
|
146
|
+
quoteId?: string;
|
|
147
|
+
txHash?: string;
|
|
148
|
+
}): Promise<OrchestraOrder>;
|
|
149
|
+
//# sourceMappingURL=orchestra-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestra-client.d.ts","sourceRoot":"","sources":["../../src/lib/orchestra-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flashnet Orchestra REST API Client
|
|
3
|
+
*
|
|
4
|
+
* Cross-chain swap orchestration: stablecoins (USDC/USDT) and native assets
|
|
5
|
+
* (ETH/SOL/TRX) on EVM/Solana/Tron ↔ BTC/USDB on Spark.
|
|
6
|
+
*
|
|
7
|
+
* API docs: https://docs.flashnet.xyz/products/orchestration/overview
|
|
8
|
+
* Base URL: https://orchestration.flashnet.xyz
|
|
9
|
+
*
|
|
10
|
+
* Ported from rate-extension/src/protocols/spark/orchestra-client.ts. The API
|
|
11
|
+
* key is NOT read from a build-time env var here — the engine is platform-
|
|
12
|
+
* agnostic, so the consumer injects it once at startup via `setOrchestraApiKey()`
|
|
13
|
+
* (the extension supplies its inlined `VITE_FLASHNET_ORCHESTRA_KEY`).
|
|
14
|
+
*/
|
|
15
|
+
import { log } from './log.js';
|
|
16
|
+
const BASE_URL = 'https://orchestration.flashnet.xyz';
|
|
17
|
+
/**
|
|
18
|
+
* Orchestra API key, injected by the consumer. PUBLIC-by-design in the
|
|
19
|
+
* extension (shipped in the bundle) — the seam simply keeps the build-time
|
|
20
|
+
* env-var read out of the engine. Empty until `setOrchestraApiKey()` runs;
|
|
21
|
+
* every authed endpoint (createQuote/getOrder/submitOrder/getStatus) 401s
|
|
22
|
+
* without it.
|
|
23
|
+
*/
|
|
24
|
+
let apiKey = '';
|
|
25
|
+
/**
|
|
26
|
+
* Register the Orchestra API key. Call once at startup. Warns if given an
|
|
27
|
+
* empty value so a misconfigured build is obvious instead of surfacing as a
|
|
28
|
+
* runtime 401 that looks like a network failure.
|
|
29
|
+
*/
|
|
30
|
+
export function setOrchestraApiKey(key) {
|
|
31
|
+
apiKey = key ?? '';
|
|
32
|
+
if (!apiKey) {
|
|
33
|
+
log.warn('[Orchestra] API key is empty — Bridge quote/submit calls will fail with HTTP 401. ' +
|
|
34
|
+
'Pass a key to setOrchestraApiKey() at startup.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Stable marker embedded in the auth-error message. Only `Error.message`
|
|
39
|
+
* survives the background-SW → UI message boundary (see background-protocol.ts:
|
|
40
|
+
* `sendResponse({ error: error?.message })`), so the UI matches on this token
|
|
41
|
+
* rather than `instanceof OrchestraAuthError`.
|
|
42
|
+
*/
|
|
43
|
+
export const ORCHESTRA_AUTH_ERROR_CODE = 'ORCHESTRA_AUTH_FAILED';
|
|
44
|
+
/**
|
|
45
|
+
* Thrown when an authed Orchestra call fails due to a missing/invalid API key
|
|
46
|
+
* (HTTP 401/403). Callers can detect this to show a "Bridge unavailable /
|
|
47
|
+
* not configured" message instead of a generic "Quote failed".
|
|
48
|
+
*/
|
|
49
|
+
export class OrchestraAuthError extends Error {
|
|
50
|
+
constructor(status) {
|
|
51
|
+
super(`${ORCHESTRA_AUTH_ERROR_CODE}: Bridge is not configured or unavailable. ` +
|
|
52
|
+
'The cross-chain service rejected the request (authentication failed).');
|
|
53
|
+
this.name = 'OrchestraAuthError';
|
|
54
|
+
this.status = status;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Client
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function authHeaders() {
|
|
61
|
+
if (!apiKey)
|
|
62
|
+
return {};
|
|
63
|
+
return { Authorization: `Bearer ${apiKey}` };
|
|
64
|
+
}
|
|
65
|
+
function idempotencyHeader(prefix) {
|
|
66
|
+
return { 'X-Idempotency-Key': `${prefix}:${crypto.randomUUID()}` };
|
|
67
|
+
}
|
|
68
|
+
async function request(method, path, opts) {
|
|
69
|
+
const url = new URL(path, BASE_URL);
|
|
70
|
+
if (opts?.params) {
|
|
71
|
+
for (const [k, v] of Object.entries(opts.params)) {
|
|
72
|
+
if (v !== undefined)
|
|
73
|
+
url.searchParams.set(k, v);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
77
|
+
if (opts?.auth)
|
|
78
|
+
Object.assign(headers, authHeaders());
|
|
79
|
+
if (opts?.idempotency)
|
|
80
|
+
Object.assign(headers, idempotencyHeader(opts.idempotency));
|
|
81
|
+
const res = await fetch(url.toString(), {
|
|
82
|
+
method,
|
|
83
|
+
headers,
|
|
84
|
+
body: opts?.body ? JSON.stringify(opts.body) : undefined,
|
|
85
|
+
});
|
|
86
|
+
if (!res.ok) {
|
|
87
|
+
const text = await res.text().catch(() => '');
|
|
88
|
+
// An auth failure on an authed call almost always means the API key was
|
|
89
|
+
// not injected (or is invalid). Throw a specific error so the UI can
|
|
90
|
+
// distinguish "Bridge not configured" from a transient quote error.
|
|
91
|
+
if (opts?.auth && (res.status === 401 || res.status === 403)) {
|
|
92
|
+
throw new OrchestraAuthError(res.status);
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Orchestra API ${method} ${path} failed (${res.status}): ${text}`);
|
|
95
|
+
}
|
|
96
|
+
return res.json();
|
|
97
|
+
}
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Public API
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
/** List all available cross-chain routes. No auth required. */
|
|
102
|
+
export async function getRoutes() {
|
|
103
|
+
const res = await request('GET', '/v1/orchestration/routes');
|
|
104
|
+
// API wraps in { routes: [...] }
|
|
105
|
+
return Array.isArray(res) ? res : res.routes;
|
|
106
|
+
}
|
|
107
|
+
/** Get a lightweight price estimate. No auth required. */
|
|
108
|
+
export async function getEstimate(params) {
|
|
109
|
+
return request('GET', '/v1/orchestration/estimate', {
|
|
110
|
+
params: {
|
|
111
|
+
sourceChain: params.sourceChain,
|
|
112
|
+
sourceAsset: params.sourceAsset,
|
|
113
|
+
destinationChain: params.destinationChain,
|
|
114
|
+
destinationAsset: params.destinationAsset,
|
|
115
|
+
amount: params.amount,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Create a durable quote with deposit address. Auth required. TTL ~30 min. */
|
|
120
|
+
export async function createQuote(params) {
|
|
121
|
+
return request('POST', '/v1/orchestration/quote', {
|
|
122
|
+
body: {
|
|
123
|
+
sourceChain: params.sourceChain,
|
|
124
|
+
sourceAsset: params.sourceAsset,
|
|
125
|
+
destinationChain: params.destinationChain,
|
|
126
|
+
destinationAsset: params.destinationAsset,
|
|
127
|
+
amount: params.amount,
|
|
128
|
+
recipientAddress: params.recipientAddress,
|
|
129
|
+
slippageBps: params.slippageBps ?? 100,
|
|
130
|
+
},
|
|
131
|
+
auth: true,
|
|
132
|
+
idempotency: 'quote:create',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/** Look up a quote and its associated order (if any). Auth required. */
|
|
136
|
+
export async function getOrder(quoteId) {
|
|
137
|
+
return request('GET', '/v1/orchestration/order', {
|
|
138
|
+
params: { quoteId },
|
|
139
|
+
auth: true,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/** Submit deposit proof to create an order from a quote. Auth required. */
|
|
143
|
+
export async function submitOrder(params) {
|
|
144
|
+
return request('POST', '/v1/orchestration/submit', {
|
|
145
|
+
body: params,
|
|
146
|
+
auth: true,
|
|
147
|
+
idempotency: 'submit',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check order status by ID, quoteId, or txHash.
|
|
152
|
+
*
|
|
153
|
+
* The Flashnet orchestration `/v1/orchestration/status` endpoint historically
|
|
154
|
+
* returned a flat `OrchestraOrder`, but the live API now wraps the response
|
|
155
|
+
* as `{ order: OrchestraOrder, stages?: OrchestraOrderStage[] }` (same shape
|
|
156
|
+
* as `/order`). Both forms have been observed in the wild — we unwrap defensively
|
|
157
|
+
* so the bridge tracking poller sees a real `status` field either way.
|
|
158
|
+
* Without this, `status` is `undefined`, the poller silently keeps showing
|
|
159
|
+
* the stale local status (e.g. "swapping") even after the order completes.
|
|
160
|
+
*/
|
|
161
|
+
export async function getStatus(query) {
|
|
162
|
+
const params = {};
|
|
163
|
+
if (query.id)
|
|
164
|
+
params.id = query.id;
|
|
165
|
+
else if (query.quoteId)
|
|
166
|
+
params.quoteId = query.quoteId;
|
|
167
|
+
else if (query.txHash)
|
|
168
|
+
params.txHash = query.txHash;
|
|
169
|
+
const raw = await request('GET', '/v1/orchestration/status', { params, auth: true });
|
|
170
|
+
// Wrapped shape: pull the order, attach stages so callers can use them
|
|
171
|
+
// for finer-grained progress UI without a second request.
|
|
172
|
+
if (raw && typeof raw === 'object' && 'order' in raw && raw.order) {
|
|
173
|
+
const wrapped = raw;
|
|
174
|
+
return wrapped.stages ? { ...wrapped.order, stages: wrapped.stages } : wrapped.order;
|
|
175
|
+
}
|
|
176
|
+
return raw;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=orchestra-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestra-client.js","sourceRoot":"","sources":["../../src/lib/orchestra-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSBT signing helper.
|
|
3
|
+
*
|
|
4
|
+
* Parses an incoming PSBT, derives the set of private keys that correspond
|
|
5
|
+
* to BIP32 derivation paths embedded in the PSBT's input entries, attempts
|
|
6
|
+
* to sign every signable input, and returns the result.
|
|
7
|
+
*
|
|
8
|
+
* Design invariants:
|
|
9
|
+
* - Never fabricates a signature: if no input can be signed (no BIP32 paths
|
|
10
|
+
* present, no matching key), returns { unchanged: true }.
|
|
11
|
+
* - Does NOT scan derivation paths — only signs inputs whose PSBT already
|
|
12
|
+
* carries explicit BIP32 derivation metadata. Scanning would be O(accounts
|
|
13
|
+
* × gap) and too slow for the background service worker.
|
|
14
|
+
* - Throws on malformed / non-PSBT input so the caller can surface an error
|
|
15
|
+
* to the dApp rather than silently returning garbage.
|
|
16
|
+
*/
|
|
17
|
+
export interface PsbtSignResult {
|
|
18
|
+
/** Signed PSBT hex (or the original hex if unchanged). */
|
|
19
|
+
psbt: string;
|
|
20
|
+
/** True when no input could be signed (no owned inputs). */
|
|
21
|
+
unchanged: boolean;
|
|
22
|
+
/** Number of inputs that were signed. */
|
|
23
|
+
signedCount: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse and attempt to sign a PSBT using keys derived from the provided
|
|
27
|
+
* BIP39 mnemonic.
|
|
28
|
+
*
|
|
29
|
+
* @param psbtHex Hex-encoded PSBT bytes (without 0x prefix).
|
|
30
|
+
* @param mnemonic BIP39 mnemonic for key derivation.
|
|
31
|
+
*/
|
|
32
|
+
export declare function signPsbt(psbtHex: string, mnemonic: string): PsbtSignResult;
|
|
33
|
+
/**
|
|
34
|
+
* Finalize a fully-signed PSBT and extract the raw network transaction.
|
|
35
|
+
*
|
|
36
|
+
* Used by `webbtc.finalizePsbt`: a dApp hands back a PSBT that already carries
|
|
37
|
+
* all required signatures and asks the wallet to assemble the final scriptSig /
|
|
38
|
+
* witness and return the broadcastable transaction hex.
|
|
39
|
+
*
|
|
40
|
+
* Throws when the PSBT is malformed or not fully signed (btc-signer's
|
|
41
|
+
* `finalize()` rejects an input that still lacks a signature) so the dApp gets
|
|
42
|
+
* a clean error rather than a half-finalized transaction.
|
|
43
|
+
*/
|
|
44
|
+
export declare function finalizePsbt(psbtHex: string): {
|
|
45
|
+
txHex: string;
|
|
46
|
+
txid: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Decode a PSBT and return lightweight metadata for display in the
|
|
50
|
+
* confirmation popup — input count, output count, and estimated value
|
|
51
|
+
* transferred (sum of non-change outputs where possible).
|
|
52
|
+
*
|
|
53
|
+
* Never throws — returns safe defaults on malformed input.
|
|
54
|
+
*/
|
|
55
|
+
export declare function decodePsbtMeta(psbtHex: string): {
|
|
56
|
+
inputCount: number;
|
|
57
|
+
outputCount: number;
|
|
58
|
+
isValid: boolean;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=psbt-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psbt-signer.d.ts","sourceRoot":"","sources":["../../src/lib/psbt-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA0BH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAA;IAClB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAyE1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuB7E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;CACjB,CAaA"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSBT signing helper.
|
|
3
|
+
*
|
|
4
|
+
* Parses an incoming PSBT, derives the set of private keys that correspond
|
|
5
|
+
* to BIP32 derivation paths embedded in the PSBT's input entries, attempts
|
|
6
|
+
* to sign every signable input, and returns the result.
|
|
7
|
+
*
|
|
8
|
+
* Design invariants:
|
|
9
|
+
* - Never fabricates a signature: if no input can be signed (no BIP32 paths
|
|
10
|
+
* present, no matching key), returns { unchanged: true }.
|
|
11
|
+
* - Does NOT scan derivation paths — only signs inputs whose PSBT already
|
|
12
|
+
* carries explicit BIP32 derivation metadata. Scanning would be O(accounts
|
|
13
|
+
* × gap) and too slow for the background service worker.
|
|
14
|
+
* - Throws on malformed / non-PSBT input so the caller can surface an error
|
|
15
|
+
* to the dApp rather than silently returning garbage.
|
|
16
|
+
*/
|
|
17
|
+
import { Transaction } from '@scure/btc-signer';
|
|
18
|
+
import { HDKey } from '@scure/bip32';
|
|
19
|
+
import { mnemonicToSeedSync } from '@scure/bip39';
|
|
20
|
+
import { hexToBytes, bytesToHex } from '@noble/hashes/utils.js';
|
|
21
|
+
// PSBT magic bytes: 0x70736274ff ("psbt" + separator 0xff)
|
|
22
|
+
const PSBT_MAGIC = new Uint8Array([0x70, 0x73, 0x62, 0x74, 0xff]);
|
|
23
|
+
function assertPsbtMagic(bytes) {
|
|
24
|
+
for (let i = 0; i < PSBT_MAGIC.length; i++) {
|
|
25
|
+
if (bytes[i] !== PSBT_MAGIC[i]) {
|
|
26
|
+
throw new Error('Input is not a valid PSBT (magic bytes mismatch)');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Convert a raw BIP32 path array (as stored in PSBT key-value pairs) to the
|
|
32
|
+
* canonical string form. Each element ≥ 0x80000000 is a hardened step.
|
|
33
|
+
*/
|
|
34
|
+
function pathToString(pathArr) {
|
|
35
|
+
return 'm/' + pathArr.map((n) => (n >= 0x80000000 ? `${n - 0x80000000}'` : String(n))).join('/');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse and attempt to sign a PSBT using keys derived from the provided
|
|
39
|
+
* BIP39 mnemonic.
|
|
40
|
+
*
|
|
41
|
+
* @param psbtHex Hex-encoded PSBT bytes (without 0x prefix).
|
|
42
|
+
* @param mnemonic BIP39 mnemonic for key derivation.
|
|
43
|
+
*/
|
|
44
|
+
export function signPsbt(psbtHex, mnemonic) {
|
|
45
|
+
const bytes = hexToBytes(psbtHex);
|
|
46
|
+
assertPsbtMagic(bytes);
|
|
47
|
+
let tx;
|
|
48
|
+
try {
|
|
49
|
+
tx = Transaction.fromPSBT(bytes);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
53
|
+
throw new Error(`Failed to parse PSBT: ${msg}`);
|
|
54
|
+
}
|
|
55
|
+
const seed = mnemonicToSeedSync(mnemonic);
|
|
56
|
+
const root = HDKey.fromMasterSeed(seed);
|
|
57
|
+
let signedCount = 0;
|
|
58
|
+
for (let idx = 0; idx < tx.inputsLength; idx++) {
|
|
59
|
+
const input = tx.getInput(idx);
|
|
60
|
+
// Skip finalized inputs. An empty Uint8Array is truthy, so check length.
|
|
61
|
+
const hasFinalSig = Array.isArray(input.finalScriptSig)
|
|
62
|
+
? input.finalScriptSig.length > 0
|
|
63
|
+
: (input.finalScriptSig?.length ?? 0) > 0;
|
|
64
|
+
const hasFinalWitness = Array.isArray(input.finalScriptWitness) && input.finalScriptWitness.length > 0;
|
|
65
|
+
if (hasFinalSig || hasFinalWitness)
|
|
66
|
+
continue;
|
|
67
|
+
// Collect derivation paths from this input. An input may have multiple
|
|
68
|
+
// BIP32_DERIVATION entries (one per required signer in multisig scripts).
|
|
69
|
+
const derivations = input.bip32Derivation ?? [];
|
|
70
|
+
const taprootDerivations = input.tapBip32Derivation ?? [];
|
|
71
|
+
const allPaths = [
|
|
72
|
+
...derivations.map(([, { path }]) => pathToString(path)),
|
|
73
|
+
...taprootDerivations.map(([, { der: { path }, },]) => pathToString(path)),
|
|
74
|
+
];
|
|
75
|
+
if (allPaths.length === 0)
|
|
76
|
+
continue;
|
|
77
|
+
for (const path of allPaths) {
|
|
78
|
+
let child;
|
|
79
|
+
try {
|
|
80
|
+
child = root.derive(path);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (!child.privateKey)
|
|
86
|
+
continue;
|
|
87
|
+
try {
|
|
88
|
+
tx.signIdx(child.privateKey, idx);
|
|
89
|
+
signedCount++;
|
|
90
|
+
break; // one signature per input is enough
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Key didn't match this input — try the next derivation path.
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const unchanged = signedCount === 0;
|
|
98
|
+
const resultBytes = tx.toPSBT();
|
|
99
|
+
return {
|
|
100
|
+
psbt: bytesToHex(resultBytes),
|
|
101
|
+
unchanged,
|
|
102
|
+
signedCount,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Finalize a fully-signed PSBT and extract the raw network transaction.
|
|
107
|
+
*
|
|
108
|
+
* Used by `webbtc.finalizePsbt`: a dApp hands back a PSBT that already carries
|
|
109
|
+
* all required signatures and asks the wallet to assemble the final scriptSig /
|
|
110
|
+
* witness and return the broadcastable transaction hex.
|
|
111
|
+
*
|
|
112
|
+
* Throws when the PSBT is malformed or not fully signed (btc-signer's
|
|
113
|
+
* `finalize()` rejects an input that still lacks a signature) so the dApp gets
|
|
114
|
+
* a clean error rather than a half-finalized transaction.
|
|
115
|
+
*/
|
|
116
|
+
export function finalizePsbt(psbtHex) {
|
|
117
|
+
const bytes = hexToBytes(psbtHex);
|
|
118
|
+
assertPsbtMagic(bytes);
|
|
119
|
+
let tx;
|
|
120
|
+
try {
|
|
121
|
+
tx = Transaction.fromPSBT(bytes);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
125
|
+
throw new Error(`Failed to parse PSBT: ${msg}`);
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
tx.finalize();
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
132
|
+
throw new Error(`PSBT is not fully signed / could not be finalized: ${msg}`);
|
|
133
|
+
}
|
|
134
|
+
// `extract()` returns the raw network transaction bytes once every input is
|
|
135
|
+
// finalized. `tx.id` is the (witness-excluded) txid in display byte order.
|
|
136
|
+
const rawTx = tx.extract();
|
|
137
|
+
return { txHex: bytesToHex(rawTx), txid: tx.id };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Decode a PSBT and return lightweight metadata for display in the
|
|
141
|
+
* confirmation popup — input count, output count, and estimated value
|
|
142
|
+
* transferred (sum of non-change outputs where possible).
|
|
143
|
+
*
|
|
144
|
+
* Never throws — returns safe defaults on malformed input.
|
|
145
|
+
*/
|
|
146
|
+
export function decodePsbtMeta(psbtHex) {
|
|
147
|
+
try {
|
|
148
|
+
const bytes = hexToBytes(psbtHex);
|
|
149
|
+
assertPsbtMagic(bytes);
|
|
150
|
+
const tx = Transaction.fromPSBT(bytes);
|
|
151
|
+
return {
|
|
152
|
+
inputCount: tx.inputsLength,
|
|
153
|
+
outputCount: tx.outputsLength,
|
|
154
|
+
isValid: true,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return { inputCount: 0, outputCount: 0, isValid: false };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=psbt-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"psbt-signer.js","sourceRoot":"","sources":["../../src/lib/psbt-signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 type { AssetBalanceResponse, BtcBalanceResponse } from "kaleido-sdk/rln";
|
|
12
|
+
import type { UnifiedAsset, UnifiedTransaction } from "../types/base.js";
|
|
13
|
+
/**
|
|
14
|
+
* `wallet.getBtcBalance()` returns BTC split into "vanilla" (regular) and
|
|
15
|
+
* "colored" (RGB-allocated) sub-balances. The wallet UI only surfaces the
|
|
16
|
+
* vanilla portion as the BTC asset's balance — colored sats are accounted
|
|
17
|
+
* for under each RGB asset's own balance. Locks the policy: don't show
|
|
18
|
+
* colored sats as spendable BTC.
|
|
19
|
+
*/
|
|
20
|
+
export declare function convertBtcBalance(btcBalance: BtcBalanceResponse): UnifiedAsset["balance"];
|
|
21
|
+
/**
|
|
22
|
+
* `wallet.getAssetBalance(assetId)` returns the per-asset SDK balance.
|
|
23
|
+
* Exposes the off-chain inbound/outbound capacities — both shown in the
|
|
24
|
+
* channel-aware balance breakdown — and treats `offchain_outbound` as
|
|
25
|
+
* `locked` for legacy callers that don't know about the off-chain split.
|
|
26
|
+
*/
|
|
27
|
+
export declare function convertSdkBalance(balance: AssetBalanceResponse, precision?: number): UnifiedAsset["balance"];
|
|
28
|
+
/**
|
|
29
|
+
* `client.rln.listAssets()` returns balance as a plain `Record<string, number>`
|
|
30
|
+
* — same field names as the SDK shape but flatter and `undefined`-safe.
|
|
31
|
+
* Same projection as `convertSdkBalance` but no required-field assumptions.
|
|
32
|
+
*/
|
|
33
|
+
export declare function convertNodeBalance(balance: Record<string, number> | undefined, precision?: number): UnifiedAsset["balance"];
|
|
34
|
+
/**
|
|
35
|
+
* Build a `UnifiedAsset` from the raw `client.rln.listAssets()` payload.
|
|
36
|
+
* Precision defaults to 8 (BTC convention) when the node omits it —
|
|
37
|
+
* legacy assets pre-RGB20 sometimes don't carry an explicit precision.
|
|
38
|
+
*/
|
|
39
|
+
export declare function convertNodeAssetToUnified(asset: Record<string, unknown>): UnifiedAsset;
|
|
40
|
+
/**
|
|
41
|
+
* On-chain RGB transfer from `client.rln.listTransfers()`. `asset` is left
|
|
42
|
+
* as an empty placeholder; the caller (Activity view) joins on `asset_id`
|
|
43
|
+
* to populate it via the asset inventory.
|
|
44
|
+
*/
|
|
45
|
+
export declare function convertTransferToTransaction(transfer: Record<string, unknown>): UnifiedTransaction;
|
|
46
|
+
/**
|
|
47
|
+
* Maker/taker swap entry from `client.rln.listSwaps()`. The same swap
|
|
48
|
+
* appears once per side — `side` distinguishes them in the rendered id
|
|
49
|
+
* so a maker and taker view of the same swap don't collide.
|
|
50
|
+
*
|
|
51
|
+
* Timestamp resolution: prefer `completed_at`, then `initiated_at`, then
|
|
52
|
+
* `requested_at` (all in seconds — converted to ms here).
|
|
53
|
+
*/
|
|
54
|
+
export declare function convertSwapToTransaction(swap: Record<string, unknown>, side: "maker" | "taker"): UnifiedTransaction;
|
|
55
|
+
/**
|
|
56
|
+
* Lightning payment entry from `client.rln.listPayments()`. Inbound vs
|
|
57
|
+
* outbound is determined by the `inbound` flag (we render as receive vs
|
|
58
|
+
* send). Amount resolution prefers `asset_amount` (for RGB-asset payments)
|
|
59
|
+
* then falls back to converting the BTC msat figure to sats.
|
|
60
|
+
*/
|
|
61
|
+
export declare function convertPaymentToTransaction(payment: Record<string, unknown>): UnifiedTransaction;
|
|
62
|
+
//# sourceMappingURL=rgb-converters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgb-converters.d.ts","sourceRoot":"","sources":["../../src/lib/rgb-converters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAetE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,CASzF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,EAC7B,SAAS,GAAE,MAAU,GACpB,YAAY,CAAC,SAAS,CAAC,CAWzB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,SAAS,GAAE,MAAU,GACpB,YAAY,CAAC,SAAS,CAAC,CAezB;AAID;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAkBtF;AAOD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,kBAAkB,CAepB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,OAAO,GAAG,OAAO,GACtB,kBAAkB,CAoBpB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAqBhG"}
|