@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,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReputationService — on-chain reputation operations for ClawReputation.
|
|
3
|
+
*
|
|
4
|
+
* This service handles all reputation write/read operations that hit the
|
|
5
|
+
* chain. Route handlers delegate to it; it calls ClawReputation.sol via
|
|
6
|
+
* ContractProvider and reads indexed review data from IndexerQuery.
|
|
7
|
+
*
|
|
8
|
+
* Design decisions:
|
|
9
|
+
* - DID → bytes32 hash via `keccak256(toUtf8Bytes(did))`.
|
|
10
|
+
* - Review hash is `keccak256(toUtf8Bytes(reviewId))` where
|
|
11
|
+
* `reviewId` is the opaque identifier from the REST layer.
|
|
12
|
+
* - `anchorReputation` requires ANCHOR_ROLE — the node signer
|
|
13
|
+
* must hold that role on the contract.
|
|
14
|
+
* - `recordReview` also requires ANCHOR_ROLE.
|
|
15
|
+
* - Scores are uint16, max 1000 (contract-enforced).
|
|
16
|
+
*/
|
|
17
|
+
import { keccak256, toUtf8Bytes } from 'ethers';
|
|
18
|
+
import { createLogger } from '../logger.js';
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// ReputationService
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
export class ReputationService {
|
|
23
|
+
contracts;
|
|
24
|
+
indexer;
|
|
25
|
+
log;
|
|
26
|
+
constructor(contracts, indexer, logger) {
|
|
27
|
+
this.contracts = contracts;
|
|
28
|
+
this.indexer = indexer;
|
|
29
|
+
this.log = logger ?? createLogger({ level: 'info' });
|
|
30
|
+
}
|
|
31
|
+
// ========================================================================
|
|
32
|
+
// READ operations
|
|
33
|
+
// ========================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Fetch an agent's on-chain reputation profile.
|
|
36
|
+
*
|
|
37
|
+
* Reads `getReputation()` for the top-level score and epoch, then
|
|
38
|
+
* `getLatestSnapshot()` for dimensional scores and merkle root.
|
|
39
|
+
*
|
|
40
|
+
* @returns Profile, or `null` if DID has no reputation on-chain.
|
|
41
|
+
*/
|
|
42
|
+
async getProfile(did) {
|
|
43
|
+
const didHash = this.hashDid(did);
|
|
44
|
+
const reputation = this.contracts.reputation;
|
|
45
|
+
try {
|
|
46
|
+
const [score, epoch] = await reputation.getReputation(didHash);
|
|
47
|
+
const overallScore = Number(score);
|
|
48
|
+
const epochNum = Number(epoch);
|
|
49
|
+
// If score and epoch are both 0, no reputation exists yet.
|
|
50
|
+
if (overallScore === 0 && epochNum === 0) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const snapshot = await reputation.getLatestSnapshot(didHash);
|
|
54
|
+
return {
|
|
55
|
+
did,
|
|
56
|
+
score: overallScore,
|
|
57
|
+
epoch: epochNum,
|
|
58
|
+
dimensions: {
|
|
59
|
+
transaction: Number(snapshot.transactionScore),
|
|
60
|
+
fulfillment: Number(snapshot.fulfillmentScore),
|
|
61
|
+
quality: Number(snapshot.qualityScore),
|
|
62
|
+
social: Number(snapshot.socialScore),
|
|
63
|
+
behavior: Number(snapshot.behaviorScore),
|
|
64
|
+
},
|
|
65
|
+
merkleRoot: snapshot.merkleRoot,
|
|
66
|
+
timestamp: Number(snapshot.timestamp),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get reviews for a DID from the indexer.
|
|
75
|
+
*
|
|
76
|
+
* @param subjectDid The DID whose reviews to fetch.
|
|
77
|
+
* @param opts Pagination options.
|
|
78
|
+
*/
|
|
79
|
+
getReviews(subjectDid, opts = {}) {
|
|
80
|
+
if (!this.indexer)
|
|
81
|
+
return null;
|
|
82
|
+
const filter = {
|
|
83
|
+
subjectDid: this.hashDid(subjectDid),
|
|
84
|
+
limit: opts.limit,
|
|
85
|
+
offset: opts.offset,
|
|
86
|
+
};
|
|
87
|
+
const result = this.indexer.getReviews(filter);
|
|
88
|
+
const reviews = result.items.map((r) => ({
|
|
89
|
+
reviewHash: r.reviewHash,
|
|
90
|
+
reviewerDid: r.reviewerDid,
|
|
91
|
+
subjectDid: r.subjectDid,
|
|
92
|
+
relatedTxHash: r.relatedTxHash,
|
|
93
|
+
timestamp: r.timestamp,
|
|
94
|
+
}));
|
|
95
|
+
return {
|
|
96
|
+
reviews,
|
|
97
|
+
total: result.total,
|
|
98
|
+
pagination: {
|
|
99
|
+
limit: result.limit,
|
|
100
|
+
offset: result.offset,
|
|
101
|
+
hasMore: result.offset + result.limit < result.total,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Verify a review anchor on-chain.
|
|
107
|
+
*/
|
|
108
|
+
async verifyReview(reviewId) {
|
|
109
|
+
const reviewHash = this.hashId(reviewId);
|
|
110
|
+
try {
|
|
111
|
+
const anchor = await this.contracts.reputation.verifyReview(reviewHash);
|
|
112
|
+
return {
|
|
113
|
+
reviewerDid: anchor.reviewerDIDHash,
|
|
114
|
+
subjectDid: anchor.subjectDIDHash,
|
|
115
|
+
txHash: anchor.txHash,
|
|
116
|
+
timestamp: Number(anchor.timestamp),
|
|
117
|
+
exists: anchor.exists,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ========================================================================
|
|
125
|
+
// WRITE operations
|
|
126
|
+
// ========================================================================
|
|
127
|
+
/**
|
|
128
|
+
* Record a review on-chain.
|
|
129
|
+
*
|
|
130
|
+
* The node signer must have ANCHOR_ROLE on ClawReputation.
|
|
131
|
+
*
|
|
132
|
+
* @param reviewId Opaque review identifier (hashed to bytes32).
|
|
133
|
+
* @param reviewerDid Reviewer's full DID string.
|
|
134
|
+
* @param subjectDid Subject's full DID string.
|
|
135
|
+
* @param relatedTxHash Associated transaction hash (bytes32).
|
|
136
|
+
*/
|
|
137
|
+
async recordReview(reviewId, reviewerDid, subjectDid, relatedTxHash) {
|
|
138
|
+
const reviewHash = this.hashId(reviewId);
|
|
139
|
+
const reviewerHash = this.hashDid(reviewerDid);
|
|
140
|
+
const subjectHash = this.hashDid(subjectDid);
|
|
141
|
+
this.log.info('Reputation recordReview: reviewer=%s subject=%s', reviewerDid, subjectDid);
|
|
142
|
+
const tx = await this.contracts.reputation.recordReview(reviewHash, reviewerHash, subjectHash, relatedTxHash);
|
|
143
|
+
const receipt = await tx.wait();
|
|
144
|
+
return {
|
|
145
|
+
txHash: receipt.hash,
|
|
146
|
+
reviewHash,
|
|
147
|
+
subjectDid,
|
|
148
|
+
reviewerDid,
|
|
149
|
+
timestamp: Date.now(),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Anchor a reputation snapshot on-chain.
|
|
154
|
+
*
|
|
155
|
+
* The node signer must have ANCHOR_ROLE on ClawReputation.
|
|
156
|
+
*
|
|
157
|
+
* @param did Agent's full DID string.
|
|
158
|
+
* @param overallScore 0–1000.
|
|
159
|
+
* @param dimensionScores [transaction, fulfillment, quality, social, behavior] — each 0–1000.
|
|
160
|
+
* @param merkleRoot Merkle root of all reviews in this epoch.
|
|
161
|
+
*/
|
|
162
|
+
async anchorReputation(did, overallScore, dimensionScores, merkleRoot) {
|
|
163
|
+
const didHash = this.hashDid(did);
|
|
164
|
+
this.log.info('Reputation anchor: %s score=%d', did, overallScore);
|
|
165
|
+
const tx = await this.contracts.reputation.anchorReputation(didHash, overallScore, dimensionScores, merkleRoot);
|
|
166
|
+
const receipt = await tx.wait();
|
|
167
|
+
// Parse epoch from ReputationAnchored event
|
|
168
|
+
let epoch = 0;
|
|
169
|
+
for (const log of receipt.logs) {
|
|
170
|
+
try {
|
|
171
|
+
const parsed = this.contracts.reputation.interface.parseLog({
|
|
172
|
+
topics: log.topics,
|
|
173
|
+
data: log.data,
|
|
174
|
+
});
|
|
175
|
+
if (parsed?.name === 'ReputationAnchored') {
|
|
176
|
+
epoch = Number(parsed.args[1]);
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Not our event — skip.
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
txHash: receipt.hash,
|
|
186
|
+
did,
|
|
187
|
+
overallScore,
|
|
188
|
+
epoch,
|
|
189
|
+
timestamp: Date.now(),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
// ========================================================================
|
|
193
|
+
// Helpers
|
|
194
|
+
// ========================================================================
|
|
195
|
+
/** Hash a DID string to bytes32. */
|
|
196
|
+
hashDid(did) {
|
|
197
|
+
return keccak256(toUtf8Bytes(did));
|
|
198
|
+
}
|
|
199
|
+
/** Hash an opaque identifier string to bytes32. */
|
|
200
|
+
hashId(id) {
|
|
201
|
+
return keccak256(toUtf8Bytes(id));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=reputation-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reputation-service.js","sourceRoot":"","sources":["../../src/services/reputation-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
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 { createLogger } from '../logger.js';
|
|
20
|
+
import type { ContractProvider } from '../services/contract-provider.js';
|
|
21
|
+
import type { IndexerQuery, EscrowFilter } from '../indexer/query.js';
|
|
22
|
+
type Logger = ReturnType<typeof createLogger>;
|
|
23
|
+
export interface TransferResult {
|
|
24
|
+
txHash: string;
|
|
25
|
+
from: string;
|
|
26
|
+
to: string;
|
|
27
|
+
amount: string;
|
|
28
|
+
fee?: string;
|
|
29
|
+
status: string;
|
|
30
|
+
timestamp: number;
|
|
31
|
+
}
|
|
32
|
+
export interface BalanceResult {
|
|
33
|
+
balance: string;
|
|
34
|
+
available: string;
|
|
35
|
+
pending: string;
|
|
36
|
+
locked: string;
|
|
37
|
+
}
|
|
38
|
+
export interface EscrowView {
|
|
39
|
+
id: string;
|
|
40
|
+
depositor: string;
|
|
41
|
+
beneficiary: string;
|
|
42
|
+
arbiter: string;
|
|
43
|
+
amount: string;
|
|
44
|
+
status: string;
|
|
45
|
+
createdAt: number;
|
|
46
|
+
expiresAt: number;
|
|
47
|
+
expired: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface EscrowActionResult {
|
|
50
|
+
txHash: string;
|
|
51
|
+
amount: string;
|
|
52
|
+
status: string;
|
|
53
|
+
timestamp: number;
|
|
54
|
+
}
|
|
55
|
+
export interface EscrowCreateResult {
|
|
56
|
+
id: string;
|
|
57
|
+
amount: string;
|
|
58
|
+
released: string;
|
|
59
|
+
remaining: string;
|
|
60
|
+
status: string;
|
|
61
|
+
createdAt: number;
|
|
62
|
+
expiresAt?: number;
|
|
63
|
+
expired: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface TransactionHistoryResult {
|
|
66
|
+
transactions: TransferRow[];
|
|
67
|
+
total: number;
|
|
68
|
+
hasMore: boolean;
|
|
69
|
+
pagination: {
|
|
70
|
+
limit: number;
|
|
71
|
+
offset: number;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
interface TransferRow {
|
|
75
|
+
txHash: string;
|
|
76
|
+
from: string;
|
|
77
|
+
to: string;
|
|
78
|
+
amount: string;
|
|
79
|
+
type: string;
|
|
80
|
+
status: string;
|
|
81
|
+
timestamp: number;
|
|
82
|
+
}
|
|
83
|
+
export declare class WalletService {
|
|
84
|
+
private readonly contracts;
|
|
85
|
+
private readonly indexer?;
|
|
86
|
+
private readonly log;
|
|
87
|
+
constructor(contracts: ContractProvider, indexer?: IndexerQuery | undefined, logger?: Logger);
|
|
88
|
+
/**
|
|
89
|
+
* Fetch on-chain Token balance for a given EVM address.
|
|
90
|
+
*
|
|
91
|
+
* ClawToken has 0 decimals, so balanceOf returns an integer directly.
|
|
92
|
+
*/
|
|
93
|
+
getBalance(address: string): Promise<BalanceResult>;
|
|
94
|
+
/**
|
|
95
|
+
* Return the EVM transaction count (nonce) for a given address.
|
|
96
|
+
*
|
|
97
|
+
* This is the standard Ethereum nonce — the number of transactions
|
|
98
|
+
* sent from the address. Useful for clients that need to construct
|
|
99
|
+
* or sequence their own transactions.
|
|
100
|
+
*/
|
|
101
|
+
getNonce(address: string): Promise<{
|
|
102
|
+
nonce: number;
|
|
103
|
+
address: string;
|
|
104
|
+
}>;
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a DID `did:claw:…` to an EVM address via the on-chain
|
|
107
|
+
* ClawIdentity registry.
|
|
108
|
+
*
|
|
109
|
+
* @returns The controller address, or `null` if the DID is not registered.
|
|
110
|
+
*/
|
|
111
|
+
resolveDidToAddress(did: string): Promise<string | null>;
|
|
112
|
+
/**
|
|
113
|
+
* Execute an on-chain Token transfer.
|
|
114
|
+
*
|
|
115
|
+
* Uses the burn+mint pattern: tokens are burned from the sender's
|
|
116
|
+
* per-DID address and minted to the receiver's address. This avoids
|
|
117
|
+
* the need for per-DID private keys or ETH gas funding — the node
|
|
118
|
+
* signer holds MINTER_ROLE and BURNER_ROLE.
|
|
119
|
+
*
|
|
120
|
+
* For the special case where `from` is `'faucet'` or the node signer,
|
|
121
|
+
* a direct `transfer()` is used instead (since the signer actually
|
|
122
|
+
* holds those tokens).
|
|
123
|
+
*/
|
|
124
|
+
transfer(from: string, to: string, amount: bigint | number, memo?: string): Promise<TransferResult>;
|
|
125
|
+
/**
|
|
126
|
+
* Mint new Tokens to a target address.
|
|
127
|
+
*
|
|
128
|
+
* The node's signer **must** hold MINTER_ROLE on ClawToken for this to
|
|
129
|
+
* succeed. Typically used by the dev faucet so it can create fresh Tokens
|
|
130
|
+
* without requiring a pre-funded balance.
|
|
131
|
+
*
|
|
132
|
+
* @param to Target EVM address.
|
|
133
|
+
* @param amount Number of Tokens to mint (integer, 0 decimals).
|
|
134
|
+
* @param memo Optional human-readable memo (logged, not stored on-chain).
|
|
135
|
+
*/
|
|
136
|
+
mint(to: string, amount: bigint | number, memo?: string): Promise<TransferResult>;
|
|
137
|
+
/**
|
|
138
|
+
* Create a new escrow.
|
|
139
|
+
*
|
|
140
|
+
* Steps:
|
|
141
|
+
* 1. `token.approve(escrowAddress, amount)` — allow the escrow contract
|
|
142
|
+
* to pull Tokens from the signer.
|
|
143
|
+
* 2. `escrow.createEscrow(id, beneficiary, arbiter, amount, expiresAt)`
|
|
144
|
+
*/
|
|
145
|
+
createEscrow(params: {
|
|
146
|
+
escrowId: string;
|
|
147
|
+
beneficiary: string;
|
|
148
|
+
arbiter?: string;
|
|
149
|
+
amount: bigint | number;
|
|
150
|
+
expiresAt?: number;
|
|
151
|
+
}): Promise<EscrowCreateResult>;
|
|
152
|
+
/**
|
|
153
|
+
* Fund (top up) an existing escrow.
|
|
154
|
+
*/
|
|
155
|
+
fundEscrow(escrowId: string, amount: bigint | number): Promise<EscrowActionResult>;
|
|
156
|
+
/**
|
|
157
|
+
* Release escrow funds to the beneficiary.
|
|
158
|
+
*/
|
|
159
|
+
releaseEscrow(escrowId: string): Promise<EscrowActionResult>;
|
|
160
|
+
/**
|
|
161
|
+
* Refund escrow funds to the depositor.
|
|
162
|
+
*/
|
|
163
|
+
refundEscrow(escrowId: string): Promise<EscrowActionResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Expire an escrow that has passed its `expiresAt` timestamp.
|
|
166
|
+
*/
|
|
167
|
+
expireEscrow(escrowId: string): Promise<EscrowActionResult>;
|
|
168
|
+
/**
|
|
169
|
+
* Open a dispute on an active escrow.
|
|
170
|
+
*/
|
|
171
|
+
disputeEscrow(escrowId: string): Promise<EscrowActionResult>;
|
|
172
|
+
/**
|
|
173
|
+
* Resolve a disputed escrow (arbiter only).
|
|
174
|
+
*
|
|
175
|
+
* @param releaseToBeneficiary `true` → release to beneficiary; `false` → refund to depositor.
|
|
176
|
+
*/
|
|
177
|
+
resolveEscrow(escrowId: string, releaseToBeneficiary: boolean): Promise<EscrowActionResult>;
|
|
178
|
+
/**
|
|
179
|
+
* Fetch on-chain escrow state.
|
|
180
|
+
*/
|
|
181
|
+
getEscrow(escrowId: string): Promise<EscrowView | null>;
|
|
182
|
+
/**
|
|
183
|
+
* Query transfer history from the indexer.
|
|
184
|
+
*/
|
|
185
|
+
getHistory(address: string, opts?: {
|
|
186
|
+
limit?: number;
|
|
187
|
+
offset?: number;
|
|
188
|
+
type?: string;
|
|
189
|
+
}): TransactionHistoryResult;
|
|
190
|
+
/**
|
|
191
|
+
* Query escrow records from the indexer.
|
|
192
|
+
*/
|
|
193
|
+
getEscrows(filter?: EscrowFilter): import("../indexer/query.js").PaginatedResult<import("../indexer/query.js").EscrowRow>;
|
|
194
|
+
/**
|
|
195
|
+
* Read the stored amount for an escrow (post-tx).
|
|
196
|
+
* Returns 0 if the escrow can't be read.
|
|
197
|
+
*/
|
|
198
|
+
private getEscrowAmount;
|
|
199
|
+
}
|
|
200
|
+
export {};
|
|
201
|
+
//# sourceMappingURL=wallet-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-service.d.ts","sourceRoot":"","sources":["../../src/services/wallet-service.ts"],"names":[],"mappings":"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"}
|