@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
package/dist/ports/index.js
CHANGED
|
@@ -5,5 +5,27 @@
|
|
|
5
5
|
* browser extension, Node) implements these ports and injects them at startup,
|
|
6
6
|
* so the same engine + adapters run everywhere unchanged.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Console-backed logger used when a host injects none. Kept as the single place
|
|
10
|
+
* the engine touches `console`, so the rest of core stays host-agnostic.
|
|
11
|
+
*/
|
|
12
|
+
export const consoleLogger = {
|
|
13
|
+
debug: (...a) => console.debug(...a),
|
|
14
|
+
info: (...a) => console.info(...a),
|
|
15
|
+
warn: (...a) => console.warn(...a),
|
|
16
|
+
error: (...a) => console.error(...a),
|
|
17
|
+
};
|
|
18
|
+
let platform = null;
|
|
19
|
+
/** Inject the host's platform ports once at startup. */
|
|
20
|
+
export function setPlatform(ctx) {
|
|
21
|
+
platform = ctx;
|
|
22
|
+
}
|
|
23
|
+
/** The injected platform context, or null if the host never called setPlatform. */
|
|
24
|
+
export function getPlatform() {
|
|
25
|
+
return platform;
|
|
26
|
+
}
|
|
27
|
+
/** The active logger: injected host logger if present, else the console logger. */
|
|
28
|
+
export function getLogger() {
|
|
29
|
+
return platform?.logger ?? consoleLogger;
|
|
30
|
+
}
|
|
9
31
|
//# sourceMappingURL=index.js.map
|
package/dist/ports/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoCH;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;CACrC,CAAA;AAED,IAAI,QAAQ,GAA2B,IAAI,CAAA;AAE3C,wDAAwD;AACxD,MAAM,UAAU,WAAW,CAAC,GAAoB;IAC9C,QAAQ,GAAG,GAAG,CAAA;AAChB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,EAAE,MAAM,IAAI,aAAa,CAAA;AAC1C,CAAC"}
|
|
@@ -51,4 +51,16 @@ export interface UnifiedReceiveParams {
|
|
|
51
51
|
export declare function buildUnifiedReceiveURI(p: UnifiedReceiveParams): string;
|
|
52
52
|
/** Parse a BIP321 unified URI back into its parts (Kaleido wallets use this on scan). */
|
|
53
53
|
export declare function parseUnifiedReceiveURI(uri: string): UnifiedReceiveParams | null;
|
|
54
|
+
/**
|
|
55
|
+
* The distinct payment methods present in a parsed unified URI.
|
|
56
|
+
*
|
|
57
|
+
* A unified `bitcoin:` URI may carry several independent payment methods (an
|
|
58
|
+
* on-chain address AND a `lightning=` invoice AND an asset invoice). They are
|
|
59
|
+
* NOT cryptographically bound to one another — a scanned QR could pair an
|
|
60
|
+
* address with an unrelated invoice. Consumers MUST present the methods and let
|
|
61
|
+
* the user/router choose one explicitly; they must not silently auto-pay a
|
|
62
|
+
* different method than the one the user intended. This helper enumerates what's
|
|
63
|
+
* on offer so the UI can do that.
|
|
64
|
+
*/
|
|
65
|
+
export declare function receiveMethodsOf(p: UnifiedReceiveParams): Array<keyof UnifiedReceiveParams>;
|
|
54
66
|
//# sourceMappingURL=unifiedReceive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unifiedReceive.d.ts","sourceRoot":"","sources":["../../src/receive/unifiedReceive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAcD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CA4BtE;AAED,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"unifiedReceive.d.ts","sourceRoot":"","sources":["../../src/receive/unifiedReceive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAcD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CA4BtE;AAED,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAsB/E;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,oBAAoB,GAAG,KAAK,CAAC,MAAM,oBAAoB,CAAC,CAW3F"}
|
|
@@ -79,11 +79,12 @@ export function parseUnifiedReceiveURI(uri) {
|
|
|
79
79
|
return null;
|
|
80
80
|
const btcAddress = m[1] || undefined;
|
|
81
81
|
const params = new URLSearchParams(m[2] ?? '');
|
|
82
|
-
const amount = params.get('amount');
|
|
83
|
-
const assetAmount = params.get(K.assetAmount);
|
|
84
82
|
return {
|
|
85
83
|
btcAddress,
|
|
86
|
-
|
|
84
|
+
// Amounts are coerced through a finite/non-negative guard: a junk, negative,
|
|
85
|
+
// or non-finite `amount=` must surface as `undefined`, never as NaN/-1/Infinity
|
|
86
|
+
// flowing into a send.
|
|
87
|
+
amountBtc: toNonNegativeFinite(params.get('amount')),
|
|
87
88
|
label: params.get('label') ?? undefined,
|
|
88
89
|
lightningInvoice: params.get(K.lightning) ?? undefined,
|
|
89
90
|
lightningOffer: params.get(K.lno) ?? undefined,
|
|
@@ -92,11 +93,41 @@ export function parseUnifiedReceiveURI(uri) {
|
|
|
92
93
|
liquidAddress: params.get(K.liquid) ?? undefined,
|
|
93
94
|
rgbInvoice: params.get(K.rgb) ?? undefined,
|
|
94
95
|
assetId: params.get(K.assetId) ?? undefined,
|
|
95
|
-
assetAmount:
|
|
96
|
+
assetAmount: toNonNegativeFinite(params.get(K.assetAmount)),
|
|
96
97
|
};
|
|
97
98
|
}
|
|
99
|
+
/** Parse a query value as a finite, non-negative number, else `undefined`. */
|
|
100
|
+
function toNonNegativeFinite(v) {
|
|
101
|
+
if (v == null || v.trim() === '')
|
|
102
|
+
return undefined;
|
|
103
|
+
const n = Number(v);
|
|
104
|
+
return Number.isFinite(n) && n >= 0 ? n : undefined;
|
|
105
|
+
}
|
|
98
106
|
/** BIP21/BIP321 amounts are in BTC with up to 8 decimals, no trailing zeros / exponent. */
|
|
99
107
|
function formatBtc(amountBtc) {
|
|
100
108
|
return amountBtc.toFixed(8).replace(/\.?0+$/, '');
|
|
101
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* The distinct payment methods present in a parsed unified URI.
|
|
112
|
+
*
|
|
113
|
+
* A unified `bitcoin:` URI may carry several independent payment methods (an
|
|
114
|
+
* on-chain address AND a `lightning=` invoice AND an asset invoice). They are
|
|
115
|
+
* NOT cryptographically bound to one another — a scanned QR could pair an
|
|
116
|
+
* address with an unrelated invoice. Consumers MUST present the methods and let
|
|
117
|
+
* the user/router choose one explicitly; they must not silently auto-pay a
|
|
118
|
+
* different method than the one the user intended. This helper enumerates what's
|
|
119
|
+
* on offer so the UI can do that.
|
|
120
|
+
*/
|
|
121
|
+
export function receiveMethodsOf(p) {
|
|
122
|
+
const keys = [
|
|
123
|
+
'btcAddress',
|
|
124
|
+
'lightningInvoice',
|
|
125
|
+
'lightningOffer',
|
|
126
|
+
'sparkAddress',
|
|
127
|
+
'arkadeAddress',
|
|
128
|
+
'liquidAddress',
|
|
129
|
+
'rgbInvoice',
|
|
130
|
+
];
|
|
131
|
+
return keys.filter((k) => p[k] != null && p[k] !== '');
|
|
132
|
+
}
|
|
102
133
|
//# sourceMappingURL=unifiedReceive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unifiedReceive.js","sourceRoot":"","sources":["../../src/receive/unifiedReceive.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"unifiedReceive.js","sourceRoot":"","sources":["../../src/receive/unifiedReceive.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,19 @@
|
|
|
10
10
|
* Adapters are constructed but NOT connected — call `connect(config)` per protocol
|
|
11
11
|
* (each adapter's config carries its mnemonic + protocol-specific endpoints).
|
|
12
12
|
*/
|
|
13
|
-
import { ProtocolAdapterRegistry } from '../adapters/IProtocolAdapter';
|
|
14
|
-
import { ProtocolType } from '../types/base';
|
|
13
|
+
import { ProtocolAdapterRegistry } from '../adapters/IProtocolAdapter.js';
|
|
14
|
+
import { ProtocolType } from '../types/base.js';
|
|
15
15
|
export interface WdkRegistryOptions {
|
|
16
16
|
/** Which protocols to register (default: all four). */
|
|
17
17
|
enabled?: ProtocolType[];
|
|
18
|
+
/**
|
|
19
|
+
* Which RGB_L1 backing to register when `RGB_L1` is enabled:
|
|
20
|
+
* - `'native'` (default): `RgbLibWdkAdapter` (native rgb-lib + filesystem
|
|
21
|
+
* dataDir; Node/RN/desktop only).
|
|
22
|
+
* - `'wasm'`: `RgbLibWasmAdapter` (browser/WASM rgb-lib + IndexedDB; runs
|
|
23
|
+
* node-less in an MV3 service worker).
|
|
24
|
+
*/
|
|
25
|
+
rgbL1Backing?: 'native' | 'wasm';
|
|
18
26
|
}
|
|
19
27
|
export declare function createWdkRegistry(opts?: WdkRegistryOptions): ProtocolAdapterRegistry;
|
|
20
28
|
//# sourceMappingURL=createWdkRegistry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createWdkRegistry.d.ts","sourceRoot":"","sources":["../../src/registry/createWdkRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"createWdkRegistry.d.ts","sourceRoot":"","sources":["../../src/registry/createWdkRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAOtE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;CACjC;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,kBAAuB,GAAG,uBAAuB,CAWxF"}
|
|
@@ -10,12 +10,16 @@
|
|
|
10
10
|
* Adapters are constructed but NOT connected — call `connect(config)` per protocol
|
|
11
11
|
* (each adapter's config carries its mnemonic + protocol-specific endpoints).
|
|
12
12
|
*/
|
|
13
|
-
import { ProtocolAdapterRegistry } from '../adapters/IProtocolAdapter';
|
|
14
|
-
import { SparkWdkAdapter } from '../adapters/wdk/SparkWdkAdapter';
|
|
15
|
-
import { LiquidWdkAdapter } from '../adapters/wdk/LiquidWdkAdapter';
|
|
16
|
-
import { RlnWdkAdapter } from '../adapters/wdk/RlnWdkAdapter';
|
|
17
|
-
import {
|
|
18
|
-
|
|
13
|
+
import { ProtocolAdapterRegistry } from '../adapters/IProtocolAdapter.js';
|
|
14
|
+
import { SparkWdkAdapter } from '../adapters/wdk/SparkWdkAdapter.js';
|
|
15
|
+
import { LiquidWdkAdapter } from '../adapters/wdk/LiquidWdkAdapter.js';
|
|
16
|
+
import { RlnWdkAdapter } from '../adapters/wdk/RlnWdkAdapter.js';
|
|
17
|
+
import { RgbLibWdkAdapter } from '../adapters/wdk/RgbLibWdkAdapter.js';
|
|
18
|
+
import { RgbLibWasmAdapter } from '../adapters/wdk/RgbLibWasmAdapter.js';
|
|
19
|
+
import { ArkadeWdkAdapter } from '../adapters/wdk/ArkadeWdkAdapter.js';
|
|
20
|
+
// RGB_L1 is opt-in (not in the default set): it's an alternative to the
|
|
21
|
+
// node-backed RGB path, not an addition to it, and the backing is host-specific.
|
|
22
|
+
const ALL = ['SPARK', 'LIQUID', 'RGB_LN', 'ARKADE'];
|
|
19
23
|
export function createWdkRegistry(opts = {}) {
|
|
20
24
|
const enabled = opts.enabled ?? ALL;
|
|
21
25
|
const registry = new ProtocolAdapterRegistry();
|
|
@@ -23,8 +27,11 @@ export function createWdkRegistry(opts = {}) {
|
|
|
23
27
|
registry.register(new SparkWdkAdapter());
|
|
24
28
|
if (enabled.includes('LIQUID'))
|
|
25
29
|
registry.register(new LiquidWdkAdapter());
|
|
26
|
-
if (enabled.includes('
|
|
30
|
+
if (enabled.includes('RGB_LN'))
|
|
27
31
|
registry.register(new RlnWdkAdapter());
|
|
32
|
+
if (enabled.includes('RGB_L1')) {
|
|
33
|
+
registry.register(opts.rgbL1Backing === 'wasm' ? new RgbLibWasmAdapter() : new RgbLibWdkAdapter());
|
|
34
|
+
}
|
|
28
35
|
if (enabled.includes('ARKADE'))
|
|
29
36
|
registry.register(new ArkadeWdkAdapter());
|
|
30
37
|
return registry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createWdkRegistry.js","sourceRoot":"","sources":["../../src/registry/createWdkRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"createWdkRegistry.js","sourceRoot":"","sources":["../../src/registry/createWdkRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAgBnE,wEAAwE;AACxE,iFAAiF;AACjF,MAAM,GAAG,GAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAEnE,MAAM,UAAU,iBAAiB,CAAC,OAA2B,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAA;IACnC,MAAM,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAA;IAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC,CAAA;IACvE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAA;IACzE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAA;IACtE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAA;IACpG,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAA;IACzE,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
* This is the cross-protocol layer that WDK's per-module detection does NOT cover:
|
|
10
10
|
* WDK detects within a protocol; this chooses BETWEEN protocols.
|
|
11
11
|
*/
|
|
12
|
-
import { ProtocolType, Layer, AddressFormat } from '../types/base';
|
|
13
|
-
export type DestinationKind = 'BOLT11' | 'LN_ADDRESS' | 'RGB_INVOICE' | 'SPARK' | 'ARKADE' | 'LIQUID' | 'BTC_ONCHAIN' | 'BIP21' | 'UNKNOWN';
|
|
12
|
+
import { ProtocolType, Layer, AddressFormat } from '../types/base.js';
|
|
13
|
+
export type DestinationKind = 'BOLT11' | 'BOLT12' | 'LN_ADDRESS' | 'RGB_INVOICE' | 'SPARK' | 'ARKADE' | 'LIQUID' | 'BTC_ONCHAIN' | 'BIP21' | 'UNKNOWN';
|
|
14
14
|
export interface ClassifiedDestination {
|
|
15
15
|
kind: DestinationKind;
|
|
16
16
|
/** The most specific layer this destination settles on. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destination.d.ts","sourceRoot":"","sources":["../../src/router/destination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElE,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,YAAY,GACZ,aAAa,GACb,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,OAAO,GACP,SAAS,CAAA;AAEb,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAA;IACrB,2DAA2D;IAC3D,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,uEAAuE;IACvE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,gEAAgE;IAChE,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;CACd;
|
|
1
|
+
{"version":3,"file":"destination.d.ts","sourceRoot":"","sources":["../../src/router/destination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElE,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,aAAa,GACb,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,OAAO,GACP,SAAS,CAAA;AAEb,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAA;IACrB,2DAA2D;IAC3D,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,uEAAuE;IACvE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,gEAAgE;IAChE,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;CACd;AAoCD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CA4DtE"}
|
|
@@ -9,15 +9,31 @@
|
|
|
9
9
|
* This is the cross-protocol layer that WDK's per-module detection does NOT cover:
|
|
10
10
|
* WDK detects within a protocol; this chooses BETWEEN protocols.
|
|
11
11
|
*/
|
|
12
|
+
// Matchers are deliberately STRICT and anchored: the classifier directs funds,
|
|
13
|
+
// so it must fail CLOSED (→ UNKNOWN, no candidates) on anything it cannot
|
|
14
|
+
// positively identify. A loose prefix that matches arbitrary text (the old
|
|
15
|
+
// Liquid `H`/`VT`/`Az` and the bare-letter BTC fallbacks) is a fund-misrouting
|
|
16
|
+
// bug, not a convenience.
|
|
12
17
|
const RE = {
|
|
13
18
|
bolt11: /^ln(bc|tb|bcrt|sb)[0-9]/i,
|
|
14
|
-
|
|
19
|
+
bolt12: /^lno1[0-9a-z]+$/i,
|
|
20
|
+
lnurl: /^lnurl[0-9a-z]+$/i,
|
|
15
21
|
lnAddress: /^[^@\s]+@[^@\s]+\.[^@\s]+$/i,
|
|
16
22
|
rgb: /^(rgb:|utxob:)/i,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
// Spark bech32m HRPs, per the @buildonspark/spark-sdk address encoder:
|
|
24
|
+
// `spark1` (mainnet), `sparkt1` (testnet), `sparkrt1` (regtest), `sparkl1`
|
|
25
|
+
// (local/signet), plus the legacy `spl1`/`sprt1` forms. `sp1` is deliberately
|
|
26
|
+
// NOT here — that HRP belongs to BIP352 Silent Payments, so matching it as
|
|
27
|
+
// Spark would be a fund-misrouting bug. Longest prefixes first.
|
|
28
|
+
spark: /^(sparkrt|sparkt|sparkl|spark|sprt|spl)1[0-9a-z]{6,}$/i,
|
|
29
|
+
arkade: /^(ark|tark)1[0-9a-z]{6,}$/i,
|
|
30
|
+
// Liquid bech32/blech32 only (confidential `lq1`, unconfidential `ex1`, +
|
|
31
|
+
// testnet/regtest variants). Legacy base58 Liquid prefixes are intentionally
|
|
32
|
+
// dropped: `VT`/`H`/`Gq` are indistinguishable from arbitrary text.
|
|
33
|
+
liquid: /^(lq1|tlq1|ex1|tex1|el1|ert1)[0-9a-z]{6,}$/i,
|
|
34
|
+
// BTC bech32 (charset excludes 1/b/i/o) or legacy base58 (charset excludes
|
|
35
|
+
// 0/O/I/l), length-bounded so junk like `not-an-address` cannot match.
|
|
36
|
+
btc: /^(bc1|tb1|bcrt1)[02-9ac-hj-np-z]{6,87}$|^[13mn2][a-km-zA-HJ-NP-Z1-9]{25,39}$/,
|
|
21
37
|
bip21: /^bitcoin:/i,
|
|
22
38
|
};
|
|
23
39
|
/** Pull a `lightning=` parameter out of a BIP21 URI, if present. */
|
|
@@ -34,20 +50,27 @@ export function classifyDestination(raw) {
|
|
|
34
50
|
kind: 'BIP21',
|
|
35
51
|
layer: 'BTC_L1',
|
|
36
52
|
format: 'BTC_ADDRESS',
|
|
37
|
-
// On-chain BTC can be served by any protocol with
|
|
38
|
-
|
|
53
|
+
// On-chain BTC can be served by any protocol with a Bitcoin on-chain path.
|
|
54
|
+
// LIQUID is excluded: it's a separate L1 and cannot settle a BTC address.
|
|
55
|
+
// (An embedded `lightning=` fallback widens the route at the router layer.)
|
|
56
|
+
candidates: ['RGB_LN', 'RGB_L1', 'ARKADE', 'SPARK'],
|
|
39
57
|
lightningFallback,
|
|
40
58
|
value: addr,
|
|
41
59
|
};
|
|
42
60
|
}
|
|
61
|
+
if (RE.bolt12.test(dest)) {
|
|
62
|
+
return { kind: 'BOLT12', layer: 'BTC_LN', format: 'BOLT12', candidates: ['RGB_LN', 'SPARK', 'ARKADE'], value: dest };
|
|
63
|
+
}
|
|
43
64
|
if (RE.bolt11.test(dest)) {
|
|
44
|
-
return { kind: 'BOLT11', layer: 'BTC_LN', format: 'BOLT11', candidates: ['
|
|
65
|
+
return { kind: 'BOLT11', layer: 'BTC_LN', format: 'BOLT11', candidates: ['RGB_LN', 'SPARK', 'ARKADE'], value: dest };
|
|
45
66
|
}
|
|
46
67
|
if (RE.lnurl.test(dest) || RE.lnAddress.test(dest)) {
|
|
47
|
-
return { kind: 'LN_ADDRESS', layer: 'BTC_LN', format: 'BOLT11', candidates: ['
|
|
68
|
+
return { kind: 'LN_ADDRESS', layer: 'BTC_LN', format: 'BOLT11', candidates: ['RGB_LN', 'SPARK', 'ARKADE'], value: dest };
|
|
48
69
|
}
|
|
49
70
|
if (RE.rgb.test(dest)) {
|
|
50
|
-
|
|
71
|
+
// Either RGB backing can pay an RGB invoice; the router filters to whichever
|
|
72
|
+
// is registered + connected (and verifies it can settle the layer).
|
|
73
|
+
return { kind: 'RGB_INVOICE', layer: 'RGB_LN', format: 'RGB_INVOICE', candidates: ['RGB_LN', 'RGB_L1'], value: dest };
|
|
51
74
|
}
|
|
52
75
|
if (RE.spark.test(dest)) {
|
|
53
76
|
return { kind: 'SPARK', layer: 'SPARK_SPARK', format: 'SPARK_ADDRESS', candidates: ['SPARK'], value: dest };
|
|
@@ -63,7 +86,7 @@ export function classifyDestination(raw) {
|
|
|
63
86
|
kind: 'BTC_ONCHAIN',
|
|
64
87
|
layer: 'BTC_L1',
|
|
65
88
|
format: 'BTC_ADDRESS',
|
|
66
|
-
candidates: ['
|
|
89
|
+
candidates: ['RGB_LN', 'RGB_L1', 'ARKADE', 'SPARK'], // protocols that can pay an on-chain BTC address
|
|
67
90
|
value: dest,
|
|
68
91
|
};
|
|
69
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destination.js","sourceRoot":"","sources":["../../src/router/destination.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"destination.js","sourceRoot":"","sources":["../../src/router/destination.ts"],"names":[],"mappings":"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"}
|
package/dist/router/index.d.ts
CHANGED
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
* It reads the capability manifest (differences-as-data) + the destination
|
|
10
10
|
* classifier — never the adapters' internals.
|
|
11
11
|
*/
|
|
12
|
-
import { ProtocolAdapterRegistry, IProtocolAdapter } from '../adapters/IProtocolAdapter';
|
|
13
|
-
import { ProtocolType, Layer } from '../types/base';
|
|
14
|
-
import { ClassifiedDestination } from './destination';
|
|
12
|
+
import { ProtocolAdapterRegistry, IProtocolAdapter } from '../adapters/IProtocolAdapter.js';
|
|
13
|
+
import { ProtocolType, Layer } from '../types/base.js';
|
|
14
|
+
import { ClassifiedDestination } from './destination.js';
|
|
15
|
+
import { type UnifiedReceiveParams } from '../receive/unifiedReceive.js';
|
|
16
|
+
import { type Rail, type RoutePreference } from './preference.js';
|
|
15
17
|
export interface SendRoute {
|
|
16
18
|
protocol: ProtocolType;
|
|
17
19
|
adapter: IProtocolAdapter;
|
|
@@ -31,6 +33,21 @@ export interface ReceiveRoute {
|
|
|
31
33
|
adapter: IProtocolAdapter;
|
|
32
34
|
layer: Layer;
|
|
33
35
|
}
|
|
36
|
+
/** A send route through a specific rail of a unified payment URI. */
|
|
37
|
+
export interface UnifiedSendRoute extends SendRoute {
|
|
38
|
+
/** Which embedded rail this route pays through (lno/lightning/spark/…/onchain). */
|
|
39
|
+
rail: Rail;
|
|
40
|
+
/** The payable value for this rail (invoice/offer/address). */
|
|
41
|
+
value: string;
|
|
42
|
+
}
|
|
43
|
+
export interface UnifiedSendResolution {
|
|
44
|
+
/** The parsed unified URI (null when the input was a single raw destination). */
|
|
45
|
+
source: UnifiedReceiveParams | null;
|
|
46
|
+
/** Every payable rail×protocol route, ranked by preference (best first). */
|
|
47
|
+
routes: UnifiedSendRoute[];
|
|
48
|
+
/** The auto-selected route (highest-priority direct route) for lite mode, or null. */
|
|
49
|
+
best: UnifiedSendRoute | null;
|
|
50
|
+
}
|
|
34
51
|
export declare class CrossProtocolRouter {
|
|
35
52
|
private registry;
|
|
36
53
|
constructor(registry: ProtocolAdapterRegistry);
|
|
@@ -41,6 +58,25 @@ export declare class CrossProtocolRouter {
|
|
|
41
58
|
* Lite mode uses `.best`; advanced mode can offer the full `.routes` list.
|
|
42
59
|
*/
|
|
43
60
|
resolveSend(destination: string): SendResolution;
|
|
61
|
+
/**
|
|
62
|
+
* Resolve how to SEND to a UNIFIED payment URI (BIP21 / BIP321) that may carry
|
|
63
|
+
* several rails at once — a BOLT12 offer, a BOLT11 invoice, Spark/Arkade/Liquid
|
|
64
|
+
* addresses, an RGB invoice, an on-chain address. Each present rail is matched
|
|
65
|
+
* to the registered+connected protocols that can settle it, then the whole set
|
|
66
|
+
* is ranked by the user's `preference` (per-asset layer ranking) falling back to
|
|
67
|
+
* the Lightning-first default. `.best` is the auto-route for lite mode; advanced
|
|
68
|
+
* mode can present the full ranked `.routes` list.
|
|
69
|
+
*
|
|
70
|
+
* A plain (non-`bitcoin:`) string is handled too: it falls back to a single-rail
|
|
71
|
+
* `resolveSend`, so callers can use one entry point for any pasted destination.
|
|
72
|
+
*
|
|
73
|
+
* NOTE: BIP353 (₿user@domain) is intentionally out of scope here — it needs a
|
|
74
|
+
* DNS-over-HTTPS lookup the dependency-free engine doesn't perform; resolve it
|
|
75
|
+
* to a BIP321 URI in the host, then pass the result in.
|
|
76
|
+
*/
|
|
77
|
+
resolveUnifiedSend(uri: string, opts?: {
|
|
78
|
+
preference?: RoutePreference;
|
|
79
|
+
}): UnifiedSendResolution;
|
|
44
80
|
/**
|
|
45
81
|
* Resolve which protocols can RECEIVE on a given layer (e.g. show the user
|
|
46
82
|
* the available "receive over Lightning / Spark / on-chain" options).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACxF,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAuB,qBAAqB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACxF,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAuB,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAC7F,OAAO,EACL,KAAK,IAAI,EACT,KAAK,eAAe,EAIrB,MAAM,cAAc,CAAA;AA+BrB,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,gBAAgB,CAAA;IACzB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,qBAAqB,CAAA;IAClC,gEAAgE;IAChE,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,2EAA2E;IAC3E,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,gBAAgB,CAAA;IACzB,KAAK,EAAE,KAAK,CAAA;CACb;AAED,qEAAqE;AACrE,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,mFAAmF;IACnF,IAAI,EAAE,IAAI,CAAA;IACV,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAA;IACnC,4EAA4E;IAC5E,MAAM,EAAE,gBAAgB,EAAE,CAAA;IAC1B,sFAAsF;IACtF,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAC9B;AAED,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,uBAAuB;IAErD,6EAA6E;IAC7E,OAAO,CAAC,SAAS;IAKjB;;;OAGG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc;IAoBhD;;;;;;;;;;;;;;;OAeG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,eAAe,CAAA;KAAE,GAAG,qBAAqB;IAqD/F;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,EAAE;IAY5C;;;OAGG;IACH,mBAAmB,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,gBAAgB,EAAE;CAOxF"}
|
package/dist/router/index.js
CHANGED
|
@@ -9,8 +9,38 @@
|
|
|
9
9
|
* It reads the capability manifest (differences-as-data) + the destination
|
|
10
10
|
* classifier — never the adapters' internals.
|
|
11
11
|
*/
|
|
12
|
-
import { getCapabilities } from '../capabilities';
|
|
13
|
-
import { classifyDestination } from './destination';
|
|
12
|
+
import { getCapabilities } from '../capabilities/index.js';
|
|
13
|
+
import { classifyDestination } from './destination.js';
|
|
14
|
+
import { parseUnifiedReceiveURI } from '../receive/unifiedReceive.js';
|
|
15
|
+
import { layerPreferenceFor, compareByPreference, railOfKind, } from './preference.js';
|
|
16
|
+
/**
|
|
17
|
+
* Whether `protocol` can pay `dest` DIRECTLY (no swap), per the capability
|
|
18
|
+
* manifest. Reads capability flags rather than exact layer strings so a protocol
|
|
19
|
+
* that reaches a surface by a different path (e.g. Spark paying on-chain via a
|
|
20
|
+
* deposit/exit) is still recognised.
|
|
21
|
+
*/
|
|
22
|
+
function canSettleDirectly(protocol, dest) {
|
|
23
|
+
const caps = getCapabilities(protocol);
|
|
24
|
+
switch (dest.kind) {
|
|
25
|
+
case 'BOLT11':
|
|
26
|
+
case 'BOLT12':
|
|
27
|
+
case 'LN_ADDRESS':
|
|
28
|
+
return caps.supportsLightning;
|
|
29
|
+
case 'BTC_ONCHAIN':
|
|
30
|
+
case 'BIP21':
|
|
31
|
+
return caps.supportsOnchain;
|
|
32
|
+
case 'RGB_INVOICE':
|
|
33
|
+
return caps.supportsAssets && caps.layers.some((l) => l.startsWith('RGB'));
|
|
34
|
+
case 'SPARK':
|
|
35
|
+
return protocol === 'SPARK';
|
|
36
|
+
case 'ARKADE':
|
|
37
|
+
return protocol === 'ARKADE';
|
|
38
|
+
case 'LIQUID':
|
|
39
|
+
return protocol === 'LIQUID';
|
|
40
|
+
default:
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
14
44
|
export class CrossProtocolRouter {
|
|
15
45
|
constructor(registry) {
|
|
16
46
|
this.registry = registry;
|
|
@@ -31,9 +61,88 @@ export class CrossProtocolRouter {
|
|
|
31
61
|
const adapter = this.connected(protocol);
|
|
32
62
|
if (!adapter)
|
|
33
63
|
continue;
|
|
34
|
-
|
|
64
|
+
// `direct` is verified against the capability manifest, not assumed: a
|
|
65
|
+
// candidate is only a direct route if its protocol actually supports the
|
|
66
|
+
// surface this destination settles on. Lite mode's auto-route (`best`)
|
|
67
|
+
// must never claim a protocol can pay directly when the manifest disagrees.
|
|
68
|
+
const direct = canSettleDirectly(protocol, classified);
|
|
69
|
+
routes.push({ protocol, adapter, layer: classified.layer, direct });
|
|
70
|
+
}
|
|
71
|
+
// Direct routes first, so `best` is always a genuinely-direct route (or null).
|
|
72
|
+
routes.sort((a, b) => Number(b.direct) - Number(a.direct));
|
|
73
|
+
return { destination: classified, routes, best: routes.find((r) => r.direct) ?? null };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolve how to SEND to a UNIFIED payment URI (BIP21 / BIP321) that may carry
|
|
77
|
+
* several rails at once — a BOLT12 offer, a BOLT11 invoice, Spark/Arkade/Liquid
|
|
78
|
+
* addresses, an RGB invoice, an on-chain address. Each present rail is matched
|
|
79
|
+
* to the registered+connected protocols that can settle it, then the whole set
|
|
80
|
+
* is ranked by the user's `preference` (per-asset layer ranking) falling back to
|
|
81
|
+
* the Lightning-first default. `.best` is the auto-route for lite mode; advanced
|
|
82
|
+
* mode can present the full ranked `.routes` list.
|
|
83
|
+
*
|
|
84
|
+
* A plain (non-`bitcoin:`) string is handled too: it falls back to a single-rail
|
|
85
|
+
* `resolveSend`, so callers can use one entry point for any pasted destination.
|
|
86
|
+
*
|
|
87
|
+
* NOTE: BIP353 (₿user@domain) is intentionally out of scope here — it needs a
|
|
88
|
+
* DNS-over-HTTPS lookup the dependency-free engine doesn't perform; resolve it
|
|
89
|
+
* to a BIP321 URI in the host, then pass the result in.
|
|
90
|
+
*/
|
|
91
|
+
resolveUnifiedSend(uri, opts) {
|
|
92
|
+
const parsed = parseUnifiedReceiveURI(uri);
|
|
93
|
+
// Not a unified `bitcoin:` URI → treat as a single raw destination.
|
|
94
|
+
if (!parsed) {
|
|
95
|
+
const r = this.resolveSend(uri);
|
|
96
|
+
const routes = r.routes.map((rt) => ({
|
|
97
|
+
...rt,
|
|
98
|
+
rail: railOfKind(r.destination.kind),
|
|
99
|
+
value: r.destination.value,
|
|
100
|
+
}));
|
|
101
|
+
return { source: null, routes, best: routes.find((rt) => rt.direct) ?? null };
|
|
102
|
+
}
|
|
103
|
+
// Collect the (rail, payable value) pairs actually present in the URI.
|
|
104
|
+
const railValues = [];
|
|
105
|
+
if (parsed.lightningOffer)
|
|
106
|
+
railValues.push({ rail: 'lno', value: parsed.lightningOffer });
|
|
107
|
+
if (parsed.lightningInvoice)
|
|
108
|
+
railValues.push({ rail: 'lightning', value: parsed.lightningInvoice });
|
|
109
|
+
if (parsed.sparkAddress)
|
|
110
|
+
railValues.push({ rail: 'spark', value: parsed.sparkAddress });
|
|
111
|
+
if (parsed.arkadeAddress)
|
|
112
|
+
railValues.push({ rail: 'ark', value: parsed.arkadeAddress });
|
|
113
|
+
if (parsed.rgbInvoice)
|
|
114
|
+
railValues.push({ rail: 'rgb', value: parsed.rgbInvoice });
|
|
115
|
+
if (parsed.liquidAddress)
|
|
116
|
+
railValues.push({ rail: 'liquid', value: parsed.liquidAddress });
|
|
117
|
+
if (parsed.btcAddress)
|
|
118
|
+
railValues.push({ rail: 'onchain', value: parsed.btcAddress });
|
|
119
|
+
const routes = [];
|
|
120
|
+
for (const { rail, value } of railValues) {
|
|
121
|
+
// Classify each rail's value through the same single source of truth.
|
|
122
|
+
const classified = classifyDestination(value);
|
|
123
|
+
for (const protocol of classified.candidates) {
|
|
124
|
+
const adapter = this.connected(protocol);
|
|
125
|
+
if (!adapter)
|
|
126
|
+
continue;
|
|
127
|
+
routes.push({
|
|
128
|
+
protocol,
|
|
129
|
+
adapter,
|
|
130
|
+
layer: classified.layer,
|
|
131
|
+
direct: canSettleDirectly(protocol, classified),
|
|
132
|
+
rail,
|
|
133
|
+
value,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
35
136
|
}
|
|
36
|
-
|
|
137
|
+
// Rank: direct routes first, then by the (per-asset) layer preference, then
|
|
138
|
+
// the default Lightning-first rail order.
|
|
139
|
+
const layerPref = layerPreferenceFor(opts?.preference, parsed.assetId);
|
|
140
|
+
routes.sort((a, b) => {
|
|
141
|
+
if (a.direct !== b.direct)
|
|
142
|
+
return Number(b.direct) - Number(a.direct);
|
|
143
|
+
return compareByPreference(a, b, layerPref);
|
|
144
|
+
});
|
|
145
|
+
return { source: parsed, routes, best: routes.find((r) => r.direct) ?? null };
|
|
37
146
|
}
|
|
38
147
|
/**
|
|
39
148
|
* Resolve which protocols can RECEIVE on a given layer (e.g. show the user
|
package/dist/router/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAyB,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route preference + rail priority
|
|
3
|
+
* --------------------------------
|
|
4
|
+
* A unified payment URI (BIP21/BIP321) can carry several rails at once — a
|
|
5
|
+
* BOLT12 offer, a BOLT11 invoice, Spark/Arkade addresses, an RGB invoice, a
|
|
6
|
+
* Liquid address, an on-chain address. When more than one is payable, the
|
|
7
|
+
* engine has to pick. This module is the *data* that drives that choice:
|
|
8
|
+
*
|
|
9
|
+
* - a DEFAULT rail ordering (Lightning-first), used when the user expresses no
|
|
10
|
+
* preference, and
|
|
11
|
+
* - a `RoutePreference` the host can supply: an ordered list of layers, with
|
|
12
|
+
* optional per-asset overrides.
|
|
13
|
+
*
|
|
14
|
+
* Pure + dependency-free; the router consumes it.
|
|
15
|
+
*/
|
|
16
|
+
import { Layer } from '../types/base.js';
|
|
17
|
+
import { DestinationKind } from './destination.js';
|
|
18
|
+
/** A concrete payment rail, i.e. which embedded method pays the destination. */
|
|
19
|
+
export type Rail = 'lno' | 'lightning' | 'spark' | 'ark' | 'rgb' | 'liquid' | 'onchain';
|
|
20
|
+
/**
|
|
21
|
+
* Default rail priority — **Lightning-first**: BOLT12 offer, then BOLT11, then
|
|
22
|
+
* the off-chain instant rails (Spark, Arkade), then on-chain (RGB-L1, Liquid,
|
|
23
|
+
* bare BTC). Used when no user preference applies. Lower index = higher priority.
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_RAIL_ORDER: readonly Rail[];
|
|
26
|
+
/**
|
|
27
|
+
* The user's routing preference. `layers` is a global ranking (highest first);
|
|
28
|
+
* `perAsset` overrides it for a specific asset id (e.g. prefer Liquid for USDt,
|
|
29
|
+
* Lightning for BTC). When neither resolves a tie, the DEFAULT rail order wins.
|
|
30
|
+
*/
|
|
31
|
+
export interface RoutePreference {
|
|
32
|
+
/** Global ordered layer ranking, highest priority first. */
|
|
33
|
+
layers?: Layer[];
|
|
34
|
+
/** Per-asset-id ordered layer rankings, overriding `layers` for that asset. */
|
|
35
|
+
perAsset?: Record<string, Layer[]>;
|
|
36
|
+
}
|
|
37
|
+
/** Resolve the effective ordered layer list for a given asset id (if any). */
|
|
38
|
+
export declare function layerPreferenceFor(pref: RoutePreference | undefined, assetId?: string): Layer[] | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Comparator for two rail/layer routes given a resolved layer preference.
|
|
41
|
+
* Primary key: the user's layer ranking (if the route's layer appears in it).
|
|
42
|
+
* Tiebreak: the default rail ordering. Routes neither side ranks compare equal.
|
|
43
|
+
*/
|
|
44
|
+
export declare function compareByPreference(a: {
|
|
45
|
+
rail: Rail;
|
|
46
|
+
layer: Layer | null;
|
|
47
|
+
}, b: {
|
|
48
|
+
rail: Rail;
|
|
49
|
+
layer: Layer | null;
|
|
50
|
+
}, layerPref?: Layer[]): number;
|
|
51
|
+
/** Map a single-destination classification kind → its rail (for the non-URI path). */
|
|
52
|
+
export declare function railOfKind(kind: DestinationKind): Rail;
|
|
53
|
+
//# sourceMappingURL=preference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preference.d.ts","sourceRoot":"","sources":["../../src/router/preference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,gFAAgF;AAChF,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEvF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,IAAI,EAQ7C,CAAA;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;IAChB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;CACnC;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,SAAS,CAI3G;AAUD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,EACtC,CAAC,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,EACtC,SAAS,CAAC,EAAE,KAAK,EAAE,GAClB,MAAM,CAOR;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAoBtD"}
|