@@ -24,6 +24,7 @@ import (
24
24
"sort"
25
25
"sync/atomic"
26
26
27
+ "github.com/ethereum/go-ethereum/common"
27
28
"github.com/ethereum/go-ethereum/consensus/misc"
28
29
"github.com/ethereum/go-ethereum/core/types"
29
30
"github.com/ethereum/go-ethereum/log"
@@ -48,7 +49,7 @@ const (
48
49
// blockFees represents a single block for processing
49
50
type blockFees struct {
50
51
// set by the caller
51
- blockNumber rpc. BlockNumber
52
+ blockNumber uint64
52
53
header * types.Header
53
54
block * types.Block // only set if reward percentiles are requested
54
55
receipts types.Receipts
@@ -133,7 +134,7 @@ func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) {
133
134
// also returned if requested and available.
134
135
// Note: an error is only returned if retrieving the head header has failed. If there are no
135
136
// retrievable blocks in the specified range then zero block count is returned with no error.
136
- func (oracle * Oracle ) resolveBlockRange (ctx context.Context , lastBlock rpc.BlockNumber , blocks , maxHistory int ) (* types.Block , []* types.Receipt , rpc. BlockNumber , int , error ) {
137
+ func (oracle * Oracle ) resolveBlockRange (ctx context.Context , lastBlock rpc.BlockNumber , blocks , maxHistory int ) (* types.Block , []* types.Receipt , uint64 , int , error ) {
137
138
var (
138
139
headBlock rpc.BlockNumber
139
140
pendingBlock * types.Block
@@ -181,7 +182,7 @@ func (oracle *Oracle) resolveBlockRange(ctx context.Context, lastBlock rpc.Block
181
182
if rpc .BlockNumber (blocks ) > lastBlock + 1 {
182
183
blocks = int (lastBlock + 1 )
183
184
}
184
- return pendingBlock , pendingReceipts , lastBlock , blocks , nil
185
+ return pendingBlock , pendingReceipts , uint64 ( lastBlock ) , blocks , nil
185
186
}
186
187
187
188
// FeeHistory returns data relevant for fee estimation based on the specified range of blocks.
@@ -197,20 +198,20 @@ func (oracle *Oracle) resolveBlockRange(ctx context.Context, lastBlock rpc.Block
197
198
// - gasUsedRatio: gasUsed/gasLimit in the given block
198
199
// Note: baseFee includes the next block after the newest of the returned range, because this
199
200
// value can be derived from the newest block.
200
- func (oracle * Oracle ) FeeHistory (ctx context.Context , blocks int , lastBlock rpc.BlockNumber , rewardPercentiles []float64 ) (rpc. BlockNumber , [][]* big.Int , []* big.Int , []float64 , error ) {
201
+ func (oracle * Oracle ) FeeHistory (ctx context.Context , blocks int , unresolvedLastBlock rpc.BlockNumber , rewardPercentiles []float64 ) (* big. Int , [][]* big.Int , []* big.Int , []float64 , error ) {
201
202
if blocks < 1 {
202
- return 0 , nil , nil , nil , nil // returning with no data and no error means there are no retrievable blocks
203
+ return common . Big0 , nil , nil , nil , nil // returning with no data and no error means there are no retrievable blocks
203
204
}
204
205
if blocks > maxFeeHistory {
205
206
log .Warn ("Sanitizing fee history length" , "requested" , blocks , "truncated" , maxFeeHistory )
206
207
blocks = maxFeeHistory
207
208
}
208
209
for i , p := range rewardPercentiles {
209
210
if p < 0 || p > 100 {
210
- return 0 , nil , nil , nil , fmt .Errorf ("%w: %f" , errInvalidPercentile , p )
211
+ return common . Big0 , nil , nil , nil , fmt .Errorf ("%w: %f" , errInvalidPercentile , p )
211
212
}
212
213
if i > 0 && p < rewardPercentiles [i - 1 ] {
213
- return 0 , nil , nil , nil , fmt .Errorf ("%w: #%d:%f > #%d:%f" , errInvalidPercentile , i - 1 , rewardPercentiles [i - 1 ], i , p )
214
+ return common . Big0 , nil , nil , nil , fmt .Errorf ("%w: #%d:%f > #%d:%f" , errInvalidPercentile , i - 1 , rewardPercentiles [i - 1 ], i , p )
214
215
}
215
216
}
216
217
// Only process blocks if reward percentiles were requested
@@ -223,36 +224,36 @@ func (oracle *Oracle) FeeHistory(ctx context.Context, blocks int, lastBlock rpc.
223
224
pendingReceipts []* types.Receipt
224
225
err error
225
226
)
226
- pendingBlock , pendingReceipts , lastBlock , blocks , err = oracle .resolveBlockRange (ctx , lastBlock , blocks , maxHistory )
227
+ pendingBlock , pendingReceipts , lastBlock , blocks , err : = oracle .resolveBlockRange (ctx , unresolvedLastBlock , blocks , maxHistory )
227
228
if err != nil || blocks == 0 {
228
- return 0 , nil , nil , nil , err
229
+ return common . Big0 , nil , nil , nil , err
229
230
}
230
- oldestBlock := lastBlock + 1 - rpc . BlockNumber (blocks )
231
+ oldestBlock := lastBlock + 1 - uint64 (blocks )
231
232
232
233
var (
233
- next = int64 ( oldestBlock )
234
+ next = oldestBlock
234
235
results = make (chan * blockFees , blocks )
235
236
)
236
237
for i := 0 ; i < maxBlockFetchers && i < blocks ; i ++ {
237
238
go func () {
238
239
for {
239
240
// Retrieve the next block number to fetch with this goroutine
240
- blockNumber := rpc . BlockNumber ( atomic .AddInt64 (& next , 1 ) - 1 )
241
+ blockNumber := atomic .AddUint64 (& next , 1 ) - 1
241
242
if blockNumber > lastBlock {
242
243
return
243
244
}
244
245
245
246
fees := & blockFees {blockNumber : blockNumber }
246
- if pendingBlock != nil && blockNumber >= rpc . BlockNumber ( pendingBlock .NumberU64 () ) {
247
+ if pendingBlock != nil && blockNumber >= pendingBlock .NumberU64 () {
247
248
fees .block , fees .receipts = pendingBlock , pendingReceipts
248
249
} else {
249
250
if len (rewardPercentiles ) != 0 {
250
- fees .block , fees .err = oracle .backend .BlockByNumber (ctx , blockNumber )
251
+ fees .block , fees .err = oracle .backend .BlockByNumber (ctx , rpc . BlockNumber ( blockNumber ) )
251
252
if fees .block != nil && fees .err == nil {
252
253
fees .receipts , fees .err = oracle .backend .GetReceipts (ctx , fees .block .Hash ())
253
254
}
254
255
} else {
255
- fees .header , fees .err = oracle .backend .HeaderByNumber (ctx , blockNumber )
256
+ fees .header , fees .err = oracle .backend .HeaderByNumber (ctx , rpc . BlockNumber ( blockNumber ) )
256
257
}
257
258
}
258
259
if fees .block != nil {
@@ -275,7 +276,7 @@ func (oracle *Oracle) FeeHistory(ctx context.Context, blocks int, lastBlock rpc.
275
276
for ; blocks > 0 ; blocks -- {
276
277
fees := <- results
277
278
if fees .err != nil {
278
- return 0 , nil , nil , nil , fees .err
279
+ return common . Big0 , nil , nil , nil , fees .err
279
280
}
280
281
i := int (fees .blockNumber - oldestBlock )
281
282
if fees .header != nil {
@@ -288,13 +289,13 @@ func (oracle *Oracle) FeeHistory(ctx context.Context, blocks int, lastBlock rpc.
288
289
}
289
290
}
290
291
if firstMissing == 0 {
291
- return 0 , nil , nil , nil , nil
292
+ return common . Big0 , nil , nil , nil , nil
292
293
}
293
294
if len (rewardPercentiles ) != 0 {
294
295
reward = reward [:firstMissing ]
295
296
} else {
296
297
reward = nil
297
298
}
298
299
baseFee , gasUsedRatio = baseFee [:firstMissing + 1 ], gasUsedRatio [:firstMissing ]
299
- return oldestBlock , reward , baseFee , gasUsedRatio , nil
300
+ return new (big. Int ). SetUint64 ( oldestBlock ) , reward , baseFee , gasUsedRatio , nil
300
301
}
0 commit comments