@arkade-os/sdk 0.3.12 → 0.4.0-next.0

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 (250) hide show
  1. package/README.md +483 -54
  2. package/dist/cjs/adapters/expo-db.js +35 -0
  3. package/dist/cjs/asset/assetGroup.js +141 -0
  4. package/dist/cjs/asset/assetId.js +88 -0
  5. package/dist/cjs/asset/assetInput.js +204 -0
  6. package/dist/cjs/asset/assetOutput.js +159 -0
  7. package/dist/cjs/asset/assetRef.js +82 -0
  8. package/dist/cjs/asset/index.js +24 -0
  9. package/dist/cjs/asset/metadata.js +172 -0
  10. package/dist/cjs/asset/packet.js +164 -0
  11. package/dist/cjs/asset/types.js +25 -0
  12. package/dist/cjs/asset/utils.js +105 -0
  13. package/dist/cjs/contracts/arkcontract.js +148 -0
  14. package/dist/cjs/contracts/contractManager.js +436 -0
  15. package/dist/cjs/contracts/contractWatcher.js +567 -0
  16. package/dist/cjs/contracts/handlers/default.js +85 -0
  17. package/dist/cjs/contracts/handlers/delegate.js +89 -0
  18. package/dist/cjs/contracts/handlers/helpers.js +105 -0
  19. package/dist/cjs/contracts/handlers/index.js +19 -0
  20. package/dist/cjs/contracts/handlers/registry.js +89 -0
  21. package/dist/cjs/contracts/handlers/vhtlc.js +193 -0
  22. package/dist/cjs/contracts/index.js +41 -0
  23. package/dist/cjs/contracts/types.js +2 -0
  24. package/dist/cjs/db/manager.js +97 -0
  25. package/dist/cjs/forfeit.js +12 -8
  26. package/dist/cjs/identity/index.js +1 -0
  27. package/dist/cjs/identity/seedIdentity.js +255 -0
  28. package/dist/cjs/index.js +70 -14
  29. package/dist/cjs/intent/index.js +28 -2
  30. package/dist/cjs/providers/ark.js +7 -0
  31. package/dist/cjs/providers/delegator.js +66 -0
  32. package/dist/cjs/providers/expoIndexer.js +5 -0
  33. package/dist/cjs/providers/indexer.js +68 -1
  34. package/dist/cjs/providers/onchain.js +2 -2
  35. package/dist/cjs/providers/utils.js +1 -0
  36. package/dist/cjs/repositories/contractRepository.js +0 -103
  37. package/dist/cjs/repositories/inMemory/contractRepository.js +55 -0
  38. package/dist/cjs/repositories/inMemory/walletRepository.js +80 -0
  39. package/dist/cjs/repositories/index.js +16 -0
  40. package/dist/cjs/repositories/indexedDB/contractRepository.js +187 -0
  41. package/dist/cjs/repositories/indexedDB/db.js +57 -0
  42. package/dist/cjs/repositories/indexedDB/schema.js +159 -0
  43. package/dist/cjs/repositories/indexedDB/walletRepository.js +338 -0
  44. package/dist/cjs/repositories/indexedDB/websqlAdapter.js +144 -0
  45. package/dist/cjs/repositories/migrations/contractRepositoryImpl.js +127 -0
  46. package/dist/cjs/repositories/migrations/fromStorageAdapter.js +66 -0
  47. package/dist/cjs/repositories/migrations/walletRepositoryImpl.js +180 -0
  48. package/dist/cjs/repositories/walletRepository.js +0 -169
  49. package/dist/cjs/script/base.js +54 -0
  50. package/dist/cjs/script/delegate.js +49 -0
  51. package/dist/cjs/storage/asyncStorage.js +4 -1
  52. package/dist/cjs/storage/fileSystem.js +3 -0
  53. package/dist/cjs/storage/inMemory.js +3 -0
  54. package/dist/cjs/storage/indexedDB.js +5 -1
  55. package/dist/cjs/storage/localStorage.js +3 -0
  56. package/dist/cjs/utils/arkTransaction.js +16 -0
  57. package/dist/cjs/utils/transactionHistory.js +50 -0
  58. package/dist/cjs/utils/txSizeEstimator.js +39 -14
  59. package/dist/cjs/wallet/asset-manager.js +338 -0
  60. package/dist/cjs/wallet/asset.js +117 -0
  61. package/dist/cjs/wallet/batch.js +1 -1
  62. package/dist/cjs/wallet/delegator.js +235 -0
  63. package/dist/cjs/wallet/expo/background.js +133 -0
  64. package/dist/cjs/wallet/expo/index.js +9 -0
  65. package/dist/cjs/wallet/expo/wallet.js +231 -0
  66. package/dist/cjs/wallet/onchain.js +57 -12
  67. package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +568 -0
  68. package/dist/cjs/wallet/serviceWorker/wallet.js +383 -102
  69. package/dist/cjs/wallet/unroll.js +7 -2
  70. package/dist/cjs/wallet/utils.js +60 -0
  71. package/dist/cjs/wallet/validation.js +151 -0
  72. package/dist/cjs/wallet/vtxo-manager.js +1 -1
  73. package/dist/cjs/wallet/wallet.js +702 -260
  74. package/dist/cjs/worker/browser/service-worker-manager.js +82 -0
  75. package/dist/cjs/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  76. package/dist/cjs/worker/expo/asyncStorageTaskQueue.js +78 -0
  77. package/dist/cjs/worker/expo/index.js +12 -0
  78. package/dist/cjs/worker/expo/processors/contractPollProcessor.js +61 -0
  79. package/dist/cjs/worker/expo/processors/index.js +6 -0
  80. package/dist/cjs/worker/expo/taskQueue.js +41 -0
  81. package/dist/cjs/worker/expo/taskRunner.js +57 -0
  82. package/dist/cjs/worker/messageBus.js +252 -0
  83. package/dist/esm/adapters/expo-db.js +27 -0
  84. package/dist/esm/asset/assetGroup.js +137 -0
  85. package/dist/esm/asset/assetId.js +84 -0
  86. package/dist/esm/asset/assetInput.js +199 -0
  87. package/dist/esm/asset/assetOutput.js +154 -0
  88. package/dist/esm/asset/assetRef.js +78 -0
  89. package/dist/esm/asset/index.js +8 -0
  90. package/dist/esm/asset/metadata.js +167 -0
  91. package/dist/esm/asset/packet.js +159 -0
  92. package/dist/esm/asset/types.js +22 -0
  93. package/dist/esm/asset/utils.js +99 -0
  94. package/dist/esm/contracts/arkcontract.js +141 -0
  95. package/dist/esm/contracts/contractManager.js +432 -0
  96. package/dist/esm/contracts/contractWatcher.js +563 -0
  97. package/dist/esm/contracts/handlers/default.js +82 -0
  98. package/dist/esm/contracts/handlers/delegate.js +86 -0
  99. package/dist/esm/contracts/handlers/helpers.js +66 -0
  100. package/dist/esm/contracts/handlers/index.js +12 -0
  101. package/dist/esm/contracts/handlers/registry.js +86 -0
  102. package/dist/esm/contracts/handlers/vhtlc.js +190 -0
  103. package/dist/esm/contracts/index.js +13 -0
  104. package/dist/esm/contracts/types.js +1 -0
  105. package/dist/esm/db/manager.js +92 -0
  106. package/dist/esm/forfeit.js +11 -8
  107. package/dist/esm/identity/index.js +1 -0
  108. package/dist/esm/identity/seedIdentity.js +249 -0
  109. package/dist/esm/index.js +25 -15
  110. package/dist/esm/intent/index.js +28 -2
  111. package/dist/esm/providers/ark.js +7 -0
  112. package/dist/esm/providers/delegator.js +62 -0
  113. package/dist/esm/providers/expoIndexer.js +5 -0
  114. package/dist/esm/providers/indexer.js +68 -1
  115. package/dist/esm/providers/onchain.js +2 -2
  116. package/dist/esm/providers/utils.js +1 -0
  117. package/dist/esm/repositories/contractRepository.js +1 -101
  118. package/dist/esm/repositories/inMemory/contractRepository.js +51 -0
  119. package/dist/esm/repositories/inMemory/walletRepository.js +76 -0
  120. package/dist/esm/repositories/index.js +8 -0
  121. package/dist/esm/repositories/indexedDB/contractRepository.js +183 -0
  122. package/dist/esm/repositories/indexedDB/db.js +42 -0
  123. package/dist/esm/repositories/indexedDB/schema.js +155 -0
  124. package/dist/esm/repositories/indexedDB/walletRepository.js +334 -0
  125. package/dist/esm/repositories/indexedDB/websqlAdapter.js +138 -0
  126. package/dist/esm/repositories/migrations/contractRepositoryImpl.js +121 -0
  127. package/dist/esm/repositories/migrations/fromStorageAdapter.js +58 -0
  128. package/dist/esm/repositories/migrations/walletRepositoryImpl.js +176 -0
  129. package/dist/esm/repositories/walletRepository.js +1 -167
  130. package/dist/esm/script/base.js +21 -1
  131. package/dist/esm/script/delegate.js +46 -0
  132. package/dist/esm/storage/asyncStorage.js +4 -1
  133. package/dist/esm/storage/fileSystem.js +3 -0
  134. package/dist/esm/storage/inMemory.js +3 -0
  135. package/dist/esm/storage/indexedDB.js +5 -1
  136. package/dist/esm/storage/localStorage.js +3 -0
  137. package/dist/esm/utils/arkTransaction.js +15 -0
  138. package/dist/esm/utils/transactionHistory.js +50 -0
  139. package/dist/esm/utils/txSizeEstimator.js +39 -14
  140. package/dist/esm/wallet/asset-manager.js +333 -0
  141. package/dist/esm/wallet/asset.js +111 -0
  142. package/dist/esm/wallet/batch.js +1 -1
  143. package/dist/esm/wallet/delegator.js +231 -0
  144. package/dist/esm/wallet/expo/background.js +128 -0
  145. package/dist/esm/wallet/expo/index.js +2 -0
  146. package/dist/esm/wallet/expo/wallet.js +194 -0
  147. package/dist/esm/wallet/onchain.js +57 -12
  148. package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +564 -0
  149. package/dist/esm/wallet/serviceWorker/wallet.js +382 -101
  150. package/dist/esm/wallet/unroll.js +7 -2
  151. package/dist/esm/wallet/utils.js +55 -0
  152. package/dist/esm/wallet/validation.js +139 -0
  153. package/dist/esm/wallet/vtxo-manager.js +1 -1
  154. package/dist/esm/wallet/wallet.js +704 -229
  155. package/dist/esm/worker/browser/service-worker-manager.js +76 -0
  156. package/dist/esm/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  157. package/dist/esm/worker/expo/asyncStorageTaskQueue.js +74 -0
  158. package/dist/esm/worker/expo/index.js +4 -0
  159. package/dist/esm/worker/expo/processors/contractPollProcessor.js +58 -0
  160. package/dist/esm/worker/expo/processors/index.js +1 -0
  161. package/dist/esm/worker/expo/taskQueue.js +37 -0
  162. package/dist/esm/worker/expo/taskRunner.js +54 -0
  163. package/dist/esm/worker/messageBus.js +248 -0
  164. package/dist/types/adapters/expo-db.d.ts +7 -0
  165. package/dist/types/asset/assetGroup.d.ts +28 -0
  166. package/dist/types/asset/assetId.d.ts +19 -0
  167. package/dist/types/asset/assetInput.d.ts +46 -0
  168. package/dist/types/asset/assetOutput.d.ts +39 -0
  169. package/dist/types/asset/assetRef.d.ts +25 -0
  170. package/dist/types/asset/index.d.ts +8 -0
  171. package/dist/types/asset/metadata.d.ts +37 -0
  172. package/dist/types/asset/packet.d.ts +27 -0
  173. package/dist/types/asset/types.d.ts +18 -0
  174. package/dist/types/asset/utils.d.ts +21 -0
  175. package/dist/types/contracts/arkcontract.d.ts +101 -0
  176. package/dist/types/contracts/contractManager.d.ts +331 -0
  177. package/dist/types/contracts/contractWatcher.d.ts +192 -0
  178. package/dist/types/contracts/handlers/default.d.ts +19 -0
  179. package/dist/types/contracts/handlers/delegate.d.ts +21 -0
  180. package/dist/types/contracts/handlers/helpers.d.ts +18 -0
  181. package/dist/types/contracts/handlers/index.d.ts +7 -0
  182. package/dist/types/contracts/handlers/registry.d.ts +65 -0
  183. package/dist/types/contracts/handlers/vhtlc.d.ts +32 -0
  184. package/dist/types/contracts/index.d.ts +14 -0
  185. package/dist/types/contracts/types.d.ts +222 -0
  186. package/dist/types/db/manager.d.ts +22 -0
  187. package/dist/types/forfeit.d.ts +2 -1
  188. package/dist/types/identity/index.d.ts +1 -0
  189. package/dist/types/identity/seedIdentity.d.ts +128 -0
  190. package/dist/types/index.d.ts +21 -12
  191. package/dist/types/intent/index.d.ts +2 -1
  192. package/dist/types/providers/ark.d.ts +11 -2
  193. package/dist/types/providers/delegator.d.ts +29 -0
  194. package/dist/types/providers/indexer.d.ts +11 -1
  195. package/dist/types/repositories/contractRepository.d.ts +30 -19
  196. package/dist/types/repositories/inMemory/contractRepository.d.ts +17 -0
  197. package/dist/types/repositories/inMemory/walletRepository.d.ts +26 -0
  198. package/dist/types/repositories/index.d.ts +7 -0
  199. package/dist/types/repositories/indexedDB/contractRepository.d.ts +21 -0
  200. package/dist/types/repositories/indexedDB/db.d.ts +56 -0
  201. package/dist/types/repositories/indexedDB/schema.d.ts +8 -0
  202. package/dist/types/repositories/indexedDB/walletRepository.d.ts +25 -0
  203. package/dist/types/repositories/indexedDB/websqlAdapter.d.ts +49 -0
  204. package/dist/types/repositories/migrations/contractRepositoryImpl.d.ts +24 -0
  205. package/dist/types/repositories/migrations/fromStorageAdapter.d.ts +19 -0
  206. package/dist/types/repositories/migrations/walletRepositoryImpl.d.ts +27 -0
  207. package/dist/types/repositories/walletRepository.d.ts +13 -24
  208. package/dist/types/script/base.d.ts +1 -0
  209. package/dist/types/script/delegate.d.ts +36 -0
  210. package/dist/types/storage/asyncStorage.d.ts +4 -0
  211. package/dist/types/storage/fileSystem.d.ts +3 -0
  212. package/dist/types/storage/inMemory.d.ts +3 -0
  213. package/dist/types/storage/index.d.ts +3 -0
  214. package/dist/types/storage/indexedDB.d.ts +3 -0
  215. package/dist/types/storage/localStorage.d.ts +3 -0
  216. package/dist/types/utils/arkTransaction.d.ts +6 -0
  217. package/dist/types/utils/txSizeEstimator.d.ts +12 -2
  218. package/dist/types/wallet/asset-manager.d.ts +78 -0
  219. package/dist/types/wallet/asset.d.ts +21 -0
  220. package/dist/types/wallet/batch.d.ts +1 -1
  221. package/dist/types/wallet/delegator.d.ts +24 -0
  222. package/dist/types/wallet/expo/background.d.ts +66 -0
  223. package/dist/types/wallet/expo/index.d.ts +4 -0
  224. package/dist/types/wallet/expo/wallet.d.ts +97 -0
  225. package/dist/types/wallet/index.d.ts +75 -2
  226. package/dist/types/wallet/onchain.d.ts +22 -1
  227. package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +366 -0
  228. package/dist/types/wallet/serviceWorker/wallet.d.ts +20 -11
  229. package/dist/types/wallet/utils.d.ts +13 -1
  230. package/dist/types/wallet/validation.d.ts +24 -0
  231. package/dist/types/wallet/wallet.d.ts +111 -17
  232. package/dist/types/worker/browser/service-worker-manager.d.ts +21 -0
  233. package/dist/types/{wallet/serviceWorker → worker/browser}/utils.d.ts +2 -1
  234. package/dist/types/worker/expo/asyncStorageTaskQueue.d.ts +46 -0
  235. package/dist/types/worker/expo/index.d.ts +7 -0
  236. package/dist/types/worker/expo/processors/contractPollProcessor.d.ts +14 -0
  237. package/dist/types/worker/expo/processors/index.d.ts +1 -0
  238. package/dist/types/worker/expo/taskQueue.d.ts +50 -0
  239. package/dist/types/worker/expo/taskRunner.d.ts +42 -0
  240. package/dist/types/worker/messageBus.d.ts +109 -0
  241. package/package.json +71 -17
  242. package/dist/cjs/wallet/serviceWorker/request.js +0 -78
  243. package/dist/cjs/wallet/serviceWorker/response.js +0 -222
  244. package/dist/cjs/wallet/serviceWorker/worker.js +0 -655
  245. package/dist/esm/wallet/serviceWorker/request.js +0 -75
  246. package/dist/esm/wallet/serviceWorker/response.js +0 -219
  247. package/dist/esm/wallet/serviceWorker/worker.js +0 -651
  248. package/dist/types/wallet/serviceWorker/request.d.ts +0 -74
  249. package/dist/types/wallet/serviceWorker/response.d.ts +0 -123
  250. package/dist/types/wallet/serviceWorker/worker.d.ts +0 -53
@@ -1,651 +0,0 @@
1
- /// <reference lib="webworker" />
2
- import { ReadonlySingleKey, SingleKey } from '../../identity/singleKey.js';
3
- import { isExpired, isRecoverable, isSpendable, isSubdust, } from '../index.js';
4
- import { ReadonlyWallet, Wallet } from '../wallet.js';
5
- import { Request } from './request.js';
6
- import { Response } from './response.js';
7
- import { RestArkProvider } from '../../providers/ark.js';
8
- import { RestIndexerProvider } from '../../providers/indexer.js';
9
- import { hex } from "@scure/base";
10
- import { IndexedDBStorageAdapter } from '../../storage/indexedDB.js';
11
- import { WalletRepositoryImpl, } from '../../repositories/walletRepository.js';
12
- import { extendCoin, extendVirtualCoin } from '../utils.js';
13
- import { DEFAULT_DB_NAME } from './utils.js';
14
- class ReadonlyHandler {
15
- constructor(wallet) {
16
- this.wallet = wallet;
17
- }
18
- get offchainTapscript() {
19
- return this.wallet.offchainTapscript;
20
- }
21
- get boardingTapscript() {
22
- return this.wallet.boardingTapscript;
23
- }
24
- get onchainProvider() {
25
- return this.wallet.onchainProvider;
26
- }
27
- get dustAmount() {
28
- return this.wallet.dustAmount;
29
- }
30
- get identity() {
31
- return this.wallet.identity;
32
- }
33
- notifyIncomingFunds(...args) {
34
- return this.wallet.notifyIncomingFunds(...args);
35
- }
36
- getAddress() {
37
- return this.wallet.getAddress();
38
- }
39
- getBoardingAddress() {
40
- return this.wallet.getBoardingAddress();
41
- }
42
- getTransactionHistory() {
43
- return this.wallet.getTransactionHistory();
44
- }
45
- async handleReload(_) {
46
- const pending = await this.wallet.fetchPendingTxs();
47
- return { pending, finalized: [] };
48
- }
49
- async handleSettle(..._) {
50
- return undefined;
51
- }
52
- async handleSendBitcoin(..._) {
53
- return undefined;
54
- }
55
- }
56
- class Handler extends ReadonlyHandler {
57
- constructor(wallet) {
58
- super(wallet);
59
- this.wallet = wallet;
60
- }
61
- async handleReload(vtxos) {
62
- return this.wallet.finalizePendingTxs(vtxos.filter((vtxo) => vtxo.virtualStatus.state !== "swept" &&
63
- vtxo.virtualStatus.state !== "settled"));
64
- }
65
- async handleSettle(...args) {
66
- return this.wallet.settle(...args);
67
- }
68
- async handleSendBitcoin(...args) {
69
- return this.wallet.sendBitcoin(...args);
70
- }
71
- }
72
- /**
73
- * Worker is a class letting to interact with ServiceWorkerWallet and ServiceWorkerReadonlyWallet from
74
- * the client; it aims to be run in a service worker context.
75
- *
76
- * The messages requiring a Wallet rather than a ReadonlyWallet result in no-op
77
- * without errors.
78
- */
79
- export class Worker {
80
- constructor(dbName = DEFAULT_DB_NAME, dbVersion = 1, messageCallback = () => { }) {
81
- this.dbName = dbName;
82
- this.dbVersion = dbVersion;
83
- this.messageCallback = messageCallback;
84
- this.storage = new IndexedDBStorageAdapter(dbName, dbVersion);
85
- this.walletRepository = new WalletRepositoryImpl(this.storage);
86
- }
87
- /**
88
- * Get spendable vtxos for the current wallet address
89
- */
90
- async getSpendableVtxos() {
91
- if (!this.handler)
92
- return [];
93
- const address = await this.handler.getAddress();
94
- const allVtxos = await this.walletRepository.getVtxos(address);
95
- return allVtxos.filter(isSpendable);
96
- }
97
- /**
98
- * Get swept vtxos for the current wallet address
99
- */
100
- async getSweptVtxos() {
101
- if (!this.handler)
102
- return [];
103
- const address = await this.handler.getAddress();
104
- const allVtxos = await this.walletRepository.getVtxos(address);
105
- return allVtxos.filter((vtxo) => vtxo.virtualStatus.state === "swept");
106
- }
107
- /**
108
- * Get all vtxos categorized by type
109
- */
110
- async getAllVtxos() {
111
- if (!this.handler)
112
- return { spendable: [], spent: [] };
113
- const address = await this.handler.getAddress();
114
- const allVtxos = await this.walletRepository.getVtxos(address);
115
- return {
116
- spendable: allVtxos.filter(isSpendable),
117
- spent: allVtxos.filter((vtxo) => !isSpendable(vtxo)),
118
- };
119
- }
120
- /**
121
- * Get all boarding utxos from wallet repository
122
- */
123
- async getAllBoardingUtxos() {
124
- if (!this.handler)
125
- return [];
126
- const address = await this.handler.getBoardingAddress();
127
- return await this.walletRepository.getUtxos(address);
128
- }
129
- async start(withServiceWorkerUpdate = true) {
130
- self.addEventListener("message", async (event) => {
131
- await this.handleMessage(event);
132
- });
133
- if (withServiceWorkerUpdate) {
134
- // activate service worker immediately
135
- self.addEventListener("install", () => {
136
- self.skipWaiting();
137
- });
138
- // take control of clients immediately
139
- self.addEventListener("activate", () => {
140
- self.clients.claim();
141
- });
142
- }
143
- }
144
- async clear() {
145
- if (this.incomingFundsSubscription)
146
- this.incomingFundsSubscription();
147
- // Clear storage - this replaces vtxoRepository.close()
148
- await this.storage.clear();
149
- // Reset in-memory caches by recreating the repository
150
- this.walletRepository = new WalletRepositoryImpl(this.storage);
151
- this.handler = undefined;
152
- this.arkProvider = undefined;
153
- this.indexerProvider = undefined;
154
- }
155
- async reload() {
156
- await this.onWalletInitialized();
157
- }
158
- async onWalletInitialized() {
159
- if (!this.handler ||
160
- !this.arkProvider ||
161
- !this.indexerProvider ||
162
- !this.handler.offchainTapscript ||
163
- !this.handler.boardingTapscript) {
164
- return;
165
- }
166
- // Get public key script and set the initial vtxos state
167
- const script = hex.encode(this.handler.offchainTapscript.pkScript);
168
- const response = await this.indexerProvider.getVtxos({
169
- scripts: [script],
170
- });
171
- const vtxos = response.vtxos.map((vtxo) => extendVirtualCoin(this.handler, vtxo));
172
- try {
173
- // recover pending transactions if possible
174
- const { pending, finalized } = await this.handler.handleReload(vtxos);
175
- console.info(`Recovered ${finalized.length}/${pending.length} pending transactions: ${finalized.join(", ")}`);
176
- }
177
- catch (error) {
178
- console.error("Error recovering pending transactions:", error);
179
- }
180
- // Get wallet address and save vtxos using unified repository
181
- const address = await this.handler.getAddress();
182
- await this.walletRepository.saveVtxos(address, vtxos);
183
- // Fetch boarding utxos and save using unified repository
184
- const boardingAddress = await this.handler.getBoardingAddress();
185
- const coins = await this.handler.onchainProvider.getCoins(boardingAddress);
186
- await this.walletRepository.saveUtxos(boardingAddress, coins.map((utxo) => extendCoin(this.handler, utxo)));
187
- // Get transaction history to cache boarding txs
188
- const txs = await this.handler.getTransactionHistory();
189
- if (txs)
190
- await this.walletRepository.saveTransactions(address, txs);
191
- // unsubscribe previous subscription if any
192
- if (this.incomingFundsSubscription)
193
- this.incomingFundsSubscription();
194
- // subscribe for incoming funds and notify all clients when new funds arrive
195
- this.incomingFundsSubscription = await this.handler.notifyIncomingFunds(async (funds) => {
196
- if (funds.type === "vtxo") {
197
- const newVtxos = funds.newVtxos.length > 0
198
- ? funds.newVtxos.map((vtxo) => extendVirtualCoin(this.handler, vtxo))
199
- : [];
200
- const spentVtxos = funds.spentVtxos.length > 0
201
- ? funds.spentVtxos.map((vtxo) => extendVirtualCoin(this.handler, vtxo))
202
- : [];
203
- if ([...newVtxos, ...spentVtxos].length === 0)
204
- return;
205
- // save vtxos using unified repository
206
- await this.walletRepository.saveVtxos(address, [
207
- ...newVtxos,
208
- ...spentVtxos,
209
- ]);
210
- // notify all clients about the vtxo update
211
- await this.sendMessageToAllClients(Response.vtxoUpdate(newVtxos, spentVtxos));
212
- }
213
- if (funds.type === "utxo") {
214
- const utxos = funds.coins.map((utxo) => extendCoin(this.handler, utxo));
215
- const boardingAddress = await this.handler?.getBoardingAddress();
216
- // save utxos using unified repository
217
- await this.walletRepository.clearUtxos(boardingAddress);
218
- await this.walletRepository.saveUtxos(boardingAddress, utxos);
219
- // notify all clients about the utxo update
220
- await this.sendMessageToAllClients(Response.utxoUpdate(utxos));
221
- }
222
- });
223
- }
224
- async handleClear(event) {
225
- await this.clear();
226
- if (Request.isBase(event.data)) {
227
- event.source?.postMessage(Response.clearResponse(event.data.id, true));
228
- }
229
- }
230
- async handleInitWallet(event) {
231
- if (!Request.isInitWallet(event.data)) {
232
- console.error("Invalid INIT_WALLET message format", event.data);
233
- event.source?.postMessage(Response.error(event.data.id, "Invalid INIT_WALLET message format"));
234
- return;
235
- }
236
- const message = event.data;
237
- const { arkServerPublicKey, arkServerUrl } = message;
238
- this.arkProvider = new RestArkProvider(arkServerUrl);
239
- this.indexerProvider = new RestIndexerProvider(arkServerUrl);
240
- try {
241
- if ("privateKey" in message.key &&
242
- typeof message.key.privateKey === "string") {
243
- const { key: { privateKey }, } = message;
244
- const identity = SingleKey.fromHex(privateKey);
245
- const wallet = await Wallet.create({
246
- identity,
247
- arkServerUrl,
248
- arkServerPublicKey,
249
- storage: this.storage, // Use unified storage for wallet too
250
- });
251
- this.handler = new Handler(wallet);
252
- }
253
- else if ("publicKey" in message.key &&
254
- typeof message.key.publicKey === "string") {
255
- const { key: { publicKey }, } = message;
256
- const identity = ReadonlySingleKey.fromPublicKey(hex.decode(publicKey));
257
- const wallet = await ReadonlyWallet.create({
258
- identity,
259
- arkServerUrl,
260
- arkServerPublicKey,
261
- storage: this.storage, // Use unified storage for wallet too
262
- });
263
- this.handler = new ReadonlyHandler(wallet);
264
- }
265
- else {
266
- const err = "Missing privateKey or publicKey in key object";
267
- event.source?.postMessage(Response.error(message.id, err));
268
- console.error(err);
269
- return;
270
- }
271
- }
272
- catch (error) {
273
- console.error("Error initializing wallet:", error);
274
- const errorMessage = error instanceof Error
275
- ? error.message
276
- : "Unknown error occurred";
277
- event.source?.postMessage(Response.error(message.id, errorMessage));
278
- return;
279
- }
280
- event.source?.postMessage(Response.walletInitialized(message.id));
281
- await this.onWalletInitialized();
282
- }
283
- async handleSettle(event) {
284
- const message = event.data;
285
- if (!Request.isSettle(message)) {
286
- console.error("Invalid SETTLE message format", message);
287
- event.source?.postMessage(Response.error(message.id, "Invalid SETTLE message format"));
288
- return;
289
- }
290
- try {
291
- if (!this.handler) {
292
- console.error("Wallet not initialized");
293
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
294
- return;
295
- }
296
- const txid = await this.handler.handleSettle(message.params, (e) => {
297
- event.source?.postMessage(Response.settleEvent(message.id, e));
298
- });
299
- if (txid) {
300
- event.source?.postMessage(Response.settleSuccess(message.id, txid));
301
- }
302
- else {
303
- event.source?.postMessage(Response.error(message.id, "Operation not supported in readonly mode"));
304
- }
305
- }
306
- catch (error) {
307
- console.error("Error settling:", error);
308
- const errorMessage = error instanceof Error
309
- ? error.message
310
- : "Unknown error occurred";
311
- event.source?.postMessage(Response.error(message.id, errorMessage));
312
- }
313
- }
314
- async handleSendBitcoin(event) {
315
- const message = event.data;
316
- if (!Request.isSendBitcoin(message)) {
317
- console.error("Invalid SEND_BITCOIN message format", message);
318
- event.source?.postMessage(Response.error(message.id, "Invalid SEND_BITCOIN message format"));
319
- return;
320
- }
321
- if (!this.handler) {
322
- console.error("Wallet not initialized");
323
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
324
- return;
325
- }
326
- try {
327
- const txid = await this.handler.handleSendBitcoin(message.params);
328
- if (txid) {
329
- event.source?.postMessage(Response.sendBitcoinSuccess(message.id, txid));
330
- }
331
- else {
332
- event.source?.postMessage(Response.error(message.id, "Operation not supported in readonly mode"));
333
- }
334
- }
335
- catch (error) {
336
- console.error("Error sending bitcoin:", error);
337
- const errorMessage = error instanceof Error
338
- ? error.message
339
- : "Unknown error occurred";
340
- event.source?.postMessage(Response.error(message.id, errorMessage));
341
- }
342
- }
343
- async handleGetAddress(event) {
344
- const message = event.data;
345
- if (!Request.isGetAddress(message)) {
346
- console.error("Invalid GET_ADDRESS message format", message);
347
- event.source?.postMessage(Response.error(message.id, "Invalid GET_ADDRESS message format"));
348
- return;
349
- }
350
- if (!this.handler) {
351
- console.error("Wallet not initialized");
352
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
353
- return;
354
- }
355
- try {
356
- const address = await this.handler.getAddress();
357
- event.source?.postMessage(Response.address(message.id, address));
358
- }
359
- catch (error) {
360
- console.error("Error getting address:", error);
361
- const errorMessage = error instanceof Error
362
- ? error.message
363
- : "Unknown error occurred";
364
- event.source?.postMessage(Response.error(message.id, errorMessage));
365
- }
366
- }
367
- async handleGetBoardingAddress(event) {
368
- const message = event.data;
369
- if (!Request.isGetBoardingAddress(message)) {
370
- console.error("Invalid GET_BOARDING_ADDRESS message format", message);
371
- event.source?.postMessage(Response.error(message.id, "Invalid GET_BOARDING_ADDRESS message format"));
372
- return;
373
- }
374
- if (!this.handler) {
375
- console.error("Wallet not initialized");
376
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
377
- return;
378
- }
379
- try {
380
- const address = await this.handler.getBoardingAddress();
381
- event.source?.postMessage(Response.boardingAddress(message.id, address));
382
- }
383
- catch (error) {
384
- console.error("Error getting boarding address:", error);
385
- const errorMessage = error instanceof Error
386
- ? error.message
387
- : "Unknown error occurred";
388
- event.source?.postMessage(Response.error(message.id, errorMessage));
389
- }
390
- }
391
- async handleGetBalance(event) {
392
- const message = event.data;
393
- if (!Request.isGetBalance(message)) {
394
- console.error("Invalid GET_BALANCE message format", message);
395
- event.source?.postMessage(Response.error(message.id, "Invalid GET_BALANCE message format"));
396
- return;
397
- }
398
- if (!this.handler) {
399
- console.error("Wallet not initialized");
400
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
401
- return;
402
- }
403
- try {
404
- const [boardingUtxos, spendableVtxos, sweptVtxos] = await Promise.all([
405
- this.getAllBoardingUtxos(),
406
- this.getSpendableVtxos(),
407
- this.getSweptVtxos(),
408
- ]);
409
- // boarding
410
- let confirmed = 0;
411
- let unconfirmed = 0;
412
- for (const utxo of boardingUtxos) {
413
- if (utxo.status.confirmed) {
414
- confirmed += utxo.value;
415
- }
416
- else {
417
- unconfirmed += utxo.value;
418
- }
419
- }
420
- // offchain
421
- let settled = 0;
422
- let preconfirmed = 0;
423
- let recoverable = 0;
424
- for (const vtxo of spendableVtxos) {
425
- if (vtxo.virtualStatus.state === "settled") {
426
- settled += vtxo.value;
427
- }
428
- else if (vtxo.virtualStatus.state === "preconfirmed") {
429
- preconfirmed += vtxo.value;
430
- }
431
- }
432
- for (const vtxo of sweptVtxos) {
433
- if (isSpendable(vtxo)) {
434
- recoverable += vtxo.value;
435
- }
436
- }
437
- const totalBoarding = confirmed + unconfirmed;
438
- const totalOffchain = settled + preconfirmed + recoverable;
439
- event.source?.postMessage(Response.balance(message.id, {
440
- boarding: {
441
- confirmed,
442
- unconfirmed,
443
- total: totalBoarding,
444
- },
445
- settled,
446
- preconfirmed,
447
- available: settled + preconfirmed,
448
- recoverable,
449
- total: totalBoarding + totalOffchain,
450
- }));
451
- }
452
- catch (error) {
453
- console.error("Error getting balance:", error);
454
- const errorMessage = error instanceof Error
455
- ? error.message
456
- : "Unknown error occurred";
457
- event.source?.postMessage(Response.error(message.id, errorMessage));
458
- }
459
- }
460
- async handleGetVtxos(event) {
461
- const message = event.data;
462
- if (!Request.isGetVtxos(message)) {
463
- console.error("Invalid GET_VTXOS message format", message);
464
- event.source?.postMessage(Response.error(message.id, "Invalid GET_VTXOS message format"));
465
- return;
466
- }
467
- if (!this.handler) {
468
- console.error("Wallet not initialized");
469
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
470
- return;
471
- }
472
- try {
473
- const vtxos = await this.getSpendableVtxos();
474
- const dustAmount = this.handler.dustAmount;
475
- const includeRecoverable = message.filter?.withRecoverable ?? false;
476
- const filteredVtxos = includeRecoverable
477
- ? vtxos
478
- : vtxos.filter((v) => {
479
- if (dustAmount != null && isSubdust(v, dustAmount)) {
480
- return false;
481
- }
482
- if (isRecoverable(v)) {
483
- return false;
484
- }
485
- if (isExpired(v)) {
486
- return false;
487
- }
488
- return true;
489
- });
490
- event.source?.postMessage(Response.vtxos(message.id, filteredVtxos));
491
- }
492
- catch (error) {
493
- console.error("Error getting vtxos:", error);
494
- const errorMessage = error instanceof Error
495
- ? error.message
496
- : "Unknown error occurred";
497
- event.source?.postMessage(Response.error(message.id, errorMessage));
498
- }
499
- }
500
- async handleGetBoardingUtxos(event) {
501
- const message = event.data;
502
- if (!Request.isGetBoardingUtxos(message)) {
503
- console.error("Invalid GET_BOARDING_UTXOS message format", message);
504
- event.source?.postMessage(Response.error(message.id, "Invalid GET_BOARDING_UTXOS message format"));
505
- return;
506
- }
507
- if (!this.handler) {
508
- console.error("Wallet not initialized");
509
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
510
- return;
511
- }
512
- try {
513
- const boardingUtxos = await this.getAllBoardingUtxos();
514
- event.source?.postMessage(Response.boardingUtxos(message.id, boardingUtxos));
515
- }
516
- catch (error) {
517
- console.error("Error getting boarding utxos:", error);
518
- const errorMessage = error instanceof Error
519
- ? error.message
520
- : "Unknown error occurred";
521
- event.source?.postMessage(Response.error(message.id, errorMessage));
522
- }
523
- }
524
- async handleGetTransactionHistory(event) {
525
- const message = event.data;
526
- if (!Request.isGetTransactionHistory(message)) {
527
- console.error("Invalid GET_TRANSACTION_HISTORY message format", message);
528
- event.source?.postMessage(Response.error(message.id, "Invalid GET_TRANSACTION_HISTORY message format"));
529
- return;
530
- }
531
- if (!this.handler) {
532
- console.error("Wallet not initialized");
533
- event.source?.postMessage(Response.error(message.id, "Wallet not initialized"));
534
- return;
535
- }
536
- try {
537
- const txs = await this.handler.getTransactionHistory();
538
- event.source?.postMessage(Response.transactionHistory(message.id, txs));
539
- }
540
- catch (error) {
541
- console.error("Error getting transaction history:", error);
542
- const errorMessage = error instanceof Error
543
- ? error.message
544
- : "Unknown error occurred";
545
- event.source?.postMessage(Response.error(message.id, errorMessage));
546
- }
547
- }
548
- async handleGetStatus(event) {
549
- const message = event.data;
550
- if (!Request.isGetStatus(message)) {
551
- console.error("Invalid GET_STATUS message format", message);
552
- event.source?.postMessage(Response.error(message.id, "Invalid GET_STATUS message format"));
553
- return;
554
- }
555
- const pubKey = this.handler
556
- ? await this.handler.identity.xOnlyPublicKey()
557
- : undefined;
558
- event.source?.postMessage(Response.walletStatus(message.id, this.handler !== undefined, pubKey));
559
- }
560
- async handleMessage(event) {
561
- this.messageCallback(event);
562
- const message = event.data;
563
- if (!Request.isBase(message)) {
564
- console.warn("Invalid message format", JSON.stringify(message));
565
- // ignore invalid messages
566
- return;
567
- }
568
- switch (message.type) {
569
- case "INIT_WALLET": {
570
- await this.handleInitWallet(event);
571
- break;
572
- }
573
- case "SETTLE": {
574
- await this.handleSettle(event);
575
- break;
576
- }
577
- case "SEND_BITCOIN": {
578
- await this.handleSendBitcoin(event);
579
- break;
580
- }
581
- case "GET_ADDRESS": {
582
- await this.handleGetAddress(event);
583
- break;
584
- }
585
- case "GET_BOARDING_ADDRESS": {
586
- await this.handleGetBoardingAddress(event);
587
- break;
588
- }
589
- case "GET_BALANCE": {
590
- await this.handleGetBalance(event);
591
- break;
592
- }
593
- case "GET_VTXOS": {
594
- await this.handleGetVtxos(event);
595
- break;
596
- }
597
- case "GET_BOARDING_UTXOS": {
598
- await this.handleGetBoardingUtxos(event);
599
- break;
600
- }
601
- case "GET_TRANSACTION_HISTORY": {
602
- await this.handleGetTransactionHistory(event);
603
- break;
604
- }
605
- case "GET_STATUS": {
606
- await this.handleGetStatus(event);
607
- break;
608
- }
609
- case "CLEAR": {
610
- await this.handleClear(event);
611
- break;
612
- }
613
- case "RELOAD_WALLET": {
614
- await this.handleReloadWallet(event);
615
- break;
616
- }
617
- default:
618
- event.source?.postMessage(Response.error(message.id, "Unknown message type"));
619
- }
620
- }
621
- async sendMessageToAllClients(message) {
622
- self.clients
623
- .matchAll({ includeUncontrolled: true, type: "window" })
624
- .then((clients) => {
625
- clients.forEach((client) => {
626
- client.postMessage(message);
627
- });
628
- });
629
- }
630
- async handleReloadWallet(event) {
631
- const message = event.data;
632
- if (!Request.isReloadWallet(message)) {
633
- console.error("Invalid RELOAD_WALLET message format", message);
634
- event.source?.postMessage(Response.error(message.id, "Invalid RELOAD_WALLET message format"));
635
- return;
636
- }
637
- if (!this.handler) {
638
- console.error("Wallet not initialized");
639
- event.source?.postMessage(Response.walletReloaded(message.id, false));
640
- return;
641
- }
642
- try {
643
- await this.onWalletInitialized();
644
- event.source?.postMessage(Response.walletReloaded(message.id, true));
645
- }
646
- catch (error) {
647
- console.error("Error reloading wallet:", error);
648
- event.source?.postMessage(Response.walletReloaded(message.id, false));
649
- }
650
- }
651
- }