@kaleidorg/wallet-engine 1.0.0-beta.4

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