arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/eth/wdelayer_test.go
eth/wdelayer_test.goRaw
  1package eth
  2
  3import (
  4	"math/big"
  5	"testing"
  6	"time"
  7
  8	"github.com/stretchr/testify/assert"
  9	"github.com/stretchr/testify/require"
 10)
 11
 12var wdelayerClient *WDelayerClient
 13var wdelayerClientTest *WDelayerClient
 14
 15var initWithdrawalDelay = big.NewInt(60)
 16var newWithdrawalDelay = big.NewInt(79)
 17var maxEmergencyModeTime = time.Hour * 24 * 7 * 26
 18var maxWithdrawalDelay = time.Hour * 24 * 7 * 2
 19
 20func TestWDelayerConstants(t *testing.T) {
 21	wDelayerConstants, err := wdelayerClientTest.WDelayerConstants()
 22	require.Nil(t, err)
 23	assert.Equal(t, uint64(maxWithdrawalDelay.Seconds()), wDelayerConstants.MaxWithdrawalDelay)
 24	assert.Equal(t, uint64(maxEmergencyModeTime.Seconds()), wDelayerConstants.MaxEmergencyModeTime)
 25	assert.Equal(t, hermezRollupTestAddressConst, wDelayerConstants.HermezRollup)
 26}
 27
 28func TestWDelayerGetHermezGovernanceAddress(t *testing.T) {
 29	governanceAddress, err := wdelayerClientTest.WDelayerGetHermezGovernanceAddress()
 30	require.Nil(t, err)
 31	assert.Equal(t, &governanceAddressConst, governanceAddress)
 32}
 33
 34func TestWDelayerSetHermezGovernanceAddress(t *testing.T) {
 35	wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerTestAddressConst)
 36	require.Nil(t, err)
 37	_, err = wdelayerClientTest.WDelayerTransferGovernance(auxAddressConst)
 38	require.Nil(t, err)
 39	_, err = wdelayerClientAux.WDelayerClaimGovernance()
 40	require.Nil(t, err)
 41	auxAddress, err := wdelayerClientTest.WDelayerGetHermezGovernanceAddress()
 42	require.Nil(t, err)
 43	assert.Equal(t, &auxAddressConst, auxAddress)
 44	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
 45	require.Nil(t, err)
 46	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
 47	require.Nil(t, err)
 48	assert.Equal(t, auxAddressConst, wdelayerEvents.NewHermezGovernanceAddress[0].NewHermezGovernanceAddress)
 49	_, err = wdelayerClientAux.WDelayerTransferGovernance(governanceAddressConst)
 50	require.Nil(t, err)
 51	_, err = wdelayerClientTest.WDelayerClaimGovernance()
 52	require.Nil(t, err)
 53}
 54
 55func TestWDelayerGetEmergencyCouncil(t *testing.T) {
 56	emergencyCouncil, err := wdelayerClientTest.WDelayerGetEmergencyCouncil()
 57	require.Nil(t, err)
 58	assert.Equal(t, &emergencyCouncilAddressConst, emergencyCouncil)
 59}
 60
 61func TestWDelayerSetEmergencyCouncil(t *testing.T) {
 62	wdelayerClientEmergencyCouncil, err := NewWDelayerClient(ethereumClientEmergencyCouncil, wdelayerTestAddressConst)
 63	require.Nil(t, err)
 64	wdelayerClientAux, err := NewWDelayerClient(ethereumClientAux, wdelayerTestAddressConst)
 65	require.Nil(t, err)
 66	_, err = wdelayerClientEmergencyCouncil.WDelayerTransferEmergencyCouncil(auxAddressConst)
 67	require.Nil(t, err)
 68	_, err = wdelayerClientAux.WDelayerClaimEmergencyCouncil()
 69	require.Nil(t, err)
 70	auxAddress, err := wdelayerClientTest.WDelayerGetEmergencyCouncil()
 71	require.Nil(t, err)
 72	assert.Equal(t, &auxAddressConst, auxAddress)
 73	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
 74	require.Nil(t, err)
 75	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
 76	require.Nil(t, err)
 77	assert.Equal(t, auxAddressConst, wdelayerEvents.NewEmergencyCouncil[0].NewEmergencyCouncil)
 78	_, err = wdelayerClientAux.WDelayerTransferEmergencyCouncil(emergencyCouncilAddressConst)
 79	require.Nil(t, err)
 80	_, err = wdelayerClientEmergencyCouncil.WDelayerClaimEmergencyCouncil()
 81	require.Nil(t, err)
 82}
 83
 84func TestWDelayerIsEmergencyMode(t *testing.T) {
 85	emergencyMode, err := wdelayerClientTest.WDelayerIsEmergencyMode()
 86	require.Nil(t, err)
 87	assert.Equal(t, false, emergencyMode)
 88}
 89
 90func TestWDelayerGetWithdrawalDelay(t *testing.T) {
 91	withdrawalDelay, err := wdelayerClientTest.WDelayerGetWithdrawalDelay()
 92	require.Nil(t, err)
 93	assert.Equal(t, initWithdrawalDelay, withdrawalDelay)
 94}
 95
 96func TestWDelayerChangeWithdrawalDelay(t *testing.T) {
 97	_, err := wdelayerClientTest.WDelayerChangeWithdrawalDelay(newWithdrawalDelay.Uint64())
 98	require.Nil(t, err)
 99	withdrawalDelay, err := wdelayerClientTest.WDelayerGetWithdrawalDelay()
100	require.Nil(t, err)
101	assert.Equal(t, newWithdrawalDelay, withdrawalDelay)
102	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
103	require.Nil(t, err)
104	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
105	require.Nil(t, err)
106	assert.Equal(t, newWithdrawalDelay.Uint64(), wdelayerEvents.NewWithdrawalDelay[0].WithdrawalDelay)
107}
108
109func TestWDelayerDeposit(t *testing.T) {
110	amount := new(big.Int)
111	amount.SetString("1100000000000000000", 10)
112	wdelayerClientHermez, err := NewWDelayerClient(ethereumClientHermez, wdelayerTestAddressConst)
113	require.Nil(t, err)
114	_, err = wdelayerClientHermez.WDelayerDeposit(auxAddressConst, tokenHEZAddressConst, amount)
115	require.Nil(t, err)
116	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
117	require.Nil(t, err)
118	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
119	require.Nil(t, err)
120	assert.Equal(t, amount, wdelayerEvents.Deposit[0].Amount)
121	assert.Equal(t, auxAddressConst, wdelayerEvents.Deposit[0].Owner)
122	assert.Equal(t, tokenHEZAddressConst, wdelayerEvents.Deposit[0].Token)
123}
124
125func TestWDelayerDepositInfo(t *testing.T) {
126	amount := new(big.Int)
127	amount.SetString("1100000000000000000", 10)
128	state, err := wdelayerClientTest.WDelayerDepositInfo(auxAddressConst, tokenHEZAddressConst)
129	require.Nil(t, err)
130	assert.Equal(t, state.Amount, amount)
131}
132
133func TestWDelayerWithdrawal(t *testing.T) {
134	amount := new(big.Int)
135	amount.SetString("1100000000000000000", 10)
136	_, err := wdelayerClientTest.WDelayerWithdrawal(auxAddressConst, tokenHEZAddressConst)
137	require.Contains(t, err.Error(), "WITHDRAWAL_NOT_ALLOWED")
138	addTime(float64(newWithdrawalDelay.Int64()), ethClientDialURL)
139	addBlock(ethClientDialURL)
140	_, err = wdelayerClientTest.WDelayerWithdrawal(auxAddressConst, tokenHEZAddressConst)
141	require.Nil(t, err)
142	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
143	require.Nil(t, err)
144	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
145	require.Nil(t, err)
146	assert.Equal(t, amount, wdelayerEvents.Withdraw[0].Amount)
147	assert.Equal(t, auxAddressConst, wdelayerEvents.Withdraw[0].Owner)
148	assert.Equal(t, tokenHEZAddressConst, wdelayerEvents.Withdraw[0].Token)
149}
150
151func TestWDelayerSecondDeposit(t *testing.T) {
152	amount := new(big.Int)
153	amount.SetString("1100000000000000000", 10)
154	wdelayerClientHermez, err := NewWDelayerClient(ethereumClientHermez, wdelayerTestAddressConst)
155	require.Nil(t, err)
156	_, err = wdelayerClientHermez.WDelayerDeposit(auxAddressConst, tokenHEZAddressConst, amount)
157	require.Nil(t, err)
158	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
159	require.Nil(t, err)
160	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
161	require.Nil(t, err)
162	assert.Equal(t, amount, wdelayerEvents.Deposit[0].Amount)
163	assert.Equal(t, auxAddressConst, wdelayerEvents.Deposit[0].Owner)
164	assert.Equal(t, tokenHEZAddressConst, wdelayerEvents.Deposit[0].Token)
165}
166
167func TestWDelayerEnableEmergencyMode(t *testing.T) {
168	_, err := wdelayerClientTest.WDelayerEnableEmergencyMode()
169	require.Nil(t, err)
170	emergencyMode, err := wdelayerClientTest.WDelayerIsEmergencyMode()
171	require.Nil(t, err)
172	assert.Equal(t, true, emergencyMode)
173	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
174	require.Nil(t, err)
175	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
176	require.Nil(t, err)
177	auxEvent := new(WDelayerEventEmergencyModeEnabled)
178	assert.Equal(t, auxEvent, &wdelayerEvents.EmergencyModeEnabled[0])
179}
180
181func TestWDelayerGetEmergencyModeStartingTime(t *testing.T) {
182	emergencyModeStartingTime, err := wdelayerClientTest.WDelayerGetEmergencyModeStartingTime()
183	require.Nil(t, err)
184	// `emergencyModeStartingTime` is initialized to 0 in the smart
185	// contract construction.  Since we called WDelayerEnableEmergencyMode
186	// previously, `emergencyModeStartingTime` is set to the time when the
187	// call was made, so it's > 0.
188	assert.True(t, emergencyModeStartingTime.Cmp(big.NewInt(0)) == 1)
189}
190
191func TestWDelayerEscapeHatchWithdrawal(t *testing.T) {
192	amount := new(big.Int)
193	amount.SetString("10000000000000000", 10)
194	wdelayerClientEmergencyCouncil, err := NewWDelayerClient(ethereumClientEmergencyCouncil, wdelayerTestAddressConst)
195	require.Nil(t, err)
196	_, err = wdelayerClientEmergencyCouncil.WDelayerEscapeHatchWithdrawal(governanceAddressConst, tokenHEZAddressConst, amount)
197	require.Contains(t, err.Error(), "NO_MAX_EMERGENCY_MODE_TIME")
198	seconds := maxEmergencyModeTime.Seconds()
199	addTime(seconds, ethClientDialURL)
200	_, err = wdelayerClientEmergencyCouncil.WDelayerEscapeHatchWithdrawal(governanceAddressConst, tokenHEZAddressConst, amount)
201	require.Nil(t, err)
202	currentBlockNum, err := wdelayerClientTest.client.EthLastBlock()
203	require.Nil(t, err)
204	wdelayerEvents, _, err := wdelayerClientTest.WDelayerEventsByBlock(currentBlockNum)
205	require.Nil(t, err)
206	assert.Equal(t, tokenHEZAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].Token)
207	assert.Equal(t, governanceAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].To)
208	assert.Equal(t, emergencyCouncilAddressConst, wdelayerEvents.EscapeHatchWithdrawal[0].Who)
209	assert.Equal(t, amount, wdelayerEvents.EscapeHatchWithdrawal[0].Amount)
210}