@@ -23,7 +23,7 @@ import (
2323 "math/big"
2424 "os"
2525 "path/filepath"
26- "sort "
26+ "slices "
2727 "strconv"
2828 "strings"
2929
@@ -486,8 +486,11 @@ func (api *API) getRewardFileNamesInRange(begin, end *rpc.BlockNumber) ([]reward
486486 if err != nil {
487487 return nil , err
488488 }
489+ if len (files ) == 0 {
490+ return nil , errors .New ("no file in rewards folder" )
491+ }
489492
490- var rewardFileNames = []rewardFileName {}
493+ rewardFileNames := make ( []rewardFileName , 0 , len ( files ))
491494 for _ , file := range files {
492495 if ! file .IsDir () {
493496 filePrefix , fileSuffix , found := strings .Cut (file .Name (), "." )
@@ -506,26 +509,29 @@ func (api *API) getRewardFileNamesInRange(begin, end *rpc.BlockNumber) ([]reward
506509 }
507510 }
508511 }
509-
510- sort .Slice (rewardFileNames , func (i , j int ) bool {
511- return rewardFileNames [i ].epochBlockNum < rewardFileNames [j ].epochBlockNum
512- })
513-
514- epochNumbers := make ([]int , len (rewardFileNames ))
515- for i , obj := range rewardFileNames {
516- epochNumbers [i ] = obj .epochBlockNum
512+ if len (rewardFileNames ) == 0 {
513+ return nil , errors .New ("no reward file in rewards folder" )
517514 }
518515
519- startIndex := sort .SearchInts (epochNumbers , int (beginHeader .Number .Int64 ()))
520- endIndex := sort .SearchInts (epochNumbers , int (endHeader .Number .Int64 ()))
521- if endIndex == len (epochNumbers ) {
522- endIndex -- //this is to prevent endIndex out of bounds when endInput is higher than last reward(epoch) block but lower than latest block
516+ slices .SortFunc (rewardFileNames , func (a , b rewardFileName ) int {
517+ return a .epochBlockNum - b .epochBlockNum
518+ })
519+ startIndex , _ := slices .BinarySearchFunc (rewardFileNames , int (beginHeader .Number .Int64 ()), func (rfn rewardFileName , number int ) int {
520+ return rfn .epochBlockNum - number
521+ })
522+ if startIndex == len (rewardFileNames ) {
523+ // retrun early if startIndex is out of bounds
524+ return []rewardFileName {}, nil
523525 }
524-
525- var rewardfileNamesInRange []rewardFileName
526- for i := startIndex ; i <= endIndex ; i ++ {
527- rewardfileNamesInRange = append (rewardfileNamesInRange , rewardFileNames [i ])
526+ endIndex , _ := slices .BinarySearchFunc (rewardFileNames , int (endHeader .Number .Int64 ()), func (rfn rewardFileName , number int ) int {
527+ return rfn .epochBlockNum - number
528+ })
529+ if endIndex != len (rewardFileNames ) {
530+ endIndex ++ // include the endIndex file
528531 }
532+ // create a new slice by copy in case of rewardFileNames is large
533+ rewardfileNamesInRange := make ([]rewardFileName , endIndex - startIndex )
534+ copy (rewardfileNamesInRange , rewardFileNames [startIndex :endIndex ])
529535 return rewardfileNamesInRange , nil
530536}
531537
0 commit comments