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 }