github.com/prysmaticlabs/prysm@v1.4.4/contracts/deposit-contract/depositContract_test.go (about)

     1  package depositcontract_test
     2  
     3  import (
     4  	"context"
     5  	"encoding/binary"
     6  	"math/big"
     7  	"testing"
     8  
     9  	"github.com/ethereum/go-ethereum"
    10  	"github.com/ethereum/go-ethereum/common"
    11  	depositcontract "github.com/prysmaticlabs/prysm/contracts/deposit-contract"
    12  	"github.com/prysmaticlabs/prysm/shared/interop"
    13  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    14  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    15  )
    16  
    17  func TestSetupRegistrationContract_OK(t *testing.T) {
    18  	_, err := depositcontract.Setup()
    19  	assert.NoError(t, err, "Can not deploy validator registration contract")
    20  }
    21  
    22  // negative test case, deposit with less than 1 ETH which is less than the top off amount.
    23  func TestRegister_Below1ETH(t *testing.T) {
    24  	testAccount, err := depositcontract.Setup()
    25  	require.NoError(t, err)
    26  
    27  	// Generate deposit data
    28  	privKeys, pubKeys, err := interop.DeterministicallyGenerateKeys(0 /*startIndex*/, 1)
    29  	require.NoError(t, err)
    30  	depositDataItems, depositDataRoots, err := interop.DepositDataFromKeys(privKeys, pubKeys)
    31  	require.NoError(t, err)
    32  
    33  	var depositDataRoot [32]byte
    34  	copy(depositDataRoot[:], depositDataRoots[0])
    35  	testAccount.TxOpts.Value = depositcontract.LessThan1Eth()
    36  	_, err = testAccount.Contract.Deposit(testAccount.TxOpts, pubKeys[0].Marshal(), depositDataItems[0].WithdrawalCredentials, depositDataItems[0].Signature, depositDataRoot)
    37  	assert.ErrorContains(t, "execution reverted", err, "Validator registration should have failed with insufficient deposit")
    38  }
    39  
    40  // normal test case, test depositing 32 ETH and verify HashChainValue event is correctly emitted.
    41  func TestValidatorRegister_OK(t *testing.T) {
    42  	testAccount, err := depositcontract.Setup()
    43  	require.NoError(t, err)
    44  	testAccount.TxOpts.Value = depositcontract.Amount32Eth()
    45  
    46  	// Generate deposit data
    47  	privKeys, pubKeys, err := interop.DeterministicallyGenerateKeys(0 /*startIndex*/, 1)
    48  	require.NoError(t, err)
    49  	depositDataItems, depositDataRoots, err := interop.DepositDataFromKeys(privKeys, pubKeys)
    50  	require.NoError(t, err)
    51  
    52  	var depositDataRoot [32]byte
    53  	copy(depositDataRoot[:], depositDataRoots[0])
    54  	_, err = testAccount.Contract.Deposit(testAccount.TxOpts, pubKeys[0].Marshal(), depositDataItems[0].WithdrawalCredentials, depositDataItems[0].Signature, depositDataRoot)
    55  	testAccount.Backend.Commit()
    56  	require.NoError(t, err, "Validator registration failed")
    57  	_, err = testAccount.Contract.Deposit(testAccount.TxOpts, pubKeys[0].Marshal(), depositDataItems[0].WithdrawalCredentials, depositDataItems[0].Signature, depositDataRoot)
    58  	testAccount.Backend.Commit()
    59  	assert.NoError(t, err, "Validator registration failed")
    60  	_, err = testAccount.Contract.Deposit(testAccount.TxOpts, pubKeys[0].Marshal(), depositDataItems[0].WithdrawalCredentials, depositDataItems[0].Signature, depositDataRoot)
    61  	testAccount.Backend.Commit()
    62  	assert.NoError(t, err, "Validator registration failed")
    63  
    64  	query := ethereum.FilterQuery{
    65  		Addresses: []common.Address{
    66  			testAccount.ContractAddr,
    67  		},
    68  	}
    69  
    70  	logs, err := testAccount.Backend.FilterLogs(context.Background(), query)
    71  	assert.NoError(t, err, "Unable to get logs of deposit contract")
    72  
    73  	merkleTreeIndex := make([]uint64, 5)
    74  
    75  	for i, log := range logs {
    76  		_, _, _, _, idx, err := depositcontract.UnpackDepositLogData(log.Data)
    77  		require.NoError(t, err, "Unable to unpack log data")
    78  		merkleTreeIndex[i] = binary.LittleEndian.Uint64(idx)
    79  	}
    80  
    81  	assert.Equal(t, uint64(0), merkleTreeIndex[0], "Deposit event total desposit count miss matched")
    82  	assert.Equal(t, uint64(1), merkleTreeIndex[1], "Deposit event total desposit count miss matched")
    83  	assert.Equal(t, uint64(2), merkleTreeIndex[2], "Deposit event total desposit count miss matched")
    84  }
    85  
    86  func TestDrain(t *testing.T) {
    87  	testAccount, err := depositcontract.Setup()
    88  	require.NoError(t, err)
    89  	testAccount.TxOpts.Value = depositcontract.Amount32Eth()
    90  
    91  	// Generate deposit data
    92  	privKeys, pubKeys, err := interop.DeterministicallyGenerateKeys(0 /*startIndex*/, 1)
    93  	require.NoError(t, err)
    94  	depositDataItems, depositDataRoots, err := interop.DepositDataFromKeys(privKeys, pubKeys)
    95  	require.NoError(t, err)
    96  
    97  	var depositDataRoot [32]byte
    98  	copy(depositDataRoot[:], depositDataRoots[0])
    99  	_, err = testAccount.Contract.Deposit(testAccount.TxOpts, pubKeys[0].Marshal(), depositDataItems[0].WithdrawalCredentials, depositDataItems[0].Signature, depositDataRoot)
   100  	testAccount.Backend.Commit()
   101  	require.NoError(t, err, "Validator registration failed")
   102  
   103  	testAccount.Backend.Commit()
   104  
   105  	ctx := context.Background()
   106  	bal, err := testAccount.Backend.BalanceAt(ctx, testAccount.ContractAddr, nil)
   107  	require.NoError(t, err)
   108  	require.Equal(t, 0, bal.Cmp(depositcontract.Amount32Eth()), "Deposit did not work")
   109  
   110  	testAccount.TxOpts.Value = big.NewInt(0)
   111  	_, err = testAccount.Contract.Drain(testAccount.TxOpts)
   112  	require.NoError(t, err)
   113  
   114  	testAccount.Backend.Commit()
   115  
   116  	bal, err = testAccount.Backend.BalanceAt(ctx, testAccount.ContractAddr, nil)
   117  	require.NoError(t, err)
   118  	assert.Equal(t, 0, big.NewInt(0).Cmp(bal), "Drain did not drain balance")
   119  }