@@ -7,60 +7,95 @@ import { DefaultStore } from "../src/node/utils/store";
7
7
8
8
const parser = yargs ( hideBin ( process . argv ) )
9
9
. 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>" ,
13
15
)
14
16
. options ( {
15
17
chain : {
16
18
type : "string" ,
17
19
demandOption : true ,
18
- desc : "test latency for the contract on this chain " ,
20
+ desc : "Chain id where the contract is deployed " ,
19
21
} ,
20
22
"private-key" : COMMON_DEPLOY_OPTIONS [ "private-key" ] ,
21
23
"sequence-number" : {
22
- type : "number " ,
24
+ type : "string " ,
23
25
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) " ,
25
27
} ,
26
28
} ) ;
27
29
28
30
async function main ( ) {
29
31
const argv = await parser . argv ;
30
32
const chain = DefaultStore . getChainOrThrow ( argv . chain , EvmChain ) ;
31
33
const contract = findEntropyContract ( chain ) ;
32
- const sequenceNumber = argv . sequenceNumber ;
33
-
34
34
const provider = await contract . getDefaultProvider ( ) ;
35
35
const providerInfo = await contract . getProviderInfo ( provider ) ;
36
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 ;
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
41
45
}
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
+ ) ;
53
50
return ;
54
51
}
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 } ` ,
63
54
) ;
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
+ }
64
99
}
65
100
66
101
main ( ) ;
0 commit comments