@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,250 @@
1
+ /**
2
+ * IndexerStore SQLite persistence for the Event Indexer.
3
+ *
4
+ * Manages all on-chain event data:
5
+ * - Generic `events` table (raw event log)
6
+ * - Module-specific materialized tables (transfers, contracts, proposals, votes, reviews, escrows)
7
+ * - Indexer metadata (last indexed block, etc.)
8
+ *
9
+ * Uses `better-sqlite3` for synchronous, single-connection access
10
+ * ideal for a single-node daemon where reads and writes are serialised.
11
+ */
12
+ import Database from 'better-sqlite3';
13
+ // ---------------------------------------------------------------------------
14
+ // Schema DDL
15
+ // ---------------------------------------------------------------------------
16
+ const SCHEMA_SQL = `
17
+ -- Indexer metadata (last indexed block, etc.)
18
+ CREATE TABLE IF NOT EXISTS indexer_meta (
19
+ key TEXT PRIMARY KEY,
20
+ value TEXT NOT NULL
21
+ );
22
+
23
+ -- Generic event log (all contracts, all events)
24
+ CREATE TABLE IF NOT EXISTS events (
25
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
26
+ block INTEGER NOT NULL,
27
+ tx_hash TEXT NOT NULL,
28
+ log_index INTEGER NOT NULL,
29
+ contract TEXT NOT NULL,
30
+ event_name TEXT NOT NULL,
31
+ args TEXT NOT NULL,
32
+ timestamp INTEGER NOT NULL,
33
+ UNIQUE(tx_hash, log_index)
34
+ );
35
+ CREATE INDEX IF NOT EXISTS idx_events_block ON events(block);
36
+ CREATE INDEX IF NOT EXISTS idx_events_contract ON events(contract, event_name);
37
+
38
+ -- Wallet: Token transfer history
39
+ CREATE TABLE IF NOT EXISTS wallet_transfers (
40
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
41
+ block INTEGER NOT NULL,
42
+ tx_hash TEXT NOT NULL,
43
+ from_addr TEXT NOT NULL,
44
+ to_addr TEXT NOT NULL,
45
+ amount TEXT NOT NULL,
46
+ timestamp INTEGER NOT NULL
47
+ );
48
+ CREATE INDEX IF NOT EXISTS idx_transfers_from ON wallet_transfers(from_addr);
49
+ CREATE INDEX IF NOT EXISTS idx_transfers_to ON wallet_transfers(to_addr);
50
+
51
+ -- Wallet: Escrow records
52
+ CREATE TABLE IF NOT EXISTS escrows (
53
+ escrow_id TEXT PRIMARY KEY,
54
+ depositor TEXT NOT NULL,
55
+ beneficiary TEXT NOT NULL,
56
+ arbiter TEXT NOT NULL,
57
+ amount TEXT NOT NULL,
58
+ status INTEGER NOT NULL DEFAULT 0,
59
+ created_at INTEGER NOT NULL,
60
+ updated_at INTEGER NOT NULL
61
+ );
62
+
63
+ -- Service contracts
64
+ CREATE TABLE IF NOT EXISTS service_contracts (
65
+ contract_id TEXT PRIMARY KEY,
66
+ client TEXT NOT NULL,
67
+ provider TEXT NOT NULL,
68
+ status INTEGER NOT NULL,
69
+ created_at INTEGER NOT NULL,
70
+ updated_at INTEGER NOT NULL
71
+ );
72
+ CREATE INDEX IF NOT EXISTS idx_svc_client ON service_contracts(client);
73
+ CREATE INDEX IF NOT EXISTS idx_svc_provider ON service_contracts(provider);
74
+ CREATE INDEX IF NOT EXISTS idx_svc_status ON service_contracts(status);
75
+
76
+ -- DAO proposals
77
+ CREATE TABLE IF NOT EXISTS proposals (
78
+ proposal_id INTEGER PRIMARY KEY,
79
+ proposer TEXT NOT NULL,
80
+ p_type INTEGER NOT NULL,
81
+ status INTEGER NOT NULL,
82
+ created_at INTEGER NOT NULL
83
+ );
84
+
85
+ -- DAO votes
86
+ CREATE TABLE IF NOT EXISTS votes (
87
+ proposal_id INTEGER NOT NULL,
88
+ voter TEXT NOT NULL,
89
+ support INTEGER NOT NULL,
90
+ weight TEXT NOT NULL,
91
+ timestamp INTEGER NOT NULL,
92
+ PRIMARY KEY(proposal_id, voter)
93
+ );
94
+
95
+ -- Reputation reviews
96
+ CREATE TABLE IF NOT EXISTS reviews (
97
+ review_hash TEXT PRIMARY KEY,
98
+ reviewer_did TEXT NOT NULL,
99
+ subject_did TEXT NOT NULL,
100
+ related_tx_hash TEXT NOT NULL,
101
+ timestamp INTEGER NOT NULL
102
+ );
103
+ CREATE INDEX IF NOT EXISTS idx_reviews_subject ON reviews(subject_did);
104
+
105
+ -- DID cache (identity module)
106
+ CREATE TABLE IF NOT EXISTS did_cache (
107
+ did_hash TEXT PRIMARY KEY,
108
+ controller TEXT NOT NULL,
109
+ active_key TEXT NOT NULL,
110
+ is_active INTEGER NOT NULL DEFAULT 1,
111
+ updated_at INTEGER NOT NULL
112
+ );
113
+ `;
114
+ // ---------------------------------------------------------------------------
115
+ // IndexerStore
116
+ // ---------------------------------------------------------------------------
117
+ export class IndexerStore {
118
+ _db;
119
+ constructor(dbPath) {
120
+ this._db = new Database(dbPath);
121
+ this._db.pragma('journal_mode = WAL');
122
+ this._db.pragma('foreign_keys = ON');
123
+ this._db.exec(SCHEMA_SQL);
124
+ }
125
+ /** Expose the underlying Database instance (for IndexerQuery). */
126
+ get database() {
127
+ return this._db;
128
+ }
129
+ // ── Metadata ────────────────────────────────────────────────────────────
130
+ getMeta(key) {
131
+ const row = this._db
132
+ .prepare('SELECT value FROM indexer_meta WHERE key = ?')
133
+ .get(key);
134
+ return row?.value;
135
+ }
136
+ setMeta(key, value) {
137
+ this._db
138
+ .prepare('INSERT INTO indexer_meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value')
139
+ .run(key, value);
140
+ }
141
+ get lastIndexedBlock() {
142
+ const val = this.getMeta('last_indexed_block');
143
+ return val ? Number(val) : 0;
144
+ }
145
+ set lastIndexedBlock(block) {
146
+ this.setMeta('last_indexed_block', String(block));
147
+ }
148
+ // ── Generic events ──────────────────────────────────────────────────────
149
+ insertEvent(event) {
150
+ this._db
151
+ .prepare(`INSERT OR IGNORE INTO events (block, tx_hash, log_index, contract, event_name, args, timestamp)
152
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
153
+ .run(event.block, event.txHash, event.logIndex, event.contract, event.eventName, event.args, event.timestamp);
154
+ }
155
+ // ── Wallet transfers ────────────────────────────────────────────────────
156
+ insertTransfer(t) {
157
+ this._db
158
+ .prepare(`INSERT INTO wallet_transfers (block, tx_hash, from_addr, to_addr, amount, timestamp)
159
+ VALUES (?, ?, ?, ?, ?, ?)`)
160
+ .run(t.block, t.txHash, t.fromAddr, t.toAddr, t.amount, t.timestamp);
161
+ }
162
+ // ── Escrows ─────────────────────────────────────────────────────────────
163
+ upsertEscrow(e) {
164
+ this._db
165
+ .prepare(`INSERT INTO escrows (escrow_id, depositor, beneficiary, arbiter, amount, status, created_at, updated_at)
166
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
167
+ ON CONFLICT(escrow_id) DO UPDATE SET
168
+ status = excluded.status,
169
+ amount = excluded.amount,
170
+ updated_at = excluded.updated_at`)
171
+ .run(e.escrowId, e.depositor, e.beneficiary, e.arbiter, e.amount, e.status, e.createdAt, e.updatedAt);
172
+ }
173
+ updateEscrowStatus(escrowId, status, updatedAt) {
174
+ this._db
175
+ .prepare('UPDATE escrows SET status = ?, updated_at = ? WHERE escrow_id = ?')
176
+ .run(status, updatedAt, escrowId);
177
+ }
178
+ updateEscrowAmount(escrowId, amount, updatedAt) {
179
+ this._db
180
+ .prepare('UPDATE escrows SET amount = ?, updated_at = ? WHERE escrow_id = ?')
181
+ .run(amount, updatedAt, escrowId);
182
+ }
183
+ // ── Service contracts ───────────────────────────────────────────────────
184
+ upsertServiceContract(c) {
185
+ this._db
186
+ .prepare(`INSERT INTO service_contracts (contract_id, client, provider, status, created_at, updated_at)
187
+ VALUES (?, ?, ?, ?, ?, ?)
188
+ ON CONFLICT(contract_id) DO UPDATE SET
189
+ status = excluded.status,
190
+ updated_at = excluded.updated_at`)
191
+ .run(c.contractId, c.client, c.provider, c.status, c.createdAt, c.updatedAt);
192
+ }
193
+ updateServiceContractStatus(contractId, status, updatedAt) {
194
+ this._db
195
+ .prepare('UPDATE service_contracts SET status = ?, updated_at = ? WHERE contract_id = ?')
196
+ .run(status, updatedAt, contractId);
197
+ }
198
+ // ── DAO proposals ───────────────────────────────────────────────────────
199
+ upsertProposal(p) {
200
+ this._db
201
+ .prepare(`INSERT INTO proposals (proposal_id, proposer, p_type, status, created_at)
202
+ VALUES (?, ?, ?, ?, ?)
203
+ ON CONFLICT(proposal_id) DO UPDATE SET
204
+ status = excluded.status`)
205
+ .run(p.proposalId, p.proposer, p.pType, p.status, p.createdAt);
206
+ }
207
+ updateProposalStatus(proposalId, status) {
208
+ this._db
209
+ .prepare('UPDATE proposals SET status = ? WHERE proposal_id = ?')
210
+ .run(status, proposalId);
211
+ }
212
+ // ── DAO votes ───────────────────────────────────────────────────────────
213
+ insertVote(v) {
214
+ this._db
215
+ .prepare(`INSERT OR IGNORE INTO votes (proposal_id, voter, support, weight, timestamp)
216
+ VALUES (?, ?, ?, ?, ?)`)
217
+ .run(v.proposalId, v.voter, v.support, v.weight, v.timestamp);
218
+ }
219
+ // ── Reputation reviews ──────────────────────────────────────────────────
220
+ insertReview(r) {
221
+ this._db
222
+ .prepare(`INSERT OR IGNORE INTO reviews (review_hash, reviewer_did, subject_did, related_tx_hash, timestamp)
223
+ VALUES (?, ?, ?, ?, ?)`)
224
+ .run(r.reviewHash, r.reviewerDid, r.subjectDid, r.relatedTxHash, r.timestamp);
225
+ }
226
+ // ── DID cache ───────────────────────────────────────────────────────────
227
+ upsertDid(didHash, controller, activeKey, isActive, updatedAt) {
228
+ // When controller or activeKey is empty, preserve the existing value
229
+ // (e.g. KeyRotated only updates the key, DIDRevoked only updates is_active).
230
+ this._db
231
+ .prepare(`INSERT INTO did_cache (did_hash, controller, active_key, is_active, updated_at)
232
+ VALUES (?, ?, ?, ?, ?)
233
+ ON CONFLICT(did_hash) DO UPDATE SET
234
+ controller = CASE WHEN excluded.controller = '' THEN did_cache.controller ELSE excluded.controller END,
235
+ active_key = CASE WHEN excluded.active_key = '' THEN did_cache.active_key ELSE excluded.active_key END,
236
+ is_active = excluded.is_active,
237
+ updated_at = excluded.updated_at`)
238
+ .run(didHash, controller, activeKey, isActive ? 1 : 0, updatedAt);
239
+ }
240
+ // ── Transaction helper ──────────────────────────────────────────────────
241
+ /** Execute a batch of operations inside a single SQLite transaction. */
242
+ transaction(fn) {
243
+ return this._db.transaction(fn)();
244
+ }
245
+ // ── Lifecycle ───────────────────────────────────────────────────────────
246
+ close() {
247
+ this._db.close();
248
+ }
249
+ }
250
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/indexer/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ interface LoggerOptions {
3
+ level?: LogLevel;
4
+ file?: string;
5
+ }
6
+ export declare function createLogger(options?: LoggerOptions): {
7
+ debug: (...args: unknown[]) => void;
8
+ info: (...args: unknown[]) => void;
9
+ warn: (...args: unknown[]) => void;
10
+ error: (...args: unknown[]) => void;
11
+ };
12
+ export {};
13
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB;qBAuBnC,OAAO,EAAE;oBACV,OAAO,EAAE;oBACT,OAAO,EAAE;qBACR,OAAO,EAAE;EAE7B"}
package/dist/logger.js ADDED
@@ -0,0 +1,37 @@
1
+ import { appendFile } from 'node:fs/promises';
2
+ import { format } from 'node:util';
3
+ const LEVEL_ORDER = {
4
+ debug: 10,
5
+ info: 20,
6
+ warn: 30,
7
+ error: 40,
8
+ };
9
+ export function createLogger(options = {}) {
10
+ const minLevel = options.level ?? 'info';
11
+ const minValue = LEVEL_ORDER[minLevel] ?? LEVEL_ORDER.info;
12
+ const filePath = options.file;
13
+ const log = (level, ...args) => {
14
+ if (LEVEL_ORDER[level] < minValue) {
15
+ return;
16
+ }
17
+ const timestamp = new Date().toISOString();
18
+ const message = format(...args);
19
+ const line = `[${timestamp}] [${level.toUpperCase()}] ${message}`;
20
+ if (level === 'error') {
21
+ console.error(line);
22
+ }
23
+ else {
24
+ console.log(line);
25
+ }
26
+ if (filePath) {
27
+ void appendFile(filePath, `${line}\n`, 'utf8');
28
+ }
29
+ };
30
+ return {
31
+ debug: (...args) => log('debug', ...args),
32
+ info: (...args) => log('info', ...args),
33
+ warn: (...args) => log('warn', ...args),
34
+ error: (...args) => log('error', ...args),
35
+ };
36
+ }
37
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AASnC,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,QAAQ,GAAa,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9B,MAAM,GAAG,GAAG,CAAC,KAAe,EAAE,GAAG,IAAe,EAAQ,EAAE;QACxD,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QAClE,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;QACpD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;QAClD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;QAClD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { EventStore, P2PNode, SnapshotRecord, SnapshotStore } from '@claw-network/core';
2
+ export type SybilPolicy = 'none' | 'allowlist' | 'pow' | 'stake';
3
+ export interface P2PSyncConfig {
4
+ maxEnvelopeBytes: number;
5
+ maxRangeLimit: number;
6
+ maxRangeBytes: number;
7
+ maxSnapshotBytes: number;
8
+ maxSnapshotTotalBytes: number;
9
+ minSnapshotSignatures: number;
10
+ rateLimitWindowMs: number;
11
+ maxMessagesPerWindow: number;
12
+ maxBytesPerWindow: number;
13
+ minPeerScore: number;
14
+ scoreIncrease: number;
15
+ scoreDecrease: number;
16
+ scoreDecayMs: number;
17
+ sybilPolicy: SybilPolicy;
18
+ allowlist: string[];
19
+ powTicketTtlMs: number;
20
+ stakeProofTtlMs: number;
21
+ minPowDifficulty: number;
22
+ verifySignatures: boolean;
23
+ verifyEventHash: boolean;
24
+ verifySnapshotHash: boolean;
25
+ verifySnapshotSignatures: boolean;
26
+ verifySnapshotState: boolean;
27
+ verifyPeerId: boolean;
28
+ subscribeEvents: boolean;
29
+ }
30
+ export interface P2PSyncOptions extends Partial<P2PSyncConfig> {
31
+ peerId: string;
32
+ peerPrivateKey: Uint8Array;
33
+ resolvePeerPublicKey?: (peerId: string) => Promise<Uint8Array | null>;
34
+ resolveControllerPublicKey?: (controllerDid: string) => Promise<Uint8Array | null>;
35
+ onEventApplied?: (envelope: Record<string, unknown>, bytes: Uint8Array) => Promise<void> | void;
36
+ validateSnapshotState?: (snapshot: SnapshotRecord, events: Uint8Array[]) => Promise<boolean> | boolean;
37
+ }
38
+ export declare const DEFAULT_P2P_SYNC_CONFIG: P2PSyncConfig;
39
+ export declare class P2PSync {
40
+ private readonly node;
41
+ private readonly eventStore;
42
+ private readonly snapshotStore;
43
+ private readonly options;
44
+ private readonly config;
45
+ private readonly resolvePeerPublicKey?;
46
+ private readonly resolveControllerPublicKey?;
47
+ private readonly onEventApplied?;
48
+ private readonly validateSnapshotState?;
49
+ private unsubscribeRequests?;
50
+ private unsubscribeResponses?;
51
+ private unsubscribeEvents?;
52
+ private unsubscribeMarketEvents?;
53
+ private readonly snapshotChunks;
54
+ private readonly snapshotChunkTtlMs;
55
+ private readonly allowlist;
56
+ private readonly powTickets;
57
+ private readonly stakeProofs;
58
+ private readonly peerStats;
59
+ private readonly peerScores;
60
+ private readonly peerRotations;
61
+ constructor(node: P2PNode, eventStore: EventStore, snapshotStore: SnapshotStore | null, options: P2PSyncOptions);
62
+ start(): Promise<void>;
63
+ stop(): Promise<void>;
64
+ requestRange(from: string, limit?: number): Promise<void>;
65
+ requestSnapshot(from?: string): Promise<void>;
66
+ private publishRequest;
67
+ private publishResponse;
68
+ private signEnvelope;
69
+ private handleRequest;
70
+ private handleResponse;
71
+ private handleEventEnvelope;
72
+ private handleRangeRequest;
73
+ private handleSnapshotRequest;
74
+ private applyRangeResponse;
75
+ private applySnapshotResponse;
76
+ private applyEventBytes;
77
+ private parseEventEnvelope;
78
+ private decodeRequest;
79
+ private decodeResponse;
80
+ private decodeEnvelope;
81
+ private resolvePublicKey;
82
+ private handlePowTicket;
83
+ private handleStakeProof;
84
+ private handlePeerRotate;
85
+ private isPeerEligible;
86
+ private isPowEligible;
87
+ private isStakeEligible;
88
+ private cleanupSybilCaches;
89
+ private collectSnapshotBytes;
90
+ /**
91
+ * Collect all events between two event-hash cursors.
92
+ *
93
+ * @param fromHash Event hash to start after (exclusive). null = start of log.
94
+ * @param toHash Event hash to stop at (inclusive). Must be an event hash
95
+ * present in the event store so the cursor comparison works.
96
+ * @returns Array of raw event bytes, or null if collection failed.
97
+ */
98
+ private collectEventsForSnapshot;
99
+ private cleanupSnapshotChunks;
100
+ private isRateLimited;
101
+ private updatePeerScore;
102
+ private isPeerScoreEligible;
103
+ private verifyPeerId;
104
+ }
105
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/p2p/sync.ts"],"names":[],"mappings":"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"}