Skip to content

Commit 8e85269

Browse files
committed
feat(contract_manager): improve manual reveal script
1 parent a1d0e22 commit 8e85269

File tree

1 file changed

+68
-33
lines changed

1 file changed

+68
-33
lines changed

contract_manager/scripts/entropy_debug_reveal.ts

Lines changed: 68 additions & 33 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" +
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" +
1212
"Usage: $0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>",
1313
)
1414
.options({
1515
chain: {
1616
type: "string",
1717
demandOption: true,
18-
desc: "test latency for the contract on this chain",
18+
desc: "Chain id where the contract is deployed",
1919
},
2020
"private-key": COMMON_DEPLOY_OPTIONS["private-key"],
2121
"sequence-number": {
22-
type: "number",
22+
type: "string",
2323
demandOption: true,
24-
desc: "sequence number of the request to reveal",
24+
desc: "Sequence number of the request to reveal or a range of sequence numbers to reveal separated by colon (e.g. 1000:1100)",
2525
},
2626
});
2727

2828
async function main() {
2929
const argv = await parser.argv;
3030
const chain = DefaultStore.getChainOrThrow(argv.chain, EvmChain);
3131
const contract = findEntropyContract(chain);
32-
const sequenceNumber = argv.sequenceNumber;
33-
34-
const provider = await contract.getDefaultProvider();
35-
const providerInfo = await contract.getProviderInfo(provider);
36-
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;
32+
let startingSequenceNumber: number, endingSequenceNumber: number;
33+
if (argv.sequenceNumber.includes(":")) {
34+
[startingSequenceNumber, endingSequenceNumber] = argv.sequenceNumber
35+
.split(":")
36+
.map(Number);
37+
} else {
38+
startingSequenceNumber = Number(argv.sequenceNumber);
39+
endingSequenceNumber = startingSequenceNumber + 1; // Default to revealing a single request
4140
}
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);
41+
if (startingSequenceNumber >= endingSequenceNumber) {
42+
console.error(
43+
"Invalid sequence number range provided. Use format: <start>:<end>",
44+
);
5345
return;
5446
}
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,
47+
console.log(
48+
`Revealing requests from sequence number ${startingSequenceNumber} to ${endingSequenceNumber}`,
6349
);
50+
51+
for (
52+
let sequenceNumber = startingSequenceNumber;
53+
sequenceNumber < endingSequenceNumber;
54+
sequenceNumber++
55+
) {
56+
console.log("Revealing request for sequence number: ", sequenceNumber);
57+
const provider = await contract.getDefaultProvider();
58+
const providerInfo = await contract.getProviderInfo(provider);
59+
const privateKey = toPrivateKey(argv.privateKey);
60+
const request = await contract.getRequest(provider, sequenceNumber);
61+
if (request.sequenceNumber === "0") {
62+
console.log("Request not found");
63+
continue;
64+
}
65+
console.log("Request block number: ", request.blockNumber);
66+
const userRandomNumber = await contract.getUserRandomNumber(
67+
provider,
68+
sequenceNumber,
69+
parseInt(request.blockNumber),
70+
);
71+
console.log("User random number: ", userRandomNumber);
72+
const revealUrl =
73+
providerInfo.uri +
74+
`/revelations/${sequenceNumber}?block_number=${request.blockNumber}`;
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)