@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,167 @@
1
+ /**
2
+ * ContractProvider — manages ethers.js Provider, Signer, and typed contract instances.
3
+ *
4
+ * Loads ABIs from hardhat artifacts at startup, resolves a Signer from the
5
+ * configured key source, and exposes contract accessors for each ClawNet
6
+ * Solidity contract.
7
+ */
8
+ import { readFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { Contract, HDNodeWallet, JsonRpcProvider, NonceManager, Wallet, } from 'ethers';
11
+ import { CONTRACT_KEYS, CONTRACT_NAMES, } from './chain-config.js';
12
+ // ---------------------------------------------------------------------------
13
+ // ABI loading
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Load a single contract ABI from the hardhat artifacts directory.
17
+ *
18
+ * @param contractName Solidity contract name (e.g. `ClawToken`)
19
+ * @param artifactsDir Path to `packages/contracts/artifacts`
20
+ */
21
+ function loadAbi(contractName, artifactsDir) {
22
+ const artifactPath = join(artifactsDir, 'contracts', `${contractName}.sol`, `${contractName}.json`);
23
+ const raw = readFileSync(artifactPath, 'utf-8');
24
+ const artifact = JSON.parse(raw);
25
+ return artifact.abi;
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // ContractProvider
29
+ // ---------------------------------------------------------------------------
30
+ export class ContractProvider {
31
+ config;
32
+ provider;
33
+ signer;
34
+ _signerAddress;
35
+ instances = new Map();
36
+ constructor(config) {
37
+ this.config = config;
38
+ this.provider = new JsonRpcProvider(config.rpcUrl, {
39
+ chainId: config.chainId,
40
+ name: 'clawnet',
41
+ });
42
+ const resolved = this.resolveSigner();
43
+ this.signer = resolved.signer;
44
+ this._signerAddress = resolved.address;
45
+ this.initContracts();
46
+ }
47
+ // ── Typed accessors ─────────────────────────────────────────────────────
48
+ /** ClawToken (ERC-20) */
49
+ get token() {
50
+ return this.get('token');
51
+ }
52
+ /** ClawEscrow */
53
+ get escrow() {
54
+ return this.get('escrow');
55
+ }
56
+ /** ClawIdentity (DID registry) */
57
+ get identity() {
58
+ return this.get('identity');
59
+ }
60
+ /** ClawReputation */
61
+ get reputation() {
62
+ return this.get('reputation');
63
+ }
64
+ /** ClawContracts (service contract lifecycle) */
65
+ get serviceContracts() {
66
+ return this.get('contracts');
67
+ }
68
+ /** ClawDAO (governance) */
69
+ get dao() {
70
+ return this.get('dao');
71
+ }
72
+ /** ClawStaking */
73
+ get staking() {
74
+ return this.get('staking');
75
+ }
76
+ /** ParamRegistry (governance parameters) */
77
+ get paramRegistry() {
78
+ return this.get('paramRegistry');
79
+ }
80
+ // ── Utility ─────────────────────────────────────────────────────────────
81
+ /** Retrieve a contract by config key. Throws if not initialised. */
82
+ get(key) {
83
+ const c = this.instances.get(key);
84
+ if (!c) {
85
+ throw new Error(`Contract "${key}" (${CONTRACT_NAMES[key]}) is not initialised. ` +
86
+ 'Ensure the ABI is available and the address is configured.');
87
+ }
88
+ return c;
89
+ }
90
+ /** Current block number on the connected chain. */
91
+ async getBlockNumber() {
92
+ return this.provider.getBlockNumber();
93
+ }
94
+ /** Returns the address of the node's signer. */
95
+ get signerAddress() {
96
+ return this._signerAddress;
97
+ }
98
+ /** Tear down provider connection. */
99
+ async destroy() {
100
+ try {
101
+ this.provider.destroy();
102
+ }
103
+ catch {
104
+ // Ignore errors from pending requests being cancelled
105
+ }
106
+ }
107
+ // ── Internal helpers ────────────────────────────────────────────────────
108
+ resolveSigner() {
109
+ const { signer: cfg } = this.config;
110
+ const wrapWallet = (wallet) => ({
111
+ signer: new NonceManager(wallet),
112
+ address: wallet.address,
113
+ });
114
+ switch (cfg.type) {
115
+ case 'keyfile': {
116
+ const raw = readFileSync(cfg.path, 'utf-8').trim();
117
+ // Support both a raw hex key file and a JSON { "privateKey": "0x..." } file.
118
+ let privateKey;
119
+ try {
120
+ const parsed = JSON.parse(raw);
121
+ privateKey = parsed.privateKey ?? raw;
122
+ }
123
+ catch {
124
+ privateKey = raw;
125
+ }
126
+ return wrapWallet(new Wallet(privateKey, this.provider));
127
+ }
128
+ case 'env': {
129
+ const pk = process.env[cfg.envVar];
130
+ if (!pk) {
131
+ throw new Error(`Signer env var "${cfg.envVar}" is not set. ` +
132
+ 'Set it to a hex-encoded private key (with 0x prefix).');
133
+ }
134
+ return wrapWallet(new Wallet(pk, this.provider));
135
+ }
136
+ case 'mnemonic': {
137
+ const phrase = process.env[cfg.envVar];
138
+ if (!phrase) {
139
+ throw new Error(`Mnemonic env var "${cfg.envVar}" is not set.`);
140
+ }
141
+ const path = `m/44'/60'/0'/0/${cfg.index}`;
142
+ const hd = HDNodeWallet.fromPhrase(phrase, undefined, path);
143
+ return wrapWallet(new Wallet(hd.privateKey, this.provider));
144
+ }
145
+ }
146
+ }
147
+ initContracts() {
148
+ const { contracts: addresses, artifactsDir } = this.config;
149
+ for (const key of CONTRACT_KEYS) {
150
+ const address = addresses[key];
151
+ if (!address)
152
+ continue;
153
+ const contractName = CONTRACT_NAMES[key];
154
+ try {
155
+ const abi = loadAbi(contractName, artifactsDir);
156
+ this.instances.set(key, new Contract(address, abi, this.signer));
157
+ }
158
+ catch (err) {
159
+ // ABI not found — contract will be unavailable at runtime.
160
+ // This is acceptable for partially-deployed environments.
161
+ const msg = err instanceof Error ? err.message : String(err);
162
+ console.warn(`[ContractProvider] Skipping ${contractName}: ABI not loaded (${msg})`);
163
+ }
164
+ }
165
+ }
166
+ }
167
+ //# sourceMappingURL=contract-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-provider.js","sourceRoot":"","sources":["../../src/services/contract-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
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 { createLogger } from '../logger.js';
19
+ import type { ContractProvider } from './contract-provider.js';
20
+ import type { IndexerQuery } from '../indexer/query.js';
21
+ type Logger = ReturnType<typeof createLogger>;
22
+ export declare enum ContractStatus {
23
+ Draft = 0,
24
+ Signed = 1,
25
+ Active = 2,
26
+ Completed = 3,
27
+ Disputed = 4,
28
+ Terminated = 5,
29
+ Cancelled = 6
30
+ }
31
+ export declare enum MilestoneStatus {
32
+ Pending = 0,
33
+ Submitted = 1,
34
+ Approved = 2,
35
+ Rejected = 3
36
+ }
37
+ export declare enum DisputeResolution {
38
+ FavorProvider = 0,
39
+ FavorClient = 1,
40
+ Resume = 2
41
+ }
42
+ export interface ServiceContractView {
43
+ contractId: string;
44
+ client: string;
45
+ provider: string;
46
+ arbiter: string;
47
+ totalAmount: number;
48
+ fundedAmount: number;
49
+ releasedAmount: number;
50
+ termsHash: string;
51
+ milestoneCount: number;
52
+ status: ContractStatus;
53
+ createdAt: number;
54
+ deadline: number;
55
+ clientSigned: boolean;
56
+ providerSigned: boolean;
57
+ }
58
+ export interface MilestoneView {
59
+ index: number;
60
+ amount: number;
61
+ deliverableHash: string;
62
+ status: MilestoneStatus;
63
+ deadline: number;
64
+ }
65
+ export interface ContractCreateResult {
66
+ txHash: string;
67
+ contractId: string;
68
+ status: string;
69
+ timestamp: number;
70
+ }
71
+ export interface ContractTxResult {
72
+ txHash: string;
73
+ contractId: string;
74
+ status: string;
75
+ timestamp: number;
76
+ }
77
+ export interface MilestoneTxResult {
78
+ txHash: string;
79
+ contractId: string;
80
+ milestoneIndex: number;
81
+ status: string;
82
+ timestamp: number;
83
+ }
84
+ export interface ContractListResult {
85
+ contracts: ServiceContractListItem[];
86
+ total: number;
87
+ pagination: {
88
+ limit: number;
89
+ offset: number;
90
+ hasMore: boolean;
91
+ };
92
+ }
93
+ export interface ServiceContractListItem {
94
+ contractId: string;
95
+ client: string;
96
+ provider: string;
97
+ status: number;
98
+ createdAt: number;
99
+ updatedAt: number;
100
+ }
101
+ export declare class ContractsService {
102
+ private readonly contracts;
103
+ private readonly indexer?;
104
+ private readonly log;
105
+ constructor(contracts: ContractProvider, indexer?: IndexerQuery | undefined, logger?: Logger);
106
+ /** Hash an opaque string to bytes32 (contract ID, terms, evidence, etc.) */
107
+ private hash;
108
+ /**
109
+ * Fetch a single contract from the chain.
110
+ *
111
+ * @param contractId Opaque REST-layer contract ID.
112
+ */
113
+ getContract(contractId: string): Promise<ServiceContractView | null>;
114
+ /**
115
+ * Fetch all milestones for a contract from the chain.
116
+ */
117
+ getMilestones(contractId: string): Promise<MilestoneView[]>;
118
+ /**
119
+ * List contracts from the indexer (paginated, filterable).
120
+ */
121
+ listContracts(opts?: {
122
+ address?: string;
123
+ status?: number;
124
+ limit?: number;
125
+ offset?: number;
126
+ }): ContractListResult | null;
127
+ /**
128
+ * Calculate the platform fee for a given amount.
129
+ */
130
+ calculateFee(amount: number): Promise<number>;
131
+ /**
132
+ * Create a new service contract on-chain.
133
+ */
134
+ createContract(params: {
135
+ contractId: string;
136
+ provider: string;
137
+ arbiter: string;
138
+ totalAmount: number;
139
+ termsHash: string;
140
+ deadline: number;
141
+ milestoneAmounts: number[];
142
+ milestoneDeadlines: number[];
143
+ }): Promise<ContractCreateResult>;
144
+ /**
145
+ * Sign a contract (both client & provider must call).
146
+ */
147
+ signContract(contractId: string): Promise<ContractTxResult>;
148
+ /**
149
+ * Fund and activate a contract.
150
+ * The caller (client) must have approved (totalAmount + fee) Tokens
151
+ * on ClawToken before calling this.
152
+ */
153
+ activateContract(contractId: string): Promise<ContractTxResult>;
154
+ /**
155
+ * Submit a milestone deliverable (provider only).
156
+ *
157
+ * @param envelopeDigest Pre-computed BLAKE3(JCS(envelope)) hex — passed
158
+ * directly to the contract with **no** re-hashing. Callers compute the
159
+ * digest themselves (see `envelopeDigest()` in @claw-network/core).
160
+ */
161
+ submitMilestone(contractId: string, index: number, envelopeDigest: string): Promise<MilestoneTxResult>;
162
+ /**
163
+ * Approve a submitted milestone (client / arbiter).
164
+ */
165
+ approveMilestone(contractId: string, index: number): Promise<MilestoneTxResult>;
166
+ /**
167
+ * Reject a submitted milestone (client / arbiter).
168
+ */
169
+ rejectMilestone(contractId: string, index: number, reason: string): Promise<MilestoneTxResult>;
170
+ /**
171
+ * Complete a contract (all milestones must be approved).
172
+ */
173
+ completeContract(contractId: string): Promise<ContractTxResult>;
174
+ /**
175
+ * Raise a dispute on an active contract.
176
+ */
177
+ disputeContract(contractId: string, evidence: string): Promise<ContractTxResult>;
178
+ /**
179
+ * Resolve a dispute (arbiter only).
180
+ */
181
+ resolveDispute(contractId: string, resolution: DisputeResolution): Promise<ContractTxResult>;
182
+ /**
183
+ * Terminate an active or disputed contract (refunds remaining funds).
184
+ */
185
+ terminateContract(contractId: string, reason: string): Promise<ContractTxResult>;
186
+ /**
187
+ * Cancel a pre-funded contract (Draft or Signed).
188
+ */
189
+ cancelContract(contractId: string): Promise<ContractTxResult>;
190
+ }
191
+ export {};
192
+ //# sourceMappingURL=contracts-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts-service.d.ts","sourceRoot":"","sources":["../../src/services/contracts-service.ts"],"names":[],"mappings":"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"}