@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,184 @@
1
+ export var Response;
2
+ (function (Response) {
3
+ Response.walletInitialized = (id) => ({
4
+ type: "WALLET_INITIALIZED",
5
+ success: true,
6
+ id,
7
+ });
8
+ function error(id, message) {
9
+ return {
10
+ type: "ERROR",
11
+ success: false,
12
+ message,
13
+ id,
14
+ };
15
+ }
16
+ Response.error = error;
17
+ function settleEvent(id, event) {
18
+ return {
19
+ type: "SETTLE_EVENT",
20
+ success: true,
21
+ event,
22
+ id,
23
+ };
24
+ }
25
+ Response.settleEvent = settleEvent;
26
+ function settleSuccess(id, txid) {
27
+ return {
28
+ type: "SETTLE_SUCCESS",
29
+ success: true,
30
+ txid,
31
+ id,
32
+ };
33
+ }
34
+ Response.settleSuccess = settleSuccess;
35
+ function isSettleSuccess(response) {
36
+ return response.type === "SETTLE_SUCCESS" && response.success;
37
+ }
38
+ Response.isSettleSuccess = isSettleSuccess;
39
+ function isAddress(response) {
40
+ return response.type === "ADDRESS" && response.success === true;
41
+ }
42
+ Response.isAddress = isAddress;
43
+ function addresses(id, addresses) {
44
+ return {
45
+ type: "ADDRESS",
46
+ success: true,
47
+ addresses,
48
+ id,
49
+ };
50
+ }
51
+ Response.addresses = addresses;
52
+ function isAddressInfo(response) {
53
+ return response.type === "ADDRESS_INFO" && response.success === true;
54
+ }
55
+ Response.isAddressInfo = isAddressInfo;
56
+ function addressInfo(id, addressInfo) {
57
+ return {
58
+ type: "ADDRESS_INFO",
59
+ success: true,
60
+ addressInfo,
61
+ id,
62
+ };
63
+ }
64
+ Response.addressInfo = addressInfo;
65
+ function isBalance(response) {
66
+ return response.type === "BALANCE" && response.success === true;
67
+ }
68
+ Response.isBalance = isBalance;
69
+ function balance(id, balance) {
70
+ return {
71
+ type: "BALANCE",
72
+ success: true,
73
+ balance,
74
+ id,
75
+ };
76
+ }
77
+ Response.balance = balance;
78
+ function isCoins(response) {
79
+ return response.type === "COINS" && response.success === true;
80
+ }
81
+ Response.isCoins = isCoins;
82
+ function coins(id, coins) {
83
+ return {
84
+ type: "COINS",
85
+ success: true,
86
+ coins,
87
+ id,
88
+ };
89
+ }
90
+ Response.coins = coins;
91
+ function isVtxos(response) {
92
+ return response.type === "VTXOS" && response.success === true;
93
+ }
94
+ Response.isVtxos = isVtxos;
95
+ function vtxos(id, vtxos) {
96
+ return {
97
+ type: "VTXOS",
98
+ success: true,
99
+ vtxos,
100
+ id,
101
+ };
102
+ }
103
+ Response.vtxos = vtxos;
104
+ function isVirtualCoins(response) {
105
+ return response.type === "VIRTUAL_COINS" && response.success === true;
106
+ }
107
+ Response.isVirtualCoins = isVirtualCoins;
108
+ function virtualCoins(id, virtualCoins) {
109
+ return {
110
+ type: "VIRTUAL_COINS",
111
+ success: true,
112
+ virtualCoins,
113
+ id,
114
+ };
115
+ }
116
+ Response.virtualCoins = virtualCoins;
117
+ function isBoardingUtxos(response) {
118
+ return response.type === "BOARDING_UTXOS" && response.success === true;
119
+ }
120
+ Response.isBoardingUtxos = isBoardingUtxos;
121
+ function boardingUtxos(id, boardingUtxos) {
122
+ return {
123
+ type: "BOARDING_UTXOS",
124
+ success: true,
125
+ boardingUtxos,
126
+ id,
127
+ };
128
+ }
129
+ Response.boardingUtxos = boardingUtxos;
130
+ function isSendBitcoinSuccess(response) {
131
+ return (response.type === "SEND_BITCOIN_SUCCESS" &&
132
+ response.success === true);
133
+ }
134
+ Response.isSendBitcoinSuccess = isSendBitcoinSuccess;
135
+ function sendBitcoinSuccess(id, txid) {
136
+ return {
137
+ type: "SEND_BITCOIN_SUCCESS",
138
+ success: true,
139
+ txid,
140
+ id,
141
+ };
142
+ }
143
+ Response.sendBitcoinSuccess = sendBitcoinSuccess;
144
+ function isTransactionHistory(response) {
145
+ return (response.type === "TRANSACTION_HISTORY" && response.success === true);
146
+ }
147
+ Response.isTransactionHistory = isTransactionHistory;
148
+ function transactionHistory(id, transactions) {
149
+ return {
150
+ type: "TRANSACTION_HISTORY",
151
+ success: true,
152
+ transactions,
153
+ id,
154
+ };
155
+ }
156
+ Response.transactionHistory = transactionHistory;
157
+ function isWalletStatus(response) {
158
+ return response.type === "WALLET_STATUS" && response.success === true;
159
+ }
160
+ Response.isWalletStatus = isWalletStatus;
161
+ function walletStatus(id, walletInitialized) {
162
+ return {
163
+ type: "WALLET_STATUS",
164
+ success: true,
165
+ status: {
166
+ walletInitialized,
167
+ },
168
+ id,
169
+ };
170
+ }
171
+ Response.walletStatus = walletStatus;
172
+ function isClearResponse(response) {
173
+ return response.type === "CLEAR_RESPONSE";
174
+ }
175
+ Response.isClearResponse = isClearResponse;
176
+ function clearResponse(id, success) {
177
+ return {
178
+ type: "CLEAR_RESPONSE",
179
+ success,
180
+ id,
181
+ };
182
+ }
183
+ Response.clearResponse = clearResponse;
184
+ })(Response || (Response = {}));
@@ -0,0 +1,328 @@
1
+ import { Response } from './response.js';
2
+ import { hex } from "@scure/base";
3
+ class UnexpectedResponseError extends Error {
4
+ constructor(response) {
5
+ super(`Unexpected response type. Got: ${JSON.stringify(response, null, 2)}`);
6
+ this.name = "UnexpectedResponseError";
7
+ }
8
+ }
9
+ // ServiceWorkerWallet is a wallet that uses a service worker as "backend" to handle the wallet logic
10
+ export class ServiceWorkerWallet {
11
+ static async create(svcWorkerPath) {
12
+ try {
13
+ const wallet = new ServiceWorkerWallet();
14
+ await wallet.setupServiceWorker(svcWorkerPath);
15
+ return wallet;
16
+ }
17
+ catch (error) {
18
+ throw new Error(`Failed to initialize service worker wallet: ${error}`);
19
+ }
20
+ }
21
+ async getStatus() {
22
+ const message = {
23
+ type: "GET_STATUS",
24
+ id: getRandomId(),
25
+ };
26
+ const response = await this.sendMessage(message);
27
+ if (Response.isWalletStatus(response)) {
28
+ return response.status;
29
+ }
30
+ throw new UnexpectedResponseError(response);
31
+ }
32
+ async init(config, failIfInitialized = false) {
33
+ // Check if wallet is already initialized
34
+ const statusMessage = {
35
+ type: "GET_STATUS",
36
+ id: getRandomId(),
37
+ };
38
+ const response = await this.sendMessage(statusMessage);
39
+ if (Response.isWalletStatus(response) &&
40
+ response.status.walletInitialized) {
41
+ if (failIfInitialized) {
42
+ throw new Error("Wallet already initialized");
43
+ }
44
+ return;
45
+ }
46
+ // If not initialized, proceed with initialization
47
+ const message = {
48
+ type: "INIT_WALLET",
49
+ id: getRandomId(),
50
+ privateKey: config.privateKey,
51
+ network: config.network,
52
+ arkServerUrl: config.arkServerUrl || "",
53
+ arkServerPublicKey: config.arkServerPublicKey,
54
+ };
55
+ await this.sendMessage(message);
56
+ }
57
+ async clear() {
58
+ const message = {
59
+ type: "CLEAR",
60
+ id: getRandomId(),
61
+ };
62
+ await this.sendMessage(message);
63
+ }
64
+ // register the service worker
65
+ async setupServiceWorker(path) {
66
+ // check if service workers are supported
67
+ if (!("serviceWorker" in navigator)) {
68
+ throw new Error("Service workers are not supported in this browser");
69
+ }
70
+ try {
71
+ // check for existing registration
72
+ const existingRegistration = await navigator.serviceWorker.getRegistration(path);
73
+ let registration;
74
+ if (existingRegistration) {
75
+ registration = existingRegistration;
76
+ // Force unregister and re-register to ensure we get the latest version
77
+ await existingRegistration.unregister();
78
+ }
79
+ registration = await navigator.serviceWorker.register(path);
80
+ // Handle updates
81
+ registration.addEventListener("updatefound", () => {
82
+ console.info("@arklabs/wallet-sdk: Service worker auto-update...");
83
+ const newWorker = registration.installing;
84
+ if (!newWorker)
85
+ return;
86
+ newWorker.addEventListener("statechange", () => {
87
+ if (newWorker.state === "installed" &&
88
+ navigator.serviceWorker.controller) {
89
+ console.info("@arklabs/wallet-sdk: Service worker updated, reloading...");
90
+ window.location.reload();
91
+ }
92
+ });
93
+ });
94
+ // Check for updates
95
+ await registration.update();
96
+ const sw = registration.active ||
97
+ registration.waiting ||
98
+ registration.installing;
99
+ if (!sw) {
100
+ throw new Error("Failed to get service worker instance");
101
+ }
102
+ this.serviceWorker = sw;
103
+ // wait for the service worker to be ready
104
+ if (this.serviceWorker?.state !== "activated") {
105
+ await new Promise((resolve) => {
106
+ if (!this.serviceWorker)
107
+ return resolve();
108
+ this.serviceWorker.addEventListener("statechange", () => {
109
+ if (this.serviceWorker?.state === "activated") {
110
+ resolve();
111
+ }
112
+ });
113
+ });
114
+ }
115
+ }
116
+ catch (error) {
117
+ throw new Error(`Failed to setup service worker: ${error}`);
118
+ }
119
+ }
120
+ // send a message and wait for a response
121
+ async sendMessage(message) {
122
+ if (!this.serviceWorker) {
123
+ throw new Error("Service worker not initialized");
124
+ }
125
+ return new Promise((resolve, reject) => {
126
+ const messageHandler = (event) => {
127
+ const response = event.data;
128
+ if (response.id === "") {
129
+ reject(new Error("Invalid response id"));
130
+ return;
131
+ }
132
+ if (response.id !== message.id) {
133
+ return;
134
+ }
135
+ navigator.serviceWorker.removeEventListener("message", messageHandler);
136
+ if (!response.success) {
137
+ reject(new Error(response.message));
138
+ }
139
+ else {
140
+ resolve(response);
141
+ }
142
+ };
143
+ navigator.serviceWorker.addEventListener("message", messageHandler);
144
+ if (this.serviceWorker) {
145
+ this.serviceWorker.postMessage(message);
146
+ }
147
+ else {
148
+ reject(new Error("Service worker not initialized"));
149
+ }
150
+ });
151
+ }
152
+ async getAddress() {
153
+ const message = {
154
+ type: "GET_ADDRESS",
155
+ id: getRandomId(),
156
+ };
157
+ try {
158
+ const response = await this.sendMessage(message);
159
+ if (Response.isAddress(response)) {
160
+ return response.addresses;
161
+ }
162
+ throw new UnexpectedResponseError(response);
163
+ }
164
+ catch (error) {
165
+ throw new Error(`Failed to get address: ${error}`);
166
+ }
167
+ }
168
+ async getAddressInfo() {
169
+ const message = {
170
+ type: "GET_ADDRESS_INFO",
171
+ id: getRandomId(),
172
+ };
173
+ try {
174
+ const response = await this.sendMessage(message);
175
+ if (Response.isAddressInfo(response)) {
176
+ return response.addressInfo;
177
+ }
178
+ throw new UnexpectedResponseError(response);
179
+ }
180
+ catch (error) {
181
+ throw new Error(`Failed to get address info: ${error}`);
182
+ }
183
+ }
184
+ async getBalance() {
185
+ const message = {
186
+ type: "GET_BALANCE",
187
+ id: getRandomId(),
188
+ };
189
+ try {
190
+ const response = await this.sendMessage(message);
191
+ if (Response.isBalance(response)) {
192
+ return response.balance;
193
+ }
194
+ throw new UnexpectedResponseError(response);
195
+ }
196
+ catch (error) {
197
+ throw new Error(`Failed to get balance: ${error}`);
198
+ }
199
+ }
200
+ async getCoins() {
201
+ const message = {
202
+ type: "GET_COINS",
203
+ id: getRandomId(),
204
+ };
205
+ try {
206
+ const response = await this.sendMessage(message);
207
+ if (Response.isCoins(response)) {
208
+ return response.coins;
209
+ }
210
+ throw new UnexpectedResponseError(response);
211
+ }
212
+ catch (error) {
213
+ throw new Error(`Failed to get coins: ${error}`);
214
+ }
215
+ }
216
+ async getVtxos() {
217
+ const message = {
218
+ type: "GET_VTXOS",
219
+ id: getRandomId(),
220
+ };
221
+ try {
222
+ const response = await this.sendMessage(message);
223
+ if (Response.isVtxos(response)) {
224
+ return response.vtxos;
225
+ }
226
+ throw new UnexpectedResponseError(response);
227
+ }
228
+ catch (error) {
229
+ throw new Error(`Failed to get vtxos: ${error}`);
230
+ }
231
+ }
232
+ async getBoardingUtxos() {
233
+ const message = {
234
+ type: "GET_BOARDING_UTXOS",
235
+ id: getRandomId(),
236
+ };
237
+ try {
238
+ const response = await this.sendMessage(message);
239
+ if (Response.isBoardingUtxos(response)) {
240
+ return response.boardingUtxos;
241
+ }
242
+ throw new UnexpectedResponseError(response);
243
+ }
244
+ catch (error) {
245
+ throw new Error(`Failed to get boarding UTXOs: ${error}`);
246
+ }
247
+ }
248
+ async sendBitcoin(params, zeroFee) {
249
+ const message = {
250
+ type: "SEND_BITCOIN",
251
+ params,
252
+ zeroFee,
253
+ id: getRandomId(),
254
+ };
255
+ try {
256
+ const response = await this.sendMessage(message);
257
+ if (Response.isSendBitcoinSuccess(response)) {
258
+ return response.txid;
259
+ }
260
+ throw new UnexpectedResponseError(response);
261
+ }
262
+ catch (error) {
263
+ throw new Error(`Failed to send bitcoin: ${error}`);
264
+ }
265
+ }
266
+ async settle(params, callback) {
267
+ const message = {
268
+ type: "SETTLE",
269
+ params,
270
+ id: getRandomId(),
271
+ };
272
+ try {
273
+ return new Promise((resolve, reject) => {
274
+ const messageHandler = (event) => {
275
+ const response = event.data;
276
+ if (!response.success) {
277
+ navigator.serviceWorker.removeEventListener("message", messageHandler);
278
+ reject(new Error(response.message));
279
+ return;
280
+ }
281
+ switch (response.type) {
282
+ case "SETTLE_EVENT":
283
+ if (callback) {
284
+ callback(response.event);
285
+ }
286
+ break;
287
+ case "SETTLE_SUCCESS":
288
+ navigator.serviceWorker.removeEventListener("message", messageHandler);
289
+ resolve(response.txid);
290
+ break;
291
+ default:
292
+ break;
293
+ }
294
+ };
295
+ navigator.serviceWorker.addEventListener("message", messageHandler);
296
+ if (this.serviceWorker) {
297
+ this.serviceWorker.postMessage(message);
298
+ }
299
+ else {
300
+ reject(new Error("Service worker not initialized"));
301
+ }
302
+ });
303
+ }
304
+ catch (error) {
305
+ throw new Error(`Settlement failed: ${error}`);
306
+ }
307
+ }
308
+ async getTransactionHistory() {
309
+ const message = {
310
+ type: "GET_TRANSACTION_HISTORY",
311
+ id: getRandomId(),
312
+ };
313
+ try {
314
+ const response = await this.sendMessage(message);
315
+ if (Response.isTransactionHistory(response)) {
316
+ return response.transactions;
317
+ }
318
+ throw new UnexpectedResponseError(response);
319
+ }
320
+ catch (error) {
321
+ throw new Error(`Failed to get transaction history: ${error}`);
322
+ }
323
+ }
324
+ }
325
+ function getRandomId() {
326
+ const randomValue = crypto.getRandomValues(new Uint8Array(16));
327
+ return hex.encode(randomValue);
328
+ }