@@ -7,60 +7,95 @@ import { DefaultStore } from "../src/node/utils/store";
77
88const 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
2828async 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
66101main ( ) ;
0 commit comments