From 65b007d59c0dc4bfe90386d6750dc2945945ff70 Mon Sep 17 00:00:00 2001 From: Eduard S Date: Fri, 26 Feb 2021 17:49:21 +0100 Subject: [PATCH] When resending an eth tx, always increase gas price Incrementing the gas price unconditionally avoids sending the exact same transaction, which geth will reject because that transaction already exists in the pool --- coordinator/batch.go | 7 ++++--- coordinator/txmanager.go | 22 ++++++++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/coordinator/batch.go b/coordinator/batch.go index 56a4088..3ff236b 100644 --- a/coordinator/batch.go +++ b/coordinator/batch.go @@ -8,6 +8,7 @@ import ( "path" "time" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" "github.com/hermeznetwork/hermez-node/common" "github.com/hermeznetwork/hermez-node/eth" @@ -90,9 +91,9 @@ type BatchInfo struct { L2Txs []common.L2Tx CoordIdxs []common.Idx ForgeBatchArgs *eth.RollupForgeBatchArgs - // FeesInfo - EthTx *types.Transaction - EthTxErr error + Auth *bind.TransactOpts `json:"-"` + EthTx *types.Transaction + EthTxErr error // SendTimestamp the time of batch sent to ethereum SendTimestamp time.Time Receipt *types.Receipt diff --git a/coordinator/txmanager.go b/coordinator/txmanager.go index 1ac43db..78355f6 100644 --- a/coordinator/txmanager.go +++ b/coordinator/txmanager.go @@ -182,19 +182,29 @@ func addPerc(v *big.Int, p int64) *big.Int { r.Mul(r, big.NewInt(p)) // nolint reason: to calculate percentages we divide by 100 r.Div(r, big.NewInt(100)) //nolit:gomnd + // If the increase is 0, force it to be 1 so that a gas increase + // doesn't result in the same value, making the transaction to be equal + // than before. + if r.Cmp(big.NewInt(0)) == 0 { + r = big.NewInt(1) + } return r.Add(v, r) } func (t *TxManager) sendRollupForgeBatch(ctx context.Context, batchInfo *BatchInfo, resend bool) error { var ethTx *types.Transaction var err error - auth, err := t.NewAuth(ctx, batchInfo) - if err != nil { - return tracerr.Wrap(err) - } - auth.Nonce = big.NewInt(int64(t.accNextNonce)) + var auth *bind.TransactOpts if resend { - auth.Nonce = big.NewInt(int64(batchInfo.EthTx.Nonce())) + auth = batchInfo.Auth + auth.GasPrice = addPerc(auth.GasPrice, 10) + } else { + auth, err = t.NewAuth(ctx, batchInfo) + if err != nil { + return tracerr.Wrap(err) + } + batchInfo.Auth = auth + auth.Nonce = big.NewInt(int64(t.accNextNonce)) } for attempt := 0; attempt < t.cfg.EthClientAttempts; attempt++ { if auth.GasPrice.Cmp(t.cfg.MaxGasPrice) > 0 {