@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,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContractsService — on-chain service-contract operations for ClawContracts.
|
|
3
|
+
*
|
|
4
|
+
* This service handles all service-contract lifecycle operations that hit
|
|
5
|
+
* the chain. Route handlers delegate to it; it calls ClawContracts.sol
|
|
6
|
+
* via ContractProvider and reads indexed contract data from IndexerQuery.
|
|
7
|
+
*
|
|
8
|
+
* Design decisions:
|
|
9
|
+
* - Contract ID is an opaque string at the REST layer; it's hashed to
|
|
10
|
+
* `bytes32` via `keccak256(toUtf8Bytes(id))` before hitting the chain.
|
|
11
|
+
* - `activateContract` requires the caller to have approved
|
|
12
|
+
* `totalAmount + fee` Tokens on ClawToken first.
|
|
13
|
+
* - `approveMilestone` / `rejectMilestone` require client, contract
|
|
14
|
+
* arbiter, or global `ARBITER_ROLE`.
|
|
15
|
+
* - `resolveDispute` requires contract arbiter or global `ARBITER_ROLE`.
|
|
16
|
+
* - Token amounts are **integers** (ClawToken has 0 decimals).
|
|
17
|
+
*/
|
|
18
|
+
import { keccak256, toUtf8Bytes } from 'ethers';
|
|
19
|
+
import { createLogger } from '../logger.js';
|
|
20
|
+
// ── Enums mirroring Solidity ──────────────────────────────────────────────
|
|
21
|
+
export var ContractStatus;
|
|
22
|
+
(function (ContractStatus) {
|
|
23
|
+
ContractStatus[ContractStatus["Draft"] = 0] = "Draft";
|
|
24
|
+
ContractStatus[ContractStatus["Signed"] = 1] = "Signed";
|
|
25
|
+
ContractStatus[ContractStatus["Active"] = 2] = "Active";
|
|
26
|
+
ContractStatus[ContractStatus["Completed"] = 3] = "Completed";
|
|
27
|
+
ContractStatus[ContractStatus["Disputed"] = 4] = "Disputed";
|
|
28
|
+
ContractStatus[ContractStatus["Terminated"] = 5] = "Terminated";
|
|
29
|
+
ContractStatus[ContractStatus["Cancelled"] = 6] = "Cancelled";
|
|
30
|
+
})(ContractStatus || (ContractStatus = {}));
|
|
31
|
+
export var MilestoneStatus;
|
|
32
|
+
(function (MilestoneStatus) {
|
|
33
|
+
MilestoneStatus[MilestoneStatus["Pending"] = 0] = "Pending";
|
|
34
|
+
MilestoneStatus[MilestoneStatus["Submitted"] = 1] = "Submitted";
|
|
35
|
+
MilestoneStatus[MilestoneStatus["Approved"] = 2] = "Approved";
|
|
36
|
+
MilestoneStatus[MilestoneStatus["Rejected"] = 3] = "Rejected";
|
|
37
|
+
})(MilestoneStatus || (MilestoneStatus = {}));
|
|
38
|
+
export var DisputeResolution;
|
|
39
|
+
(function (DisputeResolution) {
|
|
40
|
+
DisputeResolution[DisputeResolution["FavorProvider"] = 0] = "FavorProvider";
|
|
41
|
+
DisputeResolution[DisputeResolution["FavorClient"] = 1] = "FavorClient";
|
|
42
|
+
DisputeResolution[DisputeResolution["Resume"] = 2] = "Resume";
|
|
43
|
+
})(DisputeResolution || (DisputeResolution = {}));
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// ContractsService
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
export class ContractsService {
|
|
48
|
+
contracts;
|
|
49
|
+
indexer;
|
|
50
|
+
log;
|
|
51
|
+
constructor(contracts, indexer, logger) {
|
|
52
|
+
this.contracts = contracts;
|
|
53
|
+
this.indexer = indexer;
|
|
54
|
+
this.log = logger ?? createLogger({ level: 'info' });
|
|
55
|
+
}
|
|
56
|
+
// ── Helpers ─────────────────────────────────────────────────────────
|
|
57
|
+
/** Hash an opaque string to bytes32 (contract ID, terms, evidence, etc.) */
|
|
58
|
+
hash(value) {
|
|
59
|
+
return keccak256(toUtf8Bytes(value));
|
|
60
|
+
}
|
|
61
|
+
// =====================================================================
|
|
62
|
+
// READ operations
|
|
63
|
+
// =====================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Fetch a single contract from the chain.
|
|
66
|
+
*
|
|
67
|
+
* @param contractId Opaque REST-layer contract ID.
|
|
68
|
+
*/
|
|
69
|
+
async getContract(contractId) {
|
|
70
|
+
try {
|
|
71
|
+
const id = this.hash(contractId);
|
|
72
|
+
const c = await this.contracts.serviceContracts.getContract(id);
|
|
73
|
+
return {
|
|
74
|
+
contractId,
|
|
75
|
+
client: c.client,
|
|
76
|
+
provider: c.provider,
|
|
77
|
+
arbiter: c.arbiter,
|
|
78
|
+
totalAmount: Number(c.totalAmount),
|
|
79
|
+
fundedAmount: Number(c.fundedAmount),
|
|
80
|
+
releasedAmount: Number(c.releasedAmount),
|
|
81
|
+
termsHash: c.termsHash,
|
|
82
|
+
milestoneCount: Number(c.milestoneCount),
|
|
83
|
+
status: Number(c.status),
|
|
84
|
+
createdAt: Number(c.createdAt),
|
|
85
|
+
deadline: Number(c.deadline),
|
|
86
|
+
clientSigned: c.clientSigned,
|
|
87
|
+
providerSigned: c.providerSigned,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
this.log.debug('getContract failed: %s', err.message);
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Fetch all milestones for a contract from the chain.
|
|
97
|
+
*/
|
|
98
|
+
async getMilestones(contractId) {
|
|
99
|
+
const id = this.hash(contractId);
|
|
100
|
+
const milestones = await this.contracts.serviceContracts.getMilestones(id);
|
|
101
|
+
return milestones.map((m, i) => ({
|
|
102
|
+
index: i,
|
|
103
|
+
amount: Number(m.amount),
|
|
104
|
+
deliverableHash: m.deliverableHash,
|
|
105
|
+
status: Number(m.status),
|
|
106
|
+
deadline: Number(m.deadline),
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List contracts from the indexer (paginated, filterable).
|
|
111
|
+
*/
|
|
112
|
+
listContracts(opts = {}) {
|
|
113
|
+
if (!this.indexer)
|
|
114
|
+
return null;
|
|
115
|
+
const filter = {
|
|
116
|
+
address: opts.address,
|
|
117
|
+
status: opts.status,
|
|
118
|
+
limit: opts.limit,
|
|
119
|
+
offset: opts.offset,
|
|
120
|
+
};
|
|
121
|
+
const result = this.indexer.getServiceContracts(filter);
|
|
122
|
+
const contracts = result.items.map((r) => ({
|
|
123
|
+
contractId: r.contractId,
|
|
124
|
+
client: r.client,
|
|
125
|
+
provider: r.provider,
|
|
126
|
+
status: r.status,
|
|
127
|
+
createdAt: r.createdAt,
|
|
128
|
+
updatedAt: r.updatedAt,
|
|
129
|
+
}));
|
|
130
|
+
return {
|
|
131
|
+
contracts,
|
|
132
|
+
total: result.total,
|
|
133
|
+
pagination: {
|
|
134
|
+
limit: result.limit,
|
|
135
|
+
offset: result.offset,
|
|
136
|
+
hasMore: result.offset + result.limit < result.total,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Calculate the platform fee for a given amount.
|
|
142
|
+
*/
|
|
143
|
+
async calculateFee(amount) {
|
|
144
|
+
const fee = await this.contracts.serviceContracts.calculateFee(amount);
|
|
145
|
+
return Number(fee);
|
|
146
|
+
}
|
|
147
|
+
// =====================================================================
|
|
148
|
+
// WRITE operations
|
|
149
|
+
// =====================================================================
|
|
150
|
+
/**
|
|
151
|
+
* Create a new service contract on-chain.
|
|
152
|
+
*/
|
|
153
|
+
async createContract(params) {
|
|
154
|
+
const id = this.hash(params.contractId);
|
|
155
|
+
const terms = this.hash(params.termsHash);
|
|
156
|
+
this.log.info('Creating contract %s on-chain', params.contractId);
|
|
157
|
+
const tx = await this.contracts.serviceContracts.createContract(id, params.provider, params.arbiter, params.totalAmount, terms, params.deadline, params.milestoneAmounts, params.milestoneDeadlines);
|
|
158
|
+
const receipt = await tx.wait();
|
|
159
|
+
return {
|
|
160
|
+
txHash: receipt.hash,
|
|
161
|
+
contractId: params.contractId,
|
|
162
|
+
status: 'created',
|
|
163
|
+
timestamp: Date.now(),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Sign a contract (both client & provider must call).
|
|
168
|
+
*/
|
|
169
|
+
async signContract(contractId) {
|
|
170
|
+
const id = this.hash(contractId);
|
|
171
|
+
this.log.info('Signing contract %s', contractId);
|
|
172
|
+
const tx = await this.contracts.serviceContracts.signContract(id);
|
|
173
|
+
const receipt = await tx.wait();
|
|
174
|
+
return {
|
|
175
|
+
txHash: receipt.hash,
|
|
176
|
+
contractId,
|
|
177
|
+
status: 'signed',
|
|
178
|
+
timestamp: Date.now(),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Fund and activate a contract.
|
|
183
|
+
* The caller (client) must have approved (totalAmount + fee) Tokens
|
|
184
|
+
* on ClawToken before calling this.
|
|
185
|
+
*/
|
|
186
|
+
async activateContract(contractId) {
|
|
187
|
+
const id = this.hash(contractId);
|
|
188
|
+
this.log.info('Activating contract %s', contractId);
|
|
189
|
+
const tx = await this.contracts.serviceContracts.activateContract(id);
|
|
190
|
+
const receipt = await tx.wait();
|
|
191
|
+
return {
|
|
192
|
+
txHash: receipt.hash,
|
|
193
|
+
contractId,
|
|
194
|
+
status: 'active',
|
|
195
|
+
timestamp: Date.now(),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Submit a milestone deliverable (provider only).
|
|
200
|
+
*
|
|
201
|
+
* @param envelopeDigest Pre-computed BLAKE3(JCS(envelope)) hex — passed
|
|
202
|
+
* directly to the contract with **no** re-hashing. Callers compute the
|
|
203
|
+
* digest themselves (see `envelopeDigest()` in @claw-network/core).
|
|
204
|
+
*/
|
|
205
|
+
async submitMilestone(contractId, index, envelopeDigest) {
|
|
206
|
+
const id = this.hash(contractId);
|
|
207
|
+
// envelopeDigest is already a BLAKE3 hex digest — pass directly, no double-hash.
|
|
208
|
+
const digest = envelopeDigest.startsWith('0x') ? envelopeDigest : `0x${envelopeDigest}`;
|
|
209
|
+
this.log.info('Submitting milestone %d for contract %s', index, contractId);
|
|
210
|
+
const tx = await this.contracts.serviceContracts.submitMilestone(id, index, digest);
|
|
211
|
+
const receipt = await tx.wait();
|
|
212
|
+
return {
|
|
213
|
+
txHash: receipt.hash,
|
|
214
|
+
contractId,
|
|
215
|
+
milestoneIndex: index,
|
|
216
|
+
status: 'submitted',
|
|
217
|
+
timestamp: Date.now(),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Approve a submitted milestone (client / arbiter).
|
|
222
|
+
*/
|
|
223
|
+
async approveMilestone(contractId, index) {
|
|
224
|
+
const id = this.hash(contractId);
|
|
225
|
+
this.log.info('Approving milestone %d for contract %s', index, contractId);
|
|
226
|
+
const tx = await this.contracts.serviceContracts.approveMilestone(id, index);
|
|
227
|
+
const receipt = await tx.wait();
|
|
228
|
+
return {
|
|
229
|
+
txHash: receipt.hash,
|
|
230
|
+
contractId,
|
|
231
|
+
milestoneIndex: index,
|
|
232
|
+
status: 'approved',
|
|
233
|
+
timestamp: Date.now(),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Reject a submitted milestone (client / arbiter).
|
|
238
|
+
*/
|
|
239
|
+
async rejectMilestone(contractId, index, reason) {
|
|
240
|
+
const id = this.hash(contractId);
|
|
241
|
+
const reasonHash = this.hash(reason);
|
|
242
|
+
this.log.info('Rejecting milestone %d for contract %s', index, contractId);
|
|
243
|
+
const tx = await this.contracts.serviceContracts.rejectMilestone(id, index, reasonHash);
|
|
244
|
+
const receipt = await tx.wait();
|
|
245
|
+
return {
|
|
246
|
+
txHash: receipt.hash,
|
|
247
|
+
contractId,
|
|
248
|
+
milestoneIndex: index,
|
|
249
|
+
status: 'rejected',
|
|
250
|
+
timestamp: Date.now(),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Complete a contract (all milestones must be approved).
|
|
255
|
+
*/
|
|
256
|
+
async completeContract(contractId) {
|
|
257
|
+
const id = this.hash(contractId);
|
|
258
|
+
this.log.info('Completing contract %s', contractId);
|
|
259
|
+
const tx = await this.contracts.serviceContracts.completeContract(id);
|
|
260
|
+
const receipt = await tx.wait();
|
|
261
|
+
return {
|
|
262
|
+
txHash: receipt.hash,
|
|
263
|
+
contractId,
|
|
264
|
+
status: 'completed',
|
|
265
|
+
timestamp: Date.now(),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Raise a dispute on an active contract.
|
|
270
|
+
*/
|
|
271
|
+
async disputeContract(contractId, evidence) {
|
|
272
|
+
const id = this.hash(contractId);
|
|
273
|
+
const evidenceHash = this.hash(evidence);
|
|
274
|
+
this.log.info('Disputing contract %s', contractId);
|
|
275
|
+
const tx = await this.contracts.serviceContracts.disputeContract(id, evidenceHash);
|
|
276
|
+
const receipt = await tx.wait();
|
|
277
|
+
return {
|
|
278
|
+
txHash: receipt.hash,
|
|
279
|
+
contractId,
|
|
280
|
+
status: 'disputed',
|
|
281
|
+
timestamp: Date.now(),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Resolve a dispute (arbiter only).
|
|
286
|
+
*/
|
|
287
|
+
async resolveDispute(contractId, resolution) {
|
|
288
|
+
const id = this.hash(contractId);
|
|
289
|
+
this.log.info('Resolving dispute on contract %s (resolution: %d)', contractId, resolution);
|
|
290
|
+
const tx = await this.contracts.serviceContracts.resolveDispute(id, resolution);
|
|
291
|
+
const receipt = await tx.wait();
|
|
292
|
+
const statusMap = {
|
|
293
|
+
[DisputeResolution.FavorProvider]: 'completed',
|
|
294
|
+
[DisputeResolution.FavorClient]: 'terminated',
|
|
295
|
+
[DisputeResolution.Resume]: 'active',
|
|
296
|
+
};
|
|
297
|
+
return {
|
|
298
|
+
txHash: receipt.hash,
|
|
299
|
+
contractId,
|
|
300
|
+
status: statusMap[resolution] ?? 'resolved',
|
|
301
|
+
timestamp: Date.now(),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Terminate an active or disputed contract (refunds remaining funds).
|
|
306
|
+
*/
|
|
307
|
+
async terminateContract(contractId, reason) {
|
|
308
|
+
const id = this.hash(contractId);
|
|
309
|
+
const reasonHash = this.hash(reason);
|
|
310
|
+
this.log.info('Terminating contract %s', contractId);
|
|
311
|
+
const tx = await this.contracts.serviceContracts.terminateContract(id, reasonHash);
|
|
312
|
+
const receipt = await tx.wait();
|
|
313
|
+
return {
|
|
314
|
+
txHash: receipt.hash,
|
|
315
|
+
contractId,
|
|
316
|
+
status: 'terminated',
|
|
317
|
+
timestamp: Date.now(),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Cancel a pre-funded contract (Draft or Signed).
|
|
322
|
+
*/
|
|
323
|
+
async cancelContract(contractId) {
|
|
324
|
+
const id = this.hash(contractId);
|
|
325
|
+
this.log.info('Cancelling contract %s', contractId);
|
|
326
|
+
const tx = await this.contracts.serviceContracts.cancelContract(id);
|
|
327
|
+
const receipt = await tx.wait();
|
|
328
|
+
return {
|
|
329
|
+
txHash: receipt.hash,
|
|
330
|
+
contractId,
|
|
331
|
+
status: 'cancelled',
|
|
332
|
+
timestamp: Date.now(),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=contracts-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts-service.js","sourceRoot":"","sources":["../../src/services/contracts-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DaoService — on-chain DAO governance operations for ClawDAO + ParamRegistry.
|
|
3
|
+
*
|
|
4
|
+
* Handles all DAO lifecycle operations that hit the chain. Route handlers
|
|
5
|
+
* delegate to it; it calls ClawDAO.sol and ParamRegistry.sol via
|
|
6
|
+
* ContractProvider and reads indexed proposal / vote data from IndexerQuery.
|
|
7
|
+
*
|
|
8
|
+
* Design decisions:
|
|
9
|
+
* - Proposal IDs are **uint256** on-chain (auto-incrementing `proposalCount`).
|
|
10
|
+
* REST-layer string IDs are NOT used for chain proposals — the chain
|
|
11
|
+
* returns the numeric ID from `propose()`.
|
|
12
|
+
* - `advanceProposal()` is an adapter that maps the REST `newStatus` string
|
|
13
|
+
* to the appropriate chain call: `queue()` or `execute()`.
|
|
14
|
+
* - Vote support values: 0 = Against, 1 = For, 2 = Abstain (Solidity uint8).
|
|
15
|
+
* - Delegation does NOT exist in ClawDAO.sol — delegation routes remain
|
|
16
|
+
* event-store-only (legacy fallback).
|
|
17
|
+
* - Treasury balance is read via `ClawToken.balanceOf(daoAddress)`.
|
|
18
|
+
* - Governance params are read via `ParamRegistry.getAllParams()`.
|
|
19
|
+
* - Token amounts are **integers** (ClawToken has 0 decimals).
|
|
20
|
+
*/
|
|
21
|
+
import { createLogger } from '../logger.js';
|
|
22
|
+
import type { ContractProvider } from './contract-provider.js';
|
|
23
|
+
import type { IndexerQuery, ProposalFilter, VoteFilter } from '../indexer/query.js';
|
|
24
|
+
type Logger = ReturnType<typeof createLogger>;
|
|
25
|
+
export declare enum ProposalType {
|
|
26
|
+
ParameterChange = 0,
|
|
27
|
+
TreasurySpend = 1,
|
|
28
|
+
ProtocolUpgrade = 2,
|
|
29
|
+
Emergency = 3,
|
|
30
|
+
Signal = 4
|
|
31
|
+
}
|
|
32
|
+
export declare enum ProposalStatus {
|
|
33
|
+
Discussion = 0,
|
|
34
|
+
Voting = 1,
|
|
35
|
+
Passed = 2,
|
|
36
|
+
Rejected = 3,
|
|
37
|
+
Timelocked = 4,
|
|
38
|
+
Executed = 5,
|
|
39
|
+
Cancelled = 6,
|
|
40
|
+
Expired = 7
|
|
41
|
+
}
|
|
42
|
+
export declare enum VoteSupport {
|
|
43
|
+
Against = 0,
|
|
44
|
+
For = 1,
|
|
45
|
+
Abstain = 2
|
|
46
|
+
}
|
|
47
|
+
export interface ProposalView {
|
|
48
|
+
proposalId: number;
|
|
49
|
+
proposer: string;
|
|
50
|
+
pType: ProposalType;
|
|
51
|
+
status: ProposalStatus;
|
|
52
|
+
descriptionHash: string;
|
|
53
|
+
target: string;
|
|
54
|
+
snapshotBlock: number;
|
|
55
|
+
createdAt: number;
|
|
56
|
+
discussionEndAt: number;
|
|
57
|
+
votingEndAt: number;
|
|
58
|
+
timelockEndAt: number;
|
|
59
|
+
forVotes: string;
|
|
60
|
+
againstVotes: string;
|
|
61
|
+
abstainVotes: string;
|
|
62
|
+
}
|
|
63
|
+
export interface VoteReceipt {
|
|
64
|
+
hasVoted: boolean;
|
|
65
|
+
support: VoteSupport;
|
|
66
|
+
weight: string;
|
|
67
|
+
}
|
|
68
|
+
export interface VotingPowerResult {
|
|
69
|
+
voter: string;
|
|
70
|
+
power: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ProposalCreateResult {
|
|
73
|
+
txHash: string;
|
|
74
|
+
proposalId: number;
|
|
75
|
+
status: string;
|
|
76
|
+
timestamp: number;
|
|
77
|
+
}
|
|
78
|
+
export interface ProposalTxResult {
|
|
79
|
+
txHash: string;
|
|
80
|
+
proposalId: number;
|
|
81
|
+
status: string;
|
|
82
|
+
timestamp: number;
|
|
83
|
+
}
|
|
84
|
+
export interface VoteCastResult {
|
|
85
|
+
txHash: string;
|
|
86
|
+
proposalId: number;
|
|
87
|
+
support: VoteSupport;
|
|
88
|
+
timestamp: number;
|
|
89
|
+
}
|
|
90
|
+
export interface TreasuryView {
|
|
91
|
+
balance: string;
|
|
92
|
+
daoAddress: string;
|
|
93
|
+
}
|
|
94
|
+
export interface TreasuryDepositResult {
|
|
95
|
+
txHash: string;
|
|
96
|
+
amount: number;
|
|
97
|
+
timestamp: number;
|
|
98
|
+
}
|
|
99
|
+
export interface GovParam {
|
|
100
|
+
key: string;
|
|
101
|
+
keyHash: string;
|
|
102
|
+
value: string;
|
|
103
|
+
}
|
|
104
|
+
export interface GovParamsResult {
|
|
105
|
+
params: GovParam[];
|
|
106
|
+
count: number;
|
|
107
|
+
}
|
|
108
|
+
export interface ProposalListResult {
|
|
109
|
+
proposals: Array<{
|
|
110
|
+
proposalId: number;
|
|
111
|
+
proposer: string;
|
|
112
|
+
pType: number;
|
|
113
|
+
status: number;
|
|
114
|
+
createdAt: number;
|
|
115
|
+
}>;
|
|
116
|
+
total: number;
|
|
117
|
+
pagination: {
|
|
118
|
+
limit: number;
|
|
119
|
+
offset: number;
|
|
120
|
+
hasMore: boolean;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export interface VoteListResult {
|
|
124
|
+
votes: Array<{
|
|
125
|
+
proposalId: number;
|
|
126
|
+
voter: string;
|
|
127
|
+
support: number;
|
|
128
|
+
weight: string;
|
|
129
|
+
timestamp: number;
|
|
130
|
+
}>;
|
|
131
|
+
total: number;
|
|
132
|
+
pagination: {
|
|
133
|
+
limit: number;
|
|
134
|
+
offset: number;
|
|
135
|
+
hasMore: boolean;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export declare class DaoService {
|
|
139
|
+
private readonly contracts;
|
|
140
|
+
private readonly indexer?;
|
|
141
|
+
private readonly log;
|
|
142
|
+
constructor(contracts: ContractProvider, indexer?: IndexerQuery | undefined, logger?: Logger);
|
|
143
|
+
/** Hash a string to bytes32 (description hash, etc.) */
|
|
144
|
+
private hash;
|
|
145
|
+
/**
|
|
146
|
+
* Fetch a single proposal from the chain via `getProposal()`.
|
|
147
|
+
*/
|
|
148
|
+
getProposal(proposalId: number): Promise<ProposalView | null>;
|
|
149
|
+
/**
|
|
150
|
+
* List proposals from the indexer (paginated).
|
|
151
|
+
*/
|
|
152
|
+
listProposals(filter?: ProposalFilter): Promise<ProposalListResult>;
|
|
153
|
+
/**
|
|
154
|
+
* List votes from the indexer (paginated).
|
|
155
|
+
*/
|
|
156
|
+
listVotes(filter?: VoteFilter): Promise<VoteListResult>;
|
|
157
|
+
/**
|
|
158
|
+
* Get a voter's receipt for a specific proposal from the chain.
|
|
159
|
+
*/
|
|
160
|
+
getReceipt(proposalId: number, voter: string): Promise<VoteReceipt>;
|
|
161
|
+
/**
|
|
162
|
+
* Get a voter's current voting power from the chain.
|
|
163
|
+
*/
|
|
164
|
+
getVotingPower(voter: string): Promise<VotingPowerResult>;
|
|
165
|
+
/**
|
|
166
|
+
* Get the computed status of a proposal (auto-advances based on time).
|
|
167
|
+
*/
|
|
168
|
+
getComputedStatus(proposalId: number): Promise<ProposalStatus>;
|
|
169
|
+
/**
|
|
170
|
+
* Check if a proposal has reached quorum.
|
|
171
|
+
*/
|
|
172
|
+
hasQuorum(proposalId: number): Promise<boolean>;
|
|
173
|
+
/**
|
|
174
|
+
* Check if a proposal has passed (quorum + more for-votes than against).
|
|
175
|
+
*/
|
|
176
|
+
hasPassed(proposalId: number): Promise<boolean>;
|
|
177
|
+
/**
|
|
178
|
+
* Get the DAO treasury balance (ClawToken balance of the DAO contract).
|
|
179
|
+
*/
|
|
180
|
+
getTreasuryBalance(): Promise<TreasuryView>;
|
|
181
|
+
/**
|
|
182
|
+
* Fetch all governance parameters from ParamRegistry on-chain.
|
|
183
|
+
*/
|
|
184
|
+
getAllParams(): Promise<GovParamsResult>;
|
|
185
|
+
/**
|
|
186
|
+
* Get a single governance parameter by name.
|
|
187
|
+
*/
|
|
188
|
+
getParam(name: string): Promise<{
|
|
189
|
+
key: string;
|
|
190
|
+
value: string;
|
|
191
|
+
}>;
|
|
192
|
+
/**
|
|
193
|
+
* Create a new proposal on-chain.
|
|
194
|
+
*
|
|
195
|
+
* @param pType Proposal type string (e.g. 'parameter_change').
|
|
196
|
+
* @param description Description text (hashed to bytes32).
|
|
197
|
+
* @param target Target contract address (or zero address for signal).
|
|
198
|
+
* @param callData Encoded call data (hex string, or '0x' for signal).
|
|
199
|
+
*/
|
|
200
|
+
propose(pType: string, description: string, target: string, callData: string): Promise<ProposalCreateResult>;
|
|
201
|
+
/**
|
|
202
|
+
* Cast a vote on-chain.
|
|
203
|
+
*
|
|
204
|
+
* @param proposalId Numeric proposal ID.
|
|
205
|
+
* @param option Vote option string: 'for', 'against', 'abstain'.
|
|
206
|
+
*/
|
|
207
|
+
vote(proposalId: number, option: string): Promise<VoteCastResult>;
|
|
208
|
+
/**
|
|
209
|
+
* Queue a passed proposal for timelock.
|
|
210
|
+
*/
|
|
211
|
+
queue(proposalId: number): Promise<ProposalTxResult>;
|
|
212
|
+
/**
|
|
213
|
+
* Execute a timelocked proposal.
|
|
214
|
+
*/
|
|
215
|
+
execute(proposalId: number): Promise<ProposalTxResult>;
|
|
216
|
+
/**
|
|
217
|
+
* Cancel a proposal (must be proposer or CANCELLER_ROLE).
|
|
218
|
+
*/
|
|
219
|
+
cancel(proposalId: number): Promise<ProposalTxResult>;
|
|
220
|
+
/**
|
|
221
|
+
* Advance a proposal to the next status.
|
|
222
|
+
*
|
|
223
|
+
* This is the REST-layer adapter: the `newStatus` string is mapped to
|
|
224
|
+
* the appropriate chain call (`queue` or `execute`).
|
|
225
|
+
*
|
|
226
|
+
* Mapping:
|
|
227
|
+
* - 'voting' → automatic (contract auto-advances after discussion period)
|
|
228
|
+
* - 'timelocked' / 'queued' → queue()
|
|
229
|
+
* - 'executed' → execute()
|
|
230
|
+
* - 'cancelled' → cancel()
|
|
231
|
+
*
|
|
232
|
+
* For statuses managed by on-chain time (Discussion→Voting, Voting→Passed),
|
|
233
|
+
* we call `getStatus()` which auto-advances, then return the current state.
|
|
234
|
+
*/
|
|
235
|
+
advanceProposal(proposalId: number, newStatus: string): Promise<ProposalTxResult>;
|
|
236
|
+
/**
|
|
237
|
+
* Deposit Tokens into the DAO treasury.
|
|
238
|
+
*
|
|
239
|
+
* The caller must have approved the DAO contract to spend `amount` Tokens
|
|
240
|
+
* on ClawToken first. This service calls `ClawToken.transfer(daoAddress, amount)`.
|
|
241
|
+
*/
|
|
242
|
+
treasuryDeposit(amount: number): Promise<TreasuryDepositResult>;
|
|
243
|
+
}
|
|
244
|
+
export {};
|
|
245
|
+
//# sourceMappingURL=dao-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dao-service.d.ts","sourceRoot":"","sources":["../../src/services/dao-service.ts"],"names":[],"mappings":"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"}
|