@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.
- package/README.md +236 -0
- package/dist/adapters/ArkadeAdapter.d.ts +48 -0
- package/dist/adapters/ArkadeAdapter.d.ts.map +1 -0
- package/dist/adapters/ArkadeAdapter.js +314 -0
- package/dist/adapters/ArkadeAdapter.js.map +1 -0
- package/dist/adapters/IProtocolAdapter.d.ts +75 -0
- package/dist/adapters/IProtocolAdapter.d.ts.map +1 -0
- package/dist/adapters/IProtocolAdapter.js +29 -0
- package/dist/adapters/IProtocolAdapter.js.map +1 -0
- package/dist/adapters/RgbAdapter.d.ts +70 -0
- package/dist/adapters/RgbAdapter.d.ts.map +1 -0
- package/dist/adapters/RgbAdapter.js +818 -0
- package/dist/adapters/RgbAdapter.js.map +1 -0
- package/dist/adapters/SparkAdapter.d.ts +47 -0
- package/dist/adapters/SparkAdapter.d.ts.map +1 -0
- package/dist/adapters/SparkAdapter.js +390 -0
- package/dist/adapters/SparkAdapter.js.map +1 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts +78 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.js +233 -0
- package/dist/adapters/wdk/ArkadeWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.d.ts +88 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.js +272 -0
- package/dist/adapters/wdk/LiquidWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/RlnWdkAdapter.d.ts +85 -0
- package/dist/adapters/wdk/RlnWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/RlnWdkAdapter.js +308 -0
- package/dist/adapters/wdk/RlnWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/SparkWdkAdapter.d.ts +83 -0
- package/dist/adapters/wdk/SparkWdkAdapter.d.ts.map +1 -0
- package/dist/adapters/wdk/SparkWdkAdapter.js +417 -0
- package/dist/adapters/wdk/SparkWdkAdapter.js.map +1 -0
- package/dist/adapters/wdk/moduleLoader.d.ts +22 -0
- package/dist/adapters/wdk/moduleLoader.d.ts.map +1 -0
- package/dist/adapters/wdk/moduleLoader.js +31 -0
- package/dist/adapters/wdk/moduleLoader.js.map +1 -0
- package/dist/capabilities/index.d.ts +46 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +102 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/disclosure/index.d.ts +51 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/disclosure/index.js +64 -0
- package/dist/disclosure/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/arkade-client-manager.d.ts +47 -0
- package/dist/lib/arkade-client-manager.d.ts.map +1 -0
- package/dist/lib/arkade-client-manager.js +121 -0
- package/dist/lib/arkade-client-manager.js.map +1 -0
- package/dist/lib/bolt11.d.ts +18 -0
- package/dist/lib/bolt11.d.ts.map +1 -0
- package/dist/lib/bolt11.js +31 -0
- package/dist/lib/bolt11.js.map +1 -0
- package/dist/lib/flashnet-client-manager.d.ts +29 -0
- package/dist/lib/flashnet-client-manager.d.ts.map +1 -0
- package/dist/lib/flashnet-client-manager.js +116 -0
- package/dist/lib/flashnet-client-manager.js.map +1 -0
- package/dist/lib/kaleido-client-manager.d.ts +26 -0
- package/dist/lib/kaleido-client-manager.d.ts.map +1 -0
- package/dist/lib/kaleido-client-manager.js +55 -0
- package/dist/lib/kaleido-client-manager.js.map +1 -0
- package/dist/lib/spark-client-manager.d.ts +41 -0
- package/dist/lib/spark-client-manager.d.ts.map +1 -0
- package/dist/lib/spark-client-manager.js +101 -0
- package/dist/lib/spark-client-manager.js.map +1 -0
- package/dist/manager/ProtocolManager.d.ts +57 -0
- package/dist/manager/ProtocolManager.d.ts.map +1 -0
- package/dist/manager/ProtocolManager.js +228 -0
- package/dist/manager/ProtocolManager.js.map +1 -0
- package/dist/ports/index.d.ts +29 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +9 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/receive/unifiedReceive.d.ts +54 -0
- package/dist/receive/unifiedReceive.d.ts.map +1 -0
- package/dist/receive/unifiedReceive.js +102 -0
- package/dist/receive/unifiedReceive.js.map +1 -0
- package/dist/registry/createWdkRegistry.d.ts +20 -0
- package/dist/registry/createWdkRegistry.d.ts.map +1 -0
- package/dist/registry/createWdkRegistry.js +32 -0
- package/dist/registry/createWdkRegistry.js.map +1 -0
- package/dist/router/destination.d.ts +28 -0
- package/dist/router/destination.d.ts.map +1 -0
- package/dist/router/destination.js +72 -0
- package/dist/router/destination.js.map +1 -0
- package/dist/router/index.d.ts +55 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +67 -0
- package/dist/router/index.js.map +1 -0
- package/dist/swap/KaleidoswapSwap.d.ts +44 -0
- package/dist/swap/KaleidoswapSwap.d.ts.map +1 -0
- package/dist/swap/KaleidoswapSwap.js +123 -0
- package/dist/swap/KaleidoswapSwap.js.map +1 -0
- package/dist/types/arkade.d.ts +40 -0
- package/dist/types/arkade.d.ts.map +1 -0
- package/dist/types/arkade.js +6 -0
- package/dist/types/arkade.js.map +1 -0
- package/dist/types/base.d.ts +218 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +27 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/cross-l2.d.ts +108 -0
- package/dist/types/cross-l2.d.ts.map +1 -0
- package/dist/types/cross-l2.js +16 -0
- package/dist/types/cross-l2.js.map +1 -0
- package/dist/types/flashnet.d.ts +31 -0
- package/dist/types/flashnet.d.ts.map +1 -0
- package/dist/types/flashnet.js +23 -0
- package/dist/types/flashnet.js.map +1 -0
- package/dist/types/rgb.d.ts +91 -0
- package/dist/types/rgb.d.ts.map +1 -0
- package/dist/types/rgb.js +6 -0
- package/dist/types/rgb.js.map +1 -0
- package/dist/types/spark.d.ts +59 -0
- package/dist/types/spark.d.ts.map +1 -0
- package/dist/types/spark.js +6 -0
- package/dist/types/spark.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +23 -0
- package/dist/utils.js.map +1 -0
- 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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"}
|