github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/test/e2e/pool_test.go (about)

     1  package e2e
     2  
     3  import (
     4  	"context"
     5  	"math/big"
     6  	"testing"
     7  
     8  	"github.com/0xPolygon/supernets2-node/log"
     9  	"github.com/0xPolygon/supernets2-node/test/operations"
    10  	"github.com/ethereum/go-ethereum"
    11  	"github.com/ethereum/go-ethereum/common"
    12  	"github.com/ethereum/go-ethereum/core/types"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestRepeatedNonce(t *testing.T) {
    17  	if testing.Short() {
    18  		t.Skip()
    19  	}
    20  
    21  	var err error
    22  	err = operations.Teardown()
    23  	require.NoError(t, err)
    24  
    25  	defer func() { require.NoError(t, operations.Teardown()) }()
    26  
    27  	ctx := context.Background()
    28  	opsCfg := operations.GetDefaultOperationsConfig()
    29  	opsMan, err := operations.NewManager(ctx, opsCfg)
    30  	require.NoError(t, err)
    31  	err = opsMan.Setup()
    32  	require.NoError(t, err)
    33  
    34  	receiverAddr := common.HexToAddress("0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D")
    35  	amount := big.NewInt(1000)
    36  
    37  	for _, network := range networks {
    38  		log.Debugf(network.Name)
    39  		client := operations.MustGetClient(network.URL)
    40  		auth := operations.MustGetAuth(network.PrivateKey, network.ChainID)
    41  
    42  		nonce, err := client.NonceAt(ctx, auth.From, nil)
    43  		require.NoError(t, err)
    44  
    45  		gasLimit, err := client.EstimateGas(ctx, ethereum.CallMsg{
    46  			From:  auth.From,
    47  			To:    &receiverAddr,
    48  			Value: amount,
    49  		})
    50  		require.NoError(t, err)
    51  
    52  		gasPrice, err := client.SuggestGasPrice(ctx)
    53  		require.NoError(t, err)
    54  
    55  		correctNonceTx := types.NewTransaction(nonce, receiverAddr, amount.Add(amount, amount), gasLimit+gasLimit, gasPrice.Add(gasPrice, gasPrice), nil)
    56  		correctNonceSignedTx, err := auth.Signer(auth.From, correctNonceTx)
    57  		require.NoError(t, err)
    58  
    59  		repeatedNonceTx := types.NewTransaction(nonce, receiverAddr, amount, gasLimit, gasPrice, nil)
    60  		repeatedNonceSignedTx, err := auth.Signer(auth.From, repeatedNonceTx)
    61  		require.NoError(t, err)
    62  
    63  		log.Debug("sending correct nonce tx")
    64  		err = client.SendTransaction(ctx, correctNonceSignedTx)
    65  		require.NoError(t, err)
    66  
    67  		log.Debug("sending repeated nonce tx")
    68  		err = client.SendTransaction(ctx, repeatedNonceSignedTx)
    69  		require.Equal(t, "replacement transaction underpriced", err.Error())
    70  
    71  		log.Debug("waiting correct nonce tx to be mined")
    72  		err = operations.WaitTxToBeMined(ctx, client, correctNonceSignedTx, operations.DefaultTimeoutTxToBeMined)
    73  		require.NoError(t, err)
    74  	}
    75  }
    76  
    77  func TestRepeatedTx(t *testing.T) {
    78  	if testing.Short() {
    79  		t.Skip()
    80  	}
    81  
    82  	var err error
    83  	err = operations.Teardown()
    84  	require.NoError(t, err)
    85  
    86  	defer func() { require.NoError(t, operations.Teardown()) }()
    87  
    88  	ctx := context.Background()
    89  	opsCfg := operations.GetDefaultOperationsConfig()
    90  	opsMan, err := operations.NewManager(ctx, opsCfg)
    91  	require.NoError(t, err)
    92  	err = opsMan.Setup()
    93  	require.NoError(t, err)
    94  
    95  	receiverAddr := common.HexToAddress("0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D")
    96  	amount := big.NewInt(1000)
    97  
    98  	for _, network := range networks {
    99  		log.Debugf(network.Name)
   100  		client := operations.MustGetClient(network.URL)
   101  		auth := operations.MustGetAuth(network.PrivateKey, network.ChainID)
   102  
   103  		nonce, err := client.NonceAt(ctx, auth.From, nil)
   104  		require.NoError(t, err)
   105  
   106  		gasLimit, err := client.EstimateGas(ctx, ethereum.CallMsg{
   107  			From:  auth.From,
   108  			To:    &receiverAddr,
   109  			Value: amount,
   110  		})
   111  		require.NoError(t, err)
   112  
   113  		gasPrice, err := client.SuggestGasPrice(ctx)
   114  		require.NoError(t, err)
   115  
   116  		tx := types.NewTransaction(nonce, receiverAddr, amount, gasLimit, gasPrice, nil)
   117  		signedTx, err := auth.Signer(auth.From, tx)
   118  		require.NoError(t, err)
   119  
   120  		log.Debug("sending tx")
   121  		err = client.SendTransaction(ctx, signedTx)
   122  		require.NoError(t, err)
   123  
   124  		log.Debug("re sending tx")
   125  		err = client.SendTransaction(ctx, signedTx)
   126  		require.Equal(t, "already known", err.Error())
   127  
   128  		log.Debug("waiting correct nonce tx to be mined")
   129  		err = operations.WaitTxToBeMined(ctx, client, signedTx, operations.DefaultTimeoutTxToBeMined)
   130  		require.NoError(t, err)
   131  	}
   132  }
   133  
   134  func TestPendingNonce(t *testing.T) {
   135  	if testing.Short() {
   136  		t.Skip()
   137  	}
   138  
   139  	var err error
   140  	err = operations.Teardown()
   141  	require.NoError(t, err)
   142  
   143  	defer func() { require.NoError(t, operations.Teardown()) }()
   144  
   145  	ctx := context.Background()
   146  	opsCfg := operations.GetDefaultOperationsConfig()
   147  	opsMan, err := operations.NewManager(ctx, opsCfg)
   148  	require.NoError(t, err)
   149  	err = opsMan.Setup()
   150  	require.NoError(t, err)
   151  
   152  	receiverAddr := common.HexToAddress("0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D")
   153  	amount := big.NewInt(1000)
   154  
   155  	for _, network := range networks {
   156  		log.Debugf(network.Name)
   157  		client := operations.MustGetClient(network.URL)
   158  		auth := operations.MustGetAuth(network.PrivateKey, network.ChainID)
   159  
   160  		nonce, err := client.NonceAt(ctx, auth.From, nil)
   161  		require.NoError(t, err)
   162  		log.Debug("nonce: ", nonce)
   163  
   164  		pendingNonce, err := client.PendingNonceAt(ctx, auth.From)
   165  		require.Equal(t, nonce, pendingNonce)
   166  		require.NoError(t, err)
   167  		log.Debug("pending Nonce: ", pendingNonce)
   168  
   169  		gasLimit, err := client.EstimateGas(ctx, ethereum.CallMsg{
   170  			From:  auth.From,
   171  			To:    &receiverAddr,
   172  			Value: amount,
   173  		})
   174  		require.NoError(t, err)
   175  
   176  		gasPrice, err := client.SuggestGasPrice(ctx)
   177  		require.NoError(t, err)
   178  
   179  		for i := 0; i < 10; i++ {
   180  			txNonce := pendingNonce + uint64(i)
   181  			log.Debugf("creating transaction with nonce %v: ", txNonce)
   182  			tx := types.NewTransaction(txNonce, receiverAddr, amount, gasLimit, gasPrice, nil)
   183  			signedTx, err := auth.Signer(auth.From, tx)
   184  			require.NoError(t, err)
   185  
   186  			log.Debug("sending tx")
   187  			err = client.SendTransaction(ctx, signedTx)
   188  			require.NoError(t, err)
   189  
   190  			newPendingNonce, err := client.PendingNonceAt(ctx, auth.From)
   191  			require.NoError(t, err)
   192  			log.Debug("newPendingNonce: ", newPendingNonce)
   193  			require.Equal(t, txNonce+1, newPendingNonce)
   194  		}
   195  	}
   196  }