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

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 (145) hide show
  1. package/browser/resources/attestor-browser.min.mjs +4512 -0
  2. package/lib/avs/abis/avsDirectoryABI.js +338 -341
  3. package/lib/avs/abis/delegationABI.js +1 -4
  4. package/lib/avs/abis/registryABI.js +719 -722
  5. package/lib/avs/client/create-claim-on-avs.js +129 -157
  6. package/lib/avs/config.js +18 -24
  7. package/lib/avs/contracts/ReclaimServiceManager.js +1 -0
  8. package/lib/avs/contracts/common.js +1 -0
  9. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1139 -1156
  10. package/lib/avs/contracts/factories/index.js +4 -4
  11. package/lib/avs/contracts/index.js +2 -6
  12. package/lib/avs/types/index.js +1 -0
  13. package/lib/avs/utils/contracts.js +30 -50
  14. package/lib/avs/utils/register.js +75 -70
  15. package/lib/avs/utils/tasks.js +38 -45
  16. package/lib/client/create-claim.js +402 -431
  17. package/lib/client/tunnels/make-rpc-tcp-tunnel.js +46 -48
  18. package/lib/client/tunnels/make-rpc-tls-tunnel.js +125 -121
  19. package/lib/client/utils/attestor-pool.js +23 -22
  20. package/lib/client/utils/client-socket.js +86 -109
  21. package/lib/client/utils/message-handler.js +79 -89
  22. package/lib/config/index.js +40 -58
  23. package/lib/external-rpc/benchmark.js +61 -74
  24. package/lib/external-rpc/event-bus.js +12 -15
  25. package/lib/external-rpc/handle-incoming-msg.js +216 -225
  26. package/lib/external-rpc/jsc-polyfills/1.js +70 -68
  27. package/lib/external-rpc/jsc-polyfills/2.js +17 -12
  28. package/lib/external-rpc/jsc-polyfills/event.js +10 -15
  29. package/lib/external-rpc/jsc-polyfills/index.js +2 -2
  30. package/lib/external-rpc/jsc-polyfills/ws.js +77 -79
  31. package/lib/external-rpc/setup-browser.js +28 -28
  32. package/lib/external-rpc/setup-jsc.js +17 -17
  33. package/lib/external-rpc/types.js +1 -0
  34. package/lib/external-rpc/utils.js +89 -89
  35. package/lib/external-rpc/zk.js +55 -50
  36. package/lib/index.js +2 -6
  37. package/lib/mechain/abis/governanceABI.js +457 -460
  38. package/lib/mechain/abis/taskABI.js +502 -505
  39. package/lib/mechain/client/create-claim-on-mechain.js +24 -29
  40. package/lib/mechain/constants/index.js +3 -8
  41. package/lib/mechain/types/index.js +1 -0
  42. package/lib/proto/api.js +4200 -4087
  43. package/lib/proto/tee-bundle.js +1261 -1241
  44. package/lib/providers/http/index.js +616 -603
  45. package/lib/providers/http/patch-parse5-tree.js +27 -29
  46. package/lib/providers/http/utils.js +289 -248
  47. package/lib/providers/index.js +3 -6
  48. package/lib/server/create-server.js +89 -91
  49. package/lib/server/handlers/claimTeeBundle.js +231 -211
  50. package/lib/server/handlers/claimTunnel.js +66 -73
  51. package/lib/server/handlers/completeClaimOnChain.js +20 -25
  52. package/lib/server/handlers/createClaimOnChain.js +21 -27
  53. package/lib/server/handlers/createTaskOnMechain.js +40 -50
  54. package/lib/server/handlers/createTunnel.js +85 -90
  55. package/lib/server/handlers/disconnectTunnel.js +4 -7
  56. package/lib/server/handlers/fetchCertificateBytes.js +37 -53
  57. package/lib/server/handlers/index.js +21 -24
  58. package/lib/server/handlers/init.js +27 -28
  59. package/lib/server/handlers/toprf.js +13 -16
  60. package/lib/server/socket.js +97 -100
  61. package/lib/server/tunnels/make-tcp-tunnel.js +161 -186
  62. package/lib/server/utils/apm.js +32 -25
  63. package/lib/server/utils/assert-valid-claim-request.js +305 -334
  64. package/lib/server/utils/config-env.js +2 -2
  65. package/lib/server/utils/dns.js +12 -18
  66. package/lib/server/utils/gcp-attestation.js +233 -181
  67. package/lib/server/utils/generics.d.ts +1 -1
  68. package/lib/server/utils/generics.js +43 -37
  69. package/lib/server/utils/iso.js +253 -256
  70. package/lib/server/utils/keep-alive.js +36 -36
  71. package/lib/server/utils/nitro-attestation.js +295 -220
  72. package/lib/server/utils/oprf-raw.js +48 -55
  73. package/lib/server/utils/process-handshake.js +200 -218
  74. package/lib/server/utils/proxy-session.js +5 -5
  75. package/lib/server/utils/tee-oprf-mpc-verification.js +82 -78
  76. package/lib/server/utils/tee-oprf-verification.js +165 -142
  77. package/lib/server/utils/tee-transcript-reconstruction.js +176 -129
  78. package/lib/server/utils/tee-verification.js +397 -334
  79. package/lib/server/utils/validation.js +30 -37
  80. package/lib/types/bgp.js +1 -0
  81. package/lib/types/claims.js +1 -0
  82. package/lib/types/client.js +1 -0
  83. package/lib/types/general.js +1 -0
  84. package/lib/types/handlers.js +1 -0
  85. package/lib/types/providers.d.ts +3 -2
  86. package/lib/types/providers.gen.js +9 -15
  87. package/lib/types/providers.js +1 -0
  88. package/lib/types/rpc.js +1 -0
  89. package/lib/types/signatures.d.ts +1 -2
  90. package/lib/types/signatures.js +1 -0
  91. package/lib/types/tunnel.js +1 -0
  92. package/lib/types/zk.js +1 -0
  93. package/lib/utils/auth.js +54 -66
  94. package/lib/utils/b64-json.js +15 -15
  95. package/lib/utils/bgp-listener.js +107 -111
  96. package/lib/utils/claims.js +89 -80
  97. package/lib/utils/env.js +13 -17
  98. package/lib/utils/error.js +43 -47
  99. package/lib/utils/generics.js +284 -235
  100. package/lib/utils/http-parser.js +232 -187
  101. package/lib/utils/logger.js +80 -71
  102. package/lib/utils/prepare-packets.js +69 -67
  103. package/lib/utils/redactions.js +163 -121
  104. package/lib/utils/retries.js +22 -24
  105. package/lib/utils/signatures/eth.js +29 -28
  106. package/lib/utils/signatures/index.js +5 -10
  107. package/lib/utils/socket-base.js +84 -88
  108. package/lib/utils/tls.js +28 -28
  109. package/lib/utils/ws.js +19 -19
  110. package/lib/utils/zk.js +542 -582
  111. package/package.json +12 -5
  112. package/lib/external-rpc/global.d.js +0 -0
  113. package/lib/scripts/build-browser.d.ts +0 -1
  114. package/lib/scripts/build-jsc.d.ts +0 -1
  115. package/lib/scripts/build-lib.d.ts +0 -1
  116. package/lib/scripts/check-avs-registration.d.ts +0 -1
  117. package/lib/scripts/check-avs-registration.js +0 -28
  118. package/lib/scripts/fallbacks/crypto.d.ts +0 -1
  119. package/lib/scripts/fallbacks/crypto.js +0 -4
  120. package/lib/scripts/fallbacks/empty.d.ts +0 -3
  121. package/lib/scripts/fallbacks/empty.js +0 -4
  122. package/lib/scripts/fallbacks/re2.d.ts +0 -1
  123. package/lib/scripts/fallbacks/re2.js +0 -7
  124. package/lib/scripts/fallbacks/snarkjs.d.ts +0 -1
  125. package/lib/scripts/fallbacks/snarkjs.js +0 -10
  126. package/lib/scripts/fallbacks/stwo.d.ts +0 -6
  127. package/lib/scripts/fallbacks/stwo.js +0 -159
  128. package/lib/scripts/generate-provider-types.d.ts +0 -5
  129. package/lib/scripts/generate-provider-types.js +0 -101
  130. package/lib/scripts/generate-receipt.d.ts +0 -9
  131. package/lib/scripts/generate-receipt.js +0 -101
  132. package/lib/scripts/generate-toprf-keys.d.ts +0 -1
  133. package/lib/scripts/generate-toprf-keys.js +0 -24
  134. package/lib/scripts/jsc-cli-rpc.d.ts +0 -1
  135. package/lib/scripts/jsc-cli-rpc.js +0 -35
  136. package/lib/scripts/register-avs-operator.d.ts +0 -1
  137. package/lib/scripts/register-avs-operator.js +0 -3
  138. package/lib/scripts/start-server.d.ts +0 -1
  139. package/lib/scripts/start-server.js +0 -11
  140. package/lib/scripts/update-avs-metadata.d.ts +0 -1
  141. package/lib/scripts/update-avs-metadata.js +0 -20
  142. package/lib/scripts/utils.d.ts +0 -1
  143. package/lib/scripts/utils.js +0 -10
  144. package/lib/scripts/whitelist-operator.d.ts +0 -1
  145. package/lib/scripts/whitelist-operator.js +0 -16
@@ -1,168 +1,140 @@
1
- import { EventLog, hexlify, Wallet } from "ethers";
2
- import { CHAIN_CONFIGS, SELECTED_CHAIN_ID } from "../../avs/config.js";
3
- import { initialiseContracts } from "../../avs/utils/contracts.js";
4
- import { createNewClaimRequestOnChain, signClaimRequest } from "../../avs/utils/tasks.js";
1
+ import { EventLog, hexlify, Wallet } from 'ethers';
2
+ import { CHAIN_CONFIGS, SELECTED_CHAIN_ID } from "../config.js";
3
+ import { initialiseContracts } from "../utils/contracts.js";
4
+ import { createNewClaimRequestOnChain, signClaimRequest } from "../utils/tasks.js";
5
5
  import { createClaimOnAttestor as _createClaimOnAttestor, getAttestorClientFromPool } from "../../client/index.js";
6
6
  import { AttestorError, canonicalStringify, getIdentifierFromClaimInfo, logger as LOGGER, unixTimestampSeconds } from "../../utils/index.js";
7
7
  const EMPTY_CLAIM_USER_ID = hexlify(new Uint8Array(32));
8
- async function createClaimOnAvs({
9
- onStep,
10
- createClaimOnAttestor = _createClaimOnAttestor,
11
- chainId = SELECTED_CHAIN_ID,
12
- payer,
13
- ...opts
14
- }) {
15
- const {
16
- logger = LOGGER,
17
- ownerPrivateKey,
18
- name,
19
- params,
20
- context
21
- } = opts;
22
- const { contract, wallet, provider } = initialiseContracts(
23
- CHAIN_CONFIGS[chainId],
24
- ownerPrivateKey
25
- );
26
- logger.info(
27
- { owner: wallet.address, contract: await contract.getAddress() },
28
- "creating claim"
29
- );
30
- const arg = await requestClaimCreation();
31
- logger.info(
32
- {
33
- index: arg.taskIndex,
34
- operators: arg.task.operators.length
35
- },
36
- "task created, collecting claim signatures..."
37
- );
38
- onStep?.({ type: "taskCreated", data: arg });
39
- const responses = [];
40
- const timestampS = +arg.task.createdAt.toString();
41
- for (const op of arg.task.operators) {
42
- const res = await createClaimOnAttestor({
43
- ...opts,
44
- client: { url: op.url },
45
- timestampS,
46
- onStep: (step) => onStep?.({
47
- type: "attestorStep",
48
- data: {
49
- operatorAddress: op.addr,
50
- step
8
+ /**
9
+ * Creates a Reclaim claim on the AVS chain.
10
+ */
11
+ export async function createClaimOnAvs({ onStep, createClaimOnAttestor = _createClaimOnAttestor, chainId = SELECTED_CHAIN_ID, payer, ...opts }) {
12
+ const { logger = LOGGER, ownerPrivateKey, name, params, context, } = opts;
13
+ const { contract, wallet, provider } = initialiseContracts(CHAIN_CONFIGS[chainId], ownerPrivateKey);
14
+ logger.info({ owner: wallet.address, contract: await contract.getAddress() }, 'creating claim');
15
+ const arg = await requestClaimCreation();
16
+ logger.info({
17
+ index: arg.taskIndex,
18
+ operators: arg.task.operators.length,
19
+ }, 'task created, collecting claim signatures...');
20
+ onStep?.({ type: 'taskCreated', data: arg });
21
+ const responses = [];
22
+ const timestampS = +arg.task.createdAt.toString();
23
+ for (const op of arg.task.operators) {
24
+ const res = await createClaimOnAttestor({
25
+ ...opts,
26
+ client: { url: op.url },
27
+ timestampS,
28
+ onStep: (step) => (onStep?.({
29
+ type: 'attestorStep',
30
+ data: {
31
+ operatorAddress: op.addr,
32
+ step,
33
+ },
34
+ })),
35
+ logger: logger.child({ operator: op.addr }),
36
+ });
37
+ const signature = res.signatures?.claimSignature;
38
+ if (!signature) {
39
+ throw new Error('INTERNAL: Claim signature not generated');
51
40
  }
52
- }),
53
- logger: logger.child({ operator: op.addr })
54
- });
55
- const signature = res.signatures?.claimSignature;
56
- if (!signature) {
57
- throw new Error("INTERNAL: Claim signature not generated");
58
- }
59
- const diff = getClaimRequestDifference(res.request?.data, res.claim);
60
- if (diff) {
61
- throw new AttestorError(
62
- "ERROR_INVALID_CLAIM",
63
- `Claim request does not match the claim res data: ${diff}`,
64
- {
65
- diff,
66
- request: res.request?.data?.[diff],
67
- claim: res.claim?.[diff]
41
+ const diff = getClaimRequestDifference(res.request?.data, res.claim);
42
+ if (diff) {
43
+ throw new AttestorError('ERROR_INVALID_CLAIM', `Claim request does not match the claim res data: ${diff}`, {
44
+ diff,
45
+ request: res.request?.data?.[diff],
46
+ claim: res.claim?.[diff]
47
+ });
68
48
  }
69
- );
49
+ responses.push(res);
50
+ logger.info({ operator: op.addr }, 'signature generated');
51
+ onStep?.({
52
+ type: 'attestorDone',
53
+ data: {
54
+ task: arg,
55
+ responsesDone: responses,
56
+ },
57
+ });
70
58
  }
71
- responses.push(res);
72
- logger.info({ operator: op.addr }, "signature generated");
73
- onStep?.({
74
- type: "attestorDone",
75
- data: {
76
- task: arg,
77
- responsesDone: responses
78
- }
79
- });
80
- }
81
- const rslt = await completeTask();
82
- logger.info(
83
- { tx: rslt.txHash, task: arg.taskIndex },
84
- "claim submitted & validated"
85
- );
86
- return { ...rslt, claimData: responses[0].claim };
87
- async function requestClaimCreation() {
88
- const request = {
89
- provider: name,
90
- // blank for now -- till we figure out the right
91
- // algorithm for this
92
- claimUserId: EMPTY_CLAIM_USER_ID,
93
- claimHash: getIdentifierFromClaimInfo({
94
- provider: name,
95
- parameters: canonicalStringify(params),
96
- context: context ? canonicalStringify(context) : ""
97
- }),
98
- owner: wallet.address,
99
- requestedAt: unixTimestampSeconds()
100
- };
101
- if (!payer) {
102
- const payerWallet = new Wallet(ownerPrivateKey, provider);
103
- const { task } = await createNewClaimRequestOnChain({
104
- request,
105
- payer: payerWallet,
106
- owner: payerWallet,
107
- chainId
108
- });
109
- return task;
59
+ const rslt = await completeTask();
60
+ logger.info({ tx: rslt.txHash, task: arg.taskIndex }, 'claim submitted & validated');
61
+ return { ...rslt, claimData: responses[0].claim };
62
+ async function requestClaimCreation() {
63
+ const request = {
64
+ provider: name,
65
+ // blank for now -- till we figure out the right
66
+ // algorithm for this
67
+ claimUserId: EMPTY_CLAIM_USER_ID,
68
+ claimHash: getIdentifierFromClaimInfo({
69
+ provider: name,
70
+ parameters: canonicalStringify(params),
71
+ context: context
72
+ ? canonicalStringify(context)
73
+ : '',
74
+ }),
75
+ owner: wallet.address,
76
+ requestedAt: unixTimestampSeconds()
77
+ };
78
+ if (!payer) {
79
+ const payerWallet = new Wallet(ownerPrivateKey, provider);
80
+ const { task } = await createNewClaimRequestOnChain({
81
+ request,
82
+ payer: payerWallet,
83
+ owner: payerWallet,
84
+ chainId
85
+ });
86
+ return task;
87
+ }
88
+ const requestSignature = await signClaimRequest(request, wallet, chainId);
89
+ const client = getAttestorClientFromPool(payer.attestor);
90
+ await client.waitForInit();
91
+ const rslt = await client.rpc('createClaimOnChain', {
92
+ chainId: +chainId,
93
+ jsonCreateClaimRequest: JSON.stringify(request),
94
+ requestSignature
95
+ });
96
+ return JSON.parse(rslt.jsonTask);
110
97
  }
111
- const requestSignature = await signClaimRequest(
112
- request,
113
- wallet,
114
- chainId
115
- );
116
- const client = getAttestorClientFromPool(payer.attestor);
117
- await client.waitForInit();
118
- const rslt2 = await client.rpc("createClaimOnChain", {
119
- chainId: +chainId,
120
- jsonCreateClaimRequest: JSON.stringify(request),
121
- requestSignature
122
- });
123
- return JSON.parse(rslt2.jsonTask);
124
- }
125
- async function completeTask() {
126
- const data = {
127
- task: arg.task,
128
- signatures: responses.map((res) => hexlify(res.signatures?.claimSignature))
129
- };
130
- if (!payer) {
131
- const tx = await contract.taskCompleted(data, arg.taskIndex);
132
- const rslt3 = await tx.wait();
133
- const logs = rslt3?.logs ?? [];
134
- const eventLogs = logs.filter((log) => log instanceof EventLog);
135
- const ev = eventLogs[0];
136
- return {
137
- object: ev?.args,
138
- txHash: rslt3.hash
139
- };
98
+ async function completeTask() {
99
+ const data = {
100
+ task: arg.task,
101
+ signatures: responses
102
+ .map(res => (hexlify(res.signatures?.claimSignature))),
103
+ };
104
+ if (!payer) {
105
+ const tx = await contract.taskCompleted(data, arg.taskIndex);
106
+ const rslt = await tx.wait();
107
+ // check task created event was emitted
108
+ const logs = rslt?.logs ?? [];
109
+ const eventLogs = logs.filter((log) => log instanceof EventLog);
110
+ const ev = eventLogs[0];
111
+ return {
112
+ object: ev?.args,
113
+ txHash: rslt.hash
114
+ };
115
+ }
116
+ const client = getAttestorClientFromPool(payer.attestor);
117
+ await client.waitForInit();
118
+ const rslt = await client.rpc('completeClaimOnChain', {
119
+ chainId: +chainId,
120
+ taskIndex: Number(arg.taskIndex),
121
+ completedTaskJson: JSON.stringify(data)
122
+ });
123
+ const object = JSON.parse(rslt.taskCompletedObjectJson);
124
+ return { object, txHash: rslt.txHash };
140
125
  }
141
- const client = getAttestorClientFromPool(payer.attestor);
142
- await client.waitForInit();
143
- const rslt2 = await client.rpc("completeClaimOnChain", {
144
- chainId: +chainId,
145
- taskIndex: Number(arg.taskIndex),
146
- completedTaskJson: JSON.stringify(data)
147
- });
148
- const object = JSON.parse(rslt2.taskCompletedObjectJson);
149
- return { object, txHash: rslt2.txHash };
150
- }
151
126
  }
152
127
  function getClaimRequestDifference(a, b) {
153
- if (a.provider !== b.provider) {
154
- return "provider";
155
- }
156
- if (a.context !== b.context) {
157
- return "context";
158
- }
159
- if (a.parameters !== b.parameters) {
160
- return "parameters";
161
- }
162
- if (a.timestampS !== b.timestampS) {
163
- return "timestampS";
164
- }
128
+ if (a.provider !== b.provider) {
129
+ return 'provider';
130
+ }
131
+ if (a.context !== b.context) {
132
+ return 'context';
133
+ }
134
+ if (a.parameters !== b.parameters) {
135
+ return 'parameters';
136
+ }
137
+ if (a.timestampS !== b.timestampS) {
138
+ return 'timestampS';
139
+ }
165
140
  }
166
- export {
167
- createClaimOnAvs
168
- };
package/lib/avs/config.js CHANGED
@@ -1,26 +1,20 @@
1
1
  import { getEnvVariable } from "../utils/env.js";
2
- const CHAIN_CONFIGS = {
3
- "31337": {
4
- rpcUrl: "http://localhost:8545",
5
- contractAddress: "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB",
6
- delegationManagerAddress: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9",
7
- stakeRegistryAddress: "0x9E545E3C0baAB3E08CdfD552C960A1050f373042",
8
- avsDirectoryAddress: "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707"
9
- },
10
- "17000": {
11
- rpcUrl: getEnvVariable("RPC_URL") || "https://rpc.holesky.ethpandaops.io",
12
- contractAddress: "0x0861afc305999bfD3028dB66145395BdD7299366",
13
- delegationManagerAddress: "0xA44151489861Fe9e3055d95adC98FbD462B948e7",
14
- stakeRegistryAddress: "0xDa11C9Da04Ab02C4AF9374B27A5E727944D3E1dD",
15
- avsDirectoryAddress: "0x055733000064333CaDDbC92763c58BF0192fFeBf"
16
- }
17
- };
18
- const PRIVATE_KEY = getEnvVariable("PRIVATE_KEY");
19
- const SELECTED_CHAIN_ID = getEnvVariable("CHAIN_ID");
20
- const RECLAIM_PUBLIC_URL = getEnvVariable("RECLAIM_PUBLIC_URL");
21
- export {
22
- CHAIN_CONFIGS,
23
- PRIVATE_KEY,
24
- RECLAIM_PUBLIC_URL,
25
- SELECTED_CHAIN_ID
2
+ export const CHAIN_CONFIGS = {
3
+ '31337': {
4
+ rpcUrl: 'http://localhost:8545',
5
+ contractAddress: '0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB',
6
+ delegationManagerAddress: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9',
7
+ stakeRegistryAddress: '0x9E545E3C0baAB3E08CdfD552C960A1050f373042',
8
+ avsDirectoryAddress: '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707'
9
+ },
10
+ '17000': {
11
+ rpcUrl: getEnvVariable('RPC_URL') || 'https://rpc.holesky.ethpandaops.io',
12
+ contractAddress: '0x0861afc305999bfD3028dB66145395BdD7299366',
13
+ delegationManagerAddress: '0xA44151489861Fe9e3055d95adC98FbD462B948e7',
14
+ stakeRegistryAddress: '0xDa11C9Da04Ab02C4AF9374B27A5E727944D3E1dD',
15
+ avsDirectoryAddress: '0x055733000064333CaDDbC92763c58BF0192fFeBf'
16
+ }
26
17
  };
18
+ export const PRIVATE_KEY = getEnvVariable('PRIVATE_KEY');
19
+ export const SELECTED_CHAIN_ID = getEnvVariable('CHAIN_ID');
20
+ export const RECLAIM_PUBLIC_URL = getEnvVariable('RECLAIM_PUBLIC_URL');
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};