entropy_debug_reveal.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import yargs from "yargs";
  2. import { hideBin } from "yargs/helpers";
  3. import { COMMON_DEPLOY_OPTIONS, findEntropyContract } from "./common";
  4. import { toPrivateKey } from "../src/core/base";
  5. import { EvmChain } from "../src/core/chains";
  6. import { DefaultStore } from "../src/node/utils/store";
  7. const parser = yargs(hideBin(process.argv))
  8. .usage(
  9. "Tries to reveal entropy requests with callback using the provided private key.\n" +
  10. "This can be used to manually debug why a callback was not triggered or recover manually from a downtime\n" +
  11. "Usage: \n" +
  12. "$0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>\n" +
  13. "$0 --chain <chain-id> --private-key <private-key> --sequence-number <start>:<end>",
  14. )
  15. .options({
  16. chain: {
  17. type: "string",
  18. demandOption: true,
  19. desc: "Chain id where the contract is deployed",
  20. },
  21. "private-key": COMMON_DEPLOY_OPTIONS["private-key"],
  22. "sequence-number": {
  23. type: "string",
  24. demandOption: true,
  25. 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)",
  26. },
  27. });
  28. async function main() {
  29. const argv = await parser.argv;
  30. const chain = DefaultStore.getChainOrThrow(argv.chain, EvmChain);
  31. const contract = findEntropyContract(chain);
  32. const provider = await contract.getDefaultProvider();
  33. const providerInfo = await contract.getProviderInfo(provider);
  34. const privateKey = toPrivateKey(argv.privateKey);
  35. let startingSequenceNumber: number, endingSequenceNumber: number;
  36. if (argv.sequenceNumber.includes(":")) {
  37. [startingSequenceNumber, endingSequenceNumber] = argv.sequenceNumber
  38. .split(":")
  39. .map(Number);
  40. } else {
  41. startingSequenceNumber = Number(argv.sequenceNumber);
  42. endingSequenceNumber = startingSequenceNumber + 1; // Default to revealing a single request
  43. }
  44. if (startingSequenceNumber >= endingSequenceNumber) {
  45. console.error(
  46. "Invalid sequence number range provided. Use format: <start>:<end>",
  47. );
  48. return;
  49. }
  50. console.log(
  51. `Revealing requests from sequence number ${startingSequenceNumber} to ${endingSequenceNumber}`,
  52. );
  53. for (
  54. let sequenceNumber = startingSequenceNumber;
  55. sequenceNumber < endingSequenceNumber;
  56. sequenceNumber++
  57. ) {
  58. console.log("Revealing request for sequence number: ", sequenceNumber);
  59. const request = await contract.getRequest(provider, sequenceNumber);
  60. if (request.sequenceNumber === "0") {
  61. console.log("Request not found");
  62. continue;
  63. }
  64. console.log("Request block number: ", request.blockNumber);
  65. const userRandomNumber = await contract.getUserRandomNumber(
  66. provider,
  67. sequenceNumber,
  68. parseInt(request.blockNumber),
  69. );
  70. console.log("User random number: ", userRandomNumber);
  71. const revealUrl = providerInfo.uri + `/revelations/${sequenceNumber}`;
  72. const fortunaResponse = await fetch(revealUrl);
  73. if (fortunaResponse.status !== 200) {
  74. console.error("Fortuna response status: ", fortunaResponse.status);
  75. console.error("Fortuna response body: ", await fortunaResponse.text());
  76. console.error(
  77. "Refusing to continue the script, please check the Fortuna service first.",
  78. );
  79. return;
  80. }
  81. const payload = await fortunaResponse.json();
  82. const providerRevelation = "0x" + payload.value.data;
  83. try {
  84. await contract.revealWithCallback(
  85. userRandomNumber,
  86. providerRevelation,
  87. provider,
  88. sequenceNumber,
  89. privateKey,
  90. );
  91. } catch (e) {
  92. console.error("Error revealing request: ", e);
  93. continue;
  94. }
  95. }
  96. }
  97. main();