Skip to content

Commit 1dd0c91

Browse files
authored
feat(contract_manager): improve manual reveal script (#2767)
* feat(contract_manager): improve manual reveal script
1 parent 435b8aa commit 1dd0c91

File tree

1 file changed

+66
-31
lines changed

1 file changed

+66
-31
lines changed

contract_manager/scripts/entropy_debug_reveal.ts

Lines changed: 66 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,60 +7,95 @@ import { DefaultStore } from "../src/node/utils/store";
77

88
const parser = yargs(hideBin(process.argv))
99
.usage(
10-
"Tries to reveal an entropy request with callback using the provided private key.\n" +
11-
"This can be used to manually debug why a callback was not triggered.\n" +
12-
"Usage: $0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>",
10+
"Tries to reveal entropy requests with callback using the provided private key.\n" +
11+
"This can be used to manually debug why a callback was not triggered or recover manually from a downtime\n" +
12+
"Usage: \n" +
13+
"$0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>\n" +
14+
"$0 --chain <chain-id> --private-key <private-key> --sequence-number <start>:<end>",
1315
)
1416
.options({
1517
chain: {
1618
type: "string",
1719
demandOption: true,
18-
desc: "test latency for the contract on this chain",
20+
desc: "Chain id where the contract is deployed",
1921
},
2022
"private-key": COMMON_DEPLOY_OPTIONS["private-key"],
2123
"sequence-number": {
22-
type: "number",
24+
type: "string",
2325
demandOption: true,
24-
desc: "sequence number of the request to reveal",
26+
desc: "Sequence number of the request to reveal or a range of sequence numbers to reveal separated by colon (e.g. 1000:1100 reveals requests with 1000 <= number < 1100)",
2527
},
2628
});
2729

2830
async function main() {
2931
const argv = await parser.argv;
3032
const chain = DefaultStore.getChainOrThrow(argv.chain, EvmChain);
3133
const contract = findEntropyContract(chain);
32-
const sequenceNumber = argv.sequenceNumber;
33-
3434
const provider = await contract.getDefaultProvider();
3535
const providerInfo = await contract.getProviderInfo(provider);
3636
const privateKey = toPrivateKey(argv.privateKey);
37-
const request = await contract.getRequest(provider, sequenceNumber);
38-
if (request.sequenceNumber === "0") {
39-
console.log("Request not found");
40-
return;
37+
let startingSequenceNumber: number, endingSequenceNumber: number;
38+
if (argv.sequenceNumber.includes(":")) {
39+
[startingSequenceNumber, endingSequenceNumber] = argv.sequenceNumber
40+
.split(":")
41+
.map(Number);
42+
} else {
43+
startingSequenceNumber = Number(argv.sequenceNumber);
44+
endingSequenceNumber = startingSequenceNumber + 1; // Default to revealing a single request
4145
}
42-
console.log("Request block number: ", request.blockNumber);
43-
const userRandomNumber = await contract.getUserRandomNumber(
44-
provider,
45-
sequenceNumber,
46-
parseInt(request.blockNumber),
47-
);
48-
console.log("User random number: ", userRandomNumber);
49-
const revealUrl = providerInfo.uri + `/revelations/${sequenceNumber}`;
50-
const fortunaResponse = await fetch(revealUrl);
51-
if (fortunaResponse.status !== 200) {
52-
console.log("Fortuna response status: ", fortunaResponse.status);
46+
if (startingSequenceNumber >= endingSequenceNumber) {
47+
console.error(
48+
"Invalid sequence number range provided. Use format: <start>:<end>",
49+
);
5350
return;
5451
}
55-
const payload = await fortunaResponse.json();
56-
const providerRevelation = "0x" + payload.value.data;
57-
await contract.revealWithCallback(
58-
userRandomNumber,
59-
providerRevelation,
60-
provider,
61-
sequenceNumber,
62-
privateKey,
52+
console.log(
53+
`Revealing requests from sequence number ${startingSequenceNumber} to ${endingSequenceNumber}`,
6354
);
55+
56+
for (
57+
let sequenceNumber = startingSequenceNumber;
58+
sequenceNumber < endingSequenceNumber;
59+
sequenceNumber++
60+
) {
61+
console.log("Revealing request for sequence number: ", sequenceNumber);
62+
const request = await contract.getRequest(provider, sequenceNumber);
63+
if (request.sequenceNumber === "0") {
64+
console.log("Request not found");
65+
continue;
66+
}
67+
console.log("Request block number: ", request.blockNumber);
68+
const userRandomNumber = await contract.getUserRandomNumber(
69+
provider,
70+
sequenceNumber,
71+
parseInt(request.blockNumber),
72+
);
73+
console.log("User random number: ", userRandomNumber);
74+
const revealUrl = providerInfo.uri + `/revelations/${sequenceNumber}`;
75+
const fortunaResponse = await fetch(revealUrl);
76+
if (fortunaResponse.status !== 200) {
77+
console.error("Fortuna response status: ", fortunaResponse.status);
78+
console.error("Fortuna response body: ", await fortunaResponse.text());
79+
console.error(
80+
"Refusing to continue the script, please check the Fortuna service first.",
81+
);
82+
return;
83+
}
84+
const payload = await fortunaResponse.json();
85+
const providerRevelation = "0x" + payload.value.data;
86+
try {
87+
await contract.revealWithCallback(
88+
userRandomNumber,
89+
providerRevelation,
90+
provider,
91+
sequenceNumber,
92+
privateKey,
93+
);
94+
} catch (e) {
95+
console.error("Error revealing request: ", e);
96+
continue;
97+
}
98+
}
6499
}
65100

66101
main();

0 commit comments

Comments
 (0)