@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,65 @@
1
+ /**
2
+ * Nonce routes — /api/v1/nonce
3
+ *
4
+ * Returns the EVM transaction count (nonce) for the address
5
+ * derived from a DID or for a raw 0x… address.
6
+ */
7
+ import { Router } from '../router.js';
8
+ import { ok, badRequest, notFound, internalError } from '../response.js';
9
+ import { isValidDid } from '../types.js';
10
+ import { deriveAddressForDid } from '../../services/identity-service.js';
11
+ /**
12
+ * Resolve the input (DID or 0x address) to an EVM address.
13
+ *
14
+ * - `did:claw:…` → on-chain identity lookup (controller), fallback to
15
+ * deterministic derivation.
16
+ * - `0x…` → pass through.
17
+ */
18
+ async function resolveToEvmAddress(ctx, input) {
19
+ if (/^0x[0-9a-fA-F]{40}$/.test(input))
20
+ return input;
21
+ if (input.startsWith('did:claw:')) {
22
+ // Try on-chain registry first
23
+ if (ctx.walletService) {
24
+ const addr = await ctx.walletService.resolveDidToAddress(input);
25
+ if (addr)
26
+ return addr;
27
+ }
28
+ // Fallback to deterministic derivation
29
+ return deriveAddressForDid(input);
30
+ }
31
+ return null;
32
+ }
33
+ export function nonceRoutes(ctx) {
34
+ const r = new Router();
35
+ // ── GET /:did — transaction nonce for a DID / address ─────────
36
+ r.get('/:did', async (_req, res, route) => {
37
+ const { did } = route.params;
38
+ if (!isValidDid(did) && !/^0x[0-9a-fA-F]{40}$/.test(did)) {
39
+ badRequest(res, 'Invalid DID or EVM address', route.url.pathname);
40
+ return;
41
+ }
42
+ if (!ctx.walletService) {
43
+ internalError(res, 'Wallet service unavailable');
44
+ return;
45
+ }
46
+ const evmAddr = await resolveToEvmAddress(ctx, did);
47
+ if (!evmAddr) {
48
+ notFound(res, 'Could not resolve address for the given DID', route.url.pathname);
49
+ return;
50
+ }
51
+ try {
52
+ const result = await ctx.walletService.getNonce(evmAddr);
53
+ ok(res, {
54
+ did: did.startsWith('did:claw:') ? did : undefined,
55
+ address: result.address,
56
+ nonce: result.nonce,
57
+ }, { self: `/api/v1/nonce/${encodeURIComponent(did)}` });
58
+ }
59
+ catch (err) {
60
+ internalError(res, err.message);
61
+ }
62
+ });
63
+ return r;
64
+ }
65
+ //# sourceMappingURL=nonce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonce.js","sourceRoot":"","sources":["../../../src/api/routes/nonce.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;;GAMG;AACH,KAAK,UAAU,mBAAmB,CAChC,GAAmB,EACnB,KAAa;IAEb,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpD,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,8BAA8B;QAC9B,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAChE,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACxB,CAAC;QACD,uCAAuC;QACvC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAmB;IAC7C,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;IAEvB,iEAAiE;IACjE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACxC,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QAE7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,UAAU,CAAC,GAAG,EAAE,4BAA4B,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,EAAE,6CAA6C,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzD,EAAE,CACA,GAAG,EACH;gBACE,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;gBAClD,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,EACD,EAAE,IAAI,EAAE,iBAAiB,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,CACrD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,aAAa,CAAC,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Reputation routes — /api/v1/reputations
3
+ */
4
+ import { Router } from '../router.js';
5
+ import type { RuntimeContext } from '../types.js';
6
+ export declare function reputationRoutes(ctx: RuntimeContext): Router;
7
+ //# sourceMappingURL=reputations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputations.d.ts","sourceRoot":"","sources":["../../../src/api/routes/reputations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAyN5D"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Reputation routes — /api/v1/reputations
3
+ */
4
+ import { Router } from '../router.js';
5
+ import { ok, created, badRequest, notFound, internalError, paginated, parsePagination } from '../response.js';
6
+ import { validate } from '../schemas/common.js';
7
+ import { ReputationRecordSchema } from '../schemas/markets.js';
8
+ import { isValidDid, resolvePrivateKey } from '../types.js';
9
+ import { createReputationRecordEnvelope, createReputationState, applyReputationEvent, buildReputationProfile, getReputationRecords, } from '@claw-network/protocol';
10
+ import { parseEvent } from '../legacy.js';
11
+ export function reputationRoutes(ctx) {
12
+ const r = new Router();
13
+ // ── GET /:did — reputation profile ────────────────────────────
14
+ r.get('/:did', async (_req, res, route) => {
15
+ const { did } = route.params;
16
+ if (!isValidDid(did)) {
17
+ badRequest(res, 'Invalid DID', route.url.pathname);
18
+ return;
19
+ }
20
+ // On-chain
21
+ if (ctx.reputationService) {
22
+ try {
23
+ const profile = await ctx.reputationService.getProfile(did);
24
+ if (profile) {
25
+ const p = profile;
26
+ ok(res, {
27
+ did,
28
+ score: p.score ?? p.overallScore ?? 0,
29
+ level: 'anchored',
30
+ dimensions: profile.dimensions ?? {},
31
+ epoch: profile.epoch ?? 0,
32
+ merkleRoot: profile.merkleRoot ?? '',
33
+ timestamp: profile.timestamp ?? Date.now(),
34
+ }, { self: `/api/v1/reputations/${did}` });
35
+ return;
36
+ }
37
+ }
38
+ catch { /* fallthrough */ }
39
+ }
40
+ // Legacy: reputationStore or eventStore
41
+ if (ctx.reputationStore) {
42
+ try {
43
+ const profile = await ctx.reputationStore.getProfile(did);
44
+ if (profile) {
45
+ ok(res, profile, { self: `/api/v1/reputations/${did}` });
46
+ return;
47
+ }
48
+ }
49
+ catch { /* fallthrough */ }
50
+ }
51
+ if (!ctx.eventStore) {
52
+ notFound(res, `No reputation data for ${did}`);
53
+ return;
54
+ }
55
+ let state = createReputationState();
56
+ let cursor = null;
57
+ for (;;) {
58
+ const { events, cursor: next } = await ctx.eventStore.getEventLogRange(cursor, 200);
59
+ if (!events.length)
60
+ break;
61
+ for (const bytes of events) {
62
+ const envelope = parseEvent(bytes);
63
+ if (envelope)
64
+ state = applyReputationEvent(state, envelope);
65
+ }
66
+ if (!next)
67
+ break;
68
+ cursor = next;
69
+ }
70
+ const profile = buildReputationProfile(state, did);
71
+ const p = profile;
72
+ ok(res, {
73
+ did,
74
+ score: p.overallScore ?? p.score ?? 0,
75
+ level: p.level ?? 'none',
76
+ dimensions: p.dimensions ?? {},
77
+ updatedAt: p.updatedAt ?? Date.now(),
78
+ }, { self: `/api/v1/reputations/${did}` });
79
+ });
80
+ // ── GET /:did/reviews — reviews for a DID ────────────────────
81
+ r.get('/:did/reviews', async (_req, res, route) => {
82
+ const { did } = route.params;
83
+ if (!isValidDid(did)) {
84
+ badRequest(res, 'Invalid DID', route.url.pathname);
85
+ return;
86
+ }
87
+ const { page, perPage, offset } = parsePagination(route.query);
88
+ // On-chain
89
+ if (ctx.reputationService) {
90
+ try {
91
+ const result = await ctx.reputationService.getReviews(did, { limit: perPage, offset });
92
+ if (result) {
93
+ const r2 = result;
94
+ paginated(res, (r2.reviews ?? []), {
95
+ page, perPage, total: (r2.total ?? 0),
96
+ basePath: `/api/v1/reputations/${did}/reviews`,
97
+ });
98
+ return;
99
+ }
100
+ }
101
+ catch { /* fallthrough */ }
102
+ }
103
+ // Legacy
104
+ if (ctx.reputationStore) {
105
+ try {
106
+ const records = await ctx.reputationStore.getRecords(did);
107
+ const allRecords = (records ?? []);
108
+ const reviews = allRecords
109
+ .filter((rec) => rec.dimension === 'quality')
110
+ .map((rec) => ({
111
+ id: rec.id, contractId: rec.ref, reviewer: rec.issuer, reviewee: did,
112
+ rating: rec.score, comment: rec.comment, aspects: rec.aspects,
113
+ createdAt: rec.createdAt ?? rec.ts,
114
+ }));
115
+ const slice = reviews.slice(offset, offset + perPage);
116
+ paginated(res, slice, {
117
+ page, perPage, total: reviews.length,
118
+ basePath: `/api/v1/reputations/${did}/reviews`,
119
+ });
120
+ return;
121
+ }
122
+ catch { /* fallthrough */ }
123
+ }
124
+ // Bare eventStore fallback
125
+ if (!ctx.eventStore) {
126
+ paginated(res, [], { page, perPage, total: 0, basePath: `/api/v1/reputations/${did}/reviews` });
127
+ return;
128
+ }
129
+ let state = createReputationState();
130
+ let cursor = null;
131
+ for (;;) {
132
+ const { events, cursor: next } = await ctx.eventStore.getEventLogRange(cursor, 200);
133
+ if (!events.length)
134
+ break;
135
+ for (const bytes of events) {
136
+ const envelope = parseEvent(bytes);
137
+ if (envelope)
138
+ state = applyReputationEvent(state, envelope);
139
+ }
140
+ if (!next)
141
+ break;
142
+ cursor = next;
143
+ }
144
+ const records = getReputationRecords(state, did);
145
+ const qualityRecords = records.filter((rec) => rec.dimension === 'quality');
146
+ const slice = qualityRecords.slice(offset, offset + perPage);
147
+ paginated(res, slice, {
148
+ page, perPage, total: qualityRecords.length,
149
+ basePath: `/api/v1/reputations/${did}/reviews`,
150
+ });
151
+ });
152
+ // ── POST /:did/reviews — record a reputation review ───────────
153
+ r.post('/:did/reviews', async (_req, res, route) => {
154
+ const { did } = route.params;
155
+ const v = validate(ReputationRecordSchema, route.body);
156
+ if (!v.success) {
157
+ badRequest(res, v.error, route.url.pathname);
158
+ return;
159
+ }
160
+ const body = v.data;
161
+ // On-chain
162
+ if (ctx.reputationService) {
163
+ try {
164
+ const reviewId = `review-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
165
+ const result = await ctx.reputationService.recordReview(reviewId, body.did, body.target, body.ref);
166
+ const r2 = result;
167
+ created(res, { txHash: r2.txHash ?? result, status: 'confirmed', timestamp: Date.now() }, { self: `/api/v1/reputations/${did}/reviews` });
168
+ return;
169
+ }
170
+ catch (err) {
171
+ internalError(res, err.message);
172
+ return;
173
+ }
174
+ }
175
+ // Legacy
176
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
177
+ if (!privateKey) {
178
+ badRequest(res, 'Key unavailable', route.url.pathname);
179
+ return;
180
+ }
181
+ try {
182
+ const envelope = await createReputationRecordEnvelope({
183
+ issuer: body.did, privateKey, target: body.target,
184
+ dimension: body.dimension,
185
+ score: Number(body.score), ref: body.ref,
186
+ comment: body.comment,
187
+ aspects: body.aspects,
188
+ ts: body.ts ?? Date.now(), nonce: body.nonce, prev: body.prev,
189
+ });
190
+ const hash = await ctx.publishEvent(envelope);
191
+ created(res, { txHash: hash, status: 'broadcast', timestamp: body.ts ?? Date.now() }, { self: `/api/v1/reputations/${did}/reviews` });
192
+ }
193
+ catch {
194
+ internalError(res, 'Reputation record failed');
195
+ }
196
+ });
197
+ // ── POST /:did/anchor — anchor reputation on-chain ────────────
198
+ r.post('/:did/anchor', async (_req, res, route) => {
199
+ const { did } = route.params;
200
+ if (!isValidDid(did)) {
201
+ badRequest(res, 'Invalid DID', route.url.pathname);
202
+ return;
203
+ }
204
+ if (ctx.reputationService) {
205
+ try {
206
+ // Build reputation profile to get required params
207
+ let overallScore = 0;
208
+ let dimensionScores = [0, 0, 0, 0, 0];
209
+ let merkleRoot = '';
210
+ const profile = await ctx.reputationService.getProfile(did);
211
+ if (profile) {
212
+ const p = profile;
213
+ overallScore = (p.score ?? p.overallScore ?? 0);
214
+ const dims = p.dimensions;
215
+ if (dims) {
216
+ dimensionScores = [
217
+ (dims.transaction ?? 0),
218
+ (dims.fulfillment ?? 0),
219
+ (dims.quality ?? 0),
220
+ (dims.social ?? 0),
221
+ (dims.behavior ?? 0),
222
+ ];
223
+ }
224
+ merkleRoot = (p.merkleRoot ?? '');
225
+ }
226
+ const result = await ctx.reputationService.anchorReputation(did, overallScore, dimensionScores, merkleRoot);
227
+ if (result) {
228
+ const r2 = result;
229
+ ok(res, { did, txHash: r2.txHash, status: 'anchored', timestamp: Date.now() }, { self: `/api/v1/reputations/${did}` });
230
+ return;
231
+ }
232
+ }
233
+ catch (err) {
234
+ internalError(res, err.message);
235
+ return;
236
+ }
237
+ }
238
+ // Legacy: no on-chain anchor available
239
+ badRequest(res, 'Reputation anchoring requires on-chain service', route.url.pathname);
240
+ });
241
+ return r;
242
+ }
243
+ //# sourceMappingURL=reputations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputations.js","sourceRoot":"","sources":["../../../src/api/routes/reputations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Transfer routes — /api/v1/transfers
3
+ */
4
+ import { Router } from '../router.js';
5
+ import type { RuntimeContext } from '../types.js';
6
+ export declare function transferRoutes(ctx: RuntimeContext): Router;
7
+ //# sourceMappingURL=transfers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfers.d.ts","sourceRoot":"","sources":["../../../src/api/routes/transfers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAuF1D"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Transfer routes — /api/v1/transfers
3
+ */
4
+ import { Router } from '../router.js';
5
+ import { created, badRequest, internalError } from '../response.js';
6
+ import { validate } from '../schemas/common.js';
7
+ import { TransferSchema } from '../schemas/wallet.js';
8
+ import { resolveAddress, resolvePrivateKey, addressFromDid } from '../types.js';
9
+ import { createWalletTransferEnvelope } from '@claw-network/protocol';
10
+ export function transferRoutes(ctx) {
11
+ const r = new Router();
12
+ // ── POST / — transfer Tokens ──────────────────────────────────
13
+ r.post('/', async (_req, res, route) => {
14
+ const v = validate(TransferSchema, route.body);
15
+ if (!v.success) {
16
+ badRequest(res, v.error, route.url.pathname);
17
+ return;
18
+ }
19
+ const body = v.data;
20
+ const to = resolveAddress(body.to);
21
+ if (!to) {
22
+ badRequest(res, 'Invalid recipient address', route.url.pathname);
23
+ return;
24
+ }
25
+ const from = addressFromDid(body.did);
26
+ // On-chain path
27
+ if (ctx.walletService) {
28
+ try {
29
+ // Resolve sender & receiver DIDs → EVM addresses via identity registry
30
+ const evmFrom = body.did
31
+ ? await ctx.walletService.resolveDidToAddress(body.did)
32
+ : null;
33
+ const evmTo = body.to.startsWith('did:claw:')
34
+ ? await ctx.walletService.resolveDidToAddress(body.to)
35
+ : /^0x[0-9a-fA-F]{40}$/.test(to) ? to : null;
36
+ if (!evmFrom) {
37
+ badRequest(res, 'Sender DID not registered on-chain', route.url.pathname);
38
+ return;
39
+ }
40
+ if (!evmTo) {
41
+ badRequest(res, 'Recipient address not resolved on-chain', route.url.pathname);
42
+ return;
43
+ }
44
+ const result = await ctx.walletService.transfer(evmFrom, evmTo, BigInt(body.amount), body.memo);
45
+ created(res, result, { self: `/api/v1/wallets/${from}` });
46
+ return;
47
+ }
48
+ catch (err) {
49
+ internalError(res, err.message);
50
+ return;
51
+ }
52
+ }
53
+ // Legacy: sign & publish event
54
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
55
+ if (!privateKey) {
56
+ badRequest(res, 'Key unavailable — check DID and passphrase', route.url.pathname);
57
+ return;
58
+ }
59
+ try {
60
+ const envelope = await createWalletTransferEnvelope({
61
+ issuer: body.did,
62
+ privateKey,
63
+ from,
64
+ to,
65
+ amount: String(body.amount),
66
+ fee: body.fee != null ? String(body.fee) : '0',
67
+ memo: body.memo,
68
+ ts: body.ts ?? Date.now(),
69
+ nonce: body.nonce,
70
+ prev: body.prev,
71
+ });
72
+ const hash = await ctx.publishEvent(envelope);
73
+ created(res, {
74
+ txHash: hash,
75
+ from,
76
+ to,
77
+ amount: String(body.amount),
78
+ status: 'broadcast',
79
+ timestamp: body.ts ?? Date.now(),
80
+ }, { self: `/api/v1/wallets/${from}` });
81
+ }
82
+ catch {
83
+ internalError(res, 'Transfer publish failed');
84
+ }
85
+ });
86
+ return r;
87
+ }
88
+ //# sourceMappingURL=transfers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfers.js","sourceRoot":"","sources":["../../../src/api/routes/transfers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,UAAU,cAAc,CAAC,GAAmB;IAChD,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;IAEvB,iEAAiE;IACjE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QAEpB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,GAAG,EAAE,2BAA2B,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtC,gBAAgB;QAChB,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,uEAAuE;gBACvE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG;oBACtB,CAAC,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;oBACvD,CAAC,CAAC,IAAI,CAAC;gBACT,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;oBAC3C,CAAC,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtD,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,UAAU,CAAC,GAAG,EAAE,oCAAoC,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC1E,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,UAAU,CAAC,GAAG,EAAE,yCAAyC,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC/E,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,mBAAmB,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,aAAa,CAAC,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,4CAA4C,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC;gBAClD,MAAM,EAAE,IAAI,CAAC,GAAG;gBAChB,UAAU;gBACV,IAAI;gBACJ,EAAE;gBACF,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;gBAC9C,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9C,OAAO,CACL,GAAG,EACH;gBACE,MAAM,EAAE,IAAI;gBACZ,IAAI;gBACJ,EAAE;gBACF,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC3B,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE;aACjC,EACD,EAAE,IAAI,EAAE,mBAAmB,IAAI,EAAE,EAAE,CACpC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Wallet routes — /api/v1/wallets
3
+ */
4
+ import { Router } from '../router.js';
5
+ import type { RuntimeContext } from '../types.js';
6
+ export declare function walletRoutes(ctx: RuntimeContext): Router;
7
+ //# sourceMappingURL=wallets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallets.d.ts","sourceRoot":"","sources":["../../../src/api/routes/wallets.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2BlD,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAoHxD"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Wallet routes — /api/v1/wallets
3
+ */
4
+ import { Router } from '../router.js';
5
+ import { ok, badRequest, internalError, paginated, parsePagination } from '../response.js';
6
+ import { resolveAddress } from '../types.js';
7
+ import { buildWalletState } from '../legacy.js';
8
+ import { getWalletBalance } from '@claw-network/protocol';
9
+ /**
10
+ * For the on-chain path, resolve the user-supplied address/DID to an
11
+ * EVM address that contract calls understand.
12
+ * - DID → look up on-chain identity registry → controller (0x…)
13
+ * - 0x… → pass through
14
+ * - claw1… → not valid for on-chain path (needs DID or 0x)
15
+ */
16
+ async function resolveEvmAddress(ctx, input) {
17
+ // Already an EVM hex address
18
+ if (/^0x[0-9a-fA-F]{40}$/.test(input))
19
+ return input;
20
+ // DID → resolve via on-chain identity registry
21
+ if (input.startsWith('did:claw:') && ctx.walletService) {
22
+ return ctx.walletService.resolveDidToAddress(input);
23
+ }
24
+ return null;
25
+ }
26
+ export function walletRoutes(ctx) {
27
+ const r = new Router();
28
+ // ── GET /:address — wallet info + balance ─────────────────────
29
+ r.get('/:address', async (_req, res, route) => {
30
+ const { address } = route.params;
31
+ const resolved = resolveAddress(address);
32
+ if (!resolved) {
33
+ badRequest(res, 'Invalid address or DID', route.url.pathname);
34
+ return;
35
+ }
36
+ // On-chain path
37
+ if (ctx.walletService) {
38
+ const evmAddr = await resolveEvmAddress(ctx, address);
39
+ if (evmAddr) {
40
+ try {
41
+ const balance = await ctx.walletService.getBalance(evmAddr);
42
+ ok(res, balance, { self: `/api/v1/wallets/${address}` });
43
+ return;
44
+ }
45
+ catch (err) {
46
+ internalError(res, err.message);
47
+ return;
48
+ }
49
+ }
50
+ // DID not registered on-chain — fall through to legacy path
51
+ }
52
+ // Legacy fallback
53
+ if (!ctx.eventStore) {
54
+ internalError(res, 'Wallet service unavailable');
55
+ return;
56
+ }
57
+ const state = await buildWalletState(ctx.eventStore);
58
+ const balance = getWalletBalance(state, resolved);
59
+ const total = BigInt(balance.available) +
60
+ BigInt(balance.pending) +
61
+ BigInt(balance.locked.escrow) +
62
+ BigInt(balance.locked.governance);
63
+ ok(res, {
64
+ address: resolved,
65
+ balance: Number(total),
66
+ available: Number(balance.available),
67
+ pending: Number(balance.pending),
68
+ locked: Number(balance.locked.escrow),
69
+ }, { self: `/api/v1/wallets/${address}` });
70
+ });
71
+ // ── GET /:address/transactions — transaction history ──────────
72
+ r.get('/:address/transactions', async (_req, res, route) => {
73
+ const { address } = route.params;
74
+ const resolved = resolveAddress(address);
75
+ if (!resolved) {
76
+ badRequest(res, 'Invalid address or DID', route.url.pathname);
77
+ return;
78
+ }
79
+ const { page, perPage, offset } = parsePagination(route.query);
80
+ const typeFilter = route.query.get('type') ?? undefined;
81
+ // On-chain path
82
+ if (ctx.walletService) {
83
+ const evmAddr = await resolveEvmAddress(ctx, address);
84
+ if (evmAddr) {
85
+ try {
86
+ const result = await ctx.walletService.getHistory(evmAddr, {
87
+ limit: perPage,
88
+ offset,
89
+ type: typeFilter,
90
+ });
91
+ const items = Array.isArray(result.transactions) ? result.transactions : [];
92
+ paginated(res, items, {
93
+ page,
94
+ perPage,
95
+ total: result.total ?? items.length,
96
+ basePath: `/api/v1/wallets/${address}/transactions`,
97
+ query: typeFilter ? { type: typeFilter } : {},
98
+ });
99
+ return;
100
+ }
101
+ catch (err) {
102
+ internalError(res, err.message);
103
+ return;
104
+ }
105
+ }
106
+ // DID not registered on-chain — fall through to legacy path
107
+ }
108
+ // Legacy fallback
109
+ if (!ctx.eventStore) {
110
+ internalError(res, 'Wallet service unavailable');
111
+ return;
112
+ }
113
+ const state = await buildWalletState(ctx.eventStore);
114
+ const all = state.history.filter((tx) => {
115
+ const p = tx.payload;
116
+ const from = p.from;
117
+ const to = p.to;
118
+ return from === resolved || to === resolved;
119
+ });
120
+ const filtered = typeFilter ? all.filter((tx) => tx.type === typeFilter) : all;
121
+ const slice = filtered.slice(offset, offset + perPage);
122
+ paginated(res, slice, {
123
+ page,
124
+ perPage,
125
+ total: filtered.length,
126
+ basePath: `/api/v1/wallets/${address}/transactions`,
127
+ query: typeFilter ? { type: typeFilter } : {},
128
+ });
129
+ });
130
+ return r;
131
+ }
132
+ //# sourceMappingURL=wallets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallets.js","sourceRoot":"","sources":["../../../src/api/routes/wallets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Shared Zod schemas used across multiple route modules.
3
+ */
4
+ import { z } from 'zod';
5
+ /** Amount can be number or string (for large values). */
6
+ export declare const AmountSchema: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
7
+ /** Rating can be number or string. */
8
+ export declare const RatingSchema: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
9
+ /** Common envelope fields for signed requests. */
10
+ export declare const SignedRequestBase: {
11
+ did: z.ZodString;
12
+ passphrase: z.ZodString;
13
+ nonce: z.ZodNumber;
14
+ prev: z.ZodOptional<z.ZodString>;
15
+ ts: z.ZodOptional<z.ZodNumber>;
16
+ };
17
+ /** Listing removal (all market types). */
18
+ export declare const ListingRemoveSchema: z.ZodObject<{
19
+ did: z.ZodString;
20
+ passphrase: z.ZodString;
21
+ nonce: z.ZodNumber;
22
+ prev: z.ZodOptional<z.ZodString>;
23
+ ts: z.ZodOptional<z.ZodNumber>;
24
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
25
+ did: z.ZodString;
26
+ passphrase: z.ZodString;
27
+ nonce: z.ZodNumber;
28
+ prev: z.ZodOptional<z.ZodString>;
29
+ ts: z.ZodOptional<z.ZodNumber>;
30
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
31
+ did: z.ZodString;
32
+ passphrase: z.ZodString;
33
+ nonce: z.ZodNumber;
34
+ prev: z.ZodOptional<z.ZodString>;
35
+ ts: z.ZodOptional<z.ZodNumber>;
36
+ }, z.ZodTypeAny, "passthrough">>;
37
+ /** Validate Zod schema and return typed result or null (sets 400 response). */
38
+ export declare function validate<T>(schema: z.ZodType<T>, data: unknown): {
39
+ success: true;
40
+ data: T;
41
+ } | {
42
+ success: false;
43
+ error: string;
44
+ };
45
+ //# sourceMappingURL=common.d.ts.map