@claw-network/node 0.2.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 (190) hide show
  1. package/README.md +49 -0
  2. package/dist/api/api-key-store.d.ts +74 -0
  3. package/dist/api/api-key-store.d.ts.map +1 -0
  4. package/dist/api/api-key-store.js +170 -0
  5. package/dist/api/api-key-store.js.map +1 -0
  6. package/dist/api/auth.d.ts +30 -0
  7. package/dist/api/auth.d.ts.map +1 -0
  8. package/dist/api/auth.js +115 -0
  9. package/dist/api/auth.js.map +1 -0
  10. package/dist/api/legacy.d.ts +26 -0
  11. package/dist/api/legacy.d.ts.map +1 -0
  12. package/dist/api/legacy.js +281 -0
  13. package/dist/api/legacy.js.map +1 -0
  14. package/dist/api/middleware.d.ts +35 -0
  15. package/dist/api/middleware.d.ts.map +1 -0
  16. package/dist/api/middleware.js +75 -0
  17. package/dist/api/middleware.js.map +1 -0
  18. package/dist/api/response.d.ts +85 -0
  19. package/dist/api/response.d.ts.map +1 -0
  20. package/dist/api/response.js +185 -0
  21. package/dist/api/response.js.map +1 -0
  22. package/dist/api/router.d.ts +45 -0
  23. package/dist/api/router.d.ts.map +1 -0
  24. package/dist/api/router.js +183 -0
  25. package/dist/api/router.js.map +1 -0
  26. package/dist/api/routes/admin.d.ts +11 -0
  27. package/dist/api/routes/admin.d.ts.map +1 -0
  28. package/dist/api/routes/admin.js +124 -0
  29. package/dist/api/routes/admin.js.map +1 -0
  30. package/dist/api/routes/contracts.d.ts +7 -0
  31. package/dist/api/routes/contracts.d.ts.map +1 -0
  32. package/dist/api/routes/contracts.js +665 -0
  33. package/dist/api/routes/contracts.js.map +1 -0
  34. package/dist/api/routes/dao.d.ts +7 -0
  35. package/dist/api/routes/dao.d.ts.map +1 -0
  36. package/dist/api/routes/dao.js +549 -0
  37. package/dist/api/routes/dao.js.map +1 -0
  38. package/dist/api/routes/dev.d.ts +9 -0
  39. package/dist/api/routes/dev.d.ts.map +1 -0
  40. package/dist/api/routes/dev.js +273 -0
  41. package/dist/api/routes/dev.js.map +1 -0
  42. package/dist/api/routes/escrows.d.ts +7 -0
  43. package/dist/api/routes/escrows.d.ts.map +1 -0
  44. package/dist/api/routes/escrows.js +454 -0
  45. package/dist/api/routes/escrows.js.map +1 -0
  46. package/dist/api/routes/identities.d.ts +7 -0
  47. package/dist/api/routes/identities.d.ts.map +1 -0
  48. package/dist/api/routes/identities.js +245 -0
  49. package/dist/api/routes/identities.js.map +1 -0
  50. package/dist/api/routes/markets-capabilities.d.ts +7 -0
  51. package/dist/api/routes/markets-capabilities.d.ts.map +1 -0
  52. package/dist/api/routes/markets-capabilities.js +477 -0
  53. package/dist/api/routes/markets-capabilities.js.map +1 -0
  54. package/dist/api/routes/markets-disputes.d.ts +7 -0
  55. package/dist/api/routes/markets-disputes.d.ts.map +1 -0
  56. package/dist/api/routes/markets-disputes.js +102 -0
  57. package/dist/api/routes/markets-disputes.js.map +1 -0
  58. package/dist/api/routes/markets-info.d.ts +7 -0
  59. package/dist/api/routes/markets-info.d.ts.map +1 -0
  60. package/dist/api/routes/markets-info.js +523 -0
  61. package/dist/api/routes/markets-info.js.map +1 -0
  62. package/dist/api/routes/markets-search.d.ts +7 -0
  63. package/dist/api/routes/markets-search.d.ts.map +1 -0
  64. package/dist/api/routes/markets-search.js +38 -0
  65. package/dist/api/routes/markets-search.js.map +1 -0
  66. package/dist/api/routes/markets-tasks.d.ts +7 -0
  67. package/dist/api/routes/markets-tasks.d.ts.map +1 -0
  68. package/dist/api/routes/markets-tasks.js +539 -0
  69. package/dist/api/routes/markets-tasks.js.map +1 -0
  70. package/dist/api/routes/node.d.ts +7 -0
  71. package/dist/api/routes/node.d.ts.map +1 -0
  72. package/dist/api/routes/node.js +53 -0
  73. package/dist/api/routes/node.js.map +1 -0
  74. package/dist/api/routes/nonce.d.ts +10 -0
  75. package/dist/api/routes/nonce.d.ts.map +1 -0
  76. package/dist/api/routes/nonce.js +65 -0
  77. package/dist/api/routes/nonce.js.map +1 -0
  78. package/dist/api/routes/reputations.d.ts +7 -0
  79. package/dist/api/routes/reputations.d.ts.map +1 -0
  80. package/dist/api/routes/reputations.js +243 -0
  81. package/dist/api/routes/reputations.js.map +1 -0
  82. package/dist/api/routes/transfers.d.ts +7 -0
  83. package/dist/api/routes/transfers.d.ts.map +1 -0
  84. package/dist/api/routes/transfers.js +88 -0
  85. package/dist/api/routes/transfers.js.map +1 -0
  86. package/dist/api/routes/wallets.d.ts +7 -0
  87. package/dist/api/routes/wallets.d.ts.map +1 -0
  88. package/dist/api/routes/wallets.js +132 -0
  89. package/dist/api/routes/wallets.js.map +1 -0
  90. package/dist/api/schemas/common.d.ts +45 -0
  91. package/dist/api/schemas/common.d.ts.map +1 -0
  92. package/dist/api/schemas/common.js +30 -0
  93. package/dist/api/schemas/common.js.map +1 -0
  94. package/dist/api/schemas/contracts.d.ts +284 -0
  95. package/dist/api/schemas/contracts.d.ts.map +1 -0
  96. package/dist/api/schemas/contracts.js +79 -0
  97. package/dist/api/schemas/contracts.js.map +1 -0
  98. package/dist/api/schemas/dao.d.ts +271 -0
  99. package/dist/api/schemas/dao.d.ts.map +1 -0
  100. package/dist/api/schemas/dao.js +78 -0
  101. package/dist/api/schemas/dao.js.map +1 -0
  102. package/dist/api/schemas/identity.d.ts +75 -0
  103. package/dist/api/schemas/identity.d.ts.map +1 -0
  104. package/dist/api/schemas/identity.js +32 -0
  105. package/dist/api/schemas/identity.js.map +1 -0
  106. package/dist/api/schemas/markets.d.ts +822 -0
  107. package/dist/api/schemas/markets.d.ts.map +1 -0
  108. package/dist/api/schemas/markets.js +246 -0
  109. package/dist/api/schemas/markets.js.map +1 -0
  110. package/dist/api/schemas/wallet.d.ts +163 -0
  111. package/dist/api/schemas/wallet.d.ts.map +1 -0
  112. package/dist/api/schemas/wallet.js +54 -0
  113. package/dist/api/schemas/wallet.js.map +1 -0
  114. package/dist/api/server.d.ts +45 -0
  115. package/dist/api/server.d.ts.map +1 -0
  116. package/dist/api/server.js +131 -0
  117. package/dist/api/server.js.map +1 -0
  118. package/dist/api/types.d.ts +69 -0
  119. package/dist/api/types.d.ts.map +1 -0
  120. package/dist/api/types.js +196 -0
  121. package/dist/api/types.js.map +1 -0
  122. package/dist/daemon.d.ts +11 -0
  123. package/dist/daemon.d.ts.map +1 -0
  124. package/dist/daemon.js +248 -0
  125. package/dist/daemon.js.map +1 -0
  126. package/dist/index.d.ts +137 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +795 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/indexer/index.d.ts +10 -0
  131. package/dist/indexer/index.d.ts.map +1 -0
  132. package/dist/indexer/index.js +7 -0
  133. package/dist/indexer/index.js.map +1 -0
  134. package/dist/indexer/indexer.d.ts +60 -0
  135. package/dist/indexer/indexer.d.ts.map +1 -0
  136. package/dist/indexer/indexer.js +408 -0
  137. package/dist/indexer/indexer.js.map +1 -0
  138. package/dist/indexer/query.d.ts +141 -0
  139. package/dist/indexer/query.d.ts.map +1 -0
  140. package/dist/indexer/query.js +244 -0
  141. package/dist/indexer/query.js.map +1 -0
  142. package/dist/indexer/store.d.ts +95 -0
  143. package/dist/indexer/store.d.ts.map +1 -0
  144. package/dist/indexer/store.js +250 -0
  145. package/dist/indexer/store.js.map +1 -0
  146. package/dist/logger.d.ts +13 -0
  147. package/dist/logger.d.ts.map +1 -0
  148. package/dist/logger.js +37 -0
  149. package/dist/logger.js.map +1 -0
  150. package/dist/p2p/sync.d.ts +105 -0
  151. package/dist/p2p/sync.d.ts.map +1 -0
  152. package/dist/p2p/sync.js +875 -0
  153. package/dist/p2p/sync.js.map +1 -0
  154. package/dist/policy/liquidity-policy.d.ts +17 -0
  155. package/dist/policy/liquidity-policy.d.ts.map +1 -0
  156. package/dist/policy/liquidity-policy.js +112 -0
  157. package/dist/policy/liquidity-policy.js.map +1 -0
  158. package/dist/services/chain-config.d.ts +226 -0
  159. package/dist/services/chain-config.d.ts.map +1 -0
  160. package/dist/services/chain-config.js +105 -0
  161. package/dist/services/chain-config.js.map +1 -0
  162. package/dist/services/contract-provider.d.ts +44 -0
  163. package/dist/services/contract-provider.d.ts.map +1 -0
  164. package/dist/services/contract-provider.js +167 -0
  165. package/dist/services/contract-provider.js.map +1 -0
  166. package/dist/services/contracts-service.d.ts +192 -0
  167. package/dist/services/contracts-service.d.ts.map +1 -0
  168. package/dist/services/contracts-service.js +336 -0
  169. package/dist/services/contracts-service.js.map +1 -0
  170. package/dist/services/dao-service.d.ts +245 -0
  171. package/dist/services/dao-service.d.ts.map +1 -0
  172. package/dist/services/dao-service.js +389 -0
  173. package/dist/services/dao-service.js.map +1 -0
  174. package/dist/services/identity-service.d.ts +150 -0
  175. package/dist/services/identity-service.d.ts.map +1 -0
  176. package/dist/services/identity-service.js +286 -0
  177. package/dist/services/identity-service.js.map +1 -0
  178. package/dist/services/index.d.ts +20 -0
  179. package/dist/services/index.d.ts.map +1 -0
  180. package/dist/services/index.js +15 -0
  181. package/dist/services/index.js.map +1 -0
  182. package/dist/services/reputation-service.d.ts +128 -0
  183. package/dist/services/reputation-service.d.ts.map +1 -0
  184. package/dist/services/reputation-service.js +204 -0
  185. package/dist/services/reputation-service.js.map +1 -0
  186. package/dist/services/wallet-service.d.ts +201 -0
  187. package/dist/services/wallet-service.d.ts.map +1 -0
  188. package/dist/services/wallet-service.js +402 -0
  189. package/dist/services/wallet-service.js.map +1 -0
  190. package/package.json +66 -0
@@ -0,0 +1,402 @@
1
+ /**
2
+ * WalletService — on-chain wallet operations for ClawToken and ClawEscrow.
3
+ *
4
+ * This service is the **single point of truth** for all wallet write/read
5
+ * operations. API route handlers delegate to it; it calls the smart
6
+ * contracts via ContractProvider and reads indexed history from
7
+ * IndexerQuery.
8
+ *
9
+ * Design decisions:
10
+ * - Token amounts are **integers** (ClawToken has 0 decimals).
11
+ * - Escrow ID is an opaque string at the REST layer; it's hashed to
12
+ * `bytes32` (keccak256) before hitting the chain.
13
+ * - DID-to-address resolution goes through ClawIdentity.getController()
14
+ * when an on-chain lookup is desired, or through the local
15
+ * `addressFromDid` helper for off-chain derivation.
16
+ * - All write methods return a receipt-like object that matches the
17
+ * existing REST response shape (txHash, amount, status, timestamp).
18
+ */
19
+ import { keccak256, toUtf8Bytes } from 'ethers';
20
+ import { createLogger } from '../logger.js';
21
+ // ── Escrow status mapping ─────────────────────────────────────────────────
22
+ const ESCROW_STATUS_MAP = {
23
+ 0: 'active',
24
+ 1: 'released',
25
+ 2: 'refunded',
26
+ 3: 'expired',
27
+ 4: 'disputed',
28
+ };
29
+ // ---------------------------------------------------------------------------
30
+ // WalletService
31
+ // ---------------------------------------------------------------------------
32
+ export class WalletService {
33
+ contracts;
34
+ indexer;
35
+ log;
36
+ constructor(contracts, indexer, logger) {
37
+ this.contracts = contracts;
38
+ this.indexer = indexer;
39
+ this.log = logger ?? createLogger({ level: 'info' });
40
+ }
41
+ // ========================================================================
42
+ // READ operations
43
+ // ========================================================================
44
+ /**
45
+ * Fetch on-chain Token balance for a given EVM address.
46
+ *
47
+ * ClawToken has 0 decimals, so balanceOf returns an integer directly.
48
+ */
49
+ async getBalance(address) {
50
+ const raw = await this.contracts.token.balanceOf(address);
51
+ const balance = raw;
52
+ // Locked / pending breakdown requires indexer data (escrow balances).
53
+ // For now, the "locked" amount is the sum of all active escrows where
54
+ // the address is the depositor.
55
+ let locked = 0n;
56
+ if (this.indexer) {
57
+ const escrows = this.indexer.getEscrows({
58
+ address,
59
+ status: 0, // Active
60
+ limit: 200,
61
+ });
62
+ for (const e of escrows.items) {
63
+ locked += BigInt(e.amount);
64
+ }
65
+ }
66
+ return {
67
+ balance: String(balance),
68
+ available: String(balance - locked),
69
+ pending: '0',
70
+ locked: String(locked),
71
+ };
72
+ }
73
+ /**
74
+ * Return the EVM transaction count (nonce) for a given address.
75
+ *
76
+ * This is the standard Ethereum nonce — the number of transactions
77
+ * sent from the address. Useful for clients that need to construct
78
+ * or sequence their own transactions.
79
+ */
80
+ async getNonce(address) {
81
+ const count = await this.contracts.provider.getTransactionCount(address, 'latest');
82
+ return { nonce: count, address };
83
+ }
84
+ /**
85
+ * Resolve a DID `did:claw:…` to an EVM address via the on-chain
86
+ * ClawIdentity registry.
87
+ *
88
+ * @returns The controller address, or `null` if the DID is not registered.
89
+ */
90
+ async resolveDidToAddress(did) {
91
+ const didHash = keccak256(toUtf8Bytes(did));
92
+ try {
93
+ const controller = await this.contracts.identity.getController(didHash);
94
+ // Zero-address means not registered.
95
+ if (controller === '0x0000000000000000000000000000000000000000') {
96
+ return null;
97
+ }
98
+ return controller;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ // ========================================================================
105
+ // WRITE operations — Token transfers
106
+ // ========================================================================
107
+ /**
108
+ * Execute an on-chain Token transfer.
109
+ *
110
+ * Uses the burn+mint pattern: tokens are burned from the sender's
111
+ * per-DID address and minted to the receiver's address. This avoids
112
+ * the need for per-DID private keys or ETH gas funding — the node
113
+ * signer holds MINTER_ROLE and BURNER_ROLE.
114
+ *
115
+ * For the special case where `from` is `'faucet'` or the node signer,
116
+ * a direct `transfer()` is used instead (since the signer actually
117
+ * holds those tokens).
118
+ */
119
+ async transfer(from, to, amount, memo) {
120
+ this.log.info('Wallet transfer: %s → %s, %s Token(s)%s', from, to, String(amount), memo ? ` (${memo})` : '');
121
+ const isSigner = from === 'faucet' ||
122
+ from.toLowerCase() === this.contracts.signerAddress.toLowerCase();
123
+ let receipt;
124
+ if (isSigner) {
125
+ // Direct transfer from node signer's own balance
126
+ const tx = await this.contracts.token.transfer(to, amount);
127
+ receipt = await tx.wait();
128
+ }
129
+ else {
130
+ // Burn from sender and mint to receiver (per-DID isolation)
131
+ const burnTx = await this.contracts.token.burn(from, amount);
132
+ await burnTx.wait();
133
+ const mintTx = await this.contracts.token.mint(to, amount);
134
+ receipt = await mintTx.wait();
135
+ }
136
+ const timestamp = Date.now();
137
+ return {
138
+ txHash: receipt.hash,
139
+ from,
140
+ to,
141
+ amount: String(amount),
142
+ status: receipt.status === 1 ? 'confirmed' : 'failed',
143
+ timestamp,
144
+ };
145
+ }
146
+ /**
147
+ * Mint new Tokens to a target address.
148
+ *
149
+ * The node's signer **must** hold MINTER_ROLE on ClawToken for this to
150
+ * succeed. Typically used by the dev faucet so it can create fresh Tokens
151
+ * without requiring a pre-funded balance.
152
+ *
153
+ * @param to Target EVM address.
154
+ * @param amount Number of Tokens to mint (integer, 0 decimals).
155
+ * @param memo Optional human-readable memo (logged, not stored on-chain).
156
+ */
157
+ async mint(to, amount, memo) {
158
+ this.log.info('Wallet mint: → %s, %s Token(s)%s', to, String(amount), memo ? ` (${memo})` : '');
159
+ const tx = await this.contracts.token.mint(to, amount);
160
+ const receipt = await tx.wait();
161
+ const timestamp = Date.now();
162
+ return {
163
+ txHash: receipt.hash,
164
+ from: '0x0000000000000000000000000000000000000000',
165
+ to,
166
+ amount: String(amount),
167
+ status: receipt.status === 1 ? 'confirmed' : 'failed',
168
+ timestamp,
169
+ };
170
+ }
171
+ // ========================================================================
172
+ // WRITE operations — Escrow lifecycle
173
+ // ========================================================================
174
+ /**
175
+ * Create a new escrow.
176
+ *
177
+ * Steps:
178
+ * 1. `token.approve(escrowAddress, amount)` — allow the escrow contract
179
+ * to pull Tokens from the signer.
180
+ * 2. `escrow.createEscrow(id, beneficiary, arbiter, amount, expiresAt)`
181
+ */
182
+ async createEscrow(params) {
183
+ const { escrowId, beneficiary, arbiter = this.contracts.signerAddress, amount, expiresAt = 0, } = params;
184
+ const id32 = keccak256(toUtf8Bytes(escrowId));
185
+ this.log.info('Creating escrow %s: %s Token(s), beneficiary=%s', escrowId, String(amount), beneficiary);
186
+ // Approve escrow contract to spend Tokens on behalf of the signer.
187
+ const escrowAddr = await this.contracts.escrow.getAddress();
188
+ const approveTx = await this.contracts.token.approve(escrowAddr, amount);
189
+ await approveTx.wait();
190
+ // Create the escrow on-chain.
191
+ const tx = await this.contracts.escrow.createEscrow(id32, beneficiary, arbiter, amount, expiresAt);
192
+ const receipt = await tx.wait();
193
+ const ts = Date.now();
194
+ if (receipt.status !== 1) {
195
+ throw new Error(`createEscrow tx failed: ${receipt.hash}`);
196
+ }
197
+ return {
198
+ id: escrowId,
199
+ amount: String(amount),
200
+ released: '0',
201
+ remaining: String(amount),
202
+ status: 'active',
203
+ createdAt: ts,
204
+ expiresAt: expiresAt || undefined,
205
+ expired: false,
206
+ };
207
+ }
208
+ /**
209
+ * Fund (top up) an existing escrow.
210
+ */
211
+ async fundEscrow(escrowId, amount) {
212
+ const id32 = keccak256(toUtf8Bytes(escrowId));
213
+ this.log.info('Funding escrow %s: %s Token(s)', escrowId, String(amount));
214
+ // Approve and fund.
215
+ const escrowAddr = await this.contracts.escrow.getAddress();
216
+ const appTx = await this.contracts.token.approve(escrowAddr, amount);
217
+ await appTx.wait();
218
+ const tx = await this.contracts.escrow.fund(id32, amount);
219
+ const receipt = await tx.wait();
220
+ return {
221
+ txHash: receipt.hash,
222
+ amount: String(amount),
223
+ status: receipt.status === 1 ? 'funded' : 'failed',
224
+ timestamp: Date.now(),
225
+ };
226
+ }
227
+ /**
228
+ * Release escrow funds to the beneficiary.
229
+ */
230
+ async releaseEscrow(escrowId) {
231
+ const id32 = keccak256(toUtf8Bytes(escrowId));
232
+ this.log.info('Releasing escrow %s', escrowId);
233
+ const tx = await this.contracts.escrow.release(id32);
234
+ const receipt = await tx.wait();
235
+ // Read on-chain amount for the response.
236
+ const amount = await this.getEscrowAmount(id32);
237
+ return {
238
+ txHash: receipt.hash,
239
+ amount,
240
+ status: receipt.status === 1 ? 'released' : 'failed',
241
+ timestamp: Date.now(),
242
+ };
243
+ }
244
+ /**
245
+ * Refund escrow funds to the depositor.
246
+ */
247
+ async refundEscrow(escrowId) {
248
+ const id32 = keccak256(toUtf8Bytes(escrowId));
249
+ this.log.info('Refunding escrow %s', escrowId);
250
+ const tx = await this.contracts.escrow.refund(id32);
251
+ const receipt = await tx.wait();
252
+ const amount = await this.getEscrowAmount(id32);
253
+ return {
254
+ txHash: receipt.hash,
255
+ amount,
256
+ status: receipt.status === 1 ? 'refunded' : 'failed',
257
+ timestamp: Date.now(),
258
+ };
259
+ }
260
+ /**
261
+ * Expire an escrow that has passed its `expiresAt` timestamp.
262
+ */
263
+ async expireEscrow(escrowId) {
264
+ const id32 = keccak256(toUtf8Bytes(escrowId));
265
+ this.log.info('Expiring escrow %s', escrowId);
266
+ const tx = await this.contracts.escrow.expire(id32);
267
+ const receipt = await tx.wait();
268
+ const amount = await this.getEscrowAmount(id32);
269
+ return {
270
+ txHash: receipt.hash,
271
+ amount,
272
+ status: receipt.status === 1 ? 'expired' : 'failed',
273
+ timestamp: Date.now(),
274
+ };
275
+ }
276
+ /**
277
+ * Open a dispute on an active escrow.
278
+ */
279
+ async disputeEscrow(escrowId) {
280
+ const id32 = keccak256(toUtf8Bytes(escrowId));
281
+ this.log.info('Disputing escrow %s', escrowId);
282
+ const tx = await this.contracts.escrow.dispute(id32);
283
+ const receipt = await tx.wait();
284
+ const amount = await this.getEscrowAmount(id32);
285
+ return {
286
+ txHash: receipt.hash,
287
+ amount,
288
+ status: receipt.status === 1 ? 'disputed' : 'failed',
289
+ timestamp: Date.now(),
290
+ };
291
+ }
292
+ /**
293
+ * Resolve a disputed escrow (arbiter only).
294
+ *
295
+ * @param releaseToBeneficiary `true` → release to beneficiary; `false` → refund to depositor.
296
+ */
297
+ async resolveEscrow(escrowId, releaseToBeneficiary) {
298
+ const id32 = keccak256(toUtf8Bytes(escrowId));
299
+ this.log.info('Resolving escrow %s → %s', escrowId, releaseToBeneficiary ? 'beneficiary' : 'depositor');
300
+ const tx = await this.contracts.escrow.resolve(id32, releaseToBeneficiary);
301
+ const receipt = await tx.wait();
302
+ const amount = await this.getEscrowAmount(id32);
303
+ return {
304
+ txHash: receipt.hash,
305
+ amount,
306
+ status: receipt.status === 1
307
+ ? releaseToBeneficiary ? 'released' : 'refunded'
308
+ : 'failed',
309
+ timestamp: Date.now(),
310
+ };
311
+ }
312
+ // ========================================================================
313
+ // READ operations — Escrow
314
+ // ========================================================================
315
+ /**
316
+ * Fetch on-chain escrow state.
317
+ */
318
+ async getEscrow(escrowId) {
319
+ // If the input already looks like a bytes32 hex (from indexer list),
320
+ // use it directly; otherwise hash the human-readable ID.
321
+ const id32 = escrowId.startsWith('0x') && escrowId.length === 66
322
+ ? escrowId
323
+ : keccak256(toUtf8Bytes(escrowId));
324
+ try {
325
+ const [depositor, beneficiary, arbiter, amount, createdAt, expiresAt, status] = await this.contracts.escrow.getEscrow(id32);
326
+ // Zero depositor means escrow doesn't exist.
327
+ if (depositor === '0x0000000000000000000000000000000000000000') {
328
+ return null;
329
+ }
330
+ const now = Math.floor(Date.now() / 1000);
331
+ return {
332
+ id: escrowId,
333
+ depositor: depositor,
334
+ beneficiary: beneficiary,
335
+ arbiter: arbiter,
336
+ amount: String(amount),
337
+ status: ESCROW_STATUS_MAP[Number(status)] ?? 'unknown',
338
+ createdAt: Number(createdAt),
339
+ expiresAt: Number(expiresAt),
340
+ expired: Number(expiresAt) > 0 && now > Number(expiresAt),
341
+ };
342
+ }
343
+ catch {
344
+ return null;
345
+ }
346
+ }
347
+ // ========================================================================
348
+ // READ operations — History (indexer)
349
+ // ========================================================================
350
+ /**
351
+ * Query transfer history from the indexer.
352
+ */
353
+ getHistory(address, opts = {}) {
354
+ if (!this.indexer) {
355
+ return { transactions: [], total: 0, hasMore: false, pagination: { limit: 20, offset: 0 } };
356
+ }
357
+ const limit = Math.min(Math.max(opts.limit ?? 20, 1), 200);
358
+ const offset = Math.max(opts.offset ?? 0, 0);
359
+ const result = this.indexer.getTransfers({ address, limit, offset });
360
+ const transactions = result.items.map((row) => ({
361
+ txHash: row.txHash,
362
+ from: row.fromAddr,
363
+ to: row.toAddr,
364
+ amount: String(row.amount),
365
+ type: row.fromAddr.toLowerCase() === address.toLowerCase() ? 'sent' : 'received',
366
+ status: 'confirmed',
367
+ timestamp: row.timestamp,
368
+ }));
369
+ return {
370
+ transactions,
371
+ total: result.total,
372
+ hasMore: offset + limit < result.total,
373
+ pagination: { limit, offset },
374
+ };
375
+ }
376
+ /**
377
+ * Query escrow records from the indexer.
378
+ */
379
+ getEscrows(filter = {}) {
380
+ if (!this.indexer) {
381
+ return { items: [], total: 0, limit: 50, offset: 0 };
382
+ }
383
+ return this.indexer.getEscrows(filter);
384
+ }
385
+ // ========================================================================
386
+ // Internal helpers
387
+ // ========================================================================
388
+ /**
389
+ * Read the stored amount for an escrow (post-tx).
390
+ * Returns 0 if the escrow can't be read.
391
+ */
392
+ async getEscrowAmount(id32) {
393
+ try {
394
+ const [, , , amount] = await this.contracts.escrow.getEscrow(id32);
395
+ return String(amount);
396
+ }
397
+ catch {
398
+ return '0';
399
+ }
400
+ }
401
+ }
402
+ //# sourceMappingURL=wallet-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-service.js","sourceRoot":"","sources":["../../src/services/wallet-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA4E5C,6EAA6E;AAE7E,MAAM,iBAAiB,GAA2B;IAChD,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,UAAU;CACd,CAAC;AAEF,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,OAAO,aAAa;IAIL;IACA;IAJF,GAAG,CAAS;IAE7B,YACmB,SAA2B,EAC3B,OAAsB,EACvC,MAAe;QAFE,cAAS,GAAT,SAAS,CAAkB;QAC3B,YAAO,GAAP,OAAO,CAAe;QAGvC,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,2EAA2E;IAC3E,kBAAkB;IAClB,2EAA2E;IAE3E;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,OAAe;QAC9B,MAAM,GAAG,GAAW,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,GAAG,CAAC;QAEpB,sEAAsE;QACtE,sEAAsE;QACtE,gCAAgC;QAChC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBACtC,OAAO;gBACP,MAAM,EAAE,CAAC,EAAE,SAAS;gBACpB,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;YACnC,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;SACvB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAW;QACnC,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,UAAU,GAAW,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAChF,qCAAqC;YACrC,IAAI,UAAU,KAAK,4CAA4C,EAAE,CAAC;gBAChE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,qCAAqC;IACrC,2EAA2E;IAE3E;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,EAAU,EACV,MAAuB,EACvB,IAAa;QAEb,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,yCAAyC,EACzC,IAAI,EACJ,EAAE,EACF,MAAM,CAAC,MAAM,CAAC,EACd,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CACzB,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ;YAChC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAEpE,IAAI,OAAO,CAAC;QACZ,IAAI,QAAQ,EAAE,CAAC;YACb,iDAAiD;YACjD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC3D,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,4DAA4D;YAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7D,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC3D,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,IAAI;YACJ,EAAE;YACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YACrD,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,CACR,EAAU,EACV,MAAuB,EACvB,IAAa;QAEb,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,kCAAkC,EAClC,EAAE,EACF,MAAM,CAAC,MAAM,CAAC,EACd,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CACzB,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,IAAI,EAAE,4CAA4C;YAClD,EAAE;YACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;YACrD,SAAS;SACV,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,sCAAsC;IACtC,2EAA2E;IAE3E;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAAC,MAMlB;QACC,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EACtC,MAAM,EACN,SAAS,GAAG,CAAC,GACd,GAAG,MAAM,CAAC;QACX,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,iDAAiD,EACjD,QAAQ,EACR,MAAM,CAAC,MAAM,CAAC,EACd,WAAW,CACZ,CAAC;QAEF,mEAAmE;QACnE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACzE,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QAEvB,8BAA8B;QAC9B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CACjD,IAAI,EACJ,WAAW,EACX,OAAO,EACP,MAAM,EACN,SAAS,CACV,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO;YACL,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;YACzB,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,SAAS,IAAI,SAAS;YACjC,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,MAAuB;QACxD,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAE1E,oBAAoB;QACpB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhC,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAClD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhC,yCAAyC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;YACpD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;YACpD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;QAE9C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YACnD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;YACpD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,QAAgB,EAChB,oBAA6B;QAE7B,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,0BAA0B,EAC1B,QAAQ,EACR,oBAAoB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CACnD,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEhD,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;gBAC1B,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;gBAChD,CAAC,CAAC,QAAQ;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,2BAA2B;IAC3B,2EAA2E;IAE3E;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,qEAAqE;QACrE,yDAAyD;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE;YAC9D,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,GAC3E,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAE9C,6CAA6C;YAC7C,IAAI,SAAS,KAAK,4CAA4C,EAAE,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAE1C,OAAO;gBACL,EAAE,EAAE,QAAQ;gBACZ,SAAS,EAAE,SAAmB;gBAC9B,WAAW,EAAE,WAAqB;gBAClC,OAAO,EAAE,OAAiB;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAgB,CAAC;gBAChC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,SAAS;gBACtD,SAAS,EAAE,MAAM,CAAC,SAAmB,CAAC;gBACtC,SAAS,EAAE,MAAM,CAAC,SAAmB,CAAC;gBACtC,OAAO,EAAE,MAAM,CAAC,SAAmB,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC,SAAmB,CAAC;aAC9E,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,sCAAsC;IACtC,2EAA2E;IAE3E;;OAEG;IACH,UAAU,CACR,OAAe,EACf,OAA2D,EAAE;QAE7D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9F,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAErE,MAAM,YAAY,GAAkB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,EAAE,EAAE,GAAG,CAAC,MAAM;YACd,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1B,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;YAChF,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,YAAY;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK;YACtC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAuB,EAAE;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,2EAA2E;IAC3E,mBAAmB;IACnB,2EAA2E;IAE3E;;;OAGG;IACK,KAAK,CAAC,eAAe,CAAC,IAAY;QACxC,IAAI,CAAC;YACH,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACnE,OAAO,MAAM,CAAC,MAAgB,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@claw-network/node",
3
+ "version": "0.2.0",
4
+ "description": "ClawNet node daemon — HTTP API and P2P networking for the agent economy",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/claw-network/clawnet.git",
12
+ "directory": "packages/node"
13
+ },
14
+ "keywords": [
15
+ "clawnet",
16
+ "agent",
17
+ "decentralized",
18
+ "node",
19
+ "daemon"
20
+ ],
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "exports": {
26
+ ".": "./dist/index.js"
27
+ },
28
+ "bin": {
29
+ "clawnetd": "./dist/daemon.js"
30
+ },
31
+ "pkg": {
32
+ "scripts": [
33
+ "dist/daemon.js"
34
+ ],
35
+ "targets": [
36
+ "node18-macos-x64",
37
+ "node18-linux-x64",
38
+ "node18-win-x64"
39
+ ],
40
+ "outputPath": "dist/pkg"
41
+ },
42
+ "dependencies": {
43
+ "@claw-network/core": "^0.1.0",
44
+ "@claw-network/protocol": "^0.1.0",
45
+ "@libp2p/crypto": "^5.1.13",
46
+ "@libp2p/peer-id-factory": "^4.2.4",
47
+ "better-sqlite3": "^11.10.0",
48
+ "ethers": "^6.16.0",
49
+ "yaml": "^2.8.2",
50
+ "zod": "^3.24.2"
51
+ },
52
+ "devDependencies": {
53
+ "@types/better-sqlite3": "^7.6.13"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public"
57
+ },
58
+ "scripts": {
59
+ "build": "tsc -b tsconfig.json",
60
+ "package": "pnpm build && pkg . --output dist/pkg/clawnetd && node ../../scripts/rename-pkg.js",
61
+ "test": "vitest run --passWithNoTests",
62
+ "test:services": "vitest run --passWithNoTests test/services/",
63
+ "test:integration": "vitest run --config vitest.integration.config.ts",
64
+ "lint": "eslint src --max-warnings=0"
65
+ }
66
+ }