@reclaimprotocol/attestor-core 4.0.3 → 5.0.1-beta.2

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 (297) hide show
  1. package/LICENSE +660 -660
  2. package/README.md +1 -2
  3. package/lib/avs/abis/avsDirectoryABI.js +341 -342
  4. package/lib/avs/abis/delegationABI.js +4 -5
  5. package/lib/avs/abis/registryABI.js +722 -723
  6. package/lib/avs/client/create-claim-on-avs.d.ts +5 -5
  7. package/lib/avs/client/create-claim-on-avs.js +160 -139
  8. package/lib/avs/config.d.ts +1 -1
  9. package/lib/avs/config.js +25 -23
  10. package/lib/avs/contracts/ReclaimServiceManager.d.ts +436 -532
  11. package/lib/avs/contracts/ReclaimServiceManager.js +0 -3
  12. package/lib/avs/contracts/common.d.ts +40 -11
  13. package/lib/avs/contracts/common.js +0 -3
  14. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +13 -11
  15. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1157 -1148
  16. package/lib/avs/contracts/factories/index.d.ts +1 -1
  17. package/lib/avs/contracts/factories/index.js +4 -9
  18. package/lib/avs/contracts/index.d.ts +3 -3
  19. package/lib/avs/contracts/index.js +6 -40
  20. package/lib/avs/types/index.d.ts +6 -6
  21. package/lib/avs/types/index.js +0 -3
  22. package/lib/avs/utils/contracts.d.ts +14 -14
  23. package/lib/avs/utils/contracts.js +50 -35
  24. package/lib/avs/utils/register.d.ts +3 -3
  25. package/lib/avs/utils/register.js +71 -79
  26. package/lib/avs/utils/tasks.d.ts +4 -4
  27. package/lib/avs/utils/tasks.js +44 -41
  28. package/lib/client/create-claim.d.ts +2 -2
  29. package/lib/client/create-claim.js +437 -400
  30. package/lib/client/index.d.ts +3 -3
  31. package/lib/client/index.js +3 -20
  32. package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +2 -2
  33. package/lib/client/tunnels/make-rpc-tcp-tunnel.js +49 -56
  34. package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +4 -3
  35. package/lib/client/tunnels/make-rpc-tls-tunnel.js +123 -131
  36. package/lib/client/utils/attestor-pool.d.ts +3 -1
  37. package/lib/client/utils/attestor-pool.js +21 -25
  38. package/lib/client/utils/client-socket.d.ts +4 -4
  39. package/lib/client/utils/client-socket.js +114 -94
  40. package/lib/client/utils/message-handler.d.ts +2 -2
  41. package/lib/client/utils/message-handler.js +89 -86
  42. package/lib/config/index.d.ts +6 -3
  43. package/lib/config/index.js +60 -37
  44. package/lib/external-rpc/benchmark.d.ts +1 -0
  45. package/lib/external-rpc/benchmark.js +82 -0
  46. package/lib/external-rpc/event-bus.d.ts +7 -0
  47. package/lib/external-rpc/event-bus.js +17 -0
  48. package/lib/external-rpc/global.d.js +0 -0
  49. package/lib/external-rpc/handle-incoming-msg.d.ts +2 -0
  50. package/lib/external-rpc/handle-incoming-msg.js +241 -0
  51. package/lib/external-rpc/index.d.ts +3 -0
  52. package/lib/external-rpc/index.js +3 -0
  53. package/lib/external-rpc/jsc-polyfills/1.d.ts +14 -0
  54. package/lib/external-rpc/jsc-polyfills/1.js +80 -0
  55. package/lib/external-rpc/jsc-polyfills/2.js +15 -0
  56. package/lib/external-rpc/jsc-polyfills/event.d.ts +10 -0
  57. package/lib/external-rpc/jsc-polyfills/event.js +19 -0
  58. package/lib/external-rpc/jsc-polyfills/index.d.ts +2 -0
  59. package/lib/external-rpc/jsc-polyfills/index.js +2 -0
  60. package/lib/external-rpc/jsc-polyfills/ws.d.ts +21 -0
  61. package/lib/external-rpc/jsc-polyfills/ws.js +83 -0
  62. package/lib/external-rpc/setup-browser.d.ts +6 -0
  63. package/lib/external-rpc/setup-browser.js +33 -0
  64. package/lib/external-rpc/setup-jsc.d.ts +24 -0
  65. package/lib/external-rpc/setup-jsc.js +22 -0
  66. package/lib/{window-rpc → external-rpc}/types.d.ts +56 -35
  67. package/lib/external-rpc/types.js +0 -0
  68. package/lib/external-rpc/utils.d.ts +20 -0
  69. package/lib/external-rpc/utils.js +100 -0
  70. package/lib/external-rpc/zk.d.ts +14 -0
  71. package/lib/external-rpc/zk.js +58 -0
  72. package/lib/index.d.ts +8 -9
  73. package/lib/index.js +12 -49
  74. package/lib/mechain/abis/governanceABI.js +460 -461
  75. package/lib/mechain/abis/taskABI.js +505 -506
  76. package/lib/mechain/client/create-claim-on-mechain.d.ts +3 -3
  77. package/lib/mechain/client/create-claim-on-mechain.js +31 -30
  78. package/lib/mechain/client/index.d.ts +1 -1
  79. package/lib/mechain/client/index.js +1 -18
  80. package/lib/mechain/constants/index.js +8 -7
  81. package/lib/mechain/index.d.ts +2 -2
  82. package/lib/mechain/index.js +2 -19
  83. package/lib/mechain/types/index.d.ts +2 -2
  84. package/lib/mechain/types/index.js +0 -3
  85. package/lib/proto/api.d.ts +182 -39
  86. package/lib/proto/api.js +4105 -3555
  87. package/lib/proto/tee-bundle.d.ts +156 -0
  88. package/lib/proto/tee-bundle.js +1296 -0
  89. package/lib/providers/http/index.d.ts +16 -1
  90. package/lib/providers/http/index.js +603 -576
  91. package/lib/providers/http/patch-parse5-tree.d.ts +6 -0
  92. package/lib/providers/http/patch-parse5-tree.js +34 -0
  93. package/lib/providers/http/utils.d.ts +7 -4
  94. package/lib/providers/http/utils.js +240 -317
  95. package/lib/providers/index.d.ts +1 -1
  96. package/lib/providers/index.js +5 -9
  97. package/lib/scripts/check-avs-registration.d.ts +1 -1
  98. package/lib/scripts/check-avs-registration.js +24 -25
  99. package/lib/scripts/fallbacks/crypto.d.ts +1 -0
  100. package/lib/scripts/fallbacks/crypto.js +4 -0
  101. package/lib/scripts/fallbacks/empty.d.ts +3 -0
  102. package/lib/scripts/fallbacks/empty.js +4 -0
  103. package/lib/scripts/fallbacks/re2.d.ts +1 -0
  104. package/lib/scripts/fallbacks/re2.js +7 -0
  105. package/lib/scripts/fallbacks/snarkjs.d.ts +1 -0
  106. package/lib/scripts/fallbacks/snarkjs.js +10 -0
  107. package/lib/scripts/fallbacks/stwo.d.ts +6 -0
  108. package/lib/scripts/fallbacks/stwo.js +159 -0
  109. package/lib/scripts/generate-provider-types.js +92 -73
  110. package/lib/scripts/generate-receipt.d.ts +2 -2
  111. package/lib/scripts/generate-receipt.js +94 -83
  112. package/lib/scripts/generate-toprf-keys.js +17 -16
  113. package/lib/scripts/jsc-cli-rpc.d.ts +1 -0
  114. package/lib/scripts/jsc-cli-rpc.js +35 -0
  115. package/lib/scripts/register-avs-operator.d.ts +1 -1
  116. package/lib/scripts/register-avs-operator.js +3 -7
  117. package/lib/scripts/start-server.d.ts +1 -1
  118. package/lib/scripts/start-server.js +9 -11
  119. package/lib/scripts/update-avs-metadata.d.ts +1 -1
  120. package/lib/scripts/update-avs-metadata.js +17 -19
  121. package/lib/scripts/utils.js +8 -9
  122. package/lib/scripts/whitelist-operator.d.ts +1 -1
  123. package/lib/scripts/whitelist-operator.js +13 -15
  124. package/lib/server/create-server.d.ts +3 -2
  125. package/lib/server/create-server.js +98 -85
  126. package/lib/server/handlers/claimTeeBundle.d.ts +6 -0
  127. package/lib/server/handlers/claimTeeBundle.js +232 -0
  128. package/lib/server/handlers/claimTunnel.d.ts +1 -1
  129. package/lib/server/handlers/claimTunnel.js +75 -73
  130. package/lib/server/handlers/completeClaimOnChain.d.ts +1 -1
  131. package/lib/server/handlers/completeClaimOnChain.js +27 -26
  132. package/lib/server/handlers/createClaimOnChain.d.ts +1 -1
  133. package/lib/server/handlers/createClaimOnChain.js +30 -29
  134. package/lib/server/handlers/createTaskOnMechain.d.ts +1 -1
  135. package/lib/server/handlers/createTaskOnMechain.js +54 -49
  136. package/lib/server/handlers/createTunnel.d.ts +1 -1
  137. package/lib/server/handlers/createTunnel.js +91 -94
  138. package/lib/server/handlers/disconnectTunnel.d.ts +1 -1
  139. package/lib/server/handlers/disconnectTunnel.js +6 -8
  140. package/lib/server/handlers/fetchCertificateBytes.d.ts +2 -0
  141. package/lib/server/handlers/fetchCertificateBytes.js +57 -0
  142. package/lib/server/handlers/index.d.ts +1 -1
  143. package/lib/server/handlers/index.js +24 -21
  144. package/lib/server/handlers/init.d.ts +1 -1
  145. package/lib/server/handlers/init.js +31 -34
  146. package/lib/server/handlers/toprf.d.ts +1 -1
  147. package/lib/server/handlers/toprf.js +17 -19
  148. package/lib/server/index.d.ts +4 -4
  149. package/lib/server/index.js +4 -21
  150. package/lib/server/socket.d.ts +7 -7
  151. package/lib/server/socket.js +104 -106
  152. package/lib/server/tunnels/make-tcp-tunnel.d.ts +5 -3
  153. package/lib/server/tunnels/make-tcp-tunnel.js +189 -162
  154. package/lib/server/utils/apm.d.ts +1 -1
  155. package/lib/server/utils/apm.js +26 -40
  156. package/lib/server/utils/assert-valid-claim-request.d.ts +6 -5
  157. package/lib/server/utils/assert-valid-claim-request.js +339 -185
  158. package/lib/server/utils/config-env.js +4 -7
  159. package/lib/server/utils/dns.js +18 -16
  160. package/lib/server/utils/gcp-attestation.d.ts +17 -0
  161. package/lib/server/utils/gcp-attestation.js +237 -0
  162. package/lib/server/utils/generics.d.ts +3 -3
  163. package/lib/server/utils/generics.js +37 -51
  164. package/lib/server/utils/iso.js +255 -256
  165. package/lib/server/utils/keep-alive.d.ts +2 -2
  166. package/lib/server/utils/keep-alive.js +36 -40
  167. package/lib/server/utils/nitro-attestation.d.ts +33 -0
  168. package/lib/server/utils/nitro-attestation.js +249 -0
  169. package/lib/server/utils/oprf-raw.d.ts +21 -0
  170. package/lib/server/utils/oprf-raw.js +61 -0
  171. package/lib/server/utils/process-handshake.d.ts +3 -3
  172. package/lib/server/utils/process-handshake.js +217 -175
  173. package/lib/server/utils/proxy-session.d.ts +1 -0
  174. package/lib/server/utils/proxy-session.js +6 -0
  175. package/lib/server/utils/tee-oprf-mpc-verification.d.ts +16 -0
  176. package/lib/server/utils/tee-oprf-mpc-verification.js +86 -0
  177. package/lib/server/utils/tee-oprf-verification.d.ts +24 -0
  178. package/lib/server/utils/tee-oprf-verification.js +151 -0
  179. package/lib/server/utils/tee-transcript-reconstruction.d.ts +24 -0
  180. package/lib/server/utils/tee-transcript-reconstruction.js +140 -0
  181. package/lib/server/utils/tee-verification.d.ts +28 -0
  182. package/lib/server/utils/tee-verification.js +358 -0
  183. package/lib/{utils → server/utils}/validation.d.ts +1 -1
  184. package/lib/server/utils/validation.js +45 -0
  185. package/lib/types/bgp.js +0 -3
  186. package/lib/types/claims.d.ts +7 -10
  187. package/lib/types/claims.js +0 -3
  188. package/lib/types/client.d.ts +5 -5
  189. package/lib/types/client.js +0 -3
  190. package/lib/types/general.d.ts +29 -4
  191. package/lib/types/general.js +0 -3
  192. package/lib/types/handlers.d.ts +3 -3
  193. package/lib/types/handlers.js +0 -3
  194. package/lib/types/index.d.ts +10 -10
  195. package/lib/types/index.js +10 -27
  196. package/lib/types/providers.d.ts +15 -4
  197. package/lib/types/providers.gen.d.ts +15 -1
  198. package/lib/types/providers.gen.js +15 -13
  199. package/lib/types/providers.js +0 -3
  200. package/lib/types/rpc.d.ts +2 -2
  201. package/lib/types/rpc.js +0 -3
  202. package/lib/types/signatures.js +0 -3
  203. package/lib/types/tunnel.d.ts +2 -2
  204. package/lib/types/tunnel.js +0 -3
  205. package/lib/types/zk.d.ts +17 -2
  206. package/lib/types/zk.js +0 -3
  207. package/lib/utils/auth.d.ts +2 -1
  208. package/lib/utils/auth.js +66 -59
  209. package/lib/utils/b64-json.js +13 -19
  210. package/lib/utils/bgp-listener.d.ts +1 -1
  211. package/lib/utils/bgp-listener.js +111 -114
  212. package/lib/utils/claims.d.ts +3 -3
  213. package/lib/utils/claims.js +78 -101
  214. package/lib/utils/env.js +15 -16
  215. package/lib/utils/error.d.ts +6 -7
  216. package/lib/utils/error.js +50 -39
  217. package/lib/utils/generics.d.ts +15 -13
  218. package/lib/utils/generics.js +217 -297
  219. package/lib/utils/http-parser.d.ts +1 -1
  220. package/lib/utils/http-parser.js +186 -237
  221. package/lib/utils/index.d.ts +13 -12
  222. package/lib/utils/index.js +13 -29
  223. package/lib/utils/logger.d.ts +1 -1
  224. package/lib/utils/logger.js +69 -87
  225. package/lib/utils/prepare-packets.d.ts +3 -3
  226. package/lib/utils/prepare-packets.js +66 -58
  227. package/lib/utils/redactions.d.ts +20 -1
  228. package/lib/utils/redactions.js +116 -129
  229. package/lib/utils/retries.d.ts +1 -1
  230. package/lib/utils/retries.js +24 -26
  231. package/lib/utils/signatures/eth.d.ts +1 -1
  232. package/lib/utils/signatures/eth.js +28 -30
  233. package/lib/utils/signatures/index.d.ts +3 -3
  234. package/lib/utils/signatures/index.js +11 -10
  235. package/lib/utils/socket-base.d.ts +6 -5
  236. package/lib/utils/socket-base.js +89 -88
  237. package/lib/utils/tls.d.ts +1 -1
  238. package/lib/utils/tls.js +54 -28
  239. package/lib/utils/ws.d.ts +1 -6
  240. package/lib/utils/ws.js +17 -33
  241. package/lib/utils/zk.d.ts +28 -12
  242. package/lib/utils/zk.js +587 -406
  243. package/package.json +72 -60
  244. package/lib/avs/tests/test.operator.d.ts +0 -11
  245. package/lib/avs/tests/test.operator.js +0 -313
  246. package/lib/avs/tests/utils.d.ts +0 -2
  247. package/lib/avs/tests/utils.js +0 -50
  248. package/lib/scripts/verify-root-ca.d.ts +0 -1
  249. package/lib/scripts/verify-root-ca.js +0 -51
  250. package/lib/tests/describe-with-server.d.ts +0 -20
  251. package/lib/tests/describe-with-server.js +0 -64
  252. package/lib/tests/mock-provider-server.d.ts +0 -13
  253. package/lib/tests/mock-provider-server.js +0 -65
  254. package/lib/tests/mocks.d.ts +0 -4
  255. package/lib/tests/mocks.js +0 -23
  256. package/lib/tests/test.auth.js +0 -75
  257. package/lib/tests/test.bgp-listener.js +0 -169
  258. package/lib/tests/test.claim-creation.js +0 -280
  259. package/lib/tests/test.http-parser.d.ts +0 -1
  260. package/lib/tests/test.http-parser.js +0 -120
  261. package/lib/tests/test.http-provider-utils.js +0 -2416
  262. package/lib/tests/test.http-provider.d.ts +0 -1
  263. package/lib/tests/test.http-provider.js +0 -114
  264. package/lib/tests/test.rpc-communication.d.ts +0 -1
  265. package/lib/tests/test.rpc-communication.js +0 -64
  266. package/lib/tests/test.rpc-tunnel.d.ts +0 -1
  267. package/lib/tests/test.rpc-tunnel.js +0 -172
  268. package/lib/tests/test.signatures.d.ts +0 -1
  269. package/lib/tests/test.signatures.js +0 -24
  270. package/lib/tests/test.tcp-tunnel.d.ts +0 -1
  271. package/lib/tests/test.tcp-tunnel.js +0 -64
  272. package/lib/tests/test.zk.d.ts +0 -1
  273. package/lib/tests/test.zk.js +0 -337
  274. package/lib/tests/utils.d.ts +0 -18
  275. package/lib/tests/utils.js +0 -64
  276. package/lib/utils/atomic-operations.d.ts +0 -24
  277. package/lib/utils/atomic-operations.js +0 -65
  278. package/lib/utils/benchmark.d.ts +0 -1
  279. package/lib/utils/benchmark.js +0 -70
  280. package/lib/utils/connection-state-machine.d.ts +0 -43
  281. package/lib/utils/connection-state-machine.js +0 -129
  282. package/lib/utils/resource-monitor.d.ts +0 -61
  283. package/lib/utils/resource-monitor.js +0 -107
  284. package/lib/utils/validation.js +0 -46
  285. package/lib/window-rpc/index.d.ts +0 -3
  286. package/lib/window-rpc/index.js +0 -20
  287. package/lib/window-rpc/setup-window-rpc.d.ts +0 -5
  288. package/lib/window-rpc/setup-window-rpc.js +0 -291
  289. package/lib/window-rpc/types.js +0 -3
  290. package/lib/window-rpc/utils.d.ts +0 -14
  291. package/lib/window-rpc/utils.js +0 -102
  292. package/lib/window-rpc/window-rpc-zk.d.ts +0 -15
  293. package/lib/window-rpc/window-rpc-zk.js +0 -85
  294. /package/lib/{tests/test.auth.d.ts → external-rpc/jsc-polyfills/2.d.ts} +0 -0
  295. /package/lib/{tests/test.bgp-listener.d.ts → scripts/build-browser.d.ts} +0 -0
  296. /package/lib/{tests/test.claim-creation.d.ts → scripts/build-jsc.d.ts} +0 -0
  297. /package/lib/{tests/test.http-provider-utils.d.ts → scripts/build-lib.d.ts} +0 -0
@@ -1,92 +1,105 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createServer = createServer;
7
- const http_1 = require("http");
8
- const serve_static_1 = __importDefault(require("serve-static"));
9
- const config_1 = require("../config");
10
- const socket_1 = require("../server/socket");
11
- const generics_1 = require("../server/utils/generics");
12
- const keep_alive_1 = require("../server/utils/keep-alive");
13
- const utils_1 = require("../utils");
14
- const bgp_listener_1 = require("../utils/bgp-listener");
15
- const env_1 = require("../utils/env");
16
- const signatures_1 = require("../utils/signatures");
17
- const ws_1 = require("../utils/ws");
18
- const ws_2 = require("ws");
19
- const PORT = +((0, env_1.getEnvVariable)('PORT') || config_1.API_SERVER_PORT);
20
- const DISABLE_BGP_CHECKS = (0, env_1.getEnvVariable)('DISABLE_BGP_CHECKS') === '1';
21
- /**
22
- * Creates the WebSocket API server,
23
- * creates a fileserver to serve the browser RPC client,
24
- * and listens on the given port.
25
- */
1
+ import { createServer as createHttpServer } from "http";
2
+ import serveStatic from "serve-static";
3
+ import { WebSocketServer } from "ws";
4
+ import { API_SERVER_PORT, ATTESTOR_ADDRESS_PATHNAME, BROWSER_RPC_PATHNAME, WS_PATHNAME } from "../config/index.js";
5
+ import { AttestorServerSocket } from "../server/socket.js";
6
+ import { getAttestorAddress } from "../server/utils/generics.js";
7
+ import { addKeepAlive } from "../server/utils/keep-alive.js";
8
+ import { createBgpListener } from "../utils/bgp-listener.js";
9
+ import { getEnvVariable } from "../utils/env.js";
10
+ import { logger as LOGGER } from "../utils/index.js";
11
+ import { SelectedServiceSignatureType } from "../utils/signatures/index.js";
12
+ import { promisifySend } from "../utils/ws.js";
13
+ const PORT = +(getEnvVariable("PORT") || API_SERVER_PORT);
14
+ const DISABLE_BGP_CHECKS = getEnvVariable("DISABLE_BGP_CHECKS") === "1";
15
+ const ATTESTOR_ADDRESS_JSON_RES = JSON.stringify({
16
+ address: getAttestorAddress(SelectedServiceSignatureType),
17
+ signatureType: SelectedServiceSignatureType
18
+ });
26
19
  async function createServer(port = PORT) {
27
- const http = (0, http_1.createServer)();
28
- const serveBrowserRpc = (0, serve_static_1.default)('browser', { index: ['index.html'] });
29
- const bgpListener = !DISABLE_BGP_CHECKS
30
- ? (0, bgp_listener_1.createBgpListener)(utils_1.logger.child({ service: 'bgp-listener' }))
31
- : undefined;
32
- const wss = new ws_2.WebSocketServer({ noServer: true });
33
- http.on('upgrade', handleUpgrade.bind(wss));
34
- http.on('request', (req, res) => {
35
- var _a;
36
- // simple way to serve files at the browser RPC path
37
- if (!((_a = req.url) === null || _a === void 0 ? void 0 : _a.startsWith(config_1.BROWSER_RPC_PATHNAME))) {
38
- res.statusCode = 404;
39
- res.end('Not found');
40
- return;
41
- }
42
- req.url = req.url.slice(config_1.BROWSER_RPC_PATHNAME.length) || '/';
43
- serveBrowserRpc(req, res, (err) => {
44
- var _a, _b;
45
- if (err) {
46
- utils_1.logger.error({ err, url: req.url }, 'Failed to serve file');
47
- }
48
- res.statusCode = (_a = err === null || err === void 0 ? void 0 : err.statusCode) !== null && _a !== void 0 ? _a : 404;
49
- res.end((_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : 'Not found');
50
- });
51
- });
52
- // wait for us to start listening
53
- http.listen(port);
54
- await new Promise((resolve, reject) => {
55
- http.once('listening', () => resolve());
56
- http.once('error', reject);
20
+ const http = createHttpServer();
21
+ const serveBrowserRpc = serveStatic(
22
+ "browser",
23
+ {
24
+ index: ["index.html"],
25
+ setHeaders(res) {
26
+ res.setHeader("Access-Control-Allow-Origin", "*");
27
+ }
28
+ }
29
+ );
30
+ const bgpListener = !DISABLE_BGP_CHECKS ? createBgpListener(LOGGER.child({ service: "bgp-listener" })) : void 0;
31
+ const wss = new WebSocketServer({ noServer: true });
32
+ http.on("upgrade", handleUpgrade.bind(wss));
33
+ http.on("request", (req, res) => {
34
+ const url = URL.parse(req.url || "", "http://localhost");
35
+ if (!url) {
36
+ res.statusCode = 422;
37
+ res.end("Invalid URL");
38
+ return;
39
+ }
40
+ if (url.pathname === ATTESTOR_ADDRESS_PATHNAME) {
41
+ res.writeHead(200, { "Content-Type": "application/json" });
42
+ res.end(ATTESTOR_ADDRESS_JSON_RES);
43
+ return;
44
+ }
45
+ if (!url.pathname?.startsWith(BROWSER_RPC_PATHNAME)) {
46
+ res.statusCode = 404;
47
+ res.end("Not found");
48
+ return;
49
+ }
50
+ req.url = req.url.slice(BROWSER_RPC_PATHNAME.length) || "/";
51
+ serveBrowserRpc(req, res, (err) => {
52
+ if (err) {
53
+ LOGGER.error({ err, url: req.url }, "Failed to serve file");
54
+ }
55
+ res.statusCode = err?.statusCode ?? 404;
56
+ res.end(err?.message ?? "Not found");
57
57
  });
58
- wss.on('connection', (ws, req) => handleNewClient(ws, req, bgpListener));
59
- utils_1.logger.info({
60
- port,
61
- apiPath: config_1.WS_PATHNAME,
62
- browserRpcPath: config_1.BROWSER_RPC_PATHNAME,
63
- signerAddress: (0, generics_1.getAttestorAddress)(signatures_1.SelectedServiceSignatureType)
64
- }, 'WS server listening');
65
- const wssClose = wss.close.bind(wss);
66
- wss.close = (cb) => {
67
- wssClose(() => http.close(cb));
68
- bgpListener === null || bgpListener === void 0 ? void 0 : bgpListener.close();
69
- };
70
- return wss;
58
+ });
59
+ http.listen(port);
60
+ await new Promise((resolve, reject) => {
61
+ http.once("listening", () => resolve());
62
+ http.once("error", reject);
63
+ });
64
+ wss.on("connection", (ws, req) => handleNewClient(ws, req, bgpListener));
65
+ LOGGER.info(
66
+ {
67
+ port,
68
+ apiPath: WS_PATHNAME,
69
+ browserRpcPath: BROWSER_RPC_PATHNAME,
70
+ signerAddress: getAttestorAddress(SelectedServiceSignatureType)
71
+ },
72
+ "WS server listening"
73
+ );
74
+ const wssClose = wss.close.bind(wss);
75
+ wss.close = (cb) => {
76
+ wssClose(() => http.close(cb));
77
+ bgpListener?.close();
78
+ };
79
+ return wss;
71
80
  }
72
81
  async function handleNewClient(ws, req, bgpListener) {
73
- (0, ws_1.promisifySend)(ws);
74
- const client = await socket_1.AttestorServerSocket.acceptConnection(ws, { req, bgpListener, logger: utils_1.logger });
75
- // if initialisation fails, don't store the client
76
- if (!client) {
77
- return;
78
- }
79
- ws.serverSocket = client;
80
- (0, keep_alive_1.addKeepAlive)(ws, utils_1.logger.child({ sessionId: client.sessionId }));
82
+ promisifySend(ws);
83
+ const client = await AttestorServerSocket.acceptConnection(
84
+ ws,
85
+ { req, bgpListener, logger: LOGGER }
86
+ );
87
+ if (!client) {
88
+ return;
89
+ }
90
+ ws.serverSocket = client;
91
+ addKeepAlive(ws, LOGGER.child({ sessionId: client.sessionId }));
81
92
  }
82
93
  function handleUpgrade(request, socket, head) {
83
- const { pathname } = new URL(request.url, 'wss://base.url');
84
- if (pathname === config_1.WS_PATHNAME) {
85
- this.handleUpgrade(request, socket, head, (ws) => {
86
- this.emit('connection', ws, request);
87
- });
88
- return;
89
- }
90
- socket.destroy();
94
+ const { pathname } = new URL(request.url, "wss://base.url");
95
+ if (pathname === WS_PATHNAME) {
96
+ this.handleUpgrade(request, socket, head, (ws) => {
97
+ this.emit("connection", ws, request);
98
+ });
99
+ return;
100
+ }
101
+ socket.destroy();
91
102
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIvY3JlYXRlLXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVCQSxvQ0ErREM7QUF0RkQsK0JBQXdFO0FBQ3hFLGdFQUFzQztBQUN0Qyx1Q0FBK0U7QUFDL0UsOENBQXdEO0FBQ3hELHdEQUE4RDtBQUM5RCw0REFBMEQ7QUFFMUQscUNBQTRDO0FBQzVDLHlEQUEwRDtBQUMxRCx1Q0FBOEM7QUFDOUMscURBQW1FO0FBQ25FLHFDQUE0QztBQUU1QywyQkFBK0M7QUFFL0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUEsb0JBQWMsRUFBQyxNQUFNLENBQUMsSUFBSSx3QkFBZSxDQUFDLENBQUE7QUFDekQsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLG9CQUFjLEVBQUMsb0JBQW9CLENBQUMsS0FBSyxHQUFHLENBQUE7QUFFdkU7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUk7SUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQkFBZ0IsR0FBRSxDQUFBO0lBQy9CLE1BQU0sZUFBZSxHQUFHLElBQUEsc0JBQVcsRUFDbEMsU0FBUyxFQUNULEVBQUUsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FDekIsQ0FBQTtJQUNELE1BQU0sV0FBVyxHQUFHLENBQUMsa0JBQWtCO1FBQ3RDLENBQUMsQ0FBQyxJQUFBLGdDQUFpQixFQUFDLGNBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsU0FBUyxDQUFBO0lBRVosTUFBTSxHQUFHLEdBQUcsSUFBSSxvQkFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLElB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
103
+ export {
104
+ createServer
105
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * TEE Bundle Claim Handler
3
+ * Handles ClaimTeeBundleRequest by verifying TEE attestations and reconstructing TLS transcript
4
+ */
5
+ import type { RPCHandler } from '#src/types/index.ts';
6
+ export declare const claimTeeBundle: RPCHandler<'claimTeeBundle'>;
@@ -0,0 +1,232 @@
1
+ import { ClaimTeeBundleResponse } from "../../proto/api.js";
2
+ import { VerificationBundle } from "../../proto/tee-bundle.js";
3
+ import { substituteParamValues } from "../../providers/http/index.js";
4
+ import { assertValidProviderTranscript } from "../../server/utils/assert-valid-claim-request.js";
5
+ import { getAttestorAddress, niceParseJsonObject, signAsAttestor } from "../../server/utils/generics.js";
6
+ import { verifyOprfMpcOutputs } from "../../server/utils/tee-oprf-mpc-verification.js";
7
+ import { verifyOprfProofs } from "../../server/utils/tee-oprf-verification.js";
8
+ import { reconstructTlsTranscript } from "../../server/utils/tee-transcript-reconstruction.js";
9
+ import { verifyTeeBundle } from "../../server/utils/tee-verification.js";
10
+ import { AttestorError } from "../../utils/error.js";
11
+ import { createSignDataForClaim, getIdentifierFromClaimInfo } from "../../utils/index.js";
12
+ const claimTeeBundle = async (teeBundleRequest, { logger, client }) => {
13
+ const {
14
+ verificationBundle,
15
+ data
16
+ } = teeBundleRequest;
17
+ const res = ClaimTeeBundleResponse.create({ request: teeBundleRequest });
18
+ logger.info("Starting TEE bundle verification");
19
+ const teeData = await verifyTeeBundle(verificationBundle, logger);
20
+ const timestampS = Math.floor(teeData.kOutputPayload.timestampMs / 1e3);
21
+ logger.info("Verifying OPRF proofs");
22
+ const bundle = VerificationBundle.decode(verificationBundle);
23
+ const zkOprfResults = await verifyOprfProofs(
24
+ { ...teeData, oprfVerifications: bundle.oprfVerifications },
25
+ logger
26
+ );
27
+ logger.info("Verifying OPRF MPC outputs");
28
+ const oprfMpcResults = verifyOprfMpcOutputs(
29
+ teeData.kOutputPayload,
30
+ teeData.tOutputPayload,
31
+ logger
32
+ );
33
+ const allOprfResults = validateAndCombineOprfResults(zkOprfResults, oprfMpcResults, logger);
34
+ logger.info("Starting TLS transcript reconstruction with OPRF replacements");
35
+ const transcriptData = await reconstructTlsTranscript(teeData, logger, allOprfResults);
36
+ logger.info("Creating plaintext transcript from TEE data");
37
+ const plaintextTranscript = createPlaintextTranscriptFromTeeData(transcriptData, logger);
38
+ logger.info("Running direct provider validation on TEE reconstructed data");
39
+ if (!data) {
40
+ throw new AttestorError("ERROR_INVALID_CLAIM", "No claim data provided in TEE bundle request");
41
+ }
42
+ const validatedClaim = await validateTeeProviderReceipt(
43
+ plaintextTranscript,
44
+ data,
45
+ logger,
46
+ { version: client.metadata.clientVersion },
47
+ transcriptData.certificateInfo
48
+ );
49
+ const ctx = niceParseJsonObject(validatedClaim.context, "context");
50
+ ctx.pcr0_k = teeData.teekPcr0;
51
+ ctx.pcr0_t = teeData.teetPcr0;
52
+ ctx.tee_session_id = teeData.teeSessionId;
53
+ validatedClaim.context = JSON.stringify(ctx);
54
+ res.claim = {
55
+ ...validatedClaim,
56
+ identifier: getIdentifierFromClaimInfo(validatedClaim),
57
+ // Use timestampS from TEE_K bundle for claim signing
58
+ timestampS,
59
+ // hardcode for compatibility with V1 claims
60
+ epoch: 1
61
+ };
62
+ logger.info({ claim: res.claim }, "TEE bundle claim validation successful");
63
+ res.signatures = {
64
+ attestorAddress: getAttestorAddress(
65
+ client.metadata.signatureType
66
+ ),
67
+ claimSignature: res.claim ? await signAsAttestor(
68
+ createSignDataForClaim(res.claim),
69
+ client.metadata.signatureType
70
+ ) : new Uint8Array(),
71
+ resultSignature: await signAsAttestor(
72
+ ClaimTeeBundleResponse.encode(res).finish(),
73
+ client.metadata.signatureType
74
+ )
75
+ };
76
+ logger.info("TEE bundle claim processing completed");
77
+ return res;
78
+ };
79
+ function createPlaintextTranscriptFromTeeData(transcriptData, logger) {
80
+ const transcript = [];
81
+ if (transcriptData.revealedRequest && transcriptData.revealedRequest.length > 0) {
82
+ transcript.push({
83
+ sender: "client",
84
+ message: transcriptData.revealedRequest
85
+ });
86
+ logger.debug("Added TEE revealed request to plaintext transcript", {
87
+ length: transcriptData.revealedRequest.length
88
+ });
89
+ }
90
+ if (transcriptData.reconstructedResponse && transcriptData.reconstructedResponse.length > 0) {
91
+ transcript.push({
92
+ sender: "server",
93
+ message: transcriptData.reconstructedResponse
94
+ });
95
+ logger.debug("Added TEE consolidated response to plaintext transcript", {
96
+ length: transcriptData.reconstructedResponse.length
97
+ });
98
+ }
99
+ if (transcriptData.certificateInfo) {
100
+ logger.info("Certificate information available for validation", {
101
+ commonName: transcriptData.certificateInfo.commonName,
102
+ issuerCommonName: transcriptData.certificateInfo.issuerCommonName,
103
+ dnsNames: transcriptData.certificateInfo.dnsNames,
104
+ notBefore: new Date(transcriptData.certificateInfo.notBeforeUnix * 1e3).toISOString(),
105
+ notAfter: new Date(transcriptData.certificateInfo.notAfterUnix * 1e3).toISOString()
106
+ });
107
+ }
108
+ logger.info("Created plaintext transcript from TEE data", {
109
+ totalMessages: transcript.length,
110
+ hasRequest: !!transcriptData.revealedRequest?.length,
111
+ hasResponse: !!transcriptData.reconstructedResponse?.length,
112
+ hasCertificateInfo: !!transcriptData.certificateInfo
113
+ });
114
+ return transcript;
115
+ }
116
+ async function validateTeeProviderReceipt(plaintextTranscript, claimInfo, logger, providerCtx, certificateInfo) {
117
+ logger.info("Starting direct TEE provider validation", {
118
+ provider: claimInfo.provider,
119
+ transcriptMessages: plaintextTranscript.length,
120
+ hasCertificateInfo: !!certificateInfo
121
+ });
122
+ if (certificateInfo) {
123
+ validateTlsCertificate(claimInfo, certificateInfo, logger);
124
+ }
125
+ const validatedClaim = await assertValidProviderTranscript(
126
+ plaintextTranscript,
127
+ claimInfo,
128
+ logger,
129
+ providerCtx
130
+ );
131
+ logger.info("TEE provider validation completed successfully", {
132
+ provider: validatedClaim.provider,
133
+ owner: validatedClaim.owner || "unknown"
134
+ });
135
+ return validatedClaim;
136
+ }
137
+ function isHostnameValidForCertificate(hostname, certName) {
138
+ if (hostname === certName) {
139
+ return true;
140
+ }
141
+ if (certName.startsWith("*.")) {
142
+ const wildcardDomain = certName.slice(2);
143
+ if (hostname.endsWith(wildcardDomain)) {
144
+ const subdomainPart = hostname.slice(0, -wildcardDomain.length);
145
+ if (subdomainPart.endsWith(".")) {
146
+ const subdomain = subdomainPart.slice(0, -1);
147
+ return !subdomain.includes(".");
148
+ }
149
+ }
150
+ }
151
+ return false;
152
+ }
153
+ function validateTlsCertificate(claimInfo, certificateInfo, logger) {
154
+ let claimedHostname;
155
+ const paramsWithTemplates = niceParseJsonObject(claimInfo.parameters, "params");
156
+ const params = substituteParamValues(paramsWithTemplates, void 0, true).newParams;
157
+ if ("url" in params && typeof params.url === "string") {
158
+ claimedHostname = new URL(params.url).hostname;
159
+ }
160
+ if (!claimedHostname) {
161
+ logger.warn("Could not extract hostname from claim for certificate validation", {
162
+ provider: claimInfo.provider
163
+ });
164
+ throw new AttestorError(
165
+ "ERROR_INVALID_CLAIM",
166
+ "Certificate validation failed: hostname not found"
167
+ );
168
+ }
169
+ logger.info("Validating TLS certificate for claimed hostname", {
170
+ claimedHostname,
171
+ certificateCommonName: certificateInfo.commonName,
172
+ certificateDnsNames: certificateInfo.dnsNames
173
+ });
174
+ const isValidForHostname = isHostnameValidForCertificate(claimedHostname, certificateInfo.commonName) || certificateInfo.dnsNames.some((name) => isHostnameValidForCertificate(claimedHostname, name));
175
+ if (!isValidForHostname) {
176
+ throw new AttestorError(
177
+ "ERROR_INVALID_CLAIM",
178
+ `Certificate validation failed: hostname '${claimedHostname}' not valid for certificate (CN: ${certificateInfo.commonName}, SANs: ${certificateInfo.dnsNames.join(", ")})`
179
+ );
180
+ }
181
+ const now = Date.now() / 1e3;
182
+ if (now < certificateInfo.notBeforeUnix || now > certificateInfo.notAfterUnix) {
183
+ throw new AttestorError(
184
+ "ERROR_INVALID_CLAIM",
185
+ `Certificate validation failed: certificate not valid at current time (valid from ${new Date(certificateInfo.notBeforeUnix * 1e3).toISOString()} to ${new Date(certificateInfo.notAfterUnix * 1e3).toISOString()})`
186
+ );
187
+ }
188
+ logger.info("TLS certificate validation passed", {
189
+ claimedHostname,
190
+ validatedAgainst: isHostnameValidForCertificate(claimedHostname, certificateInfo.commonName) ? `CommonName: ${certificateInfo.commonName}` : `SAN: ${certificateInfo.dnsNames.find((name) => isHostnameValidForCertificate(claimedHostname, name))}`
191
+ });
192
+ }
193
+ function validateAndCombineOprfResults(zkOprfResults, oprfMpcResults, logger) {
194
+ const allOprfResults = [...zkOprfResults, ...oprfMpcResults];
195
+ if (allOprfResults.length === 0) {
196
+ return allOprfResults;
197
+ }
198
+ logger.info(`Combined ${zkOprfResults.length} ZK OPRF + ${oprfMpcResults.length} OPRF MPC results`);
199
+ const seen = {};
200
+ for (const result of zkOprfResults) {
201
+ seen[result.position] = { length: result.length, source: "zk" };
202
+ }
203
+ for (const result of oprfMpcResults) {
204
+ const existing = seen[result.position];
205
+ if (existing) {
206
+ if (existing.length !== result.length) {
207
+ throw new AttestorError(
208
+ "ERROR_INVALID_CLAIM",
209
+ `OPRF range conflict at position ${result.position}: ZK length ${existing.length} vs MPC length ${result.length}`
210
+ );
211
+ }
212
+ logger.warn(`Duplicate OPRF range at position ${result.position} from both ZK and MPC - using MPC result`);
213
+ }
214
+ for (const [pos, data] of Object.entries(seen)) {
215
+ const position = Number(pos);
216
+ const existingEnd = position + data.length;
217
+ const newEnd = result.position + result.length;
218
+ const overlaps = result.position < existingEnd && newEnd > position && result.position !== position;
219
+ if (overlaps) {
220
+ throw new AttestorError(
221
+ "ERROR_INVALID_CLAIM",
222
+ `Overlapping OPRF ranges: [${position}:${existingEnd}] (${data.source}) and [${result.position}:${newEnd}] (mpc)`
223
+ );
224
+ }
225
+ }
226
+ seen[result.position] = { length: result.length, source: "mpc" };
227
+ }
228
+ return allOprfResults;
229
+ }
230
+ export {
231
+ claimTeeBundle
232
+ };
@@ -1,2 +1,2 @@
1
- import { RPCHandler } from '../../types';
1
+ import type { RPCHandler } from '#src/types/index.ts';
2
2
  export declare const claimTunnel: RPCHandler<'claimTunnel'>;
@@ -1,78 +1,80 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.claimTunnel = void 0;
4
- const config_1 = require("../../config");
5
- const api_1 = require("../../proto/api");
6
- const apm_1 = require("../../server/utils/apm");
7
- const assert_valid_claim_request_1 = require("../../server/utils/assert-valid-claim-request");
8
- const generics_1 = require("../../server/utils/generics");
9
- const utils_1 = require("../../utils");
1
+ import { MAX_CLAIM_TIMESTAMP_DIFF_S } from "../../config/index.js";
2
+ import { ClaimTunnelResponse } from "../../proto/api.js";
3
+ import { getApm } from "../../server/utils/apm.js";
4
+ import { assertTranscriptsMatch, assertValidClaimRequest } from "../../server/utils/assert-valid-claim-request.js";
5
+ import { getAttestorAddress, signAsAttestor } from "../../server/utils/generics.js";
6
+ import { AttestorError, createSignDataForClaim, getIdentifierFromClaimInfo, unixTimestampSeconds } from "../../utils/index.js";
10
7
  const claimTunnel = async (claimRequest, { tx, logger, client }) => {
11
- var _a, _b, _c, _d;
12
- const { request, data: { timestampS } = {}, } = claimRequest;
13
- const tunnel = client.getTunnel(request === null || request === void 0 ? void 0 : request.id);
14
- try {
15
- await tunnel.close();
16
- }
17
- catch (err) {
18
- logger.debug({ err }, 'error closing tunnel');
19
- }
20
- if (tx) {
21
- const transcriptBytes = tunnel.transcript.reduce((acc, { message }) => acc + message.length, 0);
22
- tx === null || tx === void 0 ? void 0 : tx.setLabel('transcriptBytes', transcriptBytes.toString());
8
+ const {
9
+ request,
10
+ data: { timestampS } = {}
11
+ } = claimRequest;
12
+ const tunnel = client.getTunnel(request?.id);
13
+ try {
14
+ await tunnel.close();
15
+ } catch (err) {
16
+ logger.debug({ err }, "error closing tunnel");
17
+ }
18
+ if (tx) {
19
+ const transcriptBytes = tunnel.transcript.reduce(
20
+ (acc, { message }) => acc + message.length,
21
+ 0
22
+ );
23
+ tx?.setLabel("transcriptBytes", transcriptBytes.toString());
24
+ }
25
+ if (tunnel.createRequest?.host !== request?.host || tunnel.createRequest?.port !== request?.port || tunnel.createRequest?.geoLocation !== request?.geoLocation || tunnel.createRequest?.proxySessionId !== request?.proxySessionId) {
26
+ throw AttestorError.badRequest("Tunnel request does not match");
27
+ }
28
+ assertTranscriptsMatch(claimRequest.transcript, tunnel.transcript);
29
+ const res = ClaimTunnelResponse.create({ request: claimRequest });
30
+ try {
31
+ const now = unixTimestampSeconds();
32
+ if (Math.floor(timestampS - now) > MAX_CLAIM_TIMESTAMP_DIFF_S) {
33
+ throw new AttestorError(
34
+ "ERROR_INVALID_CLAIM",
35
+ `Timestamp provided ${timestampS} is too far off. Current time is ${now}`
36
+ );
23
37
  }
24
- // we throw an error for cases where the attestor cannot prove
25
- // the user's request is faulty. For eg. if the user sends a
26
- // "createRequest" that does not match the tunnel's actual
27
- // create request -- the attestor cannot prove that the user
28
- // is lying. In such cases, we throw a bad request error.
29
- // Same goes for matching the transcript.
30
- if (((_a = tunnel.createRequest) === null || _a === void 0 ? void 0 : _a.host) !== (request === null || request === void 0 ? void 0 : request.host)
31
- || ((_b = tunnel.createRequest) === null || _b === void 0 ? void 0 : _b.port) !== (request === null || request === void 0 ? void 0 : request.port)
32
- || ((_c = tunnel.createRequest) === null || _c === void 0 ? void 0 : _c.geoLocation) !== (request === null || request === void 0 ? void 0 : request.geoLocation)) {
33
- throw utils_1.AttestorError.badRequest('Tunnel request does not match');
34
- }
35
- (0, assert_valid_claim_request_1.assertTranscriptsMatch)(claimRequest.transcript, tunnel.transcript);
36
- const res = api_1.ClaimTunnelResponse.create({ request: claimRequest });
38
+ const assertTx = getApm()?.startTransaction("assertValidClaimRequest", { childOf: tx });
37
39
  try {
38
- const now = (0, utils_1.unixTimestampSeconds)();
39
- if (Math.floor(timestampS - now) > config_1.MAX_CLAIM_TIMESTAMP_DIFF_S) {
40
- throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', `Timestamp provided ${timestampS} is too far off. Current time is ${now}`);
41
- }
42
- const assertTx = (_d = (0, apm_1.getApm)()) === null || _d === void 0 ? void 0 : _d.startTransaction('assertValidClaimRequest', { childOf: tx });
43
- try {
44
- const claim = await (0, assert_valid_claim_request_1.assertValidClaimRequest)(claimRequest, client.metadata, logger);
45
- res.claim = {
46
- ...claim,
47
- identifier: (0, utils_1.getIdentifierFromClaimInfo)(claim),
48
- // hardcode for compatibility with V1 claims
49
- epoch: 1
50
- };
51
- }
52
- catch (err) {
53
- assertTx === null || assertTx === void 0 ? void 0 : assertTx.setOutcome('failure');
54
- throw err;
55
- }
56
- finally {
57
- assertTx === null || assertTx === void 0 ? void 0 : assertTx.end();
58
- }
59
- }
60
- catch (err) {
61
- logger.error({ err }, 'invalid claim request');
62
- const attestorErr = utils_1.AttestorError.fromError(err);
63
- attestorErr.code = 'ERROR_INVALID_CLAIM';
64
- res.error = attestorErr.toProto();
40
+ const claim = await assertValidClaimRequest(
41
+ claimRequest,
42
+ client.metadata,
43
+ logger
44
+ );
45
+ res.claim = {
46
+ ...claim,
47
+ identifier: getIdentifierFromClaimInfo(claim),
48
+ // hardcode for compatibility with V1 claims
49
+ epoch: 1
50
+ };
51
+ } catch (err) {
52
+ assertTx?.setOutcome("failure");
53
+ throw err;
54
+ } finally {
55
+ assertTx?.end();
65
56
  }
66
- res.signatures = {
67
- attestorAddress: (0, generics_1.getAttestorAddress)(client.metadata.signatureType),
68
- claimSignature: res.claim
69
- ? await (0, generics_1.signAsAttestor)((0, utils_1.createSignDataForClaim)(res.claim), client.metadata.signatureType)
70
- : new Uint8Array(),
71
- resultSignature: await (0, generics_1.signAsAttestor)(api_1.ClaimTunnelResponse.encode(res).finish(), client.metadata.signatureType)
72
- };
73
- // remove tunnel from client -- to free up our mem
74
- client.removeTunnel(request.id);
75
- return res;
57
+ } catch (err) {
58
+ logger.error({ err }, "invalid claim request");
59
+ const attestorErr = AttestorError.fromError(err, "ERROR_INVALID_CLAIM");
60
+ res.error = attestorErr.toProto();
61
+ }
62
+ res.signatures = {
63
+ attestorAddress: getAttestorAddress(
64
+ client.metadata.signatureType
65
+ ),
66
+ claimSignature: res.claim ? await signAsAttestor(
67
+ createSignDataForClaim(res.claim),
68
+ client.metadata.signatureType
69
+ ) : new Uint8Array(),
70
+ resultSignature: await signAsAttestor(
71
+ ClaimTunnelResponse.encode(res).finish(),
72
+ client.metadata.signatureType
73
+ )
74
+ };
75
+ client.removeTunnel(request.id);
76
+ return res;
77
+ };
78
+ export {
79
+ claimTunnel
76
80
  };
77
- exports.claimTunnel = claimTunnel;
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhaW1UdW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL2hhbmRsZXJzL2NsYWltVHVubmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUF1RDtBQUN2RCx1Q0FBbUQ7QUFDbkQsOENBQTZDO0FBQzdDLDRGQUE2RztBQUM3Ryx3REFBOEU7QUFFOUUscUNBQW1IO0FBRTVHLE1BQU0sV0FBVyxHQUE4QixLQUFLLEVBQzFELFlBQVksRUFDWixFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQ3JCLEVBQUU7O0lBQ0gsTUFBTSxFQUNMLE9BQU8sRUFDUCxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQ3pCLEdBQUcsWUFBWSxDQUFBO0lBQ2hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEVBQUcsQ0FBQyxDQUFBO0lBQzdDLElBQUksQ0FBQztRQUNKLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3JCLENBQUM7SUFBQyxPQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUVELElBQUcsRUFBRSxFQUFFLENBQUM7UUFDUCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDL0MsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQzFDLENBQUMsQ0FDRCxDQUFBO1FBQ0QsRUFBRSxhQUFGLEVBQUUsdUJBQUYsRUFBRSxDQUFFLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lB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
@@ -1,2 +1,2 @@
1
- import { RPCHandler } from '../../types';
1
+ import type { RPCHandler } from '#src/types/index.ts';
2
2
  export declare const completeClaimOnChain: RPCHandler<'completeClaimOnChain'>;