@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.
- package/README.md +49 -0
- package/dist/api/api-key-store.d.ts +74 -0
- package/dist/api/api-key-store.d.ts.map +1 -0
- package/dist/api/api-key-store.js +170 -0
- package/dist/api/api-key-store.js.map +1 -0
- package/dist/api/auth.d.ts +30 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +115 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/legacy.d.ts +26 -0
- package/dist/api/legacy.d.ts.map +1 -0
- package/dist/api/legacy.js +281 -0
- package/dist/api/legacy.js.map +1 -0
- package/dist/api/middleware.d.ts +35 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +75 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/response.d.ts +85 -0
- package/dist/api/response.d.ts.map +1 -0
- package/dist/api/response.js +185 -0
- package/dist/api/response.js.map +1 -0
- package/dist/api/router.d.ts +45 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +183 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/routes/admin.d.ts +11 -0
- package/dist/api/routes/admin.d.ts.map +1 -0
- package/dist/api/routes/admin.js +124 -0
- package/dist/api/routes/admin.js.map +1 -0
- package/dist/api/routes/contracts.d.ts +7 -0
- package/dist/api/routes/contracts.d.ts.map +1 -0
- package/dist/api/routes/contracts.js +665 -0
- package/dist/api/routes/contracts.js.map +1 -0
- package/dist/api/routes/dao.d.ts +7 -0
- package/dist/api/routes/dao.d.ts.map +1 -0
- package/dist/api/routes/dao.js +549 -0
- package/dist/api/routes/dao.js.map +1 -0
- package/dist/api/routes/dev.d.ts +9 -0
- package/dist/api/routes/dev.d.ts.map +1 -0
- package/dist/api/routes/dev.js +273 -0
- package/dist/api/routes/dev.js.map +1 -0
- package/dist/api/routes/escrows.d.ts +7 -0
- package/dist/api/routes/escrows.d.ts.map +1 -0
- package/dist/api/routes/escrows.js +454 -0
- package/dist/api/routes/escrows.js.map +1 -0
- package/dist/api/routes/identities.d.ts +7 -0
- package/dist/api/routes/identities.d.ts.map +1 -0
- package/dist/api/routes/identities.js +245 -0
- package/dist/api/routes/identities.js.map +1 -0
- package/dist/api/routes/markets-capabilities.d.ts +7 -0
- package/dist/api/routes/markets-capabilities.d.ts.map +1 -0
- package/dist/api/routes/markets-capabilities.js +477 -0
- package/dist/api/routes/markets-capabilities.js.map +1 -0
- package/dist/api/routes/markets-disputes.d.ts +7 -0
- package/dist/api/routes/markets-disputes.d.ts.map +1 -0
- package/dist/api/routes/markets-disputes.js +102 -0
- package/dist/api/routes/markets-disputes.js.map +1 -0
- package/dist/api/routes/markets-info.d.ts +7 -0
- package/dist/api/routes/markets-info.d.ts.map +1 -0
- package/dist/api/routes/markets-info.js +523 -0
- package/dist/api/routes/markets-info.js.map +1 -0
- package/dist/api/routes/markets-search.d.ts +7 -0
- package/dist/api/routes/markets-search.d.ts.map +1 -0
- package/dist/api/routes/markets-search.js +38 -0
- package/dist/api/routes/markets-search.js.map +1 -0
- package/dist/api/routes/markets-tasks.d.ts +7 -0
- package/dist/api/routes/markets-tasks.d.ts.map +1 -0
- package/dist/api/routes/markets-tasks.js +539 -0
- package/dist/api/routes/markets-tasks.js.map +1 -0
- package/dist/api/routes/node.d.ts +7 -0
- package/dist/api/routes/node.d.ts.map +1 -0
- package/dist/api/routes/node.js +53 -0
- package/dist/api/routes/node.js.map +1 -0
- package/dist/api/routes/nonce.d.ts +10 -0
- package/dist/api/routes/nonce.d.ts.map +1 -0
- package/dist/api/routes/nonce.js +65 -0
- package/dist/api/routes/nonce.js.map +1 -0
- package/dist/api/routes/reputations.d.ts +7 -0
- package/dist/api/routes/reputations.d.ts.map +1 -0
- package/dist/api/routes/reputations.js +243 -0
- package/dist/api/routes/reputations.js.map +1 -0
- package/dist/api/routes/transfers.d.ts +7 -0
- package/dist/api/routes/transfers.d.ts.map +1 -0
- package/dist/api/routes/transfers.js +88 -0
- package/dist/api/routes/transfers.js.map +1 -0
- package/dist/api/routes/wallets.d.ts +7 -0
- package/dist/api/routes/wallets.d.ts.map +1 -0
- package/dist/api/routes/wallets.js +132 -0
- package/dist/api/routes/wallets.js.map +1 -0
- package/dist/api/schemas/common.d.ts +45 -0
- package/dist/api/schemas/common.d.ts.map +1 -0
- package/dist/api/schemas/common.js +30 -0
- package/dist/api/schemas/common.js.map +1 -0
- package/dist/api/schemas/contracts.d.ts +284 -0
- package/dist/api/schemas/contracts.d.ts.map +1 -0
- package/dist/api/schemas/contracts.js +79 -0
- package/dist/api/schemas/contracts.js.map +1 -0
- package/dist/api/schemas/dao.d.ts +271 -0
- package/dist/api/schemas/dao.d.ts.map +1 -0
- package/dist/api/schemas/dao.js +78 -0
- package/dist/api/schemas/dao.js.map +1 -0
- package/dist/api/schemas/identity.d.ts +75 -0
- package/dist/api/schemas/identity.d.ts.map +1 -0
- package/dist/api/schemas/identity.js +32 -0
- package/dist/api/schemas/identity.js.map +1 -0
- package/dist/api/schemas/markets.d.ts +822 -0
- package/dist/api/schemas/markets.d.ts.map +1 -0
- package/dist/api/schemas/markets.js +246 -0
- package/dist/api/schemas/markets.js.map +1 -0
- package/dist/api/schemas/wallet.d.ts +163 -0
- package/dist/api/schemas/wallet.d.ts.map +1 -0
- package/dist/api/schemas/wallet.js +54 -0
- package/dist/api/schemas/wallet.js.map +1 -0
- package/dist/api/server.d.ts +45 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +131 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +196 -0
- package/dist/api/types.js.map +1 -0
- package/dist/daemon.d.ts +11 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +248 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +795 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/index.d.ts +10 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +7 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/indexer.d.ts +60 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +408 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/query.d.ts +141 -0
- package/dist/indexer/query.d.ts.map +1 -0
- package/dist/indexer/query.js +244 -0
- package/dist/indexer/query.js.map +1 -0
- package/dist/indexer/store.d.ts +95 -0
- package/dist/indexer/store.d.ts.map +1 -0
- package/dist/indexer/store.js +250 -0
- package/dist/indexer/store.js.map +1 -0
- package/dist/logger.d.ts +13 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +37 -0
- package/dist/logger.js.map +1 -0
- package/dist/p2p/sync.d.ts +105 -0
- package/dist/p2p/sync.d.ts.map +1 -0
- package/dist/p2p/sync.js +875 -0
- package/dist/p2p/sync.js.map +1 -0
- package/dist/policy/liquidity-policy.d.ts +17 -0
- package/dist/policy/liquidity-policy.d.ts.map +1 -0
- package/dist/policy/liquidity-policy.js +112 -0
- package/dist/policy/liquidity-policy.js.map +1 -0
- package/dist/services/chain-config.d.ts +226 -0
- package/dist/services/chain-config.d.ts.map +1 -0
- package/dist/services/chain-config.js +105 -0
- package/dist/services/chain-config.js.map +1 -0
- package/dist/services/contract-provider.d.ts +44 -0
- package/dist/services/contract-provider.d.ts.map +1 -0
- package/dist/services/contract-provider.js +167 -0
- package/dist/services/contract-provider.js.map +1 -0
- package/dist/services/contracts-service.d.ts +192 -0
- package/dist/services/contracts-service.d.ts.map +1 -0
- package/dist/services/contracts-service.js +336 -0
- package/dist/services/contracts-service.js.map +1 -0
- package/dist/services/dao-service.d.ts +245 -0
- package/dist/services/dao-service.d.ts.map +1 -0
- package/dist/services/dao-service.js +389 -0
- package/dist/services/dao-service.js.map +1 -0
- package/dist/services/identity-service.d.ts +150 -0
- package/dist/services/identity-service.d.ts.map +1 -0
- package/dist/services/identity-service.js +286 -0
- package/dist/services/identity-service.js.map +1 -0
- package/dist/services/index.d.ts +20 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +15 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/reputation-service.d.ts +128 -0
- package/dist/services/reputation-service.d.ts.map +1 -0
- package/dist/services/reputation-service.js +204 -0
- package/dist/services/reputation-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +201 -0
- package/dist/services/wallet-service.d.ts.map +1 -0
- package/dist/services/wallet-service.js +402 -0
- package/dist/services/wallet-service.js.map +1 -0
- 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":"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"}
|
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
|
+
}
|