@@ -2,13 +2,15 @@ package bootstrap
22
33import (
44 "context"
5+ _ "embed"
56 "errors"
67 "fmt"
78 "math"
89 "time"
910
1011 pebbleDB "github.com/cockroachdb/pebble"
1112 gethTypes "github.com/ethereum/go-ethereum/core/types"
13+ "github.com/onflow/cadence"
1214 "github.com/onflow/flow-go-sdk/access"
1315 "github.com/onflow/flow-go-sdk/access/grpc"
1416 "github.com/onflow/flow-go/fvm/environment"
@@ -50,6 +52,11 @@ const (
5052 DefaultResourceExhaustedMaxRetryDelay = 30 * time .Second
5153)
5254
55+ var (
56+ //go:embed cadence/get_fees_surge_factor.cdc
57+ getFeesSurgeFactor []byte
58+ )
59+
5360type Storages struct {
5461 Storage * pebble.Storage
5562 Registers * pebble.RegisterStorage
@@ -649,12 +656,12 @@ func setupStorage(
649656 // }
650657
651658 feeParameters := pebble .NewFeeParameters (store )
652- if _ , err = feeParameters . Get (); errors . Is ( err , errs . ErrEntityNotFound ) {
653- if err := feeParameters . Store ( models . DefaultFeeParameters , batch ); err != nil {
654- return nil , nil , fmt .Errorf ("failed to bootstrap fee parameters : %w" , err )
655- }
656- } else if err != nil {
657- return nil , nil , fmt .Errorf ("failed to load latest fee parameters: %w" , err )
659+ currentFeeParams , err := getNetworkFeeParams ( context . Background (), config , client , logger )
660+ if err != nil {
661+ return nil , nil , fmt .Errorf ("failed to fetch current fees surge factor : %w" , err )
662+ }
663+ if err := feeParameters . Store ( currentFeeParams , batch ); err != nil {
664+ return nil , nil , fmt .Errorf ("failed to bootstrap fee parameters: %w" , err )
658665 }
659666
660667 if batch .Count () > 0 {
@@ -794,3 +801,36 @@ func (m *metricsWrapper) Stop() {
794801 m .stopFN ()
795802 <- m .Done ()
796803}
804+
805+ // getNetworkFeeParams returns the network's current Flow fees parameters
806+ func getNetworkFeeParams (
807+ ctx context.Context ,
808+ config config.Config ,
809+ client * requester.CrossSporkClient ,
810+ logger zerolog.Logger ,
811+ ) (* models.FeeParameters , error ) {
812+ val , err := client .ExecuteScriptAtLatestBlock (
813+ ctx ,
814+ requester .ReplaceAddresses (getFeesSurgeFactor , config .FlowNetworkID ),
815+ nil ,
816+ )
817+ if err != nil {
818+ return nil , err
819+ }
820+
821+ // sanity check, should never occur
822+ if _ , ok := val .(cadence.UFix64 ); ! ok {
823+ return nil , fmt .Errorf ("failed to convert surgeFactor %v to UFix64, got type: %T" , val , val )
824+ }
825+
826+ surgeFactor := val .(cadence.UFix64 )
827+
828+ logger .Debug ().
829+ Uint64 ("surge-factor" , uint64 (surgeFactor )).
830+ Msg ("get current surge factor executed" )
831+
832+ feeParameters := models .DefaultFeeParameters ()
833+ feeParameters .SurgeFactor = surgeFactor
834+
835+ return feeParameters , nil
836+ }
0 commit comments