From eb00630d9383c142753c2046333b5891d7e62cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Negovanovi=C4=87?= Date: Fri, 26 May 2023 17:38:28 +0200 Subject: [PATCH 1/6] Invoke estimate gas limit if gas limit not already provided --- txrelayer/txrelayer.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/txrelayer/txrelayer.go b/txrelayer/txrelayer.go index 95e0671da0..0becf38a75 100644 --- a/txrelayer/txrelayer.go +++ b/txrelayer/txrelayer.go @@ -107,7 +107,12 @@ func (t *TxRelayerImpl) sendTransactionLocked(txn *ethgo.Transaction, key ethgo. } if txn.Gas == 0 { - txn.Gas = DefaultGasLimit + gasLimit, err := t.estimateGasLimit(txn) + if err != nil { + return ethgo.ZeroHash, err + } + + txn.Gas = gasLimit } chainID, err := t.client.Eth().ChainID() @@ -141,7 +146,13 @@ func (t *TxRelayerImpl) SendTransactionLocal(txn *ethgo.Transaction) (*ethgo.Rec } txn.From = accounts[0] - txn.Gas = DefaultGasLimit + + gasLimit, err := t.estimateGasLimit(txn) + if err != nil { + return nil, err + } + + txn.Gas = gasLimit txn.GasPrice = DefaultGasPrice txnHash, err := t.client.Eth().SendTransaction(txn) @@ -176,6 +187,19 @@ func (t *TxRelayerImpl) waitForReceipt(hash ethgo.Hash) (*ethgo.Receipt, error) } } +// estimateGasLimit returns estimated gas limit for the given transaction +func (t *TxRelayerImpl) estimateGasLimit(txn *ethgo.Transaction) (uint64, error) { + callMsg := ðgo.CallMsg{ + From: txn.From, + To: txn.To, + Data: txn.Input, + GasPrice: txn.GasPrice, + Value: txn.Value, + } + + return t.client.Eth().EstimateGas(callMsg) +} + type TxRelayerOption func(*TxRelayerImpl) func WithClient(client *jsonrpc.Client) TxRelayerOption { From 712604446041a3eacb7a65ccaccc87bdf4f6aff4 Mon Sep 17 00:00:00 2001 From: Marko Jelaca Date: Tue, 6 Jun 2023 10:48:59 +0200 Subject: [PATCH 2/6] Added sender address in txn. Needed for estimateGasLimit --- txrelayer/txrelayer.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/txrelayer/txrelayer.go b/txrelayer/txrelayer.go index 0becf38a75..78df0a6b00 100644 --- a/txrelayer/txrelayer.go +++ b/txrelayer/txrelayer.go @@ -95,6 +95,8 @@ func (t *TxRelayerImpl) sendTransactionLocked(txn *ethgo.Transaction, key ethgo. t.lock.Lock() defer t.lock.Unlock() + txn.From = key.Address() + nonce, err := t.client.Eth().GetNonce(key.Address(), ethgo.Pending) if err != nil { return ethgo.ZeroHash, err From 904b7dfea79c7662e3b4e13fa59cfd22bb16f934 Mon Sep 17 00:00:00 2001 From: Marko Jelaca Date: Tue, 13 Jun 2023 13:49:33 +0200 Subject: [PATCH 3/6] Fixed failing e2e tests --- e2e-polybft/e2e/bridge_test.go | 2 +- e2e-polybft/e2e/consensus_test.go | 4 ++-- txrelayer/txrelayer.go | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/e2e-polybft/e2e/bridge_test.go b/e2e-polybft/e2e/bridge_test.go index e9d8bbbfac..98f089dee4 100644 --- a/e2e-polybft/e2e/bridge_test.go +++ b/e2e-polybft/e2e/bridge_test.go @@ -1181,7 +1181,7 @@ func TestE2E_Bridge_Transfers_AccessLists(t *testing.T) { contracts.ChildERC20PredicateContract, contracts.NativeERC20TokenContract, false) - require.ErrorContains(t, err, "failed to execute withdrawal") + require.ErrorContains(t, err, "failed to send withdraw transaction") currentBlock, err := childEthEndpoint.GetBlockByNumber(ethgo.Latest, false) require.NoError(t, err) diff --git a/e2e-polybft/e2e/consensus_test.go b/e2e-polybft/e2e/consensus_test.go index 8199d51f8a..552542396e 100644 --- a/e2e-polybft/e2e/consensus_test.go +++ b/e2e-polybft/e2e/consensus_test.go @@ -542,8 +542,8 @@ func TestE2E_Consensus_MintableERC20NativeToken(t *testing.T) { To: &nativeTokenAddr, Input: mintInput, }, nonMinterAcc.Ecdsa) - require.NoError(t, err) - require.Equal(t, uint64(types.ReceiptFailed), receipt.Status) + require.Error(t, err) + require.Nil(t, receipt) } func TestE2E_Consensus_CustomRewardToken(t *testing.T) { diff --git a/txrelayer/txrelayer.go b/txrelayer/txrelayer.go index a7d08b1d3c..fb4f5e868c 100644 --- a/txrelayer/txrelayer.go +++ b/txrelayer/txrelayer.go @@ -3,6 +3,7 @@ package txrelayer import ( "errors" "fmt" + "math/big" "sync" "time" @@ -202,6 +203,7 @@ func (t *TxRelayerImpl) estimateGasLimit(txn *ethgo.Transaction) (uint64, error) Data: txn.Input, GasPrice: txn.GasPrice, Value: txn.Value, + Gas: big.NewInt(int64(txn.Gas)), } return t.client.Eth().EstimateGas(callMsg) From 0e71291c8b8c46f82101c4af4b16e39187803d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Negovanovi=C4=87?= Date: Sat, 17 Jun 2023 21:15:49 +0200 Subject: [PATCH 4/6] Provide fix gas limit for exit transaction (pass child chain mintable e2e test) --- command/bridge/exit/exit.go | 1 + e2e-polybft/e2e/bridge_test.go | 2 +- e2e-polybft/framework/test-cluster.go | 15 +++++++++------ txrelayer/txrelayer.go | 15 ++++++++------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/command/bridge/exit/exit.go b/command/bridge/exit/exit.go index 14c8762187..dc74eef0d9 100644 --- a/command/bridge/exit/exit.go +++ b/command/bridge/exit/exit.go @@ -218,6 +218,7 @@ func createExitTxn(sender ethgo.Address, proof types.Proof) (*ethgo.Transaction, From: sender, To: &exitHelperAddr, Input: input, + Gas: txrelayer.DefaultGasLimit, } return txn, exitEvent, err diff --git a/e2e-polybft/e2e/bridge_test.go b/e2e-polybft/e2e/bridge_test.go index a9153e5185..6602629f3e 100644 --- a/e2e-polybft/e2e/bridge_test.go +++ b/e2e-polybft/e2e/bridge_test.go @@ -656,7 +656,7 @@ func TestE2E_Bridge_ChildChainMintableTokensTransfer(t *testing.T) { cluster := framework.NewTestCluster(t, 5, framework.WithNumBlockConfirmations(0), framework.WithEpochSize(epochSize), - framework.WithNativeTokenConfig(fmt.Sprintf("Mintable Edge Coin:MEC:18:true:%s", adminAddr)), + framework.WithNativeTokenConfig(fmt.Sprintf(nativeTokenMintableTestCfg, adminAddr)), framework.WithBridgeAllowListAdmin(adminAddr), framework.WithBridgeBlockListAdmin(adminAddr), framework.WithPremine(append(depositors, adminAddr)...)) //nolint:makezero diff --git a/e2e-polybft/framework/test-cluster.go b/e2e-polybft/framework/test-cluster.go index a2af130eb3..53c99d1ab3 100644 --- a/e2e-polybft/framework/test-cluster.go +++ b/e2e-polybft/framework/test-cluster.go @@ -871,7 +871,7 @@ func (c *TestCluster) Transfer(t *testing.T, sender ethgo.Key, target types.Addr targetAddr := ethgo.Address(target) - return c.SendTxn(t, sender, ðgo.Transaction{To: &targetAddr, Value: value}) + return c.SendTxn(t, sender, ðgo.Transaction{From: sender.Address(), To: &targetAddr, Value: value}) } func (c *TestCluster) MethodTxn(t *testing.T, sender ethgo.Key, target types.Address, input []byte) *TestTxn { @@ -879,7 +879,7 @@ func (c *TestCluster) MethodTxn(t *testing.T, sender ethgo.Key, target types.Add targetAddr := ethgo.Address(target) - return c.SendTxn(t, sender, ðgo.Transaction{To: &targetAddr, Input: input}) + return c.SendTxn(t, sender, ðgo.Transaction{From: sender.Address(), To: &targetAddr, Input: input}) } // SendTxn sends a transaction @@ -912,7 +912,12 @@ func (c *TestCluster) SendTxn(t *testing.T, sender ethgo.Key, txn *ethgo.Transac } if txn.Gas == 0 { - txn.Gas = txrelayer.DefaultGasLimit + callMsg := txrelayer.ConvertTxnToCallMsg(txn) + + gasLimit, err := client.Eth().EstimateGas(callMsg) + require.NoError(t, err) + + txn.Gas = gasLimit } chainID, err := client.Eth().ChainID() @@ -928,13 +933,11 @@ func (c *TestCluster) SendTxn(t *testing.T, sender ethgo.Key, txn *ethgo.Transac hash, err := client.Eth().SendRawTransaction(txnRaw) require.NoError(t, err) - tTxn := &TestTxn{ + return &TestTxn{ client: client.Eth(), txn: txn, hash: hash, } - - return tTxn } type TestTxn struct { diff --git a/txrelayer/txrelayer.go b/txrelayer/txrelayer.go index fb4f5e868c..9189a69499 100644 --- a/txrelayer/txrelayer.go +++ b/txrelayer/txrelayer.go @@ -111,15 +111,18 @@ func (t *TxRelayerImpl) sendTransactionLocked(txn *ethgo.Transaction, key ethgo. return ethgo.ZeroHash, err } + fmt.Println("Tx relayer Gas Price", gasPrice, "To", txn.To) txn.GasPrice = gasPrice } if txn.Gas == 0 { - gasLimit, err := t.estimateGasLimit(txn) + gasLimit, err := t.client.Eth().EstimateGas(ConvertTxnToCallMsg(txn)) if err != nil { return ethgo.ZeroHash, err } + fmt.Println("Tx relayer Gas Limit", gasLimit, "To", txn.To) + txn.Gas = gasLimit } @@ -155,7 +158,7 @@ func (t *TxRelayerImpl) SendTransactionLocal(txn *ethgo.Transaction) (*ethgo.Rec txn.From = accounts[0] - gasLimit, err := t.estimateGasLimit(txn) + gasLimit, err := t.client.Eth().EstimateGas(ConvertTxnToCallMsg(txn)) if err != nil { return nil, err } @@ -195,9 +198,9 @@ func (t *TxRelayerImpl) waitForReceipt(hash ethgo.Hash) (*ethgo.Receipt, error) } } -// estimateGasLimit returns estimated gas limit for the given transaction -func (t *TxRelayerImpl) estimateGasLimit(txn *ethgo.Transaction) (uint64, error) { - callMsg := ðgo.CallMsg{ +// ConvertTxnToCallMsg converts txn instance to call message +func ConvertTxnToCallMsg(txn *ethgo.Transaction) *ethgo.CallMsg { + return ðgo.CallMsg{ From: txn.From, To: txn.To, Data: txn.Input, @@ -205,8 +208,6 @@ func (t *TxRelayerImpl) estimateGasLimit(txn *ethgo.Transaction) (uint64, error) Value: txn.Value, Gas: big.NewInt(int64(txn.Gas)), } - - return t.client.Eth().EstimateGas(callMsg) } type TxRelayerOption func(*TxRelayerImpl) From ac2ad4b991db2f4e8e3a2459f46cea039a90c273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Negovanovi=C4=87?= Date: Mon, 19 Jun 2023 09:25:00 +0200 Subject: [PATCH 5/6] Fix failing E2E tests --- e2e-polybft/framework/test-cluster.go | 12 ++++++++---- txrelayer/txrelayer.go | 3 --- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/e2e-polybft/framework/test-cluster.go b/e2e-polybft/framework/test-cluster.go index 53c99d1ab3..003cf1dcac 100644 --- a/e2e-polybft/framework/test-cluster.go +++ b/e2e-polybft/framework/test-cluster.go @@ -863,7 +863,7 @@ func (c *TestCluster) Call(t *testing.T, to types.Address, method *abi.Method, func (c *TestCluster) Deploy(t *testing.T, sender ethgo.Key, bytecode []byte) *TestTxn { t.Helper() - return c.SendTxn(t, sender, ðgo.Transaction{Input: bytecode}) + return c.SendTxn(t, sender, ðgo.Transaction{From: sender.Address(), Input: bytecode}) } func (c *TestCluster) Transfer(t *testing.T, sender ethgo.Key, target types.Address, value *big.Int) *TestTxn { @@ -915,9 +915,13 @@ func (c *TestCluster) SendTxn(t *testing.T, sender ethgo.Key, txn *ethgo.Transac callMsg := txrelayer.ConvertTxnToCallMsg(txn) gasLimit, err := client.Eth().EstimateGas(callMsg) - require.NoError(t, err) - - txn.Gas = gasLimit + if err != nil { + // gas estimation can fail in case an account is not allow-listed + // (fallback it to default gas limit in that case) + txn.Gas = txrelayer.DefaultGasLimit + } else { + txn.Gas = gasLimit + } } chainID, err := client.Eth().ChainID() diff --git a/txrelayer/txrelayer.go b/txrelayer/txrelayer.go index 9189a69499..ddaacbcc96 100644 --- a/txrelayer/txrelayer.go +++ b/txrelayer/txrelayer.go @@ -111,7 +111,6 @@ func (t *TxRelayerImpl) sendTransactionLocked(txn *ethgo.Transaction, key ethgo. return ethgo.ZeroHash, err } - fmt.Println("Tx relayer Gas Price", gasPrice, "To", txn.To) txn.GasPrice = gasPrice } @@ -121,8 +120,6 @@ func (t *TxRelayerImpl) sendTransactionLocked(txn *ethgo.Transaction, key ethgo. return ethgo.ZeroHash, err } - fmt.Println("Tx relayer Gas Limit", gasLimit, "To", txn.To) - txn.Gas = gasLimit } From 5a9e2faa4523ca6772211ad51a9417570f9118d7 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Mon, 19 Jun 2023 11:25:30 +0200 Subject: [PATCH 6/6] uint64 to big.int change --- txrelayer/txrelayer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/txrelayer/txrelayer.go b/txrelayer/txrelayer.go index ddaacbcc96..be8f101c04 100644 --- a/txrelayer/txrelayer.go +++ b/txrelayer/txrelayer.go @@ -203,7 +203,7 @@ func ConvertTxnToCallMsg(txn *ethgo.Transaction) *ethgo.CallMsg { Data: txn.Input, GasPrice: txn.GasPrice, Value: txn.Value, - Gas: big.NewInt(int64(txn.Gas)), + Gas: new(big.Int).SetUint64(txn.Gas), } }