@arkade-os/sdk 0.0.16

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 (103) hide show
  1. package/README.md +312 -0
  2. package/dist/cjs/arknote/index.js +86 -0
  3. package/dist/cjs/forfeit.js +38 -0
  4. package/dist/cjs/identity/inMemoryKey.js +40 -0
  5. package/dist/cjs/identity/index.js +2 -0
  6. package/dist/cjs/index.js +48 -0
  7. package/dist/cjs/musig2/index.js +10 -0
  8. package/dist/cjs/musig2/keys.js +57 -0
  9. package/dist/cjs/musig2/nonces.js +44 -0
  10. package/dist/cjs/musig2/sign.js +102 -0
  11. package/dist/cjs/networks.js +26 -0
  12. package/dist/cjs/package.json +3 -0
  13. package/dist/cjs/providers/ark.js +530 -0
  14. package/dist/cjs/providers/onchain.js +61 -0
  15. package/dist/cjs/script/address.js +45 -0
  16. package/dist/cjs/script/base.js +51 -0
  17. package/dist/cjs/script/default.js +40 -0
  18. package/dist/cjs/script/tapscript.js +528 -0
  19. package/dist/cjs/script/vhtlc.js +84 -0
  20. package/dist/cjs/tree/signingSession.js +238 -0
  21. package/dist/cjs/tree/validation.js +184 -0
  22. package/dist/cjs/tree/vtxoTree.js +197 -0
  23. package/dist/cjs/utils/bip21.js +114 -0
  24. package/dist/cjs/utils/coinselect.js +73 -0
  25. package/dist/cjs/utils/psbt.js +124 -0
  26. package/dist/cjs/utils/transactionHistory.js +148 -0
  27. package/dist/cjs/utils/txSizeEstimator.js +95 -0
  28. package/dist/cjs/wallet/index.js +8 -0
  29. package/dist/cjs/wallet/serviceWorker/db/vtxo/idb.js +153 -0
  30. package/dist/cjs/wallet/serviceWorker/db/vtxo/index.js +2 -0
  31. package/dist/cjs/wallet/serviceWorker/request.js +75 -0
  32. package/dist/cjs/wallet/serviceWorker/response.js +187 -0
  33. package/dist/cjs/wallet/serviceWorker/wallet.js +332 -0
  34. package/dist/cjs/wallet/serviceWorker/worker.js +452 -0
  35. package/dist/cjs/wallet/wallet.js +720 -0
  36. package/dist/esm/arknote/index.js +81 -0
  37. package/dist/esm/forfeit.js +35 -0
  38. package/dist/esm/identity/inMemoryKey.js +36 -0
  39. package/dist/esm/identity/index.js +1 -0
  40. package/dist/esm/index.js +39 -0
  41. package/dist/esm/musig2/index.js +3 -0
  42. package/dist/esm/musig2/keys.js +21 -0
  43. package/dist/esm/musig2/nonces.js +8 -0
  44. package/dist/esm/musig2/sign.js +63 -0
  45. package/dist/esm/networks.js +22 -0
  46. package/dist/esm/package.json +3 -0
  47. package/dist/esm/providers/ark.js +526 -0
  48. package/dist/esm/providers/onchain.js +57 -0
  49. package/dist/esm/script/address.js +41 -0
  50. package/dist/esm/script/base.js +46 -0
  51. package/dist/esm/script/default.js +37 -0
  52. package/dist/esm/script/tapscript.js +491 -0
  53. package/dist/esm/script/vhtlc.js +81 -0
  54. package/dist/esm/tree/signingSession.js +200 -0
  55. package/dist/esm/tree/validation.js +179 -0
  56. package/dist/esm/tree/vtxoTree.js +157 -0
  57. package/dist/esm/utils/bip21.js +110 -0
  58. package/dist/esm/utils/coinselect.js +69 -0
  59. package/dist/esm/utils/psbt.js +118 -0
  60. package/dist/esm/utils/transactionHistory.js +145 -0
  61. package/dist/esm/utils/txSizeEstimator.js +91 -0
  62. package/dist/esm/wallet/index.js +5 -0
  63. package/dist/esm/wallet/serviceWorker/db/vtxo/idb.js +149 -0
  64. package/dist/esm/wallet/serviceWorker/db/vtxo/index.js +1 -0
  65. package/dist/esm/wallet/serviceWorker/request.js +72 -0
  66. package/dist/esm/wallet/serviceWorker/response.js +184 -0
  67. package/dist/esm/wallet/serviceWorker/wallet.js +328 -0
  68. package/dist/esm/wallet/serviceWorker/worker.js +448 -0
  69. package/dist/esm/wallet/wallet.js +716 -0
  70. package/dist/types/arknote/index.d.ts +17 -0
  71. package/dist/types/forfeit.d.ts +15 -0
  72. package/dist/types/identity/inMemoryKey.d.ts +12 -0
  73. package/dist/types/identity/index.d.ts +7 -0
  74. package/dist/types/index.d.ts +22 -0
  75. package/dist/types/musig2/index.d.ts +4 -0
  76. package/dist/types/musig2/keys.d.ts +9 -0
  77. package/dist/types/musig2/nonces.d.ts +13 -0
  78. package/dist/types/musig2/sign.d.ts +27 -0
  79. package/dist/types/networks.d.ts +16 -0
  80. package/dist/types/providers/ark.d.ts +126 -0
  81. package/dist/types/providers/onchain.d.ts +36 -0
  82. package/dist/types/script/address.d.ts +10 -0
  83. package/dist/types/script/base.d.ts +26 -0
  84. package/dist/types/script/default.d.ts +19 -0
  85. package/dist/types/script/tapscript.d.ts +94 -0
  86. package/dist/types/script/vhtlc.d.ts +31 -0
  87. package/dist/types/tree/signingSession.d.ts +32 -0
  88. package/dist/types/tree/validation.d.ts +22 -0
  89. package/dist/types/tree/vtxoTree.d.ts +32 -0
  90. package/dist/types/utils/bip21.d.ts +21 -0
  91. package/dist/types/utils/coinselect.d.ts +21 -0
  92. package/dist/types/utils/psbt.d.ts +11 -0
  93. package/dist/types/utils/transactionHistory.d.ts +2 -0
  94. package/dist/types/utils/txSizeEstimator.d.ts +27 -0
  95. package/dist/types/wallet/index.d.ts +122 -0
  96. package/dist/types/wallet/serviceWorker/db/vtxo/idb.d.ts +18 -0
  97. package/dist/types/wallet/serviceWorker/db/vtxo/index.d.ts +12 -0
  98. package/dist/types/wallet/serviceWorker/request.d.ts +68 -0
  99. package/dist/types/wallet/serviceWorker/response.d.ts +107 -0
  100. package/dist/types/wallet/serviceWorker/wallet.d.ts +23 -0
  101. package/dist/types/wallet/serviceWorker/worker.d.ts +26 -0
  102. package/dist/types/wallet/wallet.d.ts +42 -0
  103. package/package.json +88 -0
@@ -0,0 +1,448 @@
1
+ /// <reference lib="webworker" />
2
+ import { InMemoryKey } from '../../identity/inMemoryKey.js';
3
+ import { Wallet } from '../wallet.js';
4
+ import { Request } from './request.js';
5
+ import { Response } from './response.js';
6
+ import { RestArkProvider } from '../../providers/ark.js';
7
+ import { DefaultVtxo } from '../../script/default.js';
8
+ import { IndexedDBVtxoRepository } from './db/vtxo/idb.js';
9
+ import { vtxosToTxs } from '../../utils/transactionHistory.js';
10
+ // Worker is a class letting to interact with ServiceWorkerWallet from the client
11
+ // it aims to be run in a service worker context
12
+ export class Worker {
13
+ constructor(vtxoRepository = new IndexedDBVtxoRepository(), messageCallback = () => { }) {
14
+ this.vtxoRepository = vtxoRepository;
15
+ this.messageCallback = messageCallback;
16
+ }
17
+ async start() {
18
+ self.addEventListener("message", async (event) => {
19
+ await this.handleMessage(event);
20
+ });
21
+ }
22
+ async clear() {
23
+ if (this.vtxoSubscription) {
24
+ this.vtxoSubscription.abort();
25
+ }
26
+ await this.vtxoRepository.close();
27
+ this.wallet = undefined;
28
+ this.arkProvider = undefined;
29
+ this.vtxoSubscription = undefined;
30
+ }
31
+ async onWalletInitialized() {
32
+ if (!this.wallet ||
33
+ !this.arkProvider ||
34
+ !this.wallet.offchainTapscript ||
35
+ !this.wallet.boardingTapscript) {
36
+ return;
37
+ }
38
+ // subscribe to address updates
39
+ const addressInfo = await this.wallet.getAddressInfo();
40
+ if (!addressInfo.offchain) {
41
+ return;
42
+ }
43
+ await this.vtxoRepository.open();
44
+ // set the initial vtxos state
45
+ const { spendableVtxos, spentVtxos } = await this.arkProvider.getVirtualCoins(addressInfo.offchain.address);
46
+ const encodedOffchainTapscript = this.wallet.offchainTapscript.encode();
47
+ const forfeit = this.wallet.offchainTapscript.forfeit();
48
+ const vtxos = [...spendableVtxos, ...spentVtxos].map((vtxo) => ({
49
+ ...vtxo,
50
+ tapLeafScript: forfeit,
51
+ scripts: encodedOffchainTapscript,
52
+ }));
53
+ await this.vtxoRepository.addOrUpdate(vtxos);
54
+ this.processVtxoSubscription(addressInfo.offchain);
55
+ }
56
+ async processVtxoSubscription({ address, scripts, }) {
57
+ try {
58
+ const addressScripts = [...scripts.exit, ...scripts.forfeit];
59
+ const vtxoScript = DefaultVtxo.Script.decode(addressScripts);
60
+ const tapLeafScript = vtxoScript.findLeaf(scripts.forfeit[0]);
61
+ const abortController = new AbortController();
62
+ const subscription = this.arkProvider.subscribeForAddress(address, abortController.signal);
63
+ this.vtxoSubscription = abortController;
64
+ for await (const update of subscription) {
65
+ const vtxos = [...update.newVtxos, ...update.spentVtxos];
66
+ if (vtxos.length === 0) {
67
+ continue;
68
+ }
69
+ const extendedVtxos = vtxos.map((vtxo) => ({
70
+ ...vtxo,
71
+ tapLeafScript,
72
+ scripts: addressScripts,
73
+ }));
74
+ await this.vtxoRepository.addOrUpdate(extendedVtxos);
75
+ }
76
+ }
77
+ catch (error) {
78
+ console.error("Error processing address updates:", error);
79
+ }
80
+ }
81
+ async handleClear(event) {
82
+ this.clear();
83
+ if (Request.isBase(event.data)) {
84
+ event.source?.postMessage(Response.clearResponse(event.data.id, true));
85
+ }
86
+ }
87
+ async handleInitWallet(event) {
88
+ const message = event.data;
89
+ if (!Request.isInitWallet(message)) {
90
+ console.error("Invalid INIT_WALLET message format", message);
91
+ event.source?.postMessage(Response.error(message.id, "Invalid INIT_WALLET message format"));
92
+ return;
93
+ }
94
+ try {
95
+ this.arkProvider = new RestArkProvider(message.arkServerUrl);
96
+ this.wallet = await Wallet.create({
97
+ network: message.network,
98
+ identity: InMemoryKey.fromHex(message.privateKey),
99
+ arkServerUrl: message.arkServerUrl,
100
+ arkServerPublicKey: message.arkServerPublicKey,
101
+ });
102
+ event.source?.postMessage(Response.walletInitialized(message.id));
103
+ await this.onWalletInitialized();
104
+ }
105
+ catch (error) {
106
+ console.error("Error initializing wallet:", error);
107
+ const errorMessage = error instanceof Error
108
+ ? error.message
109
+ : "Unknown error occurred";
110
+ event.source?.postMessage(Response.error(message.id, errorMessage));
111
+ }
112
+ }
113
+ async handleSettle(event) {
114
+ const message = event.data;
115
+ if (!Request.isSettle(message)) {
116
+ console.error("Invalid SETTLE message format", message);
117
+ event.source?.postMessage(Response.error(message.id, "Invalid SETTLE message format"));
118
+ return;
119
+ }
120
+ try {
121
+ if (!this.wallet) {
122
+ console.error("Wallet not initialized");
123
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
124
+ return;
125
+ }
126
+ const txid = await this.wallet.settle(message.params, (e) => {
127
+ event.source?.postMessage(Response.settleEvent(message.id, e));
128
+ });
129
+ event.source?.postMessage(Response.settleSuccess(message.id, txid));
130
+ }
131
+ catch (error) {
132
+ console.error("Error settling:", error);
133
+ const errorMessage = error instanceof Error
134
+ ? error.message
135
+ : "Unknown error occurred";
136
+ event.source?.postMessage(Response.error(message.id, errorMessage));
137
+ }
138
+ }
139
+ async handleSendBitcoin(event) {
140
+ const message = event.data;
141
+ if (!Request.isSendBitcoin(message)) {
142
+ console.error("Invalid SEND_BITCOIN message format", message);
143
+ event.source?.postMessage(Response.error(message.id, "Invalid SEND_BITCOIN message format"));
144
+ return;
145
+ }
146
+ if (!this.wallet) {
147
+ console.error("Wallet not initialized");
148
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
149
+ return;
150
+ }
151
+ try {
152
+ const txid = await this.wallet.sendBitcoin(message.params, message.zeroFee);
153
+ event.source?.postMessage(Response.sendBitcoinSuccess(message.id, txid));
154
+ }
155
+ catch (error) {
156
+ console.error("Error sending bitcoin:", error);
157
+ const errorMessage = error instanceof Error
158
+ ? error.message
159
+ : "Unknown error occurred";
160
+ event.source?.postMessage(Response.error(message.id, errorMessage));
161
+ }
162
+ }
163
+ async handleGetAddress(event) {
164
+ const message = event.data;
165
+ if (!Request.isGetAddress(message)) {
166
+ console.error("Invalid GET_ADDRESS message format", message);
167
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_ADDRESS message format"));
168
+ return;
169
+ }
170
+ if (!this.wallet) {
171
+ console.error("Wallet not initialized");
172
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
173
+ return;
174
+ }
175
+ try {
176
+ const addresses = await this.wallet.getAddress();
177
+ event.source?.postMessage(Response.addresses(message.id, addresses));
178
+ }
179
+ catch (error) {
180
+ console.error("Error getting address:", error);
181
+ const errorMessage = error instanceof Error
182
+ ? error.message
183
+ : "Unknown error occurred";
184
+ event.source?.postMessage(Response.error(message.id, errorMessage));
185
+ }
186
+ }
187
+ async handleGetAddressInfo(event) {
188
+ const message = event.data;
189
+ if (!Request.isGetAddressInfo(message)) {
190
+ console.error("Invalid GET_ADDRESS_INFO message format", message);
191
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_ADDRESS_INFO message format"));
192
+ return;
193
+ }
194
+ if (!this.wallet) {
195
+ console.error("Wallet not initialized");
196
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
197
+ return;
198
+ }
199
+ try {
200
+ const addressInfo = await this.wallet.getAddressInfo();
201
+ event.source?.postMessage(Response.addressInfo(message.id, addressInfo));
202
+ }
203
+ catch (error) {
204
+ console.error("Error getting address info:", error);
205
+ const errorMessage = error instanceof Error
206
+ ? error.message
207
+ : "Unknown error occurred";
208
+ event.source?.postMessage(Response.error(message.id, errorMessage));
209
+ }
210
+ }
211
+ async handleGetBalance(event) {
212
+ const message = event.data;
213
+ if (!Request.isGetBalance(message)) {
214
+ console.error("Invalid GET_BALANCE message format", message);
215
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_BALANCE message format"));
216
+ return;
217
+ }
218
+ if (!this.wallet) {
219
+ console.error("Wallet not initialized");
220
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
221
+ return;
222
+ }
223
+ try {
224
+ const coins = await this.wallet.getCoins();
225
+ const onchainConfirmed = coins
226
+ .filter((coin) => coin.status.confirmed)
227
+ .reduce((sum, coin) => sum + coin.value, 0);
228
+ const onchainUnconfirmed = coins
229
+ .filter((coin) => !coin.status.confirmed)
230
+ .reduce((sum, coin) => sum + coin.value, 0);
231
+ const onchainTotal = onchainConfirmed + onchainUnconfirmed;
232
+ const spendableVtxos = await this.vtxoRepository.getSpendableVtxos();
233
+ const offchainSettledBalance = spendableVtxos.reduce((sum, vtxo) => vtxo.virtualStatus.state === "settled"
234
+ ? sum + vtxo.value
235
+ : sum, 0);
236
+ const offchainPendingBalance = spendableVtxos.reduce((sum, vtxo) => vtxo.virtualStatus.state === "pending"
237
+ ? sum + vtxo.value
238
+ : sum, 0);
239
+ const offchainSweptBalance = spendableVtxos.reduce((sum, vtxo) => vtxo.virtualStatus.state === "swept"
240
+ ? sum + vtxo.value
241
+ : sum, 0);
242
+ const offchainTotal = offchainSettledBalance +
243
+ offchainPendingBalance +
244
+ offchainSweptBalance;
245
+ event.source?.postMessage(Response.balance(message.id, {
246
+ onchain: {
247
+ confirmed: onchainConfirmed,
248
+ unconfirmed: onchainUnconfirmed,
249
+ total: onchainTotal,
250
+ },
251
+ offchain: {
252
+ swept: offchainSweptBalance,
253
+ settled: offchainSettledBalance,
254
+ pending: offchainPendingBalance,
255
+ total: offchainTotal,
256
+ },
257
+ total: onchainTotal + offchainTotal,
258
+ }));
259
+ }
260
+ catch (error) {
261
+ console.error("Error getting balance:", error);
262
+ const errorMessage = error instanceof Error
263
+ ? error.message
264
+ : "Unknown error occurred";
265
+ event.source?.postMessage(Response.error(message.id, errorMessage));
266
+ }
267
+ }
268
+ async handleGetCoins(event) {
269
+ const message = event.data;
270
+ if (!Request.isGetCoins(message)) {
271
+ console.error("Invalid GET_COINS message format", message);
272
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_COINS message format"));
273
+ return;
274
+ }
275
+ if (!this.wallet) {
276
+ console.error("Wallet not initialized");
277
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
278
+ return;
279
+ }
280
+ try {
281
+ const coins = await this.wallet.getCoins();
282
+ event.source?.postMessage(Response.coins(message.id, coins));
283
+ }
284
+ catch (error) {
285
+ console.error("Error getting coins:", error);
286
+ const errorMessage = error instanceof Error
287
+ ? error.message
288
+ : "Unknown error occurred";
289
+ event.source?.postMessage(Response.error(message.id, errorMessage));
290
+ }
291
+ }
292
+ async handleGetVtxos(event) {
293
+ const message = event.data;
294
+ if (!Request.isGetVtxos(message)) {
295
+ console.error("Invalid GET_VTXOS message format", message);
296
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_VTXOS message format"));
297
+ return;
298
+ }
299
+ if (!this.wallet) {
300
+ console.error("Wallet not initialized");
301
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
302
+ return;
303
+ }
304
+ try {
305
+ const vtxos = await this.vtxoRepository.getSpendableVtxos();
306
+ event.source?.postMessage(Response.vtxos(message.id, vtxos));
307
+ }
308
+ catch (error) {
309
+ console.error("Error getting vtxos:", error);
310
+ const errorMessage = error instanceof Error
311
+ ? error.message
312
+ : "Unknown error occurred";
313
+ event.source?.postMessage(Response.error(message.id, errorMessage));
314
+ }
315
+ }
316
+ async handleGetBoardingUtxos(event) {
317
+ const message = event.data;
318
+ if (!Request.isGetBoardingUtxos(message)) {
319
+ console.error("Invalid GET_BOARDING_UTXOS message format", message);
320
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_BOARDING_UTXOS message format"));
321
+ return;
322
+ }
323
+ if (!this.wallet) {
324
+ console.error("Wallet not initialized");
325
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
326
+ return;
327
+ }
328
+ try {
329
+ const boardingUtxos = await this.wallet.getBoardingUtxos();
330
+ event.source?.postMessage(Response.boardingUtxos(message.id, boardingUtxos));
331
+ }
332
+ catch (error) {
333
+ console.error("Error getting boarding utxos:", error);
334
+ const errorMessage = error instanceof Error
335
+ ? error.message
336
+ : "Unknown error occurred";
337
+ event.source?.postMessage(Response.error(message.id, errorMessage));
338
+ }
339
+ }
340
+ async handleGetTransactionHistory(event) {
341
+ const message = event.data;
342
+ if (!Request.isGetTransactionHistory(message)) {
343
+ console.error("Invalid GET_TRANSACTION_HISTORY message format", message);
344
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_TRANSACTION_HISTORY message format"));
345
+ return;
346
+ }
347
+ if (!this.wallet) {
348
+ console.error("Wallet not initialized");
349
+ event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
350
+ return;
351
+ }
352
+ try {
353
+ const { boardingTxs, roundsToIgnore } = await this.wallet.getBoardingTxs();
354
+ const { spendable, spent } = await this.vtxoRepository.getAllVtxos();
355
+ // convert VTXOs to offchain transactions
356
+ const offchainTxs = vtxosToTxs(spendable, spent, roundsToIgnore);
357
+ const txs = [...boardingTxs, ...offchainTxs];
358
+ // sort transactions by creation time in descending order (newest first)
359
+ txs.sort(
360
+ // place createdAt = 0 (unconfirmed txs) first, then descending
361
+ (a, b) => {
362
+ if (a.createdAt === 0)
363
+ return -1;
364
+ if (b.createdAt === 0)
365
+ return 1;
366
+ return b.createdAt - a.createdAt;
367
+ });
368
+ event.source?.postMessage(Response.transactionHistory(message.id, txs));
369
+ }
370
+ catch (error) {
371
+ console.error("Error getting transaction history:", error);
372
+ const errorMessage = error instanceof Error
373
+ ? error.message
374
+ : "Unknown error occurred";
375
+ event.source?.postMessage(Response.error(message.id, errorMessage));
376
+ }
377
+ }
378
+ async handleGetStatus(event) {
379
+ const message = event.data;
380
+ if (!Request.isGetStatus(message)) {
381
+ console.error("Invalid GET_STATUS message format", message);
382
+ event.source?.postMessage(Response.error(message.id, "Invalid GET_STATUS message format"));
383
+ return;
384
+ }
385
+ event.source?.postMessage(Response.walletStatus(message.id, this.wallet !== undefined));
386
+ }
387
+ async handleMessage(event) {
388
+ this.messageCallback(event);
389
+ const message = event.data;
390
+ if (!Request.isBase(message)) {
391
+ console.warn("Invalid message format", JSON.stringify(message));
392
+ // ignore invalid messages
393
+ return;
394
+ }
395
+ switch (message.type) {
396
+ case "INIT_WALLET": {
397
+ await this.handleInitWallet(event);
398
+ break;
399
+ }
400
+ case "SETTLE": {
401
+ await this.handleSettle(event);
402
+ break;
403
+ }
404
+ case "SEND_BITCOIN": {
405
+ await this.handleSendBitcoin(event);
406
+ break;
407
+ }
408
+ case "GET_ADDRESS": {
409
+ await this.handleGetAddress(event);
410
+ break;
411
+ }
412
+ case "GET_ADDRESS_INFO": {
413
+ await this.handleGetAddressInfo(event);
414
+ break;
415
+ }
416
+ case "GET_BALANCE": {
417
+ await this.handleGetBalance(event);
418
+ break;
419
+ }
420
+ case "GET_COINS": {
421
+ await this.handleGetCoins(event);
422
+ break;
423
+ }
424
+ case "GET_VTXOS": {
425
+ await this.handleGetVtxos(event);
426
+ break;
427
+ }
428
+ case "GET_BOARDING_UTXOS": {
429
+ await this.handleGetBoardingUtxos(event);
430
+ break;
431
+ }
432
+ case "GET_TRANSACTION_HISTORY": {
433
+ await this.handleGetTransactionHistory(event);
434
+ break;
435
+ }
436
+ case "GET_STATUS": {
437
+ await this.handleGetStatus(event);
438
+ break;
439
+ }
440
+ case "CLEAR": {
441
+ await this.handleClear(event);
442
+ break;
443
+ }
444
+ default:
445
+ event.source?.postMessage(Response.error(message.id, "Unknown message type"));
446
+ }
447
+ }
448
+ }