github.com/smartcontractkit/chainlink-testing-framework/libs@v0.0.0-20240227141906-ec710b4eb1a3/docker/test_env/besu_integration_test.go (about)

     1  package test_env
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"math/big"
     7  	"testing"
     8  
     9  	"github.com/ethereum/go-ethereum"
    10  	"github.com/ethereum/go-ethereum/common"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/smartcontractkit/chainlink-testing-framework/libs/blockchain"
    14  	"github.com/smartcontractkit/chainlink-testing-framework/libs/logging"
    15  	"github.com/smartcontractkit/chainlink-testing-framework/libs/utils/testcontext"
    16  )
    17  
    18  func TestEth2WithPrysmAndBesu(t *testing.T) {
    19  	l := logging.GetTestLogger(t)
    20  
    21  	builder := NewEthereumNetworkBuilder()
    22  	cfg, err := builder.
    23  		WithConsensusType(ConsensusType_PoS).
    24  		WithConsensusLayer(ConsensusLayer_Prysm).
    25  		WithExecutionLayer(ExecutionLayer_Besu).
    26  		Build()
    27  	require.NoError(t, err, "Builder validation failed")
    28  
    29  	_, eth2, err := cfg.Start()
    30  	require.NoError(t, err, "Couldn't start PoS network")
    31  
    32  	nonEip1559Network := blockchain.SimulatedEVMNetwork
    33  	nonEip1559Network.Name = "Simulated Besu + Prysm (non-EIP 1559)"
    34  	nonEip1559Network.GasEstimationBuffer = 10_000_000_000
    35  	nonEip1559Network.URLs = eth2.PublicWsUrls()
    36  	clientOne, err := blockchain.ConnectEVMClient(nonEip1559Network, l)
    37  	require.NoError(t, err, "Couldn't connect to the evm client")
    38  
    39  	t.Cleanup(func() {
    40  		err = clientOne.Close()
    41  		require.NoError(t, err, "Couldn't close the client")
    42  	})
    43  
    44  	address := common.HexToAddress("0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1")
    45  	err = sendAndCompareBalances(testcontext.Get(t), clientOne, address)
    46  	require.NoError(t, err, fmt.Sprintf("balance wasn't correctly updated when %s network", nonEip1559Network.Name))
    47  
    48  	eip1559Network := blockchain.SimulatedEVMNetwork
    49  	eip1559Network.Name = "Simulated Besu + Prysm (EIP 1559)"
    50  	eip1559Network.SupportsEIP1559 = true
    51  	eip1559Network.URLs = eth2.PublicWsUrls()
    52  	_, err = blockchain.ConnectEVMClient(eip1559Network, l)
    53  	require.Error(t, err, "Could connect to the evm client")
    54  	require.Contains(t, err.Error(), "Method not found", "Besu should not work EIP-1559 yet")
    55  }
    56  
    57  func sendAndCompareBalances(ctx context.Context, c blockchain.EVMClient, address common.Address) error {
    58  	balanceBefore, err := c.BalanceAt(ctx, address)
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	toSendEth := big.NewFloat(1)
    64  	gasEstimations, err := c.EstimateGas(ethereum.CallMsg{
    65  		To: &address,
    66  	})
    67  	if err != nil {
    68  		return err
    69  	}
    70  	err = c.Fund(address.Hex(), toSendEth, gasEstimations)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	balanceAfter, err := c.BalanceAt(ctx, address)
    76  	if err != nil {
    77  		return err
    78  	}
    79  
    80  	exp := new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil)
    81  	toSendEthInt := new(big.Int)
    82  	_, _ = toSendEth.Int(toSendEthInt)
    83  	sentInWei := new(big.Int).Mul(toSendEthInt, exp)
    84  
    85  	expected := big.NewInt(0).Add(balanceBefore, sentInWei)
    86  
    87  	if expected.Cmp(balanceAfter) != 0 {
    88  		return fmt.Errorf("Balance is incorrect. Expected %s, got %s", expected.String(), balanceAfter.String())
    89  	}
    90  
    91  	return nil
    92  }