entropy_debug_reveal.ts 4.1 KB

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