@arkade-os/sdk 0.3.13 → 0.4.0-next.1

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 (270) hide show
  1. package/README.md +586 -54
  2. package/dist/cjs/asset/assetGroup.js +141 -0
  3. package/dist/cjs/asset/assetId.js +88 -0
  4. package/dist/cjs/asset/assetInput.js +204 -0
  5. package/dist/cjs/asset/assetOutput.js +159 -0
  6. package/dist/cjs/asset/assetRef.js +82 -0
  7. package/dist/cjs/asset/index.js +24 -0
  8. package/dist/cjs/asset/metadata.js +172 -0
  9. package/dist/cjs/asset/packet.js +164 -0
  10. package/dist/cjs/asset/types.js +25 -0
  11. package/dist/cjs/asset/utils.js +105 -0
  12. package/dist/cjs/bip322/index.js +270 -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/forfeit.js +12 -8
  25. package/dist/cjs/identity/index.js +1 -0
  26. package/dist/cjs/identity/seedIdentity.js +255 -0
  27. package/dist/cjs/index.js +72 -14
  28. package/dist/cjs/intent/index.js +47 -11
  29. package/dist/cjs/providers/ark.js +7 -0
  30. package/dist/cjs/providers/delegator.js +66 -0
  31. package/dist/cjs/providers/expoIndexer.js +5 -0
  32. package/dist/cjs/providers/indexer.js +68 -1
  33. package/dist/cjs/providers/utils.js +1 -0
  34. package/dist/cjs/repositories/contractRepository.js +0 -103
  35. package/dist/cjs/repositories/inMemory/contractRepository.js +55 -0
  36. package/dist/cjs/repositories/inMemory/walletRepository.js +80 -0
  37. package/dist/cjs/repositories/index.js +16 -0
  38. package/dist/cjs/repositories/indexedDB/contractRepository.js +187 -0
  39. package/dist/cjs/repositories/indexedDB/db.js +19 -0
  40. package/dist/cjs/repositories/indexedDB/manager.js +97 -0
  41. package/dist/cjs/repositories/indexedDB/schema.js +159 -0
  42. package/dist/cjs/repositories/indexedDB/walletRepository.js +338 -0
  43. package/dist/cjs/repositories/indexedDB/websqlAdapter.js +144 -0
  44. package/dist/cjs/repositories/migrations/contractRepositoryImpl.js +127 -0
  45. package/dist/cjs/repositories/migrations/fromStorageAdapter.js +66 -0
  46. package/dist/cjs/repositories/migrations/walletRepositoryImpl.js +180 -0
  47. package/dist/cjs/repositories/realm/contractRepository.js +120 -0
  48. package/dist/cjs/repositories/realm/index.js +9 -0
  49. package/dist/cjs/repositories/realm/schemas.js +108 -0
  50. package/dist/cjs/repositories/realm/types.js +7 -0
  51. package/dist/cjs/repositories/realm/walletRepository.js +273 -0
  52. package/dist/cjs/repositories/serialization.js +49 -0
  53. package/dist/cjs/repositories/sqlite/contractRepository.js +139 -0
  54. package/dist/cjs/repositories/sqlite/index.js +7 -0
  55. package/dist/cjs/repositories/sqlite/types.js +2 -0
  56. package/dist/cjs/repositories/sqlite/walletRepository.js +328 -0
  57. package/dist/cjs/repositories/walletRepository.js +0 -169
  58. package/dist/cjs/script/base.js +54 -0
  59. package/dist/cjs/script/delegate.js +49 -0
  60. package/dist/cjs/storage/asyncStorage.js +4 -1
  61. package/dist/cjs/storage/fileSystem.js +3 -0
  62. package/dist/cjs/storage/inMemory.js +3 -0
  63. package/dist/cjs/storage/indexedDB.js +5 -1
  64. package/dist/cjs/storage/localStorage.js +3 -0
  65. package/dist/cjs/utils/arkTransaction.js +16 -0
  66. package/dist/cjs/utils/transactionHistory.js +50 -0
  67. package/dist/cjs/wallet/asset-manager.js +338 -0
  68. package/dist/cjs/wallet/asset.js +117 -0
  69. package/dist/cjs/wallet/batch.js +1 -1
  70. package/dist/cjs/wallet/delegator.js +235 -0
  71. package/dist/cjs/wallet/expo/background.js +133 -0
  72. package/dist/cjs/wallet/expo/index.js +9 -0
  73. package/dist/cjs/wallet/expo/wallet.js +231 -0
  74. package/dist/cjs/wallet/serviceWorker/wallet-message-handler.js +568 -0
  75. package/dist/cjs/wallet/serviceWorker/wallet.js +383 -102
  76. package/dist/cjs/wallet/utils.js +58 -0
  77. package/dist/cjs/wallet/validation.js +151 -0
  78. package/dist/cjs/wallet/vtxo-manager.js +8 -1
  79. package/dist/cjs/wallet/wallet.js +702 -260
  80. package/dist/cjs/worker/browser/service-worker-manager.js +82 -0
  81. package/dist/cjs/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  82. package/dist/cjs/worker/expo/asyncStorageTaskQueue.js +78 -0
  83. package/dist/cjs/worker/expo/index.js +12 -0
  84. package/dist/cjs/worker/expo/processors/contractPollProcessor.js +61 -0
  85. package/dist/cjs/worker/expo/processors/index.js +6 -0
  86. package/dist/cjs/worker/expo/taskQueue.js +41 -0
  87. package/dist/cjs/worker/expo/taskRunner.js +57 -0
  88. package/dist/cjs/worker/messageBus.js +252 -0
  89. package/dist/esm/asset/assetGroup.js +137 -0
  90. package/dist/esm/asset/assetId.js +84 -0
  91. package/dist/esm/asset/assetInput.js +199 -0
  92. package/dist/esm/asset/assetOutput.js +154 -0
  93. package/dist/esm/asset/assetRef.js +78 -0
  94. package/dist/esm/asset/index.js +8 -0
  95. package/dist/esm/asset/metadata.js +167 -0
  96. package/dist/esm/asset/packet.js +159 -0
  97. package/dist/esm/asset/types.js +22 -0
  98. package/dist/esm/asset/utils.js +99 -0
  99. package/dist/esm/bip322/index.js +267 -0
  100. package/dist/esm/contracts/arkcontract.js +141 -0
  101. package/dist/esm/contracts/contractManager.js +432 -0
  102. package/dist/esm/contracts/contractWatcher.js +563 -0
  103. package/dist/esm/contracts/handlers/default.js +82 -0
  104. package/dist/esm/contracts/handlers/delegate.js +86 -0
  105. package/dist/esm/contracts/handlers/helpers.js +66 -0
  106. package/dist/esm/contracts/handlers/index.js +12 -0
  107. package/dist/esm/contracts/handlers/registry.js +86 -0
  108. package/dist/esm/contracts/handlers/vhtlc.js +190 -0
  109. package/dist/esm/contracts/index.js +13 -0
  110. package/dist/esm/contracts/types.js +1 -0
  111. package/dist/esm/forfeit.js +11 -8
  112. package/dist/esm/identity/index.js +1 -0
  113. package/dist/esm/identity/seedIdentity.js +249 -0
  114. package/dist/esm/index.js +28 -15
  115. package/dist/esm/intent/index.js +44 -9
  116. package/dist/esm/providers/ark.js +7 -0
  117. package/dist/esm/providers/delegator.js +62 -0
  118. package/dist/esm/providers/expoIndexer.js +5 -0
  119. package/dist/esm/providers/indexer.js +68 -1
  120. package/dist/esm/providers/utils.js +1 -0
  121. package/dist/esm/repositories/contractRepository.js +1 -101
  122. package/dist/esm/repositories/inMemory/contractRepository.js +51 -0
  123. package/dist/esm/repositories/inMemory/walletRepository.js +76 -0
  124. package/dist/esm/repositories/index.js +8 -0
  125. package/dist/esm/repositories/indexedDB/contractRepository.js +183 -0
  126. package/dist/esm/repositories/indexedDB/db.js +4 -0
  127. package/dist/esm/repositories/indexedDB/manager.js +92 -0
  128. package/dist/esm/repositories/indexedDB/schema.js +155 -0
  129. package/dist/esm/repositories/indexedDB/walletRepository.js +334 -0
  130. package/dist/esm/repositories/indexedDB/websqlAdapter.js +138 -0
  131. package/dist/esm/repositories/migrations/contractRepositoryImpl.js +121 -0
  132. package/dist/esm/repositories/migrations/fromStorageAdapter.js +58 -0
  133. package/dist/esm/repositories/migrations/walletRepositoryImpl.js +176 -0
  134. package/dist/esm/repositories/realm/contractRepository.js +116 -0
  135. package/dist/esm/repositories/realm/index.js +3 -0
  136. package/dist/esm/repositories/realm/schemas.js +105 -0
  137. package/dist/esm/repositories/realm/types.js +6 -0
  138. package/dist/esm/repositories/realm/walletRepository.js +269 -0
  139. package/dist/esm/repositories/serialization.js +40 -0
  140. package/dist/esm/repositories/sqlite/contractRepository.js +135 -0
  141. package/dist/esm/repositories/sqlite/index.js +2 -0
  142. package/dist/esm/repositories/sqlite/types.js +1 -0
  143. package/dist/esm/repositories/sqlite/walletRepository.js +324 -0
  144. package/dist/esm/repositories/walletRepository.js +1 -167
  145. package/dist/esm/script/base.js +21 -1
  146. package/dist/esm/script/delegate.js +46 -0
  147. package/dist/esm/storage/asyncStorage.js +4 -1
  148. package/dist/esm/storage/fileSystem.js +3 -0
  149. package/dist/esm/storage/inMemory.js +3 -0
  150. package/dist/esm/storage/indexedDB.js +5 -1
  151. package/dist/esm/storage/localStorage.js +3 -0
  152. package/dist/esm/utils/arkTransaction.js +15 -0
  153. package/dist/esm/utils/transactionHistory.js +50 -0
  154. package/dist/esm/wallet/asset-manager.js +333 -0
  155. package/dist/esm/wallet/asset.js +111 -0
  156. package/dist/esm/wallet/batch.js +1 -1
  157. package/dist/esm/wallet/delegator.js +231 -0
  158. package/dist/esm/wallet/expo/background.js +128 -0
  159. package/dist/esm/wallet/expo/index.js +2 -0
  160. package/dist/esm/wallet/expo/wallet.js +194 -0
  161. package/dist/esm/wallet/serviceWorker/wallet-message-handler.js +564 -0
  162. package/dist/esm/wallet/serviceWorker/wallet.js +382 -101
  163. package/dist/esm/wallet/utils.js +54 -0
  164. package/dist/esm/wallet/validation.js +139 -0
  165. package/dist/esm/wallet/vtxo-manager.js +8 -1
  166. package/dist/esm/wallet/wallet.js +704 -229
  167. package/dist/esm/worker/browser/service-worker-manager.js +76 -0
  168. package/dist/esm/{wallet/serviceWorker → worker/browser}/utils.js +2 -1
  169. package/dist/esm/worker/expo/asyncStorageTaskQueue.js +74 -0
  170. package/dist/esm/worker/expo/index.js +4 -0
  171. package/dist/esm/worker/expo/processors/contractPollProcessor.js +58 -0
  172. package/dist/esm/worker/expo/processors/index.js +1 -0
  173. package/dist/esm/worker/expo/taskQueue.js +37 -0
  174. package/dist/esm/worker/expo/taskRunner.js +54 -0
  175. package/dist/esm/worker/messageBus.js +248 -0
  176. package/dist/types/asset/assetGroup.d.ts +28 -0
  177. package/dist/types/asset/assetId.d.ts +19 -0
  178. package/dist/types/asset/assetInput.d.ts +46 -0
  179. package/dist/types/asset/assetOutput.d.ts +39 -0
  180. package/dist/types/asset/assetRef.d.ts +25 -0
  181. package/dist/types/asset/index.d.ts +8 -0
  182. package/dist/types/asset/metadata.d.ts +37 -0
  183. package/dist/types/asset/packet.d.ts +27 -0
  184. package/dist/types/asset/types.d.ts +18 -0
  185. package/dist/types/asset/utils.d.ts +21 -0
  186. package/dist/types/bip322/index.d.ts +55 -0
  187. package/dist/types/contracts/arkcontract.d.ts +101 -0
  188. package/dist/types/contracts/contractManager.d.ts +331 -0
  189. package/dist/types/contracts/contractWatcher.d.ts +192 -0
  190. package/dist/types/contracts/handlers/default.d.ts +19 -0
  191. package/dist/types/contracts/handlers/delegate.d.ts +21 -0
  192. package/dist/types/contracts/handlers/helpers.d.ts +18 -0
  193. package/dist/types/contracts/handlers/index.d.ts +7 -0
  194. package/dist/types/contracts/handlers/registry.d.ts +65 -0
  195. package/dist/types/contracts/handlers/vhtlc.d.ts +32 -0
  196. package/dist/types/contracts/index.d.ts +14 -0
  197. package/dist/types/contracts/types.d.ts +222 -0
  198. package/dist/types/forfeit.d.ts +2 -1
  199. package/dist/types/identity/index.d.ts +1 -0
  200. package/dist/types/identity/seedIdentity.d.ts +128 -0
  201. package/dist/types/index.d.ts +22 -12
  202. package/dist/types/intent/index.d.ts +15 -1
  203. package/dist/types/providers/ark.d.ts +11 -2
  204. package/dist/types/providers/delegator.d.ts +29 -0
  205. package/dist/types/providers/indexer.d.ts +11 -1
  206. package/dist/types/repositories/contractRepository.d.ts +30 -19
  207. package/dist/types/repositories/inMemory/contractRepository.d.ts +17 -0
  208. package/dist/types/repositories/inMemory/walletRepository.d.ts +26 -0
  209. package/dist/types/repositories/index.d.ts +7 -0
  210. package/dist/types/repositories/indexedDB/contractRepository.d.ts +21 -0
  211. package/dist/types/repositories/indexedDB/db.d.ts +4 -0
  212. package/dist/types/repositories/indexedDB/manager.d.ts +22 -0
  213. package/dist/types/repositories/indexedDB/schema.d.ts +8 -0
  214. package/dist/types/repositories/indexedDB/walletRepository.d.ts +25 -0
  215. package/dist/types/repositories/indexedDB/websqlAdapter.d.ts +49 -0
  216. package/dist/types/repositories/migrations/contractRepositoryImpl.d.ts +24 -0
  217. package/dist/types/repositories/migrations/fromStorageAdapter.d.ts +19 -0
  218. package/dist/types/repositories/migrations/walletRepositoryImpl.d.ts +27 -0
  219. package/dist/types/repositories/realm/contractRepository.d.ts +24 -0
  220. package/dist/types/repositories/realm/index.d.ts +4 -0
  221. package/dist/types/repositories/realm/schemas.d.ts +208 -0
  222. package/dist/types/repositories/realm/types.d.ts +16 -0
  223. package/dist/types/repositories/realm/walletRepository.d.ts +31 -0
  224. package/dist/types/repositories/serialization.d.ts +40 -0
  225. package/dist/types/repositories/sqlite/contractRepository.d.ts +33 -0
  226. package/dist/types/repositories/sqlite/index.d.ts +3 -0
  227. package/dist/types/repositories/sqlite/types.d.ts +18 -0
  228. package/dist/types/repositories/sqlite/walletRepository.d.ts +40 -0
  229. package/dist/types/repositories/walletRepository.d.ts +13 -24
  230. package/dist/types/script/base.d.ts +1 -0
  231. package/dist/types/script/delegate.d.ts +36 -0
  232. package/dist/types/storage/asyncStorage.d.ts +4 -0
  233. package/dist/types/storage/fileSystem.d.ts +3 -0
  234. package/dist/types/storage/inMemory.d.ts +3 -0
  235. package/dist/types/storage/index.d.ts +3 -0
  236. package/dist/types/storage/indexedDB.d.ts +3 -0
  237. package/dist/types/storage/localStorage.d.ts +3 -0
  238. package/dist/types/utils/arkTransaction.d.ts +6 -0
  239. package/dist/types/wallet/asset-manager.d.ts +78 -0
  240. package/dist/types/wallet/asset.d.ts +21 -0
  241. package/dist/types/wallet/batch.d.ts +1 -1
  242. package/dist/types/wallet/delegator.d.ts +24 -0
  243. package/dist/types/wallet/expo/background.d.ts +66 -0
  244. package/dist/types/wallet/expo/index.d.ts +4 -0
  245. package/dist/types/wallet/expo/wallet.d.ts +97 -0
  246. package/dist/types/wallet/index.d.ts +75 -2
  247. package/dist/types/wallet/serviceWorker/wallet-message-handler.d.ts +366 -0
  248. package/dist/types/wallet/serviceWorker/wallet.d.ts +20 -11
  249. package/dist/types/wallet/utils.d.ts +12 -1
  250. package/dist/types/wallet/validation.d.ts +24 -0
  251. package/dist/types/wallet/wallet.d.ts +111 -17
  252. package/dist/types/worker/browser/service-worker-manager.d.ts +21 -0
  253. package/dist/types/{wallet/serviceWorker → worker/browser}/utils.d.ts +2 -1
  254. package/dist/types/worker/expo/asyncStorageTaskQueue.d.ts +46 -0
  255. package/dist/types/worker/expo/index.d.ts +7 -0
  256. package/dist/types/worker/expo/processors/contractPollProcessor.d.ts +14 -0
  257. package/dist/types/worker/expo/processors/index.d.ts +1 -0
  258. package/dist/types/worker/expo/taskQueue.d.ts +50 -0
  259. package/dist/types/worker/expo/taskRunner.d.ts +42 -0
  260. package/dist/types/worker/messageBus.d.ts +109 -0
  261. package/package.json +69 -11
  262. package/dist/cjs/wallet/serviceWorker/request.js +0 -78
  263. package/dist/cjs/wallet/serviceWorker/response.js +0 -222
  264. package/dist/cjs/wallet/serviceWorker/worker.js +0 -655
  265. package/dist/esm/wallet/serviceWorker/request.js +0 -75
  266. package/dist/esm/wallet/serviceWorker/response.js +0 -219
  267. package/dist/esm/wallet/serviceWorker/worker.js +0 -651
  268. package/dist/types/wallet/serviceWorker/request.d.ts +0 -74
  269. package/dist/types/wallet/serviceWorker/response.d.ts +0 -123
  270. package/dist/types/wallet/serviceWorker/worker.d.ts +0 -53
@@ -0,0 +1,568 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WalletMessageHandler = exports.DEFAULT_MESSAGE_TAG = void 0;
4
+ const indexer_1 = require("../../providers/indexer");
5
+ const index_1 = require("../index");
6
+ const utils_1 = require("../utils");
7
+ exports.DEFAULT_MESSAGE_TAG = "WALLET_UPDATER";
8
+ class WalletMessageHandler {
9
+ /**
10
+ * Instantiate a new WalletUpdater.
11
+ * Can override the default `messageTag` allowing more than one updater to run in parallel.
12
+ * Note that the default ServiceWorkerWallet sends messages to the default WalletUpdater tag.
13
+ */
14
+ constructor(options) {
15
+ this.onNextTick = [];
16
+ this.messageTag = options?.messageTag ?? exports.DEFAULT_MESSAGE_TAG;
17
+ }
18
+ // lifecycle methods
19
+ async start(...params) {
20
+ const [services, repositories] = params;
21
+ this.readonlyWallet = services.readonlyWallet;
22
+ this.wallet = services.wallet;
23
+ this.arkProvider = services.arkProvider;
24
+ this.walletRepository = repositories.walletRepository;
25
+ }
26
+ async stop() {
27
+ // optional cleanup and persistence
28
+ }
29
+ async tick(_now) {
30
+ const results = await Promise.allSettled(this.onNextTick.map((fn) => fn()));
31
+ this.onNextTick = [];
32
+ return results
33
+ .map((result) => {
34
+ if (result.status === "fulfilled") {
35
+ return result.value;
36
+ }
37
+ else {
38
+ console.error(`[${this.messageTag}] tick failed`, result.reason);
39
+ // TODO: how to deliver errors down the stream? a broadcast?
40
+ return null;
41
+ }
42
+ })
43
+ .filter((response) => response !== null);
44
+ }
45
+ scheduleForNextTick(callback) {
46
+ this.onNextTick.push(callback);
47
+ }
48
+ requireWallet() {
49
+ if (!this.wallet) {
50
+ throw new Error("Read-only wallet: operation requires signing");
51
+ }
52
+ return this.wallet;
53
+ }
54
+ tagged(res) {
55
+ return {
56
+ ...res,
57
+ tag: this.messageTag,
58
+ };
59
+ }
60
+ async handleMessage(message) {
61
+ const id = message.id;
62
+ if (message.type === "INIT_WALLET") {
63
+ await this.handleInitWallet(message);
64
+ return this.tagged({
65
+ id,
66
+ type: "WALLET_INITIALIZED",
67
+ });
68
+ }
69
+ if (!this.readonlyWallet) {
70
+ return this.tagged({
71
+ id,
72
+ error: new Error("Wallet handler not initialized"),
73
+ });
74
+ }
75
+ try {
76
+ switch (message.type) {
77
+ case "SETTLE": {
78
+ const response = await this.handleSettle(message);
79
+ return this.tagged({
80
+ id,
81
+ ...response,
82
+ });
83
+ }
84
+ case "SEND_BITCOIN": {
85
+ const response = await this.handleSendBitcoin(message);
86
+ return this.tagged({
87
+ id,
88
+ ...response,
89
+ });
90
+ }
91
+ case "GET_ADDRESS": {
92
+ const address = await this.readonlyWallet.getAddress();
93
+ return this.tagged({
94
+ id,
95
+ type: "ADDRESS",
96
+ payload: { address },
97
+ });
98
+ }
99
+ case "GET_BOARDING_ADDRESS": {
100
+ const address = await this.readonlyWallet.getBoardingAddress();
101
+ return this.tagged({
102
+ id,
103
+ type: "BOARDING_ADDRESS",
104
+ payload: { address },
105
+ });
106
+ }
107
+ case "GET_BALANCE": {
108
+ const balance = await this.handleGetBalance();
109
+ return this.tagged({
110
+ id,
111
+ type: "BALANCE",
112
+ payload: balance,
113
+ });
114
+ }
115
+ case "GET_VTXOS": {
116
+ const vtxos = await this.handleGetVtxos(message);
117
+ return {
118
+ tag: this.messageTag,
119
+ id,
120
+ type: "VTXOS",
121
+ payload: { vtxos },
122
+ };
123
+ }
124
+ case "GET_BOARDING_UTXOS": {
125
+ const utxos = await this.getAllBoardingUtxos();
126
+ return this.tagged({
127
+ id,
128
+ type: "BOARDING_UTXOS",
129
+ payload: { utxos },
130
+ });
131
+ }
132
+ case "GET_TRANSACTION_HISTORY": {
133
+ const transactions = await this.readonlyWallet.getTransactionHistory();
134
+ return this.tagged({
135
+ id,
136
+ type: "TRANSACTION_HISTORY",
137
+ payload: { transactions },
138
+ });
139
+ }
140
+ case "GET_STATUS": {
141
+ const pubKey = await this.readonlyWallet.identity.xOnlyPublicKey();
142
+ return this.tagged({
143
+ id,
144
+ type: "WALLET_STATUS",
145
+ payload: {
146
+ walletInitialized: true,
147
+ xOnlyPublicKey: pubKey,
148
+ },
149
+ });
150
+ }
151
+ case "CLEAR": {
152
+ await this.clear();
153
+ return this.tagged({
154
+ id,
155
+ type: "CLEAR_SUCCESS",
156
+ payload: { cleared: true },
157
+ });
158
+ }
159
+ case "RELOAD_WALLET": {
160
+ await this.onWalletInitialized();
161
+ return this.tagged({
162
+ id,
163
+ type: "RELOAD_SUCCESS",
164
+ payload: { reloaded: true },
165
+ });
166
+ }
167
+ case "SIGN_TRANSACTION": {
168
+ const response = await this.handleSignTransaction(message);
169
+ return this.tagged({
170
+ id,
171
+ ...response,
172
+ });
173
+ }
174
+ case "CREATE_CONTRACT": {
175
+ const manager = await this.readonlyWallet.getContractManager();
176
+ const contract = await manager.createContract(message.payload);
177
+ return this.tagged({
178
+ id,
179
+ type: "CONTRACT_CREATED",
180
+ payload: { contract },
181
+ });
182
+ }
183
+ case "GET_CONTRACTS": {
184
+ const manager = await this.readonlyWallet.getContractManager();
185
+ const contracts = await manager.getContracts(message.payload.filter);
186
+ return this.tagged({
187
+ id,
188
+ type: "CONTRACTS",
189
+ payload: { contracts },
190
+ });
191
+ }
192
+ case "GET_CONTRACTS_WITH_VTXOS": {
193
+ const manager = await this.readonlyWallet.getContractManager();
194
+ const contracts = await manager.getContractsWithVtxos(message.payload.filter);
195
+ return this.tagged({
196
+ id,
197
+ type: "CONTRACTS_WITH_VTXOS",
198
+ payload: { contracts },
199
+ });
200
+ }
201
+ case "UPDATE_CONTRACT": {
202
+ const manager = await this.readonlyWallet.getContractManager();
203
+ const contract = await manager.updateContract(message.payload.script, message.payload.updates);
204
+ return this.tagged({
205
+ id,
206
+ type: "CONTRACT_UPDATED",
207
+ payload: { contract },
208
+ });
209
+ }
210
+ case "DELETE_CONTRACT": {
211
+ const manager = await this.readonlyWallet.getContractManager();
212
+ await manager.deleteContract(message.payload.script);
213
+ return this.tagged({
214
+ id,
215
+ type: "CONTRACT_DELETED",
216
+ payload: { deleted: true },
217
+ });
218
+ }
219
+ case "GET_SPENDABLE_PATHS": {
220
+ const manager = await this.readonlyWallet.getContractManager();
221
+ const paths = await manager.getSpendablePaths(message.payload.options);
222
+ return this.tagged({
223
+ id,
224
+ type: "SPENDABLE_PATHS",
225
+ payload: { paths },
226
+ });
227
+ }
228
+ case "GET_ALL_SPENDING_PATHS": {
229
+ const manager = await this.readonlyWallet.getContractManager();
230
+ const paths = await manager.getAllSpendingPaths(message.payload.options);
231
+ return this.tagged({
232
+ id,
233
+ type: "ALL_SPENDING_PATHS",
234
+ payload: { paths },
235
+ });
236
+ }
237
+ case "IS_CONTRACT_MANAGER_WATCHING": {
238
+ const manager = await this.readonlyWallet.getContractManager();
239
+ const isWatching = await manager.isWatching();
240
+ return this.tagged({
241
+ id,
242
+ type: "CONTRACT_WATCHING",
243
+ payload: { isWatching },
244
+ });
245
+ }
246
+ case "SEND": {
247
+ const { recipients } = message.payload;
248
+ const txid = await this.wallet.send(...recipients);
249
+ return this.tagged({
250
+ id,
251
+ type: "SEND_SUCCESS",
252
+ payload: { txid },
253
+ });
254
+ }
255
+ case "GET_ASSET_DETAILS": {
256
+ const { assetId } = message
257
+ .payload;
258
+ const assetDetails = await this.readonlyWallet.assetManager.getAssetDetails(assetId);
259
+ return this.tagged({
260
+ id,
261
+ type: "ASSET_DETAILS",
262
+ payload: { assetDetails },
263
+ });
264
+ }
265
+ case "ISSUE": {
266
+ const { params } = message.payload;
267
+ const result = await this.wallet.assetManager.issue(params);
268
+ return this.tagged({
269
+ id,
270
+ type: "ISSUE_SUCCESS",
271
+ payload: { result },
272
+ });
273
+ }
274
+ case "REISSUE": {
275
+ const { params } = message.payload;
276
+ const txid = await this.wallet.assetManager.reissue(params);
277
+ return this.tagged({
278
+ id,
279
+ type: "REISSUE_SUCCESS",
280
+ payload: { txid },
281
+ });
282
+ }
283
+ case "BURN": {
284
+ const { params } = message.payload;
285
+ const txid = await this.wallet.assetManager.burn(params);
286
+ return this.tagged({
287
+ id,
288
+ type: "BURN_SUCCESS",
289
+ payload: { txid },
290
+ });
291
+ }
292
+ default:
293
+ console.error("Unknown message type", message);
294
+ throw new Error("Unknown message");
295
+ }
296
+ }
297
+ catch (error) {
298
+ return this.tagged({ id, error: error });
299
+ }
300
+ }
301
+ // Wallet methods
302
+ async handleInitWallet({ payload }) {
303
+ const { arkServerUrl } = payload;
304
+ this.indexerProvider = new indexer_1.RestIndexerProvider(arkServerUrl);
305
+ await this.onWalletInitialized();
306
+ }
307
+ async handleGetBalance() {
308
+ const [boardingUtxos, spendableVtxos, sweptVtxos] = await Promise.all([
309
+ this.getAllBoardingUtxos(),
310
+ this.getSpendableVtxos(),
311
+ this.getSweptVtxos(),
312
+ ]);
313
+ // boarding
314
+ let confirmed = 0;
315
+ let unconfirmed = 0;
316
+ for (const utxo of boardingUtxos) {
317
+ if (utxo.status.confirmed) {
318
+ confirmed += utxo.value;
319
+ }
320
+ else {
321
+ unconfirmed += utxo.value;
322
+ }
323
+ }
324
+ // offchain
325
+ let settled = 0;
326
+ let preconfirmed = 0;
327
+ let recoverable = 0;
328
+ for (const vtxo of spendableVtxos) {
329
+ if (vtxo.virtualStatus.state === "settled") {
330
+ settled += vtxo.value;
331
+ }
332
+ else if (vtxo.virtualStatus.state === "preconfirmed") {
333
+ preconfirmed += vtxo.value;
334
+ }
335
+ }
336
+ for (const vtxo of sweptVtxos) {
337
+ if ((0, index_1.isSpendable)(vtxo)) {
338
+ recoverable += vtxo.value;
339
+ }
340
+ }
341
+ const totalBoarding = confirmed + unconfirmed;
342
+ const totalOffchain = settled + preconfirmed + recoverable;
343
+ // aggregate asset balances from spendable vtxos
344
+ const assetBalances = new Map();
345
+ for (const vtxo of spendableVtxos) {
346
+ if (vtxo.assets) {
347
+ for (const a of vtxo.assets) {
348
+ const current = assetBalances.get(a.assetId) ?? 0;
349
+ assetBalances.set(a.assetId, current + a.amount);
350
+ }
351
+ }
352
+ }
353
+ const assets = Array.from(assetBalances.entries()).map(([assetId, amount]) => ({ assetId, amount }));
354
+ return {
355
+ boarding: {
356
+ confirmed,
357
+ unconfirmed,
358
+ total: totalBoarding,
359
+ },
360
+ settled,
361
+ preconfirmed,
362
+ available: settled + preconfirmed,
363
+ recoverable,
364
+ total: totalBoarding + totalOffchain,
365
+ assets,
366
+ };
367
+ }
368
+ async getAllBoardingUtxos() {
369
+ if (!this.readonlyWallet)
370
+ return [];
371
+ return this.readonlyWallet.getBoardingUtxos();
372
+ }
373
+ /**
374
+ * Get spendable vtxos for the current wallet address
375
+ */
376
+ async getSpendableVtxos() {
377
+ if (!this.readonlyWallet)
378
+ return [];
379
+ const vtxos = await this.readonlyWallet.getVtxos();
380
+ return vtxos.filter(index_1.isSpendable);
381
+ }
382
+ /**
383
+ * Get swept vtxos for the current wallet address
384
+ */
385
+ async getSweptVtxos() {
386
+ if (!this.readonlyWallet)
387
+ return [];
388
+ const vtxos = await this.readonlyWallet.getVtxos();
389
+ return vtxos.filter((vtxo) => vtxo.virtualStatus.state === "swept");
390
+ }
391
+ async onWalletInitialized() {
392
+ if (!this.readonlyWallet ||
393
+ !this.arkProvider ||
394
+ !this.indexerProvider ||
395
+ !this.walletRepository) {
396
+ return;
397
+ }
398
+ // Get all wallet scripts (current + historical delegate/non-delegate)
399
+ const scripts = await this.readonlyWallet.getWalletScripts();
400
+ const response = await this.indexerProvider.getVtxos({ scripts });
401
+ const vtxos = response.vtxos.map((vtxo) => (0, utils_1.extendVirtualCoin)(this.readonlyWallet, vtxo));
402
+ if (this.wallet) {
403
+ try {
404
+ // recover pending transactions if possible
405
+ const { pending, finalized } = await this.wallet.finalizePendingTxs(vtxos.filter((vtxo) => vtxo.virtualStatus.state !== "swept" &&
406
+ vtxo.virtualStatus.state !== "settled"));
407
+ console.info(`Recovered ${finalized.length}/${pending.length} pending transactions: ${finalized.join(", ")}`);
408
+ }
409
+ catch (error) {
410
+ console.error("Error recovering pending transactions:", error);
411
+ }
412
+ }
413
+ // Get wallet address and save vtxos using unified repository
414
+ const address = await this.readonlyWallet.getAddress();
415
+ await this.walletRepository.saveVtxos(address, vtxos);
416
+ // Fetch boarding utxos and save using unified repository
417
+ const boardingAddress = await this.readonlyWallet.getBoardingAddress();
418
+ const coins = await this.readonlyWallet.onchainProvider.getCoins(boardingAddress);
419
+ await this.walletRepository.saveUtxos(boardingAddress, coins.map((utxo) => (0, utils_1.extendCoin)(this.readonlyWallet, utxo)));
420
+ // Get transaction history to cache boarding txs
421
+ const txs = await this.readonlyWallet.getTransactionHistory();
422
+ if (txs)
423
+ await this.walletRepository.saveTransactions(address, txs);
424
+ // unsubscribe previous subscription if any
425
+ if (this.incomingFundsSubscription)
426
+ this.incomingFundsSubscription();
427
+ // subscribe for incoming funds and notify all clients when new funds arrive
428
+ this.incomingFundsSubscription =
429
+ await this.readonlyWallet.notifyIncomingFunds(async (funds) => {
430
+ if (funds.type === "vtxo") {
431
+ const newVtxos = funds.newVtxos.length > 0
432
+ ? funds.newVtxos.map((vtxo) => (0, utils_1.extendVirtualCoin)(this.readonlyWallet, vtxo))
433
+ : [];
434
+ const spentVtxos = funds.spentVtxos.length > 0
435
+ ? funds.spentVtxos.map((vtxo) => (0, utils_1.extendVirtualCoin)(this.readonlyWallet, vtxo))
436
+ : [];
437
+ if ([...newVtxos, ...spentVtxos].length === 0)
438
+ return;
439
+ // save vtxos using unified repository
440
+ await this.walletRepository?.saveVtxos(address, [
441
+ ...newVtxos,
442
+ ...spentVtxos,
443
+ ]);
444
+ // notify all clients about the vtxo update
445
+ this.scheduleForNextTick(() => this.tagged({
446
+ type: "VTXO_UPDATE",
447
+ broadcast: true,
448
+ payload: { newVtxos, spentVtxos },
449
+ }));
450
+ }
451
+ if (funds.type === "utxo") {
452
+ const utxos = funds.coins.map((utxo) => (0, utils_1.extendCoin)(this.readonlyWallet, utxo));
453
+ const boardingAddress = await this.readonlyWallet.getBoardingAddress();
454
+ // save utxos using unified repository
455
+ // TODO: remove UTXOS by address
456
+ // await this.walletRepository.clearUtxos(boardingAddress);
457
+ await this.walletRepository?.saveUtxos(boardingAddress, utxos);
458
+ // notify all clients about the utxo update
459
+ this.scheduleForNextTick(() => this.tagged({
460
+ type: "UTXO_UPDATE",
461
+ broadcast: true,
462
+ payload: { coins: utxos },
463
+ }));
464
+ }
465
+ });
466
+ await this.ensureContractEventBroadcasting();
467
+ }
468
+ async handleSettle(message) {
469
+ const wallet = this.requireWallet();
470
+ const txid = await wallet.settle(message.payload.params, (e) => {
471
+ this.scheduleForNextTick(() => this.tagged({
472
+ id: message.id,
473
+ type: "SETTLE_EVENT",
474
+ payload: e,
475
+ }));
476
+ });
477
+ if (!txid) {
478
+ throw new Error("Settlement failed");
479
+ }
480
+ return { type: "SETTLE_SUCCESS", payload: { txid } };
481
+ }
482
+ async handleSendBitcoin(message) {
483
+ const wallet = this.requireWallet();
484
+ const txid = await wallet.sendBitcoin(message.payload);
485
+ if (!txid) {
486
+ throw new Error("Send bitcoin failed");
487
+ }
488
+ return {
489
+ type: "SEND_BITCOIN_SUCCESS",
490
+ payload: { txid },
491
+ };
492
+ }
493
+ async handleSignTransaction(message) {
494
+ const wallet = this.requireWallet();
495
+ const { tx, inputIndexes } = message.payload;
496
+ const signature = await wallet.identity.sign(tx, inputIndexes);
497
+ if (!signature) {
498
+ throw new Error("Sign transaction failed");
499
+ }
500
+ return {
501
+ type: "SIGN_TRANSACTION",
502
+ payload: { tx: signature },
503
+ };
504
+ }
505
+ async handleGetVtxos(message) {
506
+ if (!this.readonlyWallet) {
507
+ throw new Error("Wallet handler not initialized");
508
+ }
509
+ const vtxos = await this.getSpendableVtxos();
510
+ const dustAmount = this.readonlyWallet.dustAmount;
511
+ const includeRecoverable = message.payload.filter?.withRecoverable ?? false;
512
+ const filteredVtxos = includeRecoverable
513
+ ? vtxos
514
+ : vtxos.filter((v) => {
515
+ if (dustAmount != null && (0, index_1.isSubdust)(v, dustAmount)) {
516
+ return false;
517
+ }
518
+ if ((0, index_1.isRecoverable)(v)) {
519
+ return false;
520
+ }
521
+ if ((0, index_1.isExpired)(v)) {
522
+ return false;
523
+ }
524
+ return true;
525
+ });
526
+ return filteredVtxos;
527
+ }
528
+ async clear() {
529
+ if (!this.readonlyWallet)
530
+ return;
531
+ if (this.incomingFundsSubscription)
532
+ this.incomingFundsSubscription();
533
+ if (this.contractEventsSubscription) {
534
+ this.contractEventsSubscription();
535
+ this.contractEventsSubscription = undefined;
536
+ }
537
+ try {
538
+ await this.walletRepository?.clear();
539
+ }
540
+ catch (_) {
541
+ console.warn("Failed to clear vtxos from wallet repository");
542
+ }
543
+ this.wallet = undefined;
544
+ this.readonlyWallet = undefined;
545
+ this.arkProvider = undefined;
546
+ this.indexerProvider = undefined;
547
+ }
548
+ async ensureContractEventBroadcasting() {
549
+ if (!this.readonlyWallet)
550
+ return;
551
+ if (this.contractEventsSubscription)
552
+ return;
553
+ try {
554
+ const manager = await this.readonlyWallet.getContractManager();
555
+ this.contractEventsSubscription = manager.onContractEvent((event) => {
556
+ this.scheduleForNextTick(() => this.tagged({
557
+ type: "CONTRACT_EVENT",
558
+ broadcast: true,
559
+ payload: { event },
560
+ }));
561
+ });
562
+ }
563
+ catch (error) {
564
+ console.error("Error subscribing to contract events:", error);
565
+ }
566
+ }
567
+ }
568
+ exports.WalletMessageHandler = WalletMessageHandler;