Skip to content
Merged
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 64 additions & 31 deletions contract_manager/scripts/entropy_debug_reveal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,60 +7,93 @@ import { DefaultStore } from "../src/node/utils/store";

const parser = yargs(hideBin(process.argv))
.usage(
"Tries to reveal an entropy request with callback using the provided private key.\n" +
"This can be used to manually debug why a callback was not triggered.\n" +
"Usage: $0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>",
"Tries to reveal entropy requests with callback using the provided private key.\n" +
"This can be used to manually debug why a callback was not triggered or recover manually from a downtime\n" +
"Usage: $0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would be useful to add an example of a seq number range

)
.options({
chain: {
type: "string",
demandOption: true,
desc: "test latency for the contract on this chain",
desc: "Chain id where the contract is deployed",
},
"private-key": COMMON_DEPLOY_OPTIONS["private-key"],
"sequence-number": {
type: "number",
type: "string",
demandOption: true,
desc: "sequence number of the request to reveal",
desc: "Sequence number of the request to reveal or a range of sequence numbers to reveal separated by colon (e.g. 1000:1100)",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the second number inclusive or exclusive?

},
});

async function main() {
const argv = await parser.argv;
const chain = DefaultStore.getChainOrThrow(argv.chain, EvmChain);
const contract = findEntropyContract(chain);
const sequenceNumber = argv.sequenceNumber;

const provider = await contract.getDefaultProvider();
const providerInfo = await contract.getProviderInfo(provider);
const privateKey = toPrivateKey(argv.privateKey);
const request = await contract.getRequest(provider, sequenceNumber);
if (request.sequenceNumber === "0") {
console.log("Request not found");
return;
let startingSequenceNumber: number, endingSequenceNumber: number;
if (argv.sequenceNumber.includes(":")) {
[startingSequenceNumber, endingSequenceNumber] = argv.sequenceNumber
.split(":")
.map(Number);
} else {
startingSequenceNumber = Number(argv.sequenceNumber);
endingSequenceNumber = startingSequenceNumber + 1; // Default to revealing a single request
}
console.log("Request block number: ", request.blockNumber);
const userRandomNumber = await contract.getUserRandomNumber(
provider,
sequenceNumber,
parseInt(request.blockNumber),
);
console.log("User random number: ", userRandomNumber);
const revealUrl = providerInfo.uri + `/revelations/${sequenceNumber}`;
const fortunaResponse = await fetch(revealUrl);
if (fortunaResponse.status !== 200) {
console.log("Fortuna response status: ", fortunaResponse.status);
if (startingSequenceNumber >= endingSequenceNumber) {
console.error(
"Invalid sequence number range provided. Use format: <start>:<end>",
);
return;
}
const payload = await fortunaResponse.json();
const providerRevelation = "0x" + payload.value.data;
await contract.revealWithCallback(
userRandomNumber,
providerRevelation,
provider,
sequenceNumber,
privateKey,
console.log(
`Revealing requests from sequence number ${startingSequenceNumber} to ${endingSequenceNumber}`,
);

for (
let sequenceNumber = startingSequenceNumber;
sequenceNumber < endingSequenceNumber;
sequenceNumber++
) {
console.log("Revealing request for sequence number: ", sequenceNumber);
const request = await contract.getRequest(provider, sequenceNumber);
if (request.sequenceNumber === "0") {
console.log("Request not found");
continue;
}
console.log("Request block number: ", request.blockNumber);
const userRandomNumber = await contract.getUserRandomNumber(
provider,
sequenceNumber,
parseInt(request.blockNumber),
);
console.log("User random number: ", userRandomNumber);
const revealUrl = providerInfo.uri + `/revelations/${sequenceNumber}`;
const fortunaResponse = await fetch(revealUrl);
if (fortunaResponse.status !== 200) {
console.error("Fortuna response status: ", fortunaResponse.status);
console.error("Fortuna response body: ", await fortunaResponse.text());
console.error(
"Refusing to continue the script, please check the Fortuna service first.",
);
return;
}
const payload = await fortunaResponse.json();
const providerRevelation = "0x" + payload.value.data;
try {
await contract.revealWithCallback(
userRandomNumber,
providerRevelation,
provider,
sequenceNumber,
privateKey,
);
} catch (e) {
console.error("Error revealing request: ", e);
continue;
}
}
}

main();
Loading