From 179a0630a43efedf81d8f2996740bcfd4f3e86b8 Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 2 Mar 2026 12:24:33 +0800 Subject: [PATCH 01/12] support tron dynamic checkpoint and add CheckpointPollInterval to checkpoint params --- auth/querier_test.go | 14 ++++- bridge/setu/listener/heimdall.go | 26 ++++++--- bridge/setu/listener/maticchain.go | 11 +++- bridge/setu/processor/checkpoint.go | 62 ++++++++++++++++----- bridge/setu/processor/troncheckpoint.go | 36 +++++++++++- bridge/setu/util/common.go | 38 +++++++++++++ chainmanager/querier_test.go | 13 ++++- checkpoint/handler.go | 22 +++++++- checkpoint/handler_test.go | 73 ++++++++++++++++++++++++- checkpoint/integration_test.go | 3 +- checkpoint/types/params.go | 52 +++++++++++------- featuremanager/keeper.go | 1 + featuremanager/types/keys.go | 9 +-- helper/util.go | 14 +++++ helper/util_test.go | 8 +++ params/subspace/subspace.go | 10 +++- 16 files changed, 328 insertions(+), 64 deletions(-) diff --git a/auth/querier_test.go b/auth/querier_test.go index fbdcd26c..6ba9c765 100644 --- a/auth/querier_test.go +++ b/auth/querier_test.go @@ -157,11 +157,19 @@ func (suite *QuerierTestSuite) TestQueryParams() { require.Equal(t, uint64(8), params.TxSizeCostPerByte) { + // When params are not set, querier should return zero values instead of panicking happ := app.Setup(true) ctx := happ.BaseApp.NewContext(true, abci.Header{}) querier := auth.NewQuerier(happ.AccountKeeper) - require.Panics(t, func() { - querier(ctx, path, req) - }) + res, err = querier(ctx, path, req) + require.NoError(t, err) + require.NotNil(t, res) + + var zeroParams types.Params + err4 := json.Unmarshal(res, &zeroParams) + require.NoError(t, err4) + // Params should be zero values when not initialized + require.Equal(t, uint64(0), zeroParams.MaxMemoCharacters) + require.Equal(t, uint64(0), zeroParams.TxSigLimit) } } diff --git a/bridge/setu/listener/heimdall.go b/bridge/setu/listener/heimdall.go index d9ceaf48..64a19e43 100644 --- a/bridge/setu/listener/heimdall.go +++ b/bridge/setu/listener/heimdall.go @@ -16,7 +16,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" checkpointTypes "github.com/maticnetwork/heimdall/checkpoint/types" clerkTypes "github.com/maticnetwork/heimdall/clerk/types" - featureManagerTypes "github.com/maticnetwork/heimdall/featuremanager/types" slashingTypes "github.com/maticnetwork/heimdall/slashing/types" stakingTypes "github.com/maticnetwork/heimdall/staking/types" htype "github.com/maticnetwork/heimdall/types" @@ -48,8 +47,17 @@ func (hl *HeimdallListener) Start() error { // Heimdall pollIntervall = (minimal pollInterval of rootchain and matichain) pollInterval := helper.GetConfig().EthSyncerPollInterval - if helper.GetConfig().CheckpointerPollInterval < helper.GetConfig().EthSyncerPollInterval { - pollInterval = helper.GetConfig().CheckpointerPollInterval + + checkpointPollInterval := helper.GetConfig().CheckpointerPollInterval + + // fetch initial checkpoint params (will retry up to 10 times or exit service) + checkpointParams := util.GetCheckpointParamsWithRetry(hl.cliCtx) + if checkpointParams.CheckpointPollInterval > 0 { + checkpointPollInterval = checkpointParams.CheckpointPollInterval + } + + if checkpointPollInterval < helper.GetConfig().EthSyncerPollInterval { + pollInterval = checkpointPollInterval } hl.Logger.Info("Start polling for events", "pollInterval", pollInterval) @@ -293,12 +301,12 @@ func (hl *HeimdallListener) StartPollingEventRecord(ctx context.Context, pollInt } func (hl *HeimdallListener) loadEventRecords(ctx context.Context, pollInterval time.Duration) { - targetFeature, err := util.GetTargetFeatureConfig(hl.cliCtx, featureManagerTypes.DynamicCheckpoint) - if err != nil || !targetFeature.IsOpen { - hl.Logger.Info("Feature not supported... goroutine exists") - - return - } + //targetFeature, err := util.GetTargetFeatureConfig(hl.cliCtx, featureManagerTypes.DynamicCheckpoint) + //if err != nil || !targetFeature.IsOpen { + // hl.Logger.Info("Feature not supported... goroutine exists") + // + // return + //} if atomic.LoadUint32(&hl.stateSyncedInitializationRun) == 1 { hl.Logger.Info("Last ProcessEventRecords not finished... goroutine exists") diff --git a/bridge/setu/listener/maticchain.go b/bridge/setu/listener/maticchain.go index 48c1267c..3fbed7a5 100644 --- a/bridge/setu/listener/maticchain.go +++ b/bridge/setu/listener/maticchain.go @@ -5,6 +5,7 @@ import ( "time" "github.com/RichardKnop/machinery/v1/tasks" + "github.com/maticnetwork/heimdall/bridge/setu/util" "github.com/maticnetwork/heimdall/helper" ) @@ -33,9 +34,15 @@ func (ml *MaticChainListener) Start() error { // start header process go ml.StartHeaderProcess(headerCtx) - ml.Logger.Info("Start polling for header blocks", "pollInterval", helper.GetConfig().CheckpointerPollInterval) + pollInterval := helper.GetConfig().CheckpointerPollInterval + params := util.GetCheckpointParamsWithRetry(ml.cliCtx) + if params.CheckpointPollInterval > 0 { + pollInterval = params.CheckpointPollInterval + } + + ml.Logger.Info("Start polling for header blocks", "pollInterval", pollInterval) - go ml.StartPolling(ctx, helper.GetConfig().CheckpointerPollInterval, true, nil) + go ml.StartPolling(ctx, pollInterval, true, nil) // subscribed to new head ml.Logger.Info("Subscribed to new head") diff --git a/bridge/setu/processor/checkpoint.go b/bridge/setu/processor/checkpoint.go index abab9986..4d011c7b 100644 --- a/bridge/setu/processor/checkpoint.go +++ b/bridge/setu/processor/checkpoint.go @@ -99,15 +99,23 @@ func (cp *CheckpointProcessor) startPolling(ctx context.Context) { now := time.Now() baseTime := time.Unix(0, 0) // no-ack ticker interval keep same with checkpoint interval - noAckInterval := helper.GetConfig().CheckpointerPollInterval + checkpointPollInterval := helper.GetConfig().CheckpointerPollInterval + + // fetch initial checkpoint params (will retry up to 10 times or exit service) + checkpointParams := util.GetCheckpointParamsWithRetry(cp.cliCtx) + if checkpointParams.CheckpointPollInterval > 0 { + checkpointPollInterval = checkpointParams.CheckpointPollInterval + } + // adjust no-ack ticker to tick at the middle of checkpoint interval - firstIntervalForNoAck := noAckInterval - (now.UTC().Sub(baseTime) % noAckInterval) - noAckInterval/2 // nolint: gomnd + firstIntervalForNoAck := checkpointPollInterval - (now.UTC().Sub(baseTime) % checkpointPollInterval) - checkpointPollInterval/2 // nolint: gomnd if firstIntervalForNoAck <= 0 { - firstIntervalForNoAck += noAckInterval + firstIntervalForNoAck += checkpointPollInterval } tickerForNoAck := time.NewTicker(firstIntervalForNoAck) - syncInterval := helper.GetConfig().CheckpointerPollInterval / 2 + syncInterval := checkpointPollInterval / 2 + noAckInterval := checkpointPollInterval tickerForSync := time.NewTicker(syncInterval) // stop ticker when everything done defer tickerForNoAck.Stop() @@ -568,10 +576,10 @@ func (cp *CheckpointProcessor) createAndSendCheckpointToHeimdall(checkpointConte latestCheckpoint, err := util.GetlastestCheckpoint(cp.cliCtx, rootChain) // event checkpoint is older than or equal to latest checkpoint if err == nil && latestCheckpoint != nil && latestCheckpoint.EndBlock+1 < start { - cp.Logger.Debug("Need to resubmit Checkpoint ack first", "start", start, "last_end", latestCheckpoint.EndBlock) + cp.Logger.Info("Need to resubmit Checkpoint ack first", "start", start, "last_end", latestCheckpoint.EndBlock) err := cp.resubmitCheckpointAck(checkpointContext, rootChain) if err != nil { - cp.Logger.Info("Error while resubmit checkpoint ack", "root", rootChain, "err", err) + cp.Logger.Error("Error while resubmit checkpoint ack", "root", rootChain, "err", err) return err } return nil @@ -840,16 +848,36 @@ func (cp *CheckpointProcessor) checkIfNoAckIsRequired(checkpointContext *Checkpo currentTime := time.Now().UTC() timeDiff := currentTime.Sub(checkpointCreationTime) - if timeDiff.Seconds() >= helper.GetConfig().CheckpointerPollInterval.Seconds() && index == 0 { - index = math.Floor(timeDiff.Seconds() / helper.GetConfig().CheckpointerPollInterval.Seconds()) + + // checkpoint params + checkpointParams := checkpointContext.CheckpointParams + + var checkpointPollInterval time.Duration + if checkpointParams.CheckpointPollInterval > 0 { + checkpointPollInterval = checkpointParams.CheckpointPollInterval + } else { + checkpointPollInterval = helper.GetConfig().CheckpointerPollInterval } - if index == 0 { + var checkpointTimeout time.Duration + isOpen, tronMaxLength, err := cp.getTronDynamicCheckpointProposalWithErr() + if err != nil { + cp.Logger.Error("failed to check if no ack is required. Error while fetching dynamic checkpoint feature", "error", err) return false, uint64(index) } + if isOpen { + checkpointTimeout, _ = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) + } else { + checkpointTimeout = checkpointPollInterval + } - // checkpoint params - checkpointParams := checkpointContext.CheckpointParams + if timeDiff.Seconds() >= checkpointTimeout.Seconds() && index == 0 { + index = math.Floor(timeDiff.Seconds() / checkpointTimeout.Seconds()) + } + + if index == 0 { + return false, uint64(index) + } // check if difference between no-ack time and current time lastNoAck := cp.getLastNoAckTime() @@ -991,9 +1019,7 @@ func (cp *CheckpointProcessor) Stop() { cp.cancelNoACKPolling() } -// // utils -// func (cp *CheckpointProcessor) getCheckpointContext(rootChain string) (*CheckpointContext, error) { // fetch chain params for different root chains chainmanagerParams, err := util.GetNewChainParams(cp.cliCtx, rootChain) @@ -1090,3 +1116,13 @@ func (cp *CheckpointProcessor) getDynamicCheckpointProposal(rootType string) (bo return fea.IsOpen, fea.IntConf[strings.ToLower(rootType)] != 0, fea.IntConf["maxLength"] } + +func (cp *CheckpointProcessor) getTronDynamicCheckpointProposalWithErr() (bool, int, error) { + fea, err := util.GetTronDynamicCheckpointFeature(cp.cliCtx) + if err != nil { + cp.Logger.Error("Error while fetching dynamic checkpoint feature", "error", err) + + return false, 0, err + } + return fea.IsOpen, fea.IntConf["maxLength"], err +} diff --git a/bridge/setu/processor/troncheckpoint.go b/bridge/setu/processor/troncheckpoint.go index 4eeb8e84..854482a0 100644 --- a/bridge/setu/processor/troncheckpoint.go +++ b/bridge/setu/processor/troncheckpoint.go @@ -97,6 +97,12 @@ func (cp *CheckpointProcessor) nextExpectedTronCheckpoint(checkpointContext *Che "end", end, ) } + + // Check cross-chain transactions for Tron dynamic checkpoint feature + if !cp.checkCrossChainForTron(start, end, checkpointParams.MaxCheckpointLength) { + end = start + } + // Handle when block producers go down if end == 0 || end == start || (0 < diff && diff < checkpointParams.AvgCheckpointLength) { cp.Logger.Debug("Fetching last header block to calculate time") @@ -137,10 +143,10 @@ func (cp *CheckpointProcessor) createAndSendTronCheckpointToHeimdall(checkpointC latestCheckpoint, err := util.GetlastestCheckpoint(cp.cliCtx, hmTypes.RootChainTypeTron) // event checkpoint is older than or equal to latest checkpoint if err == nil && latestCheckpoint != nil && latestCheckpoint.EndBlock+1 < start { - cp.Logger.Debug("Need to resubmit Checkpoint ack first", "start", start, "last_end", latestCheckpoint.EndBlock) + cp.Logger.Info("Need to resubmit Checkpoint ack first", "start", start, "last_end", latestCheckpoint.EndBlock) err := cp.resubmitTronCheckpointAck(checkpointContext) if err != nil { - cp.Logger.Info("Error while resubmit checkpoint ack", "root", hmTypes.RootChainTypeTron, "err", err) + cp.Logger.Error("Error while resubmit checkpoint ack", "root", hmTypes.RootChainTypeTron, "err", err) return err } return nil @@ -343,3 +349,29 @@ func (cp *CheckpointProcessor) resubmitTronCheckpointAck(checkpointContext *Chec return nil } + +// checkCrossChainForTron checks if checkpoint should be submitted based on Tron dynamic checkpoint feature +// This method implements the same logic as checkCrossChain but specifically for Tron chain +func (cp *CheckpointProcessor) checkCrossChainForTron(start uint64, end uint64, maxCheckpointLengthParam uint64) bool { + // Get Tron dynamic checkpoint feature configuration + isOpen, maxLength, err := cp.getTronDynamicCheckpointProposalWithErr() + if err != nil || !isOpen { + // If feature is not enabled or error occurred, allow checkpoint submission + return true + } + + // Validate maxLength parameter + if maxCheckpointLengthParam < uint64(maxLength) { + cp.Logger.Error("proposal feature-tron-dynamic-checkpoint maxlength is too long", + "maxLength", maxLength, "MaxCheckpointLength", maxCheckpointLengthParam) + return true + } + + // If checkpoint length already reached maxLength, allow submission + if end-start+1 >= uint64(maxLength) { + return true + } + + // Check if there are cross-chain transactions for Tron + return cp.hasCrossChainTx(start, end, hmTypes.RootChainTypeTron) +} diff --git a/bridge/setu/util/common.go b/bridge/setu/util/common.go index b3fd47e7..48929a41 100644 --- a/bridge/setu/util/common.go +++ b/bridge/setu/util/common.go @@ -426,6 +426,40 @@ func GetCheckpointParams(cliCtx cliContext.CLIContext) (*checkpointTypes.Params, return ¶ms, nil } +// GetCheckpointParamsWithRetry guarantees successful retrieval of checkpoint parameters +// by retrying up to 10 times. If it fails after 10 attempts, the service will exit. +func GetCheckpointParamsWithRetry(cliCtx cliContext.CLIContext) *checkpointTypes.Params { + const maxRetries = 10 + retryDelay := 1 * time.Second + maxRetryDelay := 30 * time.Second + + for attempt := 1; attempt <= maxRetries; attempt++ { + params, err := GetCheckpointParams(cliCtx) + if err == nil { + logger.Info("Successfully fetched checkpoint params", "attempt", attempt) + return params + } + + logger.Error("Failed to fetch checkpoint params, retrying...", + "err", err, "attempt", attempt, "maxRetries", maxRetries, "retryAfter", retryDelay) + + if attempt < maxRetries { + time.Sleep(retryDelay) + + // Exponential backoff with cap + retryDelay *= 2 + if retryDelay > maxRetryDelay { + retryDelay = maxRetryDelay + } + } + } + + logger.Error("Unexpected: exceeded retry loop without returning or exiting") + + panic(errors.New("Failed to fetch checkpoint params")) + return nil +} + // GetBufferedCheckpoint return checkpoint from bueffer func GetBufferedCheckpoint(cliCtx cliContext.CLIContext, rootChain string) (*hmtypes.Checkpoint, error) { response, err := helper.FetchFromAPI( @@ -570,6 +604,10 @@ func GetDynamicCheckpointFeature(cliCtx cliContext.CLIContext) (*featureManagerT return GetTargetFeatureConfig(cliCtx, featureManagerTypes.DynamicCheckpoint) } +func GetTronDynamicCheckpointFeature(cliCtx cliContext.CLIContext) (*featureManagerTypes.PlainFeatureData, error) { + return GetTargetFeatureConfig(cliCtx, featureManagerTypes.TronDynamicCheckpoint) +} + func GetFinalizedEthOpen(cliCtx cliContext.CLIContext) bool { feature, err := GetTargetFeatureConfig(cliCtx, featureManagerTypes.FinalizedEth) if err != nil { diff --git a/chainmanager/querier_test.go b/chainmanager/querier_test.go index e78eb7b7..852fa766 100644 --- a/chainmanager/querier_test.go +++ b/chainmanager/querier_test.go @@ -82,11 +82,18 @@ func (suite *QuerierTestSuite) TestQueryParams() { require.Equal(t, defaultParams.ChainParams, params.ChainParams) { + // When params are not set, querier should return zero values instead of panicking rapp := app.Setup(true) ctx := rapp.BaseApp.NewContext(true, abci.Header{}) querier := chainmanager.NewQuerier(rapp.ChainKeeper) - require.Panics(t, func() { - querier(ctx, path, req) - }) + res, err = querier(ctx, path, req) + require.NoError(t, err) + require.NotNil(t, res) + + var zeroParams types.Params + json.Unmarshal(res, &zeroParams) + // Params should be zero values when not initialized + require.Equal(t, uint64(0), zeroParams.MainchainTxConfirmations) + require.Equal(t, uint64(0), zeroParams.MaticchainTxConfirmations) } } diff --git a/checkpoint/handler.go b/checkpoint/handler.go index 7531b60b..f82eeaf3 100644 --- a/checkpoint/handler.go +++ b/checkpoint/handler.go @@ -225,14 +225,32 @@ func handleMsgCheckpointNoAck(ctx sdk.Context, msg types.MsgCheckpointNoAck, k K // Get buffer time from params bufferTime := k.GetParams(ctx).CheckpointBufferTime + var checkpointPollInterval time.Duration + if k.GetParams(ctx).CheckpointPollInterval > 0 { + checkpointPollInterval = k.GetParams(ctx).CheckpointPollInterval + } else { + checkpointPollInterval = helper.GetConfig().CheckpointerPollInterval + } + + var checkpointTimeout time.Duration + tronDynamicFeature := util.GetFeatureConfig().GetFeature(ctx, featuremanagerTypes.TronDynamicCheckpoint) + if tronDynamicFeature.IsOpen { + tronMaxLength := tronDynamicFeature.IntConf["maxLength"] + checkpointTimeout, _ = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) + } else { + checkpointTimeout = bufferTime + } + // Fetch last checkpoint from store // TODO figure out how to handle this error lastCheckpoint, _ := k.GetLastCheckpoint(ctx, hmTypes.RootChainTypeStake) lastCheckpointTime := time.Unix(int64(lastCheckpoint.TimeStamp), 0) // If last checkpoint is not present or last checkpoint happens before checkpoint buffer time -- thrown an error - if lastCheckpointTime.After(currentTime) || (currentTime.Sub(lastCheckpointTime) < bufferTime) { - logger.Debug("Invalid No ACK -- Waiting for last checkpoint ACK") + if lastCheckpointTime.After(currentTime) || (currentTime.Sub(lastCheckpointTime) < checkpointTimeout) { + logger.Debug("Invalid No ACK -- Waiting for last checkpoint ACK", "lastCheckpoint", lastCheckpoint, + "lastCheckpointTime", lastCheckpointTime, "currentTime", currentTime, + "checkpointTimeout", checkpointTimeout) return common.ErrInvalidNoACK(k.Codespace()).Result() } diff --git a/checkpoint/handler_test.go b/checkpoint/handler_test.go index 9ed44aef..d557989a 100644 --- a/checkpoint/handler_test.go +++ b/checkpoint/handler_test.go @@ -15,6 +15,7 @@ import ( "github.com/maticnetwork/heimdall/checkpoint" chSim "github.com/maticnetwork/heimdall/checkpoint/simulation" + featuremanagerTypes "github.com/maticnetwork/heimdall/featuremanager/types" "github.com/maticnetwork/heimdall/helper/mocks" hmTypes "github.com/maticnetwork/heimdall/types" "github.com/stretchr/testify/require" @@ -332,7 +333,6 @@ func (suite *HandlerTestSuite) TestHandleMsgCheckpointNoAck() { start := uint64(0) maxSize := uint64(256) params := keeper.GetParams(ctx) - checkpointBufferTime := params.CheckpointBufferTime dividendAccount := hmTypes.DividendAccount{ User: hmTypes.HexToHeimdallAddress("123"), @@ -359,8 +359,75 @@ func (suite *HandlerTestSuite) TestHandleMsgCheckpointNoAck() { require.True(t, got.IsOK(), "expected send-NoAck to be ok, got %v", got) // set time lastCheckpoint timestamp + checkpointBufferTime - newTime := lastCheckpoint.TimeStamp + uint64(checkpointBufferTime) - suite.ctx = ctx.WithBlockTime(time.Unix(0, int64(newTime))) + checkpointTimeout := 10 * time.Minute + newTime := time.Unix(int64(lastCheckpoint.TimeStamp), int64(checkpointTimeout)) + suite.ctx = ctx.WithBlockTime(newTime) + result := suite.SendNoAck() + require.True(t, result.IsOK(), "expected send-NoAck to be ok, got %v", got) + ackCount := keeper.GetACKCount(ctx, hmTypes.RootChainTypeStake) + require.Equal(t, uint64(0), uint64(ackCount), "Should not update state") +} + +func (suite *HandlerTestSuite) TestHandleMsgCheckpointNoAckWithTronDynamicOpen() { + t, app, ctx := suite.T(), suite.app, suite.ctx + keeper := app.CheckpointKeeper + stakingKeeper := app.StakingKeeper + topupKeeper := app.TopupKeeper + featureKeeper := app.FeatureKeeper + start := uint64(0) + maxSize := uint64(256) + params := keeper.GetParams(ctx) + + open := true + + featureParams := featuremanagerTypes.FeatureParams{ + FeatureParamMap: map[string]featuremanagerTypes.FeatureData{ + featuremanagerTypes.DynamicCheckpoint: {IsOpen: &open, + IntConf: map[string]int{ + "eth": 1, + "maxLength": 1024, + }}, + featuremanagerTypes.FinalizedEth: {IsOpen: &open}, + }, + } + featureData := featuremanagerTypes.FeatureData{ + IsOpen: &open, + IntConf: map[string]int{ + "maxLength": 1024, + }, + } + featureParams.FeatureParamMap[featuremanagerTypes.TronDynamicCheckpoint] = featureData + + featureKeeper.SetFeatureParams(ctx, featureParams) + + dividendAccount := hmTypes.DividendAccount{ + User: hmTypes.HexToHeimdallAddress("123"), + FeeAmount: big.NewInt(0).String(), + } + topupKeeper.AddDividendAccount(ctx, dividendAccount) + + // check valid checkpoint + // generate proposer for validator set + chSim.LoadValidatorSet(2, t, stakingKeeper, ctx, false, 10) + stakingKeeper.IncrementAccum(ctx, 1) + + lastCheckpoint, err := keeper.GetLastCheckpoint(ctx, hmTypes.RootChainTypeStake) + if err == nil { + start = start + lastCheckpoint.EndBlock + 1 + } + + header, err := chSim.GenRandCheckpoint(start, maxSize, params.MaxCheckpointLength) + + // add current proposer to header + header.Proposer = stakingKeeper.GetValidatorSet(ctx).Proposer.Signer + + got := suite.SendCheckpoint(header) + require.True(t, got.IsOK(), "expected send-NoAck to be ok, got %v", got) + + // set time lastCheckpoint timestamp + checkpointBufferTime + checkpointTimeout := 40 * time.Minute + newTime := time.Unix(int64(lastCheckpoint.TimeStamp), int64(checkpointTimeout)) + suite.ctx = ctx.WithBlockTime(newTime) result := suite.SendNoAck() require.True(t, result.IsOK(), "expected send-NoAck to be ok, got %v", got) ackCount := keeper.GetACKCount(ctx, hmTypes.RootChainTypeStake) diff --git a/checkpoint/integration_test.go b/checkpoint/integration_test.go index a1c7140e..5b845432 100644 --- a/checkpoint/integration_test.go +++ b/checkpoint/integration_test.go @@ -26,8 +26,7 @@ func createTestApp(isCheckTx bool) (*app.HeimdallApp, sdk.Context, context.CLICo cliCtx := context.NewCLIContext().WithCodec(app.Codec()) helper.SetTestConfig(helper.GetDefaultHeimdallConfig()) - - params := types.NewParams(5*time.Second, 256, 1024, 10000) + params := types.NewParams(5*time.Second, 256, 1024, 10000, 10*time.Minute) Checkpoints := make([]hmTypes.Checkpoint, 0) diff --git a/checkpoint/types/params.go b/checkpoint/types/params.go index 09222ab8..49e8c9f3 100644 --- a/checkpoint/types/params.go +++ b/checkpoint/types/params.go @@ -11,28 +11,31 @@ import ( // Default parameter values const ( - DefaultCheckpointBufferTime time.Duration = 1000 * time.Second // Time checkpoint is allowed to stay in buffer (1000 seconds ~ 17 mins) - DefaultAvgCheckpointLength uint64 = 256 - DefaultMaxCheckpointLength uint64 = 1024 - DefaultChildBlockInterval uint64 = 10000 + DefaultCheckpointBufferTime time.Duration = 1000 * time.Second // Time checkpoint is allowed to stay in buffer (1000 seconds ~ 17 mins) + DefaultAvgCheckpointLength uint64 = 256 + DefaultMaxCheckpointLength uint64 = 1024 + DefaultChildBlockInterval uint64 = 10000 + DefaultCheckpointPollInterval time.Duration = 30 * time.Minute // Poll interval for checkpoint service to send new checkpoints or missing ACK ) // Parameter keys var ( - KeyCheckpointBufferTime = []byte("CheckpointBufferTime") - KeyAvgCheckpointLength = []byte("AvgCheckpointLength") - KeyMaxCheckpointLength = []byte("MaxCheckpointLength") - KeyChildBlockInterval = []byte("ChildBlockInterval") + KeyCheckpointBufferTime = []byte("CheckpointBufferTime") + KeyAvgCheckpointLength = []byte("AvgCheckpointLength") + KeyMaxCheckpointLength = []byte("MaxCheckpointLength") + KeyChildBlockInterval = []byte("ChildBlockInterval") + KeyCheckpointPollInterval = []byte("CheckpointPollInterval") ) var _ subspace.ParamSet = &Params{} // Params defines the parameters for the auth module. type Params struct { - CheckpointBufferTime time.Duration `json:"checkpoint_buffer_time" yaml:"checkpoint_buffer_time"` - AvgCheckpointLength uint64 `json:"avg_checkpoint_length" yaml:"avg_checkpoint_length"` - MaxCheckpointLength uint64 `json:"max_checkpoint_length" yaml:"max_checkpoint_length"` - ChildBlockInterval uint64 `json:"child_chain_block_interval" yaml:"child_chain_block_interval"` + CheckpointBufferTime time.Duration `json:"checkpoint_buffer_time" yaml:"checkpoint_buffer_time"` + AvgCheckpointLength uint64 `json:"avg_checkpoint_length" yaml:"avg_checkpoint_length"` + MaxCheckpointLength uint64 `json:"max_checkpoint_length" yaml:"max_checkpoint_length"` + ChildBlockInterval uint64 `json:"child_chain_block_interval" yaml:"child_chain_block_interval"` + CheckpointPollInterval time.Duration `json:"checkpoint_poll_interval" yaml:"checkpoint_poll_interval"` } // NewParams creates a new Params object @@ -41,12 +44,14 @@ func NewParams( checkpointLength uint64, maxCheckpointLength uint64, childBlockInterval uint64, + checkpointPollInterval time.Duration, ) Params { return Params{ - CheckpointBufferTime: checkpointBufferTime, - AvgCheckpointLength: checkpointLength, - MaxCheckpointLength: maxCheckpointLength, - ChildBlockInterval: childBlockInterval, + CheckpointBufferTime: checkpointBufferTime, + AvgCheckpointLength: checkpointLength, + MaxCheckpointLength: maxCheckpointLength, + ChildBlockInterval: childBlockInterval, + CheckpointPollInterval: checkpointPollInterval, } } @@ -64,6 +69,7 @@ func (p *Params) ParamSetPairs() subspace.ParamSetPairs { {KeyAvgCheckpointLength, &p.AvgCheckpointLength}, {KeyMaxCheckpointLength, &p.MaxCheckpointLength}, {KeyChildBlockInterval, &p.ChildBlockInterval}, + {KeyCheckpointPollInterval, &p.CheckpointPollInterval}, } } @@ -77,10 +83,11 @@ func (p Params) Equal(p2 Params) bool { // DefaultParams returns a default set of parameters. func DefaultParams() Params { return Params{ - CheckpointBufferTime: DefaultCheckpointBufferTime, - AvgCheckpointLength: DefaultAvgCheckpointLength, - MaxCheckpointLength: DefaultMaxCheckpointLength, - ChildBlockInterval: DefaultChildBlockInterval, + CheckpointBufferTime: DefaultCheckpointBufferTime, + AvgCheckpointLength: DefaultAvgCheckpointLength, + MaxCheckpointLength: DefaultMaxCheckpointLength, + ChildBlockInterval: DefaultChildBlockInterval, + CheckpointPollInterval: DefaultCheckpointPollInterval, } } @@ -92,6 +99,7 @@ func (p Params) String() string { sb.WriteString(fmt.Sprintf("AvgCheckpointLength: %d\n", p.AvgCheckpointLength)) sb.WriteString(fmt.Sprintf("MaxCheckpointLength: %d\n", p.MaxCheckpointLength)) sb.WriteString(fmt.Sprintf("ChildBlockInterval: %d\n", p.ChildBlockInterval)) + sb.WriteString(fmt.Sprintf("CheckpointPollInterval: %s\n", p.CheckpointPollInterval)) return sb.String() } @@ -109,5 +117,9 @@ func (p Params) Validate() error { return fmt.Errorf("ChildBlockInterval should be greater than zero") } + if p.CheckpointPollInterval == 0 { + return fmt.Errorf("CheckpointPollInterval should be greater than zero") + } + return nil } diff --git a/featuremanager/keeper.go b/featuremanager/keeper.go index 93b3ef69..68f44a53 100644 --- a/featuremanager/keeper.go +++ b/featuremanager/keeper.go @@ -66,6 +66,7 @@ func (k Keeper) RegisterFeature() { k.addFeature(types.SupportMapMarshaling) k.addFeature(types.FinalizedEth) k.addFeature(types.NoAckValidatorCheck) + k.addFeature(types.TronDynamicCheckpoint) } func (k Keeper) HasFeature(feature string) bool { diff --git a/featuremanager/types/keys.go b/featuremanager/types/keys.go index b0b6dfb5..1bd65ef6 100644 --- a/featuremanager/types/keys.go +++ b/featuremanager/types/keys.go @@ -18,8 +18,9 @@ const ( ) const ( - SupportMapMarshaling = "SupportMapMarshaling" - DynamicCheckpoint = "DynamicCheckpoint" - FinalizedEth = "FinalizedEth" - NoAckValidatorCheck = "NoAckValidatorCheck" + SupportMapMarshaling = "SupportMapMarshaling" + DynamicCheckpoint = "DynamicCheckpoint" + FinalizedEth = "FinalizedEth" + NoAckValidatorCheck = "NoAckValidatorCheck" + TronDynamicCheckpoint = "TronDynamicCheckpoint" ) diff --git a/helper/util.go b/helper/util.go index 035d83fc..586d4060 100644 --- a/helper/util.go +++ b/helper/util.go @@ -16,6 +16,7 @@ import ( "os" "path" "sort" + "time" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" @@ -51,6 +52,8 @@ var ZeroAddress = common.Address{} // ZeroPubKey represents empty pub key var ZeroPubKey = hmTypes.PubKey{} +const BttcBlockInterval = 2 * time.Second + // GetFromAddress get from address func GetFromAddress(cliCtx context.CLIContext) types.HeimdallAddress { fromAddress := cliCtx.GetFromAddress() @@ -888,3 +891,14 @@ func Hash(s []byte) ([]byte, error) { bs := h.Sum(nil) return bs, nil } + +func CalcCheckpointTimeout(tronMaxLength int, pollTime time.Duration) (time.Duration, error) { + if pollTime <= 0 { + return 0, errors.New("pollTime must be greater than 0") + } + + timeForBttcBlocks := time.Duration(tronMaxLength) * BttcBlockInterval + + checkpointTimeout := ((timeForBttcBlocks + pollTime - 1) / pollTime) * pollTime + return checkpointTimeout, nil +} diff --git a/helper/util_test.go b/helper/util_test.go index 2ac50e2d..bbda5a72 100644 --- a/helper/util_test.go +++ b/helper/util_test.go @@ -4,6 +4,7 @@ import ( "encoding/hex" "math/big" "testing" + "time" "github.com/stretchr/testify/require" @@ -63,3 +64,10 @@ func TestGetPowerFromAmount(t *testing.T) { require.Equal(t, p.String(), v, "Power must match") } } + +func TestCalcCheckpointTimeout(t *testing.T) { + tronMaxLength := 1024 + pollTime := 10 * time.Minute + checkpointTimeout, _ := CalcCheckpointTimeout(tronMaxLength, pollTime) + require.Equal(t, 40*time.Minute, checkpointTimeout, "checkpointTimeout should match") +} diff --git a/params/subspace/subspace.go b/params/subspace/subspace.go index ea26a947..e8911fa5 100644 --- a/params/subspace/subspace.go +++ b/params/subspace/subspace.go @@ -2,9 +2,10 @@ package subspace import ( "encoding/json" - "github.com/ethereum/go-ethereum/log" "reflect" + "github.com/ethereum/go-ethereum/log" + "github.com/maticnetwork/heimdall/helper/fork" "github.com/cosmos/cosmos-sdk/codec" @@ -123,6 +124,13 @@ func (s Subspace) Get(ctx sdk.Context, key []byte, ptr interface{}) { store := s.kvStore(ctx) bz := store.Get(key) + // If the key does not exist in store, return early without modifying ptr + // This allows ptr to keep its zero value (e.g., 0 for time.Duration) + // Callers can check if the value > 0 to determine if it was set + if bz == nil { + return + } + var err error if hasMap(ctx, s, string(key)) { From 9fefa0e6bc06430999e5c9ff2fa3425a3f43bde1 Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 2 Mar 2026 21:18:19 -0600 Subject: [PATCH 02/12] upgrade dependencies --- .github/workflows/ci.yml | 6 +- .github/workflows/lint.yml | 6 +- README.md | 2 +- go.mod | 29 ++++-- go.sum | 204 +++++++++---------------------------- 5 files changed, 71 insertions(+), 176 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8818a62..f3406d98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,9 +5,9 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install Go - uses: actions/setup-go@v1 + uses: actions/setup-go@v5 with: go-version: 1.21 - name: "Build binaries" @@ -17,4 +17,4 @@ jobs: - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: - file: ./cover.out + file: ./cover.out \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 506a2cf6..6947ff88 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,11 +5,11 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install Go - uses: actions/setup-go@v1 + uses: actions/setup-go@v5 with: - go-version: 1.17 + go-version: 1.21 - name: "Run lint" uses: golangci/golangci-lint-action@v3 with: diff --git a/README.md b/README.md index 00e5dd73..acc03ce0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Validator node for Bittorrent Chain Network. It uses peppermint, customized [Ten ### Install from source -Make sure your have go1.11+ already installed +Make sure your have go1.21+ already installed ### Install ```bash diff --git a/go.mod b/go.mod index e58089dc..af6e5715 100644 --- a/go.mod +++ b/go.mod @@ -28,10 +28,9 @@ require ( github.com/tendermint/tendermint v0.34.21 github.com/tendermint/tm-db v0.6.7 github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/xdg/scram v1.0.3 // indirect - github.com/xdg/stringprep v1.0.3 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/sync v0.3.0 + go.mongodb.org/mongo-driver v1.5.1 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.10.0 golang.org/x/time v0.3.0 // indirect google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/grpc v1.58.3 @@ -51,7 +50,6 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b // indirect - github.com/btcsuite/btcd v0.20.1-beta // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect github.com/cespare/cp v1.1.1 // indirect @@ -76,7 +74,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/gomodule/redigo v2.0.0+incompatible // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/googleapis/gax-go/v2 v2.11.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -110,7 +108,7 @@ require ( github.com/prometheus/procfs v0.9.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rjeczalik/notify v0.9.2 // indirect + github.com/rjeczalik/notify v0.9.3 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rs/cors v1.8.2 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect @@ -126,12 +124,11 @@ require ( github.com/tklauser/numcpus v0.2.2 // indirect github.com/xsleonard/go-merkle v1.1.0 // indirect github.com/zondax/hid v0.9.1 // indirect - go.mongodb.org/mongo-driver v1.4.6 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/api v0.126.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect @@ -150,6 +147,10 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/subosito/gotenv v1.4.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.0.2 // indirect + github.com/xdg-go/stringprep v1.0.2 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/zondax/ledger-go v0.14.1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -162,3 +163,9 @@ replace github.com/cosmos/cosmos-sdk => github.com/maticnetwork/cosmos-sdk v0.37 replace github.com/ethereum/go-ethereum => github.com/maticnetwork/bor v0.2.18-0.20220922050621-c91d4ca1fa4f replace github.com/tendermint/tm-db => github.com/tendermint/tm-db v0.2.0 + +replace github.com/btcsuite/btcd => github.com/btcsuite/btcd v0.23.2 + +replace golang.org/x/net => golang.org/x/net v0.17.0 + +replace golang.org/x/crypto => golang.org/x/crypto v0.31.0 diff --git a/go.sum b/go.sum index 247a3d33..252208e4 100644 --- a/go.sum +++ b/go.sum @@ -823,20 +823,21 @@ github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b h1:L/QXpzIa3pOvUGt1D1lA5KjYhPBAN/3iWdP7xeFS9F0= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= -github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.23.2 h1:/YOgUp25sdCnP5ho6Hl3s0E438zlX+Kak7E6TgBgoT0= +github.com/btcsuite/btcd v0.23.2/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= @@ -892,7 +893,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -902,6 +902,7 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -1131,8 +1132,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= @@ -1276,7 +1278,7 @@ github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1: github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -1552,8 +1554,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qq github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= -github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= +github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= +github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -1679,16 +1681,20 @@ github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6Ac github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/scram v1.0.3 h1:nTadYh2Fs4BK2xdldEa2g5bbaZp0/+1nJMMPtPxS/to= -github.com/xdg/scram v1.0.3/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= -github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xsleonard/go-merkle v1.1.0 h1:fHe1fuhJjGH22ZzVTAH0jqHLhTGhOq3wQjJN+8P0jQg= github.com/xsleonard/go-merkle v1.1.0/go.mod h1:cW4z+UZ/4f2n9IJgIiyDCdYguchoDyDAPmpuOWGxdGg= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1715,8 +1721,9 @@ go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsX go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.mongodb.org/mongo-driver v1.4.6 h1:rh7GdYmDrb8AQSkF8yteAus8qYOgOASWDOv1BWqBXkU= go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= +go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1751,41 +1758,8 @@ go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95a go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1845,89 +1819,11 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1983,8 +1879,11 @@ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1997,7 +1896,6 @@ golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2010,7 +1908,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2043,8 +1940,6 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2055,14 +1950,11 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2081,7 +1973,6 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2099,7 +1990,6 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2109,21 +1999,15 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2141,8 +2025,10 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2230,6 +2116,8 @@ golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 1d110f8de1e61a13e6d41295129be7f62489a91f Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 2 Mar 2026 21:36:48 -0600 Subject: [PATCH 03/12] enable to set if increase gas price and the ratio when submit checkpoint to eth --- bridge/setu/broadcaster/broadcaster.go | 2 +- helper/config.go | 9 ++++++++ helper/tx.go | 32 +++++++++++++++++++++----- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/bridge/setu/broadcaster/broadcaster.go b/bridge/setu/broadcaster/broadcaster.go index 4f54398e..c650e980 100644 --- a/bridge/setu/broadcaster/broadcaster.go +++ b/bridge/setu/broadcaster/broadcaster.go @@ -120,7 +120,7 @@ func (tb *TxBroadcaster) BroadcastToMatic(msg bor.CallMsg) error { maticClient := helper.GetMaticClient() // get auth - auth, err := helper.GenerateAuthObj(maticClient, *msg.To, msg.Data) + auth, err := helper.GenerateAuthObj(maticClient, *msg.To, msg.Data, false) if err != nil { tb.logger.Error("Error generating auth object", "error", err) diff --git a/helper/config.go b/helper/config.go index 52db40d4..4ea24b25 100644 --- a/helper/config.go +++ b/helper/config.go @@ -102,6 +102,9 @@ const ( DefaultBttcChainID string = "15001" + DefaultEnableIncreaseGasPrice = false + DefaultGasPriceIncreasePercent = 0 + DefaultLogsType = "json" DefaultChain = "mainnet" @@ -165,6 +168,9 @@ type Configuration struct { EthMaxQueryBlocks int64 `mapstructure:"eth_max_query_blocks"` // eth max number of blocks in one query logs BscMaxQueryBlocks int64 `mapstructure:"bsc_max_query_blocks"` // bsc max number of blocks in one query logs TronMaxQueryBlocks int64 `mapstructure:"tron_max_query_blocks"` // tron max number of blocks in one query logs + + EnableIncreaseGasPrice bool `mapstructure:"enable_increase_gas_price"` // whether enable increase gas price when submit checkpoint to eth + GasPriceIncreasePercent int64 `mapstructure:"gas_price_increase_percent"` // the increase percent of gas price when submit tx. newGasPrice = oldGasPrice * (100 + GasPriceIncreasePercent) / 100 } var conf Configuration @@ -325,6 +331,9 @@ func GetDefaultHeimdallConfig() Configuration { EthMaxQueryBlocks: DefaultEthMaxQueryBlocks, BscMaxQueryBlocks: DefaultBscMaxQueryBlocks, TronMaxQueryBlocks: DefaultTronMaxQueryBlocks, + + EnableIncreaseGasPrice: DefaultEnableIncreaseGasPrice, + GasPriceIncreasePercent: DefaultGasPriceIncreasePercent, } } diff --git a/helper/tx.go b/helper/tx.go index b28954f9..7415042b 100644 --- a/helper/tx.go +++ b/helper/tx.go @@ -22,7 +22,7 @@ import ( "google.golang.org/protobuf/proto" ) -func GenerateAuthObj(client *ethclient.Client, address common.Address, data []byte) (auth *bind.TransactOpts, err error) { +func GenerateAuthObj(client *ethclient.Client, address common.Address, data []byte, enableIncreaseGasPrice bool) (auth *bind.TransactOpts, err error) { // generate call msg callMsg := ethereum.CallMsg{ To: &address, @@ -46,6 +46,18 @@ func GenerateAuthObj(client *ethclient.Client, address common.Address, data []by return } + if enableIncreaseGasPrice { + gasPriceIncreasePercent := GetConfig().GasPriceIncreasePercent + if gasPriceIncreasePercent > 0 { + multiplier := big.NewInt(100 + gasPriceIncreasePercent) + divisor := big.NewInt(100) + originGasPrice := gasprice + gasprice = new(big.Int).Mul(gasprice, multiplier) + gasprice.Div(gasprice, divisor) + Logger.Debug("Adjust gas price", "originGasPrice", originGasPrice, "adjustedGasPrice", gasprice) + } + } + mainChainMaxGasPrice := GetConfig().MainchainMaxGasPrice // Check if configured or not, Use default in case of invalid value if mainChainMaxGasPrice <= 0 { @@ -106,7 +118,15 @@ func (c *ContractCaller) SendCheckpoint(signedData []byte, sigs [][3]*big.Int, case hmtypes.RootChainTypeBsc: client = GetBscClient() } - auth, err := GenerateAuthObj(client, rootChainAddress, data) + var auth *bind.TransactOpts + + if rootChain == hmtypes.RootChainTypeEth { + enableIncreaseGasPrice := GetConfig().EnableIncreaseGasPrice + auth, err = GenerateAuthObj(client, rootChainAddress, data, enableIncreaseGasPrice) + } else { + auth, err = GenerateAuthObj(client, rootChainAddress, data, false) + } + if err != nil { Logger.Error("Unable to create auth object", "error", err) return err @@ -141,7 +161,7 @@ func (c *ContractCaller) SendTick(signedData []byte, sigs []byte, slashManagerAd return err } - auth, err := GenerateAuthObj(GetMainClient(), slashManagerAddress, data) + auth, err := GenerateAuthObj(GetMainClient(), slashManagerAddress, data, false) if err != nil { Logger.Error("Unable to create auth object", "error", err) return err @@ -173,7 +193,7 @@ func (c *ContractCaller) StakeFor(val common.Address, stakeAmount *big.Int, feeA return err } - auth, err := GenerateAuthObj(GetMainClient(), stakeManagerAddress, data) + auth, err := GenerateAuthObj(GetMainClient(), stakeManagerAddress, data, false) if err != nil { Logger.Error("Unable to create auth object", "error", err) return err @@ -206,7 +226,7 @@ func (c *ContractCaller) ApproveTokens(amount *big.Int, stakeManager common.Addr return err } - auth, err := GenerateAuthObj(GetMainClient(), tokenAddress, data) + auth, err := GenerateAuthObj(GetMainClient(), tokenAddress, data, false) if err != nil { Logger.Error("Unable to create auth object", "error", err) return err @@ -302,7 +322,7 @@ func (c *ContractCaller) SendMainStakingSync(syncMethod string, signedData []byt case hmtypes.RootChainTypeBsc: client = GetBscClient() } - auth, err := GenerateAuthObj(client, stakingManager, data) + auth, err := GenerateAuthObj(client, stakingManager, data, false) if err != nil { Logger.Error("Unable to create auth object", "error", err) return err From 17cacfd80e449971fca32444cb0a084051af4306 Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 2 Mar 2026 21:44:51 -0600 Subject: [PATCH 04/12] support set bsc start listen block by config file --- helper/call.go | 2 ++ helper/config.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/helper/call.go b/helper/call.go index 56d6aaef..be9f333e 100644 --- a/helper/call.go +++ b/helper/call.go @@ -1088,6 +1088,8 @@ func (c *ContractCaller) GetStartListenBlock(rootChainType string) uint64 { return GetConfig().TronStartListenBlock } else if rootChainType == hmTypes.RootChainTypeEth { return GetConfig().EthStartListenBlock + } else if rootChainType == hmTypes.RootChainTypeBsc { + return GetConfig().BscStartListenBlock } else { return 0 } diff --git a/helper/config.go b/helper/config.go index 52db40d4..eba1ae3d 100644 --- a/helper/config.go +++ b/helper/config.go @@ -157,6 +157,7 @@ type Configuration struct { TronStartListenBlock uint64 `mapstructure:"tron_start_listen_block"` // tron chain start listen block on bridge EthStartListenBlock uint64 `mapstructure:"eth_start_listen_block"` // eth chain start listen block on bridge + BscStartListenBlock uint64 `mapstructure:"bsc_start_listen_block"` // bsc chain start listen block on bridge EthUnconfirmedTxsBusyLimit int `mapstructure:"eth_unconfirmed_txs_busy_limit"` // the busy limit of unconfirmed txs on heimdall for eth BscUnconfirmedTxsBusyLimit int `mapstructure:"bsc_unconfirmed_txs_busy_limit"` // the busy limit of unconfirmed txs on heimdall for bsc @@ -317,6 +318,7 @@ func GetDefaultHeimdallConfig() Configuration { TronGridApiKey: DefaultTronGridApiKey, TronStartListenBlock: DefaultStartListenBlock, EthStartListenBlock: DefaultStartListenBlock, + BscStartListenBlock: DefaultStartListenBlock, EthUnconfirmedTxsBusyLimit: DefaultEthBusyLimitTxs, BscUnconfirmedTxsBusyLimit: DefaultBscBusyLimitTxs, From 65874fbc65645102fe1ce69346fbffae822b7657 Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 2 Mar 2026 22:00:39 -0600 Subject: [PATCH 05/12] fix the problem of submitting repeat checkpoint sync tx --- bridge/setu/listener/heimdall.go | 40 ++++++++++++++++++++++++++++++-- helper/config.go | 21 ++++++++++------- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/bridge/setu/listener/heimdall.go b/bridge/setu/listener/heimdall.go index d9ceaf48..ec89515a 100644 --- a/bridge/setu/listener/heimdall.go +++ b/bridge/setu/listener/heimdall.go @@ -3,6 +3,7 @@ package listener import ( "context" "encoding/json" + "fmt" "math/big" "strconv" "sync" @@ -104,6 +105,9 @@ func (hl *HeimdallListener) StartPolling(ctx context.Context, pollInterval time. hl.Logger.Info("Fetching new events between", "fromBlock", fromBlock, "toBlock", toBlock) + // set to avoid deduplicate checkpoint-sync events by (rootChain, number, startBlock, endBlock) + checkpointSyncSet := make(map[string]struct{}) + // Querying and processing Begin events for i := fromBlock; i <= toBlock; i++ { events, err := helper.GetBeginBlockEvents(hl.httpClient, int64(i)) @@ -111,7 +115,7 @@ func (hl *HeimdallListener) StartPolling(ctx context.Context, pollInterval time. hl.Logger.Error("Error fetching begin block events", "error", err) } for _, event := range events { - hl.ProcessBlockEvent(sdk.StringifyEvent(event), int64(i)) + hl.ProcessBlockEvent(sdk.StringifyEvent(event), int64(i), checkpointSyncSet) } } @@ -194,11 +198,18 @@ func (hl *HeimdallListener) fetchFromAndToBlock() (uint64, uint64, error) { return fromBlock, toBlock, err } } + maxQueryBlocks := helper.GetConfig().HeimdallMaxQueryBlocks + if maxQueryBlocks == 0 { + maxQueryBlocks = helper.DefaultHeimdallMaxQueryBlocks + } + if maxQueryBlocks != 0 && toBlock-fromBlock > uint64(maxQueryBlocks) { + toBlock = fromBlock + uint64(maxQueryBlocks) + } return fromBlock, toBlock, err } // ProcessBlockEvent - process Blockevents (BeginBlock, EndBlock events) from heimdall. -func (hl *HeimdallListener) ProcessBlockEvent(event sdk.StringEvent, blockHeight int64) { +func (hl *HeimdallListener) ProcessBlockEvent(event sdk.StringEvent, blockHeight int64, checkpointSyncSet map[string]struct{}) { hl.Logger.Info("Received block event from Heimdall", "eventType", event.Type, "height", blockHeight) eventBytes, err := json.Marshal(event) if err != nil { @@ -210,6 +221,13 @@ func (hl *HeimdallListener) ProcessBlockEvent(event sdk.StringEvent, blockHeight case checkpointTypes.EventTypeCheckpoint: hl.sendBlockTask("sendCheckpointToRootchain", eventBytes, blockHeight) case checkpointTypes.EventTypeCheckpointSync: + key := hl.getCheckpointSyncKey(event) + if _, exists := checkpointSyncSet[key]; exists { + hl.Logger.Info("CheckpointSync duplicate, skip sending task", "key", key) + return + } + + checkpointSyncSet[key] = struct{}{} hl.sendBlockTask("sendCheckpointSyncToStakeChain", eventBytes, blockHeight) case slashingTypes.EventTypeSlashLimit: hl.sendBlockTask("sendTickToHeimdall", eventBytes, blockHeight) @@ -228,6 +246,24 @@ func (hl *HeimdallListener) ProcessBlockEvent(event sdk.StringEvent, blockHeight } } +func (hl *HeimdallListener) getCheckpointSyncKey(event sdk.StringEvent) string { + var rootChain string + var number, startBlock, endBlock uint64 + for _, attr := range event.Attributes { + switch attr.Key { + case checkpointTypes.AttributeKeyRootChain: + rootChain = attr.Value + case checkpointTypes.AttributeKeyHeaderIndex: + number, _ = strconv.ParseUint(attr.Value, 10, 64) + case checkpointTypes.AttributeKeyStartBlock: + startBlock, _ = strconv.ParseUint(attr.Value, 10, 64) + case checkpointTypes.AttributeKeyEndBlock: + endBlock, _ = strconv.ParseUint(attr.Value, 10, 64) + } + } + return fmt.Sprintf("%s_%d_%d_%d", rootChain, number, startBlock, endBlock) +} + func (hl *HeimdallListener) sendBlockTask(taskName string, eventBytes []byte, blockHeight int64) { // create machinery task signature := &tasks.Signature{ diff --git a/helper/config.go b/helper/config.go index 52db40d4..6cfb57da 100644 --- a/helper/config.go +++ b/helper/config.go @@ -96,9 +96,10 @@ const ( DefaultBscBusyLimitTxs = 1000 DefaultTronBusyLimitTxs = 20000 - DefaultEthMaxQueryBlocks = 100 - DefaultBscMaxQueryBlocks = 5 - DefaultTronMaxQueryBlocks = 5 + DefaultEthMaxQueryBlocks = 100 + DefaultBscMaxQueryBlocks = 5 + DefaultTronMaxQueryBlocks = 5 + DefaultHeimdallMaxQueryBlocks = 1000 DefaultBttcChainID string = "15001" @@ -162,9 +163,10 @@ type Configuration struct { BscUnconfirmedTxsBusyLimit int `mapstructure:"bsc_unconfirmed_txs_busy_limit"` // the busy limit of unconfirmed txs on heimdall for bsc TronUnconfirmedTxsBusyLimit int `mapstructure:"tron_unconfirmed_txs_busy_limit"` // the busy limit of unconfirmed txs on heimdall for tron - EthMaxQueryBlocks int64 `mapstructure:"eth_max_query_blocks"` // eth max number of blocks in one query logs - BscMaxQueryBlocks int64 `mapstructure:"bsc_max_query_blocks"` // bsc max number of blocks in one query logs - TronMaxQueryBlocks int64 `mapstructure:"tron_max_query_blocks"` // tron max number of blocks in one query logs + EthMaxQueryBlocks int64 `mapstructure:"eth_max_query_blocks"` // eth max number of blocks in one query logs + BscMaxQueryBlocks int64 `mapstructure:"bsc_max_query_blocks"` // bsc max number of blocks in one query logs + TronMaxQueryBlocks int64 `mapstructure:"tron_max_query_blocks"` // tron max number of blocks in one query logs + HeimdallMaxQueryBlocks int64 `mapstructure:"heimdall_max_query_blocks"` // heimdall max number of blocks in one query logs } var conf Configuration @@ -322,9 +324,10 @@ func GetDefaultHeimdallConfig() Configuration { BscUnconfirmedTxsBusyLimit: DefaultBscBusyLimitTxs, TronUnconfirmedTxsBusyLimit: DefaultTronBusyLimitTxs, - EthMaxQueryBlocks: DefaultEthMaxQueryBlocks, - BscMaxQueryBlocks: DefaultBscMaxQueryBlocks, - TronMaxQueryBlocks: DefaultTronMaxQueryBlocks, + EthMaxQueryBlocks: DefaultEthMaxQueryBlocks, + BscMaxQueryBlocks: DefaultBscMaxQueryBlocks, + TronMaxQueryBlocks: DefaultTronMaxQueryBlocks, + HeimdallMaxQueryBlocks: DefaultHeimdallMaxQueryBlocks, } } From 870834a9d7ccfb18815366e00352e7ad21634769 Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 2 Mar 2026 22:03:31 -0600 Subject: [PATCH 06/12] modify log --- bridge/setu/processor/checkpointsync.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge/setu/processor/checkpointsync.go b/bridge/setu/processor/checkpointsync.go index 5309f0b3..0387d994 100644 --- a/bridge/setu/processor/checkpointsync.go +++ b/bridge/setu/processor/checkpointsync.go @@ -147,7 +147,7 @@ func (cp *CheckpointProcessor) sendCheckpointSyncToStakeChain(eventBytes string, } else { txHash := common.FromHex(txHash) if err := cp.createAndSendCheckpointSyncToTron(checkpointContext, number, startBlock, endBlock, rootChain, blockHeight, txHash); err != nil { - cp.Logger.Error("Error sending checkpoint to rootchain", "error", err) + cp.Logger.Error("Error sending checkpoint sync to rootchain", "error", err) return err } } From b6e5fb36b41cc1a1544876bbae373b5e88d8c42a Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Tue, 3 Mar 2026 00:16:53 -0600 Subject: [PATCH 07/12] add TriggerConstantContractWithRetry --- helper/call.go | 4 ++-- tron/tronclient.go | 30 ++++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/helper/call.go b/helper/call.go index 56d6aaef..8578b5bc 100644 --- a/helper/call.go +++ b/helper/call.go @@ -1104,7 +1104,7 @@ func (c *ContractCaller) GetTronHeaderInfo(headerID uint64, contractAddress stri } // Call - data, err := c.TronChainRPC.TriggerConstantContract(contractAddress, btsPack) + data, err := c.TronChainRPC.TriggerConstantContractWithRetry(contractAddress, btsPack) if err != nil { return root, 0, 0, 0, types.HeimdallAddress{}, err } @@ -1134,7 +1134,7 @@ func (c *ContractCaller) GetSyncedCheckpointId(contractAddress string, rootChain } // Call - data, err := c.TronChainRPC.TriggerConstantContract(contractAddress, btsPack) + data, err := c.TronChainRPC.TriggerConstantContractWithRetry(contractAddress, btsPack) if err != nil { return 0, err } diff --git a/tron/tronclient.go b/tron/tronclient.go index 8848bcc2..e431608d 100644 --- a/tron/tronclient.go +++ b/tron/tronclient.go @@ -3,9 +3,11 @@ package tron import ( "context" "fmt" + "github.com/ethereum/go-ethereum/log" "math/big" "os" "strings" + "time" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -36,9 +38,7 @@ func NewClient(url string) *Client { } } -// // private abi methods -// func getABI(data string) (abi.ABI, error) { return abi.JSON(strings.NewReader(data)) } @@ -81,6 +81,28 @@ func (tc *Client) TriggerConstantContract(contractAddress string, data []byte) ( return response.ConstantResult[0], nil } +func (tc *Client) TriggerConstantContractWithRetry(contractAddress string, data []byte) ([]byte, error) { + const maxRetries = 5 + + var response []byte + var err error + + for attempt := 0; attempt < maxRetries; attempt++ { + response, err = tc.TriggerConstantContract(contractAddress, data) + + if err == nil && response != nil { + log.Info("Successfully trigger tron constant contract", "attempt", attempt) + break + } + log.Error("Failed to trigger tron constant contract", + "err", err, "attempt", attempt, "maxRetries", maxRetries) + if attempt < maxRetries-1 { + delay := attempt + 1 + time.Sleep(time.Duration(delay) * time.Second) + } + } + return response, err +} func (tc *Client) GetNowBlock(ctx context.Context) (int64, error) { block, err := tc.client.GetNowBlock2(ctx, &pb.EmptyMessage{}) if err != nil { @@ -100,7 +122,7 @@ func (tc *Client) CurrentHeaderBlock(contractAddress string, childBlockInterval } // Call - data, err := tc.TriggerConstantContract(contractAddress, btsPack) + data, err := tc.TriggerConstantContractWithRetry(contractAddress, btsPack) if err != nil { return 0, err } @@ -125,7 +147,7 @@ func (tc *Client) GetLastChildBlock(contractAddress string) (uint64, error) { if err != nil { return 0, err } - data, err := tc.TriggerConstantContract(contractAddress, btsPack) + data, err := tc.TriggerConstantContractWithRetry(contractAddress, btsPack) if err != nil { return 0, err } From 8259608c221435327e06287e34f813272b7ecc88 Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Wed, 4 Mar 2026 01:33:07 -0600 Subject: [PATCH 08/12] modify the checkpoint timeout func when open tron dynamic feature --- helper/util.go | 4 +++- helper/util_test.go | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/helper/util.go b/helper/util.go index 586d4060..dd357092 100644 --- a/helper/util.go +++ b/helper/util.go @@ -53,6 +53,8 @@ var ZeroAddress = common.Address{} var ZeroPubKey = hmTypes.PubKey{} const BttcBlockInterval = 2 * time.Second +const BttcFirstBlockIntervalInSprint = 6 * time.Second +const BttcSprintLength = 64 // GetFromAddress get from address func GetFromAddress(cliCtx context.CLIContext) types.HeimdallAddress { @@ -897,7 +899,7 @@ func CalcCheckpointTimeout(tronMaxLength int, pollTime time.Duration) (time.Dura return 0, errors.New("pollTime must be greater than 0") } - timeForBttcBlocks := time.Duration(tronMaxLength) * BttcBlockInterval + timeForBttcBlocks := time.Duration(tronMaxLength)*BttcBlockInterval + time.Duration(tronMaxLength)/BttcSprintLength*(BttcFirstBlockIntervalInSprint-BttcBlockInterval) checkpointTimeout := ((timeForBttcBlocks + pollTime - 1) / pollTime) * pollTime return checkpointTimeout, nil diff --git a/helper/util_test.go b/helper/util_test.go index bbda5a72..91b73fe0 100644 --- a/helper/util_test.go +++ b/helper/util_test.go @@ -71,3 +71,10 @@ func TestCalcCheckpointTimeout(t *testing.T) { checkpointTimeout, _ := CalcCheckpointTimeout(tronMaxLength, pollTime) require.Equal(t, 40*time.Minute, checkpointTimeout, "checkpointTimeout should match") } + +func TestCalcCheckpointTimeout2(t *testing.T) { + tronMaxLength := 1024 + pollTime := 5 * time.Minute + checkpointTimeout, _ := CalcCheckpointTimeout(tronMaxLength, pollTime) + require.Equal(t, 40*time.Minute, checkpointTimeout, "checkpointTimeout should match") +} From 6a7288f740b7f9404abf8aa6a8e4a5245054aa3e Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Thu, 5 Mar 2026 21:53:48 -0600 Subject: [PATCH 09/12] change attempt value in TriggerConstantContractWithRetry --- tron/tronclient.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tron/tronclient.go b/tron/tronclient.go index e431608d..ed5dc334 100644 --- a/tron/tronclient.go +++ b/tron/tronclient.go @@ -87,7 +87,7 @@ func (tc *Client) TriggerConstantContractWithRetry(contractAddress string, data var response []byte var err error - for attempt := 0; attempt < maxRetries; attempt++ { + for attempt := 1; attempt <= maxRetries; attempt++ { response, err = tc.TriggerConstantContract(contractAddress, data) if err == nil && response != nil { @@ -96,8 +96,8 @@ func (tc *Client) TriggerConstantContractWithRetry(contractAddress string, data } log.Error("Failed to trigger tron constant contract", "err", err, "attempt", attempt, "maxRetries", maxRetries) - if attempt < maxRetries-1 { - delay := attempt + 1 + if attempt < maxRetries { + delay := attempt time.Sleep(time.Duration(delay) * time.Second) } } From 645aa8b0a63c4c93b9cc790e98be8f67d6eaad21 Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 9 Mar 2026 17:09:13 +0800 Subject: [PATCH 10/12] process CalcCheckpointTimeout when tronMaxLength or pollTime equals 0 --- bridge/setu/processor/checkpoint.go | 6 +++++- bridge/setu/util/common.go | 1 - checkpoint/handler.go | 7 ++++++- checkpoint/types/params.go | 5 ----- helper/util.go | 5 +++++ helper/util_test.go | 19 +++++++++++++++++-- 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/bridge/setu/processor/checkpoint.go b/bridge/setu/processor/checkpoint.go index 4d011c7b..8083e5d3 100644 --- a/bridge/setu/processor/checkpoint.go +++ b/bridge/setu/processor/checkpoint.go @@ -866,7 +866,11 @@ func (cp *CheckpointProcessor) checkIfNoAckIsRequired(checkpointContext *Checkpo return false, uint64(index) } if isOpen { - checkpointTimeout, _ = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) + checkpointTimeout, err = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) + if err != nil { + cp.Logger.Error("failed to CalcCheckpointTimeout", "error", err) + return false, uint64(index) + } } else { checkpointTimeout = checkpointPollInterval } diff --git a/bridge/setu/util/common.go b/bridge/setu/util/common.go index 48929a41..5aebca91 100644 --- a/bridge/setu/util/common.go +++ b/bridge/setu/util/common.go @@ -457,7 +457,6 @@ func GetCheckpointParamsWithRetry(cliCtx cliContext.CLIContext) *checkpointTypes logger.Error("Unexpected: exceeded retry loop without returning or exiting") panic(errors.New("Failed to fetch checkpoint params")) - return nil } // GetBufferedCheckpoint return checkpoint from bueffer diff --git a/checkpoint/handler.go b/checkpoint/handler.go index f82eeaf3..a3b7694d 100644 --- a/checkpoint/handler.go +++ b/checkpoint/handler.go @@ -233,10 +233,15 @@ func handleMsgCheckpointNoAck(ctx sdk.Context, msg types.MsgCheckpointNoAck, k K } var checkpointTimeout time.Duration + var err error tronDynamicFeature := util.GetFeatureConfig().GetFeature(ctx, featuremanagerTypes.TronDynamicCheckpoint) if tronDynamicFeature.IsOpen { tronMaxLength := tronDynamicFeature.IntConf["maxLength"] - checkpointTimeout, _ = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) + checkpointTimeout, err = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) + // if err is not nil, checkpointTimeout fall back to bufferTime + if err != nil { + checkpointTimeout = bufferTime + } } else { checkpointTimeout = bufferTime } diff --git a/checkpoint/types/params.go b/checkpoint/types/params.go index 49e8c9f3..91c7e228 100644 --- a/checkpoint/types/params.go +++ b/checkpoint/types/params.go @@ -116,10 +116,5 @@ func (p Params) Validate() error { if p.ChildBlockInterval == 0 { return fmt.Errorf("ChildBlockInterval should be greater than zero") } - - if p.CheckpointPollInterval == 0 { - return fmt.Errorf("CheckpointPollInterval should be greater than zero") - } - return nil } diff --git a/helper/util.go b/helper/util.go index dd357092..fec9ceb7 100644 --- a/helper/util.go +++ b/helper/util.go @@ -896,8 +896,13 @@ func Hash(s []byte) ([]byte, error) { func CalcCheckpointTimeout(tronMaxLength int, pollTime time.Duration) (time.Duration, error) { if pollTime <= 0 { + Logger.Error("pollTime should be greater than 0", "pollTime", pollTime) return 0, errors.New("pollTime must be greater than 0") } + if tronMaxLength <= 0 { + Logger.Error("tronMaxLength should be greater than 0", "tronMaxLength", tronMaxLength) + return 0, errors.New("tronMaxLength must be greater than 0") + } timeForBttcBlocks := time.Duration(tronMaxLength)*BttcBlockInterval + time.Duration(tronMaxLength)/BttcSprintLength*(BttcFirstBlockIntervalInSprint-BttcBlockInterval) diff --git a/helper/util_test.go b/helper/util_test.go index 91b73fe0..2c191355 100644 --- a/helper/util_test.go +++ b/helper/util_test.go @@ -2,12 +2,11 @@ package helper import ( "encoding/hex" + "github.com/stretchr/testify/require" "math/big" "testing" "time" - "github.com/stretchr/testify/require" - authTypes "github.com/maticnetwork/heimdall/auth/types" "github.com/maticnetwork/heimdall/contracts/rootchain" "github.com/maticnetwork/heimdall/types" @@ -78,3 +77,19 @@ func TestCalcCheckpointTimeout2(t *testing.T) { checkpointTimeout, _ := CalcCheckpointTimeout(tronMaxLength, pollTime) require.Equal(t, 40*time.Minute, checkpointTimeout, "checkpointTimeout should match") } + +func TestCalcCheckpointTimeout3(t *testing.T) { + tronMaxLength := 0 + pollTime := 5 * time.Minute + checkpointTimeout, err := CalcCheckpointTimeout(tronMaxLength, pollTime) + require.Equal(t, 0*time.Minute, checkpointTimeout, "checkpointTimeout should match") + require.True(t, err != nil) +} + +func TestCalcCheckpointTimeout4(t *testing.T) { + tronMaxLength := 1024 + pollTime := 0 * time.Minute + checkpointTimeout, err := CalcCheckpointTimeout(tronMaxLength, pollTime) + require.Equal(t, 0*time.Minute, checkpointTimeout, "checkpointTimeout should match") + require.True(t, err != nil) +} From 43f6f6b25eba9e4b1824aa52dee2f6c82475dd1c Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Mon, 9 Mar 2026 18:14:04 +0800 Subject: [PATCH 11/12] ignore in handler when CalcCheckpointTimeout returns 0 --- checkpoint/handler.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/checkpoint/handler.go b/checkpoint/handler.go index a3b7694d..f82eeaf3 100644 --- a/checkpoint/handler.go +++ b/checkpoint/handler.go @@ -233,15 +233,10 @@ func handleMsgCheckpointNoAck(ctx sdk.Context, msg types.MsgCheckpointNoAck, k K } var checkpointTimeout time.Duration - var err error tronDynamicFeature := util.GetFeatureConfig().GetFeature(ctx, featuremanagerTypes.TronDynamicCheckpoint) if tronDynamicFeature.IsOpen { tronMaxLength := tronDynamicFeature.IntConf["maxLength"] - checkpointTimeout, err = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) - // if err is not nil, checkpointTimeout fall back to bufferTime - if err != nil { - checkpointTimeout = bufferTime - } + checkpointTimeout, _ = helper.CalcCheckpointTimeout(tronMaxLength, checkpointPollInterval) } else { checkpointTimeout = bufferTime } From e275901591f43c33f1187e4d5125e554730c0a3f Mon Sep 17 00:00:00 2001 From: sgz13140 Date: Tue, 7 Apr 2026 13:19:59 +0800 Subject: [PATCH 12/12] add return --- bridge/setu/util/common.go | 1 + 1 file changed, 1 insertion(+) diff --git a/bridge/setu/util/common.go b/bridge/setu/util/common.go index 5aebca91..48929a41 100644 --- a/bridge/setu/util/common.go +++ b/bridge/setu/util/common.go @@ -457,6 +457,7 @@ func GetCheckpointParamsWithRetry(cliCtx cliContext.CLIContext) *checkpointTypes logger.Error("Unexpected: exceeded retry loop without returning or exiting") panic(errors.New("Failed to fetch checkpoint params")) + return nil } // GetBufferedCheckpoint return checkpoint from bueffer