@@ -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" +
12- "Usage: $0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>" ,
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" +
12+ "Usage: \n" +
13+ "$0 --chain <chain-id> --private-key <private-key> --sequence-number <sequence-number>\n" +
14+ "$0 --chain <chain-id> --private-key <private-key> --sequence-number <start>:<end>" ,
1315 )
1416 . options ( {
1517 chain : {
1618 type : "string" ,
1719 demandOption : true ,
18- desc : "test latency for the contract on this chain " ,
20+ desc : "Chain id where the contract is deployed " ,
1921 } ,
2022 "private-key" : COMMON_DEPLOY_OPTIONS [ "private-key" ] ,
2123 "sequence-number" : {
22- type : "number " ,
24+ type : "string " ,
2325 demandOption : true ,
24- desc : "sequence number of the request to reveal" ,
26+ 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) " ,
2527 } ,
2628 } ) ;
2729
2830async function main ( ) {
2931 const argv = await parser . argv ;
3032 const chain = DefaultStore . getChainOrThrow ( argv . chain , EvmChain ) ;
3133 const contract = findEntropyContract ( chain ) ;
32- const sequenceNumber = argv . sequenceNumber ;
33-
3434 const provider = await contract . getDefaultProvider ( ) ;
3535 const providerInfo = await contract . getProviderInfo ( provider ) ;
3636 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 ;
37+ let startingSequenceNumber : number , endingSequenceNumber : number ;
38+ if ( argv . sequenceNumber . includes ( ":" ) ) {
39+ [ startingSequenceNumber , endingSequenceNumber ] = argv . sequenceNumber
40+ . split ( ":" )
41+ . map ( Number ) ;
42+ } else {
43+ startingSequenceNumber = Number ( argv . sequenceNumber ) ;
44+ endingSequenceNumber = startingSequenceNumber + 1 ; // Default to revealing a single request
4145 }
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 ) ;
46+ if ( startingSequenceNumber >= endingSequenceNumber ) {
47+ console . error (
48+ "Invalid sequence number range provided. Use format: <start>:<end>" ,
49+ ) ;
5350 return ;
5451 }
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 ,
52+ console . log (
53+ `Revealing requests from sequence number ${ startingSequenceNumber } to ${ endingSequenceNumber } ` ,
6354 ) ;
55+
56+ for (
57+ let sequenceNumber = startingSequenceNumber ;
58+ sequenceNumber < endingSequenceNumber ;
59+ sequenceNumber ++
60+ ) {
61+ console . log ( "Revealing request for sequence number: " , sequenceNumber ) ;
62+ const request = await contract . getRequest ( provider , sequenceNumber ) ;
63+ if ( request . sequenceNumber === "0" ) {
64+ console . log ( "Request not found" ) ;
65+ continue ;
66+ }
67+ console . log ( "Request block number: " , request . blockNumber ) ;
68+ const userRandomNumber = await contract . getUserRandomNumber (
69+ provider ,
70+ sequenceNumber ,
71+ parseInt ( request . blockNumber ) ,
72+ ) ;
73+ console . log ( "User random number: " , userRandomNumber ) ;
74+ const revealUrl = providerInfo . uri + `/revelations/${ sequenceNumber } ` ;
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