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

     1  package e2e
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"math/big"
     7  	"os/exec"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/0xPolygon/supernets2-node/log"
    12  	"github.com/0xPolygon/supernets2-node/test/operations"
    13  	"github.com/ethereum/go-ethereum"
    14  	"github.com/ethereum/go-ethereum/accounts/abi/bind"
    15  	"github.com/ethereum/go-ethereum/common"
    16  	"github.com/ethereum/go-ethereum/core/types"
    17  	"github.com/ethereum/go-ethereum/crypto"
    18  	"github.com/ethereum/go-ethereum/ethclient"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func TestEthTransferGasless(t *testing.T) {
    23  	if testing.Short() {
    24  		t.Skip()
    25  	}
    26  	// Edit config
    27  	out, err := exec.Command("pwd").CombinedOutput()
    28  	fmt.Println(string(out))
    29  	require.NoError(t, err)
    30  	const path = "../../test/config/test.node.config.toml"
    31  	require.NoError(t,
    32  		exec.Command("sed", "-i", "s/DefaultMinGasPriceAllowed = 1000000000/DefaultMinGasPriceAllowed = 0/g", path).Run(),
    33  	)
    34  	require.NoError(t,
    35  		exec.Command("sed", "-i", "s/EnableL2SuggestedGasPricePolling = true/EnableL2SuggestedGasPricePolling = false/g", path).Run(),
    36  	)
    37  	// Undo edit config
    38  	defer func() {
    39  		require.NoError(t,
    40  			exec.Command("sed", "-i", "s/DefaultMinGasPriceAllowed = 0/DefaultMinGasPriceAllowed = 1000000000/g", path).Run(),
    41  		)
    42  		require.NoError(t,
    43  			exec.Command("sed", "-i", "s/EnableL2SuggestedGasPricePolling = false/EnableL2SuggestedGasPricePolling = true/g", path).Run(),
    44  		)
    45  	}()
    46  
    47  	ctx := context.Background()
    48  	defer func() { require.NoError(t, operations.Teardown()) }()
    49  
    50  	err = operations.Teardown()
    51  	require.NoError(t, err)
    52  	opsCfg := operations.GetDefaultOperationsConfig()
    53  	opsCfg.State.MaxCumulativeGasUsed = 80000000000
    54  	opsman, err := operations.NewManager(ctx, opsCfg)
    55  	require.NoError(t, err)
    56  	err = opsman.Setup()
    57  	require.NoError(t, err)
    58  	time.Sleep(5 * time.Second)
    59  	// Load account with balance on local genesis
    60  	pk, err := crypto.GenerateKey()
    61  	require.NoError(t, err)
    62  	auth, err := bind.NewKeyedTransactorWithChainID(pk, big.NewInt(0).SetUint64(operations.DefaultL2ChainID))
    63  	require.NoError(t, err)
    64  	// Load eth client
    65  	client, err := ethclient.Dial(operations.DefaultL2NetworkURL)
    66  	require.NoError(t, err)
    67  	// Send txs
    68  	nTxs := 10
    69  	amount := big.NewInt(0)
    70  	toAddress := common.HexToAddress("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
    71  	senderBalance, err := client.BalanceAt(ctx, auth.From, nil)
    72  	require.NoError(t, err)
    73  	senderNonce, err := client.PendingNonceAt(ctx, auth.From)
    74  	require.NoError(t, err)
    75  
    76  	log.Infof("Receiver Addr: %v", toAddress.String())
    77  	log.Infof("Sender Addr: %v", auth.From.String())
    78  	log.Infof("Sender Balance: %v", senderBalance.String())
    79  	log.Infof("Sender Nonce: %v", senderNonce)
    80  
    81  	gasLimit, err := client.EstimateGas(ctx, ethereum.CallMsg{From: auth.From, To: &toAddress, Value: amount})
    82  	require.NoError(t, err)
    83  
    84  	gasPrice := big.NewInt(0)
    85  	nonce, err := client.PendingNonceAt(ctx, auth.From)
    86  	require.NoError(t, err)
    87  
    88  	txs := make([]*types.Transaction, 0, nTxs)
    89  	for i := 0; i < nTxs; i++ {
    90  		tx := types.NewTransaction(nonce+uint64(i), toAddress, amount, gasLimit, gasPrice, nil)
    91  		txs = append(txs, tx)
    92  	}
    93  
    94  	_, err = operations.ApplyL2Txs(ctx, txs, auth, client, operations.VerifiedConfirmationLevel)
    95  	require.NoError(t, err)
    96  }