@kaleidorg/wallet-engine 1.0.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/dist/adapters/ArkadeAdapter.d.ts +49 -0
  4. package/dist/adapters/ArkadeAdapter.d.ts.map +1 -0
  5. package/dist/adapters/ArkadeAdapter.js +316 -0
  6. package/dist/adapters/ArkadeAdapter.js.map +1 -0
  7. package/dist/adapters/IProtocolAdapter.d.ts +217 -0
  8. package/dist/adapters/IProtocolAdapter.d.ts.map +1 -0
  9. package/dist/adapters/IProtocolAdapter.js +33 -0
  10. package/dist/adapters/IProtocolAdapter.js.map +1 -0
  11. package/dist/adapters/RgbAdapter.d.ts +71 -0
  12. package/dist/adapters/RgbAdapter.d.ts.map +1 -0
  13. package/dist/adapters/RgbAdapter.js +820 -0
  14. package/dist/adapters/RgbAdapter.js.map +1 -0
  15. package/dist/adapters/SparkAdapter.d.ts +48 -0
  16. package/dist/adapters/SparkAdapter.d.ts.map +1 -0
  17. package/dist/adapters/SparkAdapter.js +395 -0
  18. package/dist/adapters/SparkAdapter.js.map +1 -0
  19. package/dist/adapters/native.d.ts +16 -0
  20. package/dist/adapters/native.d.ts.map +1 -0
  21. package/dist/adapters/native.js +16 -0
  22. package/dist/adapters/native.js.map +1 -0
  23. package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts +85 -0
  24. package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts.map +1 -0
  25. package/dist/adapters/wdk/ArkadeWdkAdapter.js +313 -0
  26. package/dist/adapters/wdk/ArkadeWdkAdapter.js.map +1 -0
  27. package/dist/adapters/wdk/LiquidWdkAdapter.d.ts +88 -0
  28. package/dist/adapters/wdk/LiquidWdkAdapter.d.ts.map +1 -0
  29. package/dist/adapters/wdk/LiquidWdkAdapter.js +276 -0
  30. package/dist/adapters/wdk/LiquidWdkAdapter.js.map +1 -0
  31. package/dist/adapters/wdk/RlnWdkAdapter.d.ts +86 -0
  32. package/dist/adapters/wdk/RlnWdkAdapter.d.ts.map +1 -0
  33. package/dist/adapters/wdk/RlnWdkAdapter.js +310 -0
  34. package/dist/adapters/wdk/RlnWdkAdapter.js.map +1 -0
  35. package/dist/adapters/wdk/SparkWdkAdapter.d.ts +81 -0
  36. package/dist/adapters/wdk/SparkWdkAdapter.d.ts.map +1 -0
  37. package/dist/adapters/wdk/SparkWdkAdapter.js +417 -0
  38. package/dist/adapters/wdk/SparkWdkAdapter.js.map +1 -0
  39. package/dist/adapters/wdk/index.d.ts +15 -0
  40. package/dist/adapters/wdk/index.d.ts.map +1 -0
  41. package/dist/adapters/wdk/index.js +15 -0
  42. package/dist/adapters/wdk/index.js.map +1 -0
  43. package/dist/adapters/wdk/moduleLoader.d.ts +22 -0
  44. package/dist/adapters/wdk/moduleLoader.d.ts.map +1 -0
  45. package/dist/adapters/wdk/moduleLoader.js +31 -0
  46. package/dist/adapters/wdk/moduleLoader.js.map +1 -0
  47. package/dist/capabilities/index.d.ts +46 -0
  48. package/dist/capabilities/index.d.ts.map +1 -0
  49. package/dist/capabilities/index.js +102 -0
  50. package/dist/capabilities/index.js.map +1 -0
  51. package/dist/capabilities/operations.d.ts +22 -0
  52. package/dist/capabilities/operations.d.ts.map +1 -0
  53. package/dist/capabilities/operations.js +55 -0
  54. package/dist/capabilities/operations.js.map +1 -0
  55. package/dist/constants.d.ts +8 -0
  56. package/dist/constants.d.ts.map +1 -0
  57. package/dist/constants.js +8 -0
  58. package/dist/constants.js.map +1 -0
  59. package/dist/disclosure/index.d.ts +51 -0
  60. package/dist/disclosure/index.d.ts.map +1 -0
  61. package/dist/disclosure/index.js +64 -0
  62. package/dist/disclosure/index.js.map +1 -0
  63. package/dist/index.d.ts +22 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +34 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/lib/arkade-client-manager.d.ts +47 -0
  68. package/dist/lib/arkade-client-manager.d.ts.map +1 -0
  69. package/dist/lib/arkade-client-manager.js +121 -0
  70. package/dist/lib/arkade-client-manager.js.map +1 -0
  71. package/dist/lib/bolt11.d.ts +18 -0
  72. package/dist/lib/bolt11.d.ts.map +1 -0
  73. package/dist/lib/bolt11.js +31 -0
  74. package/dist/lib/bolt11.js.map +1 -0
  75. package/dist/lib/flashnet-client-manager.d.ts +29 -0
  76. package/dist/lib/flashnet-client-manager.d.ts.map +1 -0
  77. package/dist/lib/flashnet-client-manager.js +116 -0
  78. package/dist/lib/flashnet-client-manager.js.map +1 -0
  79. package/dist/lib/kaleido-client-manager.d.ts +26 -0
  80. package/dist/lib/kaleido-client-manager.d.ts.map +1 -0
  81. package/dist/lib/kaleido-client-manager.js +55 -0
  82. package/dist/lib/kaleido-client-manager.js.map +1 -0
  83. package/dist/lib/spark-client-manager.d.ts +41 -0
  84. package/dist/lib/spark-client-manager.d.ts.map +1 -0
  85. package/dist/lib/spark-client-manager.js +101 -0
  86. package/dist/lib/spark-client-manager.js.map +1 -0
  87. package/dist/manager/ProtocolManager.d.ts +108 -0
  88. package/dist/manager/ProtocolManager.d.ts.map +1 -0
  89. package/dist/manager/ProtocolManager.js +305 -0
  90. package/dist/manager/ProtocolManager.js.map +1 -0
  91. package/dist/ports/index.d.ts +49 -0
  92. package/dist/ports/index.d.ts.map +1 -0
  93. package/dist/ports/index.js +31 -0
  94. package/dist/ports/index.js.map +1 -0
  95. package/dist/receive/unifiedReceive.d.ts +54 -0
  96. package/dist/receive/unifiedReceive.d.ts.map +1 -0
  97. package/dist/receive/unifiedReceive.js +102 -0
  98. package/dist/receive/unifiedReceive.js.map +1 -0
  99. package/dist/registry/createWdkRegistry.d.ts +20 -0
  100. package/dist/registry/createWdkRegistry.d.ts.map +1 -0
  101. package/dist/registry/createWdkRegistry.js +32 -0
  102. package/dist/registry/createWdkRegistry.js.map +1 -0
  103. package/dist/router/destination.d.ts +28 -0
  104. package/dist/router/destination.d.ts.map +1 -0
  105. package/dist/router/destination.js +72 -0
  106. package/dist/router/destination.js.map +1 -0
  107. package/dist/router/index.d.ts +55 -0
  108. package/dist/router/index.d.ts.map +1 -0
  109. package/dist/router/index.js +67 -0
  110. package/dist/router/index.js.map +1 -0
  111. package/dist/swap/KaleidoswapSwap.d.ts +44 -0
  112. package/dist/swap/KaleidoswapSwap.d.ts.map +1 -0
  113. package/dist/swap/KaleidoswapSwap.js +123 -0
  114. package/dist/swap/KaleidoswapSwap.js.map +1 -0
  115. package/dist/swap/index.d.ts +8 -0
  116. package/dist/swap/index.d.ts.map +1 -0
  117. package/dist/swap/index.js +8 -0
  118. package/dist/swap/index.js.map +1 -0
  119. package/dist/types/arkade.d.ts +40 -0
  120. package/dist/types/arkade.d.ts.map +1 -0
  121. package/dist/types/arkade.js +6 -0
  122. package/dist/types/arkade.js.map +1 -0
  123. package/dist/types/base.d.ts +228 -0
  124. package/dist/types/base.d.ts.map +1 -0
  125. package/dist/types/base.js +53 -0
  126. package/dist/types/base.js.map +1 -0
  127. package/dist/types/cross-l2.d.ts +108 -0
  128. package/dist/types/cross-l2.d.ts.map +1 -0
  129. package/dist/types/cross-l2.js +16 -0
  130. package/dist/types/cross-l2.js.map +1 -0
  131. package/dist/types/flashnet.d.ts +31 -0
  132. package/dist/types/flashnet.d.ts.map +1 -0
  133. package/dist/types/flashnet.js +23 -0
  134. package/dist/types/flashnet.js.map +1 -0
  135. package/dist/types/rgb.d.ts +105 -0
  136. package/dist/types/rgb.d.ts.map +1 -0
  137. package/dist/types/rgb.js +6 -0
  138. package/dist/types/rgb.js.map +1 -0
  139. package/dist/types/spark.d.ts +59 -0
  140. package/dist/types/spark.d.ts.map +1 -0
  141. package/dist/types/spark.js +6 -0
  142. package/dist/types/spark.js.map +1 -0
  143. package/dist/utils.d.ts +10 -0
  144. package/dist/utils.d.ts.map +1 -0
  145. package/dist/utils.js +23 -0
  146. package/dist/utils.js.map +1 -0
  147. package/package.json +71 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 KaleidoSwap
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,247 @@
1
+ # @kaleidorg/wallet-engine
2
+
3
+ > Multi-protocol Bitcoin L2 wallet engine — **native or WDK-backed** adapters for
4
+ > **Spark · RGB/RLN · Liquid · Arkade** behind one `IProtocolAdapter` contract,
5
+ > with a cross-protocol router, BIP321 unified receive, and lite/advanced disclosure.
6
+
7
+ > [!WARNING]
8
+ > **Alpha — experimental, not production-ready.** This engine moves real funds across
9
+ > Bitcoin L2s. APIs may change without notice, adapters are incomplete, and it has not
10
+ > been independently audited. Do not use it with mainnet funds you cannot afford to lose.
11
+ > Use at your own risk.
12
+
13
+ `wallet-engine` is the headless core you build a multi-protocol Bitcoin wallet on.
14
+ It hides the differences between Bitcoin L2s behind one interface, keeps the app code
15
+ the same across React Native, browser extension, and Node hosts, and ships the hard
16
+ parts — routing, unified receive, swaps, lite/advanced UX — as reusable primitives.
17
+ It powers KaleidoSwap's apps (`rate` mobile wallet, the browser extension, the desktop
18
+ agent).
19
+
20
+ ```
21
+ ┌──────────────────────────────────────────────────────────────┐
22
+ │ your app (rate · extension · desktop) │
23
+ ├──────────────────────────────────────────────────────────────┤
24
+ │ @kaleidorg/wallet-engine │
25
+ │ ProtocolManager · CrossProtocolRouter · UnifiedReceive │
26
+ │ Capability manifest · Disclosure (lite/advanced) · Swap │
27
+ │ IProtocolAdapter contract · Platform ports (injected) │
28
+ ├───────────┬───────────┬───────────┬───────────┬──────────────┤
29
+ │ Spark │ RGB/RLN │ Liquid │ Arkade │ (your proto) │
30
+ │ adapter │ adapter │ adapter │ adapter │ adapter │
31
+ ├───────────┴───────────┴───────────┴───────────┴──────────────┤
32
+ │ WDK modules · native SDKs · kaleido-sdk (RFQ/RLN client) │
33
+ └──────────────────────────────────────────────────────────────┘
34
+ ```
35
+
36
+ ---
37
+
38
+ ## Why
39
+
40
+ Every Bitcoin L2 (Spark, RGB-on-Lightning, Liquid, Arkade) ships its own SDK, its
41
+ own address formats, its own quirks (channel liquidity, boarding, invoice expiry,
42
+ zero-fee transfers). A wallet that wants to support more than one of them ends up
43
+ with `if (protocol === …)` smeared across every screen.
44
+
45
+ `wallet-engine` collapses that into **one contract + a data manifest of differences**:
46
+
47
+ - Screens call **one** API (`ProtocolManager` / `CrossProtocolRouter`), never a
48
+ protocol SDK directly.
49
+ - Protocol *differences* live as **data** in a capability manifest, not as branches
50
+ in app code — adding or changing a protocol never edits another protocol's path.
51
+ - The **same engine runs on every host**; platform specifics are injected.
52
+
53
+ ---
54
+
55
+ ## Supported protocols
56
+
57
+ | Protocol | Layers | Assets | Swaps | Notable quirks | Backing module |
58
+ |---|---|---|:---:|---|---|
59
+ | **BTC** | on-chain | — | — | base on-chain only | (native) |
60
+ | **SPARK** | Spark, LN, on-chain | Spark tokens | — | zero-fee, static receive addr | `@tetherto/wdk-wallet-spark` |
61
+ | **RGB/RLN**| RGB-L1, RGB-LN, BTC-L1, BTC-LN | RGB (USDT, XAUT) | ✅ | needs channel liquidity (LSPS1) | `@kaleidorg/wdk-wallet-rln` |
62
+ | **LIQUID** | Liquid, Liquid assets | USDt (lite "USD") | — | own L1, no LN | `@kaleidorg/wdk-wallet-liquid` |
63
+ | **ARKADE** | Arkade, LN | Arkade assets | — | boarding addr, static receive | `@arkade-os/wdk` |
64
+
65
+ Each protocol is described once in [`src/capabilities/index.ts`](src/capabilities/index.ts).
66
+ The router and UI read that manifest — they never special-case a protocol by name.
67
+
68
+ ---
69
+
70
+ ## Install
71
+
72
+ ```bash
73
+ pnpm add @kaleidorg/wallet-engine
74
+ ```
75
+
76
+ > Published as [`@kaleidorg/wallet-engine`](https://www.npmjs.com/package/@kaleidorg/wallet-engine)
77
+ > (renamed from the earlier `@kaleidorg/wallet-protocols`; versions ≤ 1.0.0-beta.11 were
78
+ > published under the old name).
79
+
80
+ Heavy protocol SDKs are **optional dependencies** — install only the adapters you use:
81
+
82
+ ```bash
83
+ # RGB/RLN + Liquid only, for example
84
+ pnpm add @kaleidorg/wdk-wallet-rln @kaleidorg/wdk-wallet-liquid
85
+ ```
86
+
87
+ The engine lazy-loads each WDK module inside its adapter's `connect()`, so importing
88
+ `wallet-engine` does **not** pull every protocol SDK into your bundle.
89
+
90
+ ---
91
+
92
+ ## Quickstart
93
+
94
+ ```ts
95
+ import {
96
+ ProtocolManager,
97
+ CrossProtocolRouter,
98
+ createWdkRegistry,
99
+ buildUnifiedReceiveURI,
100
+ aggregateForLite,
101
+ } from '@kaleidorg/wallet-engine'
102
+
103
+ // 1. Build a registry of WDK-backed adapters (pick the protocols you want).
104
+ const registry = createWdkRegistry({ enabled: ['RGB', 'LIQUID', 'SPARK'] })
105
+
106
+ // 2. Connect each protocol (config carries the mnemonic + endpoints).
107
+ await registry.get('RGB')!.connect({ protocol: 'RGB', network: 'mainnet', /* … */ })
108
+ await registry.get('LIQUID')!.connect({ protocol: 'LIQUID', network: 'mainnet', /* … */ })
109
+
110
+ // 3. Drive everything through the manager — no protocol SDK in app code.
111
+ const manager = new ProtocolManager({ defaultProtocol: 'RGB' })
112
+ for (const a of registry.getAll()) manager.registerAdapter(a)
113
+
114
+ const assets = await manager.listAllAssets() // unified across protocols
115
+ const lite = aggregateForLite(assets) // { btc, usd, other }
116
+
117
+ // 4. Let the router choose which protocol pays a destination.
118
+ const router = new CrossProtocolRouter(registry)
119
+ const { best, routes } = router.resolveSend('lnbc1…') // best = auto-route for lite mode
120
+
121
+ // 5. One QR that any wallet can pay; Kaleido wallets read the richer params.
122
+ const uri = buildUnifiedReceiveURI({
123
+ btcAddress: 'bc1q…',
124
+ lightningInvoice: 'lnbc1…',
125
+ rgbInvoice: 'rgb:…',
126
+ liquidAddress: 'lq1…',
127
+ })
128
+ ```
129
+
130
+ ---
131
+
132
+ ## Core concepts
133
+
134
+ ### `IProtocolAdapter` — the contract
135
+ Every protocol implements the same interface: connect, list assets/transactions,
136
+ create/decode invoices, send/receive, and (optionally) `getSwapQuote` / `executeSwap`.
137
+ See [`src/adapters/IProtocolAdapter.ts`](src/adapters/IProtocolAdapter.ts). Two flavours
138
+ ship: **native** adapters (direct SDK integrations) and **WDK-backed** adapters — both
139
+ satisfy the same contract, so the app can't tell which is underneath.
140
+
141
+ ### Capability manifest — differences as data
142
+ [`src/capabilities/index.ts`](src/capabilities/index.ts) is the single source of truth
143
+ for what each protocol can do (layers, swaps, channel liquidity, zero-fee, static
144
+ addresses, boarding…). **Rule:** when tempted to add a method to the contract for one
145
+ protocol, add a capability flag here instead.
146
+
147
+ ### `ProtocolManager` — unified operations
148
+ [`src/manager/ProtocolManager.ts`](src/manager/ProtocolManager.ts) routes calls to the
149
+ active adapter and provides cross-protocol aggregates (`listAllAssets`,
150
+ `listAllTransactions`, `getPortfolioSummary`).
151
+
152
+ ### `CrossProtocolRouter` — chooses *between* protocols
153
+ [`src/router/index.ts`](src/router/index.ts) takes a destination string or a receive
154
+ layer and returns the protocol(s) that can fulfil it, filtered to what's registered and
155
+ connected. `resolveSend().best` is the auto-route that makes **lite mode** possible.
156
+
157
+ ### Unified receive (BIP321)
158
+ [`src/receive/unifiedReceive.ts`](src/receive/unifiedReceive.ts) builds **one** `bitcoin:`
159
+ URI carrying on-chain + Lightning (BOLT11/BOLT12) + Spark + Arkade + Liquid + RGB. Other
160
+ wallets ignore the unknown params; Kaleido-aware wallets get the full menu. The address is
161
+ optional, so a lite wallet can publish a single LN/asset-only QR.
162
+
163
+ ### Disclosure (lite / advanced)
164
+ [`src/disclosure/index.ts`](src/disclosure/index.ts) — lite vs advanced is **one
165
+ reversible setting**, not a code fork. It controls how much the UI reveals (networks,
166
+ route selector, channel management, raw ids) and how much the router auto-decides. Lite
167
+ mode collapses every BTC representation into one "BTC" and USDt-on-Liquid into one "USD".
168
+
169
+ ### Platform ports — write once, run everywhere
170
+ [`src/ports/index.ts`](src/ports/index.ts) — the engine never touches platform APIs.
171
+ Each host injects `IStorageProvider` + `IRuntimeProvider` (storage, CSPRNG, clock) so
172
+ the same engine runs on React Native (SecureStore/MMKV), the extension (chrome.storage),
173
+ and Node unchanged.
174
+
175
+ ---
176
+
177
+ ## Swaps
178
+
179
+ [`KaleidoswapSwap`](src/swap/KaleidoswapSwap.ts) wraps the Kaleidoswap **RFQ** flow
180
+ (quote → execute → status) behind domain `Quote` / `SwapResult` types — no SDK types
181
+ leak across the boundary.
182
+
183
+ ```ts
184
+ import { KaleidoswapSwap } from '@kaleidorg/wallet-engine'
185
+
186
+ const swap = new KaleidoswapSwap(rlnAccount, { baseUrl: 'https://api.kaleidoswap.com' })
187
+
188
+ const quote = await swap.getQuote({
189
+ fromAsset: 'rgb:USDT…', toAsset: 'BTC',
190
+ fromLayer: 'RGB_LN', toLayer: 'BTC_LN',
191
+ fromAmount: 100,
192
+ })
193
+
194
+ const result = await swap.executeSwap({
195
+ ...quote, receiverAddress: 'lnbc1…', receiverAddressFormat: 'BOLT11',
196
+ })
197
+
198
+ const status = await swap.getSwapStatus(result.swapId) // pending → confirmed/failed
199
+ ```
200
+
201
+ ---
202
+
203
+ ## Extending: add a protocol
204
+
205
+ 1. Implement `IProtocolAdapter` (native or WDK-backed).
206
+ 2. Add one entry to the capability manifest describing its layers + quirks.
207
+ 3. Register it: `manager.registerAdapter(new MyAdapter())`.
208
+
209
+ The router, unified receive, lite aggregation, and every screen pick it up with **zero
210
+ changes** to existing protocol code. New protocol-specific behaviour is a capability
211
+ flag, never a new method on the contract.
212
+
213
+ ---
214
+
215
+ ## Public API
216
+
217
+ The package's surface is its barrel, [`src/index.ts`](src/index.ts): types, the
218
+ `IProtocolAdapter` contract + registry, capability manifest, platform ports, all native
219
+ and WDK adapters, `createWdkRegistry`, `CrossProtocolRouter` + destination classifier,
220
+ `KaleidoswapSwap`, unified receive, the disclosure model, `ProtocolManager`, and the
221
+ per-protocol client managers.
222
+
223
+ ---
224
+
225
+ ## Where it sits
226
+
227
+ ```
228
+ wallet-engine wallet engine (this package)
229
+ └─ depends on
230
+ kaleido-sdk protocol client (RFQ/maker + RLN), Python + TypeScript
231
+ ```
232
+
233
+ `wallet-engine` consumes `kaleido-sdk` internally for the Kaleidoswap protocol;
234
+ consumers of `wallet-engine` never import `kaleido-sdk` directly.
235
+
236
+ ---
237
+
238
+ ## Status
239
+
240
+ **Alpha — experimental.** Published under a `1.0.0-beta` version tag, but treat the
241
+ project as alpha: interfaces are unstable, several adapters are partial, and nothing has
242
+ been audited. WDK adapters are `beta` maturity (native fallbacks remain available); see
243
+ the `maturity` field per protocol in the capability manifest.
244
+
245
+ ## License
246
+
247
+ [MIT](LICENSE)
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Arkade Protocol Adapter
3
+ * Implements IProtocolAdapter using @arkade-os/sdk.
4
+ * Ported from rate-extension, adapted for React Native with Expo providers.
5
+ */
6
+ import { IProtocolAdapter, BaseProtocolConfig } from './IProtocolAdapter.js';
7
+ import { ProtocolType, Layer, UnifiedAsset, UnifiedTransaction, InvoiceRequest, Invoice, DecodedInvoice, PaymentRequest, PaymentResult, PaymentStatus, Address, ConnectionInfo, TransactionFilter } from '../types/base.js';
8
+ export declare class ArkadeAdapter implements IProtocolAdapter {
9
+ readonly protocolName: ProtocolType;
10
+ readonly capabilities: readonly import("..").ProtocolCapability[];
11
+ readonly supportedLayers: Layer[];
12
+ readonly version = "1.0.0";
13
+ private config;
14
+ connect(config: BaseProtocolConfig): Promise<void>;
15
+ disconnect(): Promise<void>;
16
+ isConnected(): boolean;
17
+ getConnectionInfo(): Promise<ConnectionInfo>;
18
+ listAssets(): Promise<UnifiedAsset[]>;
19
+ getAsset(assetId: string): Promise<UnifiedAsset>;
20
+ getAssetBalance(assetId: string): Promise<UnifiedAsset['balance']>;
21
+ refreshBalances(): Promise<void>;
22
+ listTransactions(filter?: TransactionFilter): Promise<UnifiedTransaction[]>;
23
+ getTransaction(txId: string): Promise<UnifiedTransaction>;
24
+ createInvoice(request: InvoiceRequest): Promise<Invoice>;
25
+ decodeInvoice(invoice: string): Promise<DecodedInvoice>;
26
+ sendPayment(request: PaymentRequest): Promise<PaymentResult>;
27
+ getPaymentStatus(paymentHash: string): Promise<PaymentStatus>;
28
+ getReceiveAddress(assetId?: string): Promise<Address>;
29
+ getNodeInfo(): Promise<any>;
30
+ getBtcBalance(): Promise<{
31
+ confirmed: number;
32
+ unconfirmed: number;
33
+ total: number;
34
+ }>;
35
+ listChannels(): Promise<[]>;
36
+ listPayments(): Promise<any>;
37
+ listTransfers(_options?: {
38
+ asset_id?: string;
39
+ }): Promise<any>;
40
+ supportsSwaps(): boolean;
41
+ sendBtcOnchain(params: {
42
+ address: string;
43
+ amount: number;
44
+ }): Promise<any>;
45
+ private convertArkTx;
46
+ private toNumber;
47
+ private formatSats;
48
+ }
49
+ //# sourceMappingURL=ArkadeAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArkadeAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/ArkadeAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAGzE,OAAO,EACL,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,OAAO,EACP,cAAc,EACd,iBAAiB,EAOlB,MAAM,eAAe,CAAA;AAGtB,qBAAa,aAAc,YAAW,gBAAgB;IACpD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAW;IAC9C,QAAQ,CAAC,YAAY,6CAA6B;IAClD,QAAQ,CAAC,eAAe,EAAE,KAAK,EAAE,CAA4C;IAC7E,QAAQ,CAAC,OAAO,WAAU;IAE1B,OAAO,CAAC,MAAM,CAA4B;IAMpC,OAAO,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,WAAW,IAAI,OAAO;IAIhB,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAgB5C,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IA8CrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAShD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAKlE,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC,gBAAgB,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAwB3E,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAazD,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAexD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAIvD,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA0B5D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQ7D,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBrD,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IAmB3B,aAAa,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAWnF,YAAY,IAAI,OAAO,CAAC,EAAE,CAAC;IAC3B,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IAC5B,aAAa,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAMnE,aAAa,IAAI,OAAO;IAElB,cAAc,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAa/E,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,UAAU;CAGnB"}
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Arkade Protocol Adapter
3
+ * Implements IProtocolAdapter using @arkade-os/sdk.
4
+ * Ported from rate-extension, adapted for React Native with Expo providers.
5
+ */
6
+ import { arkadeClientManager } from '../lib/arkade-client-manager.js';
7
+ import { ProtocolError, ConnectionError, } from '../types/base.js';
8
+ import { PROTOCOL_OPERATIONS } from '../capabilities/operations.js';
9
+ export class ArkadeAdapter {
10
+ constructor() {
11
+ this.protocolName = 'ARKADE';
12
+ this.capabilities = PROTOCOL_OPERATIONS.ARKADE;
13
+ this.supportedLayers = ['BTC_ARKADE', 'BTC_L1', 'ARKADE_ARKADE'];
14
+ this.version = '1.0.0';
15
+ this.config = null;
16
+ }
17
+ // ========================================================================
18
+ // Connection Management
19
+ // ========================================================================
20
+ async connect(config) {
21
+ const arkadeConfig = config;
22
+ if (!arkadeConfig.mnemonic) {
23
+ throw new ConnectionError('Mnemonic is required for Arkade wallet', 'ARKADE');
24
+ }
25
+ if (!arkadeConfig.arkServerUrl) {
26
+ throw new ConnectionError('arkServerUrl is required for Arkade wallet', 'ARKADE');
27
+ }
28
+ try {
29
+ await arkadeClientManager.initialize(arkadeConfig);
30
+ this.config = arkadeConfig;
31
+ console.log('[ArkadeAdapter] Connected to Arkade successfully');
32
+ }
33
+ catch (error) {
34
+ const msg = error instanceof Error ? error.message : String(error);
35
+ throw new ConnectionError(`Failed to connect to Arkade: ${msg}`, 'ARKADE');
36
+ }
37
+ }
38
+ async disconnect() {
39
+ await arkadeClientManager.disconnect();
40
+ this.config = null;
41
+ console.log('[ArkadeAdapter] Disconnected from Arkade');
42
+ }
43
+ isConnected() {
44
+ return arkadeClientManager.isInitialized();
45
+ }
46
+ async getConnectionInfo() {
47
+ if (!this.isConnected()) {
48
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
49
+ }
50
+ return {
51
+ protocol: 'ARKADE',
52
+ connected: true,
53
+ network: this.config?.network ?? 'signet',
54
+ syncStatus: { synced: true, progress: 100 },
55
+ };
56
+ }
57
+ // ========================================================================
58
+ // Asset Operations
59
+ // ========================================================================
60
+ async listAssets() {
61
+ if (!this.isConnected()) {
62
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
63
+ }
64
+ try {
65
+ const wallet = arkadeClientManager.getWallet();
66
+ const balance = await wallet.getBalance();
67
+ const totalSats = this.toNumber(balance?.total);
68
+ const availableSats = this.toNumber(balance?.available);
69
+ const preconfirmed = this.toNumber(balance?.preconfirmed);
70
+ return [{
71
+ id: 'BTC',
72
+ name: 'Bitcoin (Arkade)',
73
+ ticker: 'BTC',
74
+ precision: 8,
75
+ protocol: 'ARKADE',
76
+ layer: 'BTC_ARKADE',
77
+ balance: {
78
+ total: totalSats,
79
+ available: availableSats,
80
+ pending: preconfirmed,
81
+ locked: 0,
82
+ totalDisplay: this.formatSats(totalSats),
83
+ availableDisplay: this.formatSats(availableSats),
84
+ },
85
+ capabilities: {
86
+ canSend: true,
87
+ canReceive: true,
88
+ canSwap: false,
89
+ supportsLightning: false,
90
+ supportsOnchain: true,
91
+ },
92
+ metadata: {
93
+ boarding: this.toNumber(balance?.boarding?.total),
94
+ settled: this.toNumber(balance?.settled),
95
+ preconfirmed,
96
+ recoverable: this.toNumber(balance?.recoverable),
97
+ },
98
+ }];
99
+ }
100
+ catch (error) {
101
+ const msg = error instanceof Error ? error.message : String(error);
102
+ throw new ProtocolError(`Failed to list assets: ${msg}`, 'ARKADE', 'LIST_ASSETS_ERROR');
103
+ }
104
+ }
105
+ async getAsset(assetId) {
106
+ const assets = await this.listAssets();
107
+ const asset = assets.find(a => a.id === assetId || a.ticker === assetId);
108
+ if (!asset) {
109
+ throw new ProtocolError(`Asset not found: ${assetId}`, 'ARKADE', 'ASSET_NOT_FOUND');
110
+ }
111
+ return asset;
112
+ }
113
+ async getAssetBalance(assetId) {
114
+ const asset = await this.getAsset(assetId);
115
+ return asset.balance;
116
+ }
117
+ async refreshBalances() { }
118
+ // ========================================================================
119
+ // Transaction Operations
120
+ // ========================================================================
121
+ async listTransactions(filter) {
122
+ if (!this.isConnected()) {
123
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
124
+ }
125
+ try {
126
+ const wallet = arkadeClientManager.getWallet();
127
+ const history = await wallet.getTransactionHistory();
128
+ return (history ?? [])
129
+ .map((item) => this.convertArkTx(item))
130
+ .filter((tx) => tx !== null)
131
+ .filter(tx => {
132
+ if (!filter)
133
+ return true;
134
+ if (filter.type && tx.type !== filter.type)
135
+ return false;
136
+ if (filter.status && tx.status !== filter.status)
137
+ return false;
138
+ return true;
139
+ })
140
+ .slice(filter?.offset ?? 0, filter?.limit ? (filter.offset ?? 0) + filter.limit : undefined);
141
+ }
142
+ catch (error) {
143
+ const msg = error instanceof Error ? error.message : String(error);
144
+ throw new ProtocolError(`Failed to list transactions: ${msg}`, 'ARKADE', 'LIST_TRANSACTIONS_ERROR');
145
+ }
146
+ }
147
+ async getTransaction(txId) {
148
+ const txs = await this.listTransactions();
149
+ const tx = txs.find(t => t.id === txId);
150
+ if (!tx) {
151
+ throw new ProtocolError(`Transaction not found: ${txId}`, 'ARKADE', 'TX_NOT_FOUND');
152
+ }
153
+ return tx;
154
+ }
155
+ // ========================================================================
156
+ // Payment Operations
157
+ // ========================================================================
158
+ async createInvoice(request) {
159
+ if (!this.isConnected()) {
160
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
161
+ }
162
+ const wallet = arkadeClientManager.getWallet();
163
+ const address = await wallet.getAddress();
164
+ return {
165
+ invoice: address,
166
+ paymentHash: '',
167
+ amount: request.amount,
168
+ expiresAt: Date.now() + (request.expirySeconds ?? 3600) * 1000,
169
+ description: request.description ?? 'Arkade receiving address',
170
+ };
171
+ }
172
+ async decodeInvoice(invoice) {
173
+ return { paymentHash: '', expiresAt: 0, destination: invoice };
174
+ }
175
+ async sendPayment(request) {
176
+ if (!this.isConnected()) {
177
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
178
+ }
179
+ if (!request.amount || request.amount <= 0) {
180
+ throw new ProtocolError('Amount is required for Arkade payments', 'ARKADE', 'INVALID_AMOUNT');
181
+ }
182
+ try {
183
+ const wallet = arkadeClientManager.getWallet();
184
+ const txid = await wallet.sendBitcoin({
185
+ address: request.invoice,
186
+ amount: request.amount,
187
+ });
188
+ return {
189
+ paymentHash: txid,
190
+ amount: request.amount,
191
+ fee: 0,
192
+ status: 'confirmed',
193
+ timestamp: Date.now(),
194
+ };
195
+ }
196
+ catch (error) {
197
+ const msg = error instanceof Error ? error.message : String(error);
198
+ throw new ProtocolError(`Failed to send payment: ${msg}`, 'ARKADE', 'SEND_PAYMENT_ERROR');
199
+ }
200
+ }
201
+ async getPaymentStatus(paymentHash) {
202
+ return { paymentHash, status: 'pending' };
203
+ }
204
+ // ========================================================================
205
+ // Address Operations
206
+ // ========================================================================
207
+ async getReceiveAddress(assetId) {
208
+ if (!this.isConnected()) {
209
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
210
+ }
211
+ const wallet = arkadeClientManager.getWallet();
212
+ if (assetId === 'onchain' || assetId === 'boarding') {
213
+ const address = await wallet.getBoardingAddress();
214
+ return { address, format: 'BTC_ADDRESS', asset: 'BTC' };
215
+ }
216
+ const address = await wallet.getAddress();
217
+ return { address, format: 'ARKADE_ADDRESS', asset: 'BTC' };
218
+ }
219
+ // ========================================================================
220
+ // Node & Balance Operations
221
+ // ========================================================================
222
+ async getNodeInfo() {
223
+ if (!this.isConnected()) {
224
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
225
+ }
226
+ const wallet = arkadeClientManager.getWallet();
227
+ const balance = await wallet.getBalance();
228
+ const spendable = this.toNumber(balance?.available);
229
+ return {
230
+ channelsBalanceMsat: spendable * 1000,
231
+ maxPayableMsat: spendable * 1000,
232
+ onchainBalanceMsat: this.toNumber(balance?.boarding?.total) * 1000,
233
+ pendingOnchainBalanceMsat: 0,
234
+ maxReceivableMsat: 0,
235
+ inboundLiquidityMsats: 0,
236
+ connectedPeers: [],
237
+ utxos: 0,
238
+ };
239
+ }
240
+ async getBtcBalance() {
241
+ if (!this.isConnected()) {
242
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
243
+ }
244
+ const wallet = arkadeClientManager.getWallet();
245
+ const balance = await wallet.getBalance();
246
+ const confirmed = this.toNumber(balance?.available);
247
+ const total = this.toNumber(balance?.total);
248
+ return { confirmed, unconfirmed: Math.max(total - confirmed, 0), total };
249
+ }
250
+ async listChannels() { return []; }
251
+ async listPayments() { return { payments: await this.listTransactions() }; }
252
+ async listTransfers(_options) { return { transfers: [] }; }
253
+ // ========================================================================
254
+ // Unsupported Operations
255
+ // ========================================================================
256
+ supportsSwaps() { return false; }
257
+ async sendBtcOnchain(params) {
258
+ if (!this.isConnected()) {
259
+ throw new ProtocolError('Not connected', 'ARKADE', 'NOT_CONNECTED');
260
+ }
261
+ const wallet = arkadeClientManager.getWallet();
262
+ const txid = await wallet.sendBitcoin({ address: params.address, amount: params.amount });
263
+ return { txid };
264
+ }
265
+ // ========================================================================
266
+ // Private Helpers
267
+ // ========================================================================
268
+ convertArkTx(tx) {
269
+ try {
270
+ const isSend = tx.type === 'SENT';
271
+ const amountSats = tx.amount ?? 0;
272
+ const timestamp = typeof tx.createdAt === 'number' ? tx.createdAt
273
+ : tx.createdAt instanceof Date ? tx.createdAt.getTime()
274
+ : Date.now();
275
+ const txId = tx.key?.arkTxid || tx.key?.commitmentTxid || tx.key?.boardingTxid || tx.txid || `ark-${timestamp}`;
276
+ const btcAsset = {
277
+ id: 'BTC', name: 'Bitcoin (Ark)', ticker: 'BTC', precision: 8,
278
+ protocol: 'ARKADE', layer: 'ARKADE_ARKADE',
279
+ balance: {
280
+ total: amountSats, available: amountSats, pending: 0,
281
+ totalDisplay: this.formatSats(amountSats),
282
+ availableDisplay: this.formatSats(amountSats),
283
+ },
284
+ capabilities: { canSend: true, canReceive: true, canSwap: false, supportsLightning: false, supportsOnchain: true },
285
+ };
286
+ return {
287
+ id: txId,
288
+ type: isSend ? 'send' : 'receive',
289
+ status: tx.settled || !isSend ? 'confirmed' : 'pending',
290
+ timestamp, amount: amountSats,
291
+ amountDisplay: this.formatSats(amountSats),
292
+ fee: 0, feeDisplay: '0.00000000',
293
+ asset: btcAsset,
294
+ protocolData: { type: tx.type, settled: tx.settled, key: tx.key },
295
+ };
296
+ }
297
+ catch {
298
+ return null;
299
+ }
300
+ }
301
+ toNumber(value) {
302
+ if (typeof value === 'number' && Number.isFinite(value))
303
+ return value;
304
+ if (typeof value === 'bigint')
305
+ return Number(value);
306
+ if (typeof value === 'string' && value.trim() !== '') {
307
+ const parsed = Number(value);
308
+ return Number.isFinite(parsed) ? parsed : 0;
309
+ }
310
+ return 0;
311
+ }
312
+ formatSats(sats) {
313
+ return (sats / 1e8).toFixed(8);
314
+ }
315
+ }
316
+ //# sourceMappingURL=ArkadeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArkadeAdapter.js","sourceRoot":"","sources":["../../src/adapters/ArkadeAdapter.ts"],"names":[],"mappings":"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"}