@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.
- package/README.md +312 -0
- package/dist/cjs/arknote/index.js +86 -0
- package/dist/cjs/forfeit.js +38 -0
- package/dist/cjs/identity/inMemoryKey.js +40 -0
- package/dist/cjs/identity/index.js +2 -0
- package/dist/cjs/index.js +48 -0
- package/dist/cjs/musig2/index.js +10 -0
- package/dist/cjs/musig2/keys.js +57 -0
- package/dist/cjs/musig2/nonces.js +44 -0
- package/dist/cjs/musig2/sign.js +102 -0
- package/dist/cjs/networks.js +26 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/providers/ark.js +530 -0
- package/dist/cjs/providers/onchain.js +61 -0
- package/dist/cjs/script/address.js +45 -0
- package/dist/cjs/script/base.js +51 -0
- package/dist/cjs/script/default.js +40 -0
- package/dist/cjs/script/tapscript.js +528 -0
- package/dist/cjs/script/vhtlc.js +84 -0
- package/dist/cjs/tree/signingSession.js +238 -0
- package/dist/cjs/tree/validation.js +184 -0
- package/dist/cjs/tree/vtxoTree.js +197 -0
- package/dist/cjs/utils/bip21.js +114 -0
- package/dist/cjs/utils/coinselect.js +73 -0
- package/dist/cjs/utils/psbt.js +124 -0
- package/dist/cjs/utils/transactionHistory.js +148 -0
- package/dist/cjs/utils/txSizeEstimator.js +95 -0
- package/dist/cjs/wallet/index.js +8 -0
- package/dist/cjs/wallet/serviceWorker/db/vtxo/idb.js +153 -0
- package/dist/cjs/wallet/serviceWorker/db/vtxo/index.js +2 -0
- package/dist/cjs/wallet/serviceWorker/request.js +75 -0
- package/dist/cjs/wallet/serviceWorker/response.js +187 -0
- package/dist/cjs/wallet/serviceWorker/wallet.js +332 -0
- package/dist/cjs/wallet/serviceWorker/worker.js +452 -0
- package/dist/cjs/wallet/wallet.js +720 -0
- package/dist/esm/arknote/index.js +81 -0
- package/dist/esm/forfeit.js +35 -0
- package/dist/esm/identity/inMemoryKey.js +36 -0
- package/dist/esm/identity/index.js +1 -0
- package/dist/esm/index.js +39 -0
- package/dist/esm/musig2/index.js +3 -0
- package/dist/esm/musig2/keys.js +21 -0
- package/dist/esm/musig2/nonces.js +8 -0
- package/dist/esm/musig2/sign.js +63 -0
- package/dist/esm/networks.js +22 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/providers/ark.js +526 -0
- package/dist/esm/providers/onchain.js +57 -0
- package/dist/esm/script/address.js +41 -0
- package/dist/esm/script/base.js +46 -0
- package/dist/esm/script/default.js +37 -0
- package/dist/esm/script/tapscript.js +491 -0
- package/dist/esm/script/vhtlc.js +81 -0
- package/dist/esm/tree/signingSession.js +200 -0
- package/dist/esm/tree/validation.js +179 -0
- package/dist/esm/tree/vtxoTree.js +157 -0
- package/dist/esm/utils/bip21.js +110 -0
- package/dist/esm/utils/coinselect.js +69 -0
- package/dist/esm/utils/psbt.js +118 -0
- package/dist/esm/utils/transactionHistory.js +145 -0
- package/dist/esm/utils/txSizeEstimator.js +91 -0
- package/dist/esm/wallet/index.js +5 -0
- package/dist/esm/wallet/serviceWorker/db/vtxo/idb.js +149 -0
- package/dist/esm/wallet/serviceWorker/db/vtxo/index.js +1 -0
- package/dist/esm/wallet/serviceWorker/request.js +72 -0
- package/dist/esm/wallet/serviceWorker/response.js +184 -0
- package/dist/esm/wallet/serviceWorker/wallet.js +328 -0
- package/dist/esm/wallet/serviceWorker/worker.js +448 -0
- package/dist/esm/wallet/wallet.js +716 -0
- package/dist/types/arknote/index.d.ts +17 -0
- package/dist/types/forfeit.d.ts +15 -0
- package/dist/types/identity/inMemoryKey.d.ts +12 -0
- package/dist/types/identity/index.d.ts +7 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/musig2/index.d.ts +4 -0
- package/dist/types/musig2/keys.d.ts +9 -0
- package/dist/types/musig2/nonces.d.ts +13 -0
- package/dist/types/musig2/sign.d.ts +27 -0
- package/dist/types/networks.d.ts +16 -0
- package/dist/types/providers/ark.d.ts +126 -0
- package/dist/types/providers/onchain.d.ts +36 -0
- package/dist/types/script/address.d.ts +10 -0
- package/dist/types/script/base.d.ts +26 -0
- package/dist/types/script/default.d.ts +19 -0
- package/dist/types/script/tapscript.d.ts +94 -0
- package/dist/types/script/vhtlc.d.ts +31 -0
- package/dist/types/tree/signingSession.d.ts +32 -0
- package/dist/types/tree/validation.d.ts +22 -0
- package/dist/types/tree/vtxoTree.d.ts +32 -0
- package/dist/types/utils/bip21.d.ts +21 -0
- package/dist/types/utils/coinselect.d.ts +21 -0
- package/dist/types/utils/psbt.d.ts +11 -0
- package/dist/types/utils/transactionHistory.d.ts +2 -0
- package/dist/types/utils/txSizeEstimator.d.ts +27 -0
- package/dist/types/wallet/index.d.ts +122 -0
- package/dist/types/wallet/serviceWorker/db/vtxo/idb.d.ts +18 -0
- package/dist/types/wallet/serviceWorker/db/vtxo/index.d.ts +12 -0
- package/dist/types/wallet/serviceWorker/request.d.ts +68 -0
- package/dist/types/wallet/serviceWorker/response.d.ts +107 -0
- package/dist/types/wallet/serviceWorker/wallet.d.ts +23 -0
- package/dist/types/wallet/serviceWorker/worker.d.ts +26 -0
- package/dist/types/wallet/wallet.d.ts +42 -0
- 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
|
+
}
|