arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/api/state_test.go
api/state_test.goRaw
  1package api
  2
  3import (
  4	"math/big"
  5	"testing"
  6
  7	"github.com/hermeznetwork/hermez-node/apitypes"
  8	"github.com/hermeznetwork/hermez-node/common"
  9	"github.com/hermeznetwork/hermez-node/db/historydb"
 10	"github.com/stretchr/testify/assert"
 11	"github.com/stretchr/testify/require"
 12)
 13
 14type testStatus struct {
 15	Network           testNetwork                   `json:"network"`
 16	Metrics           historydb.MetricsAPI          `json:"metrics"`
 17	Rollup            historydb.RollupVariablesAPI  `json:"rollup"`
 18	Auction           historydb.AuctionVariablesAPI `json:"auction"`
 19	WithdrawalDelayer common.WDelayerVariables      `json:"withdrawalDelayer"`
 20	RecommendedFee    common.RecommendedFee         `json:"recommendedFee"`
 21}
 22
 23type testNetwork struct {
 24	LastEthBlock  int64                     `json:"lastEthereumBlock"`
 25	LastSyncBlock int64                     `json:"lastSynchedBlock"`
 26	LastBatch     testBatch                 `json:"lastBatch"`
 27	CurrentSlot   int64                     `json:"currentSlot"`
 28	NextForgers   []historydb.NextForgerAPI `json:"nextForgers"`
 29}
 30
 31func TestSetRollupVariables(t *testing.T) {
 32	stateAPIUpdater.SetSCVars(&common.SCVariablesPtr{Rollup: &tc.rollupVars})
 33	require.NoError(t, stateAPIUpdater.Store())
 34	ni, err := api.h.GetNodeInfoAPI()
 35	require.NoError(t, err)
 36	assertEqualRollupVariables(t, tc.rollupVars, ni.StateAPI.Rollup, true)
 37}
 38
 39func assertEqualRollupVariables(t *testing.T, rollupVariables common.RollupVariables, apiVariables historydb.RollupVariablesAPI, checkBuckets bool) {
 40	assert.Equal(t, apitypes.NewBigIntStr(rollupVariables.FeeAddToken), apiVariables.FeeAddToken)
 41	assert.Equal(t, rollupVariables.ForgeL1L2BatchTimeout, apiVariables.ForgeL1L2BatchTimeout)
 42	assert.Equal(t, rollupVariables.WithdrawalDelay, apiVariables.WithdrawalDelay)
 43	assert.Equal(t, rollupVariables.SafeMode, apiVariables.SafeMode)
 44	if checkBuckets {
 45		for i, bucket := range rollupVariables.Buckets {
 46			assert.Equal(t, apitypes.NewBigIntStr(bucket.BlockWithdrawalRate), apiVariables.Buckets[i].BlockWithdrawalRate)
 47			assert.Equal(t, apitypes.NewBigIntStr(bucket.CeilUSD), apiVariables.Buckets[i].CeilUSD)
 48			assert.Equal(t, apitypes.NewBigIntStr(bucket.MaxWithdrawals), apiVariables.Buckets[i].MaxWithdrawals)
 49			assert.Equal(t, apitypes.NewBigIntStr(bucket.Withdrawals), apiVariables.Buckets[i].Withdrawals)
 50		}
 51	}
 52}
 53
 54func TestSetWDelayerVariables(t *testing.T) {
 55	stateAPIUpdater.SetSCVars(&common.SCVariablesPtr{WDelayer: &tc.wdelayerVars})
 56	require.NoError(t, stateAPIUpdater.Store())
 57	ni, err := api.h.GetNodeInfoAPI()
 58	require.NoError(t, err)
 59	assert.Equal(t, tc.wdelayerVars, ni.StateAPI.WithdrawalDelayer)
 60}
 61
 62func TestSetAuctionVariables(t *testing.T) {
 63	stateAPIUpdater.SetSCVars(&common.SCVariablesPtr{Auction: &tc.auctionVars})
 64	require.NoError(t, stateAPIUpdater.Store())
 65	ni, err := api.h.GetNodeInfoAPI()
 66	require.NoError(t, err)
 67	assertEqualAuctionVariables(t, tc.auctionVars, ni.StateAPI.Auction)
 68}
 69
 70func assertEqualAuctionVariables(t *testing.T, auctionVariables common.AuctionVariables, apiVariables historydb.AuctionVariablesAPI) {
 71	assert.Equal(t, auctionVariables.EthBlockNum, apiVariables.EthBlockNum)
 72	assert.Equal(t, auctionVariables.DonationAddress, apiVariables.DonationAddress)
 73	assert.Equal(t, auctionVariables.BootCoordinator, apiVariables.BootCoordinator)
 74	assert.Equal(t, auctionVariables.BootCoordinatorURL, apiVariables.BootCoordinatorURL)
 75	assert.Equal(t, auctionVariables.DefaultSlotSetBidSlotNum, apiVariables.DefaultSlotSetBidSlotNum)
 76	assert.Equal(t, auctionVariables.ClosedAuctionSlots, apiVariables.ClosedAuctionSlots)
 77	assert.Equal(t, auctionVariables.OpenAuctionSlots, apiVariables.OpenAuctionSlots)
 78	assert.Equal(t, auctionVariables.Outbidding, apiVariables.Outbidding)
 79	assert.Equal(t, auctionVariables.SlotDeadline, apiVariables.SlotDeadline)
 80
 81	for i, slot := range auctionVariables.DefaultSlotSetBid {
 82		assert.Equal(t, apitypes.NewBigIntStr(slot), apiVariables.DefaultSlotSetBid[i])
 83	}
 84
 85	for i, ratio := range auctionVariables.AllocationRatio {
 86		assert.Equal(t, ratio, apiVariables.AllocationRatio[i])
 87	}
 88}
 89
 90func TestUpdateNetworkInfo(t *testing.T) {
 91	lastBlock := tc.blocks[3]
 92	lastBatchNum := common.BatchNum(3)
 93	currentSlotNum := int64(1)
 94
 95	// Generate some bucket_update data
 96	bucketUpdates := []common.BucketUpdate{
 97		{
 98			EthBlockNum: 4,
 99			NumBucket:   0,
100			BlockStamp:  4,
101			Withdrawals: big.NewInt(123),
102		},
103		{
104			EthBlockNum: 5,
105			NumBucket:   2,
106			BlockStamp:  5,
107			Withdrawals: big.NewInt(42),
108		},
109		{
110			EthBlockNum: 5,
111			NumBucket:   2, // Repeated bucket
112			BlockStamp:  5,
113			Withdrawals: big.NewInt(43),
114		},
115	}
116	err := api.h.AddBucketUpdatesTest(api.h.DB(), bucketUpdates)
117	require.NoError(t, err)
118
119	err = stateAPIUpdater.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
120	require.NoError(t, err)
121	require.NoError(t, stateAPIUpdater.Store())
122	ni, err := api.h.GetNodeInfoAPI()
123	require.NoError(t, err)
124	assert.Equal(t, lastBlock.Num, ni.StateAPI.Network.LastSyncBlock)
125	assert.Equal(t, lastBatchNum, ni.StateAPI.Network.LastBatch.BatchNum)
126	assert.Equal(t, currentSlotNum, ni.StateAPI.Network.CurrentSlot)
127	assert.Equal(t, int(ni.StateAPI.Auction.ClosedAuctionSlots)+1, len(ni.StateAPI.Network.NextForgers))
128	assert.Equal(t, ni.StateAPI.Rollup.Buckets[0].Withdrawals, apitypes.NewBigIntStr(big.NewInt(123)))
129	assert.Equal(t, ni.StateAPI.Rollup.Buckets[2].Withdrawals, apitypes.NewBigIntStr(big.NewInt(43)))
130}
131
132func TestUpdateMetrics(t *testing.T) {
133	// Update Metrics needs api.status.Network.LastBatch.BatchNum to be updated
134	lastBlock := tc.blocks[3]
135	lastBatchNum := common.BatchNum(12)
136	currentSlotNum := int64(1)
137	err := stateAPIUpdater.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
138	require.NoError(t, err)
139
140	err = stateAPIUpdater.UpdateMetrics()
141	require.NoError(t, err)
142	require.NoError(t, stateAPIUpdater.Store())
143	ni, err := api.h.GetNodeInfoAPI()
144	require.NoError(t, err)
145	assert.Greater(t, ni.StateAPI.Metrics.TransactionsPerBatch, float64(0))
146	assert.Greater(t, ni.StateAPI.Metrics.BatchFrequency, float64(0))
147	assert.Greater(t, ni.StateAPI.Metrics.TransactionsPerSecond, float64(0))
148	assert.Greater(t, ni.StateAPI.Metrics.TokenAccounts, int64(0))
149	assert.Greater(t, ni.StateAPI.Metrics.Wallets, int64(0))
150	assert.Greater(t, ni.StateAPI.Metrics.AvgTransactionFee, float64(0))
151}
152
153func TestUpdateRecommendedFee(t *testing.T) {
154	err := stateAPIUpdater.UpdateRecommendedFee()
155	require.NoError(t, err)
156	require.NoError(t, stateAPIUpdater.Store())
157	var minFeeUSD float64
158	if api.l2 != nil {
159		minFeeUSD = api.l2.MinFeeUSD()
160	}
161	ni, err := api.h.GetNodeInfoAPI()
162	require.NoError(t, err)
163	assert.Greater(t, ni.StateAPI.RecommendedFee.ExistingAccount, minFeeUSD)
164	assert.Equal(t, ni.StateAPI.RecommendedFee.CreatesAccount,
165		ni.StateAPI.RecommendedFee.ExistingAccount*
166			historydb.CreateAccountExtraFeePercentage)
167	assert.Equal(t, ni.StateAPI.RecommendedFee.CreatesAccountInternal,
168		ni.StateAPI.RecommendedFee.ExistingAccount*
169			historydb.CreateAccountInternalExtraFeePercentage)
170}
171
172func TestGetState(t *testing.T) {
173	lastBlock := tc.blocks[3]
174	lastBatchNum := common.BatchNum(12)
175	currentSlotNum := int64(1)
176	stateAPIUpdater.SetSCVars(&common.SCVariablesPtr{
177		Rollup:   &tc.rollupVars,
178		Auction:  &tc.auctionVars,
179		WDelayer: &tc.wdelayerVars,
180	})
181	err := stateAPIUpdater.UpdateNetworkInfo(lastBlock, lastBlock, lastBatchNum, currentSlotNum)
182	require.NoError(t, err)
183	err = stateAPIUpdater.UpdateMetrics()
184	require.NoError(t, err)
185	err = stateAPIUpdater.UpdateRecommendedFee()
186	require.NoError(t, err)
187	require.NoError(t, stateAPIUpdater.Store())
188
189	endpoint := apiURL + "state"
190	var status testStatus
191
192	require.NoError(t, doGoodReq("GET", endpoint, nil, &status))
193
194	// SC vars
195	// UpdateNetworkInfo will overwrite buckets withdrawal values
196	// So they won't be checked here, they are checked at
197	// TestUpdateNetworkInfo
198	assertEqualRollupVariables(t, tc.rollupVars, status.Rollup, false)
199	assertEqualAuctionVariables(t, tc.auctionVars, status.Auction)
200	assert.Equal(t, tc.wdelayerVars, status.WithdrawalDelayer)
201	// Network
202	assert.Equal(t, lastBlock.Num, status.Network.LastEthBlock)
203	assert.Equal(t, lastBlock.Num, status.Network.LastSyncBlock)
204	// TODO: assert all the batch, not just the batch num
205	assert.Equal(t, lastBatchNum, status.Network.LastBatch.BatchNum)
206	assert.Equal(t, currentSlotNum, status.Network.CurrentSlot)
207	assertNextForgers(t, tc.nextForgers, status.Network.NextForgers)
208	// Metrics
209	// TODO: perform real asserts (not just greater than 0)
210	assert.Greater(t, status.Metrics.TransactionsPerBatch, float64(0))
211	assert.Greater(t, status.Metrics.BatchFrequency, float64(0))
212	assert.Greater(t, status.Metrics.TransactionsPerSecond, float64(0))
213	assert.Greater(t, status.Metrics.TokenAccounts, int64(0))
214	assert.Greater(t, status.Metrics.Wallets, int64(0))
215	assert.Greater(t, status.Metrics.AvgTransactionFee, float64(0))
216	// Recommended fee
217	// TODO: perform real asserts (not just greater than 0)
218	assert.Greater(t, status.RecommendedFee.ExistingAccount, float64(0))
219	assert.Equal(t, status.RecommendedFee.CreatesAccount,
220		status.RecommendedFee.ExistingAccount*
221			historydb.CreateAccountExtraFeePercentage)
222	assert.Equal(t, status.RecommendedFee.CreatesAccountInternal,
223		status.RecommendedFee.ExistingAccount*
224			historydb.CreateAccountInternalExtraFeePercentage)
225}
226
227func assertNextForgers(t *testing.T, expected, actual []historydb.NextForgerAPI) {
228	assert.Equal(t, len(expected), len(actual))
229	for i := range expected {
230		// ignore timestamps and other metadata
231		actual[i].Period.FromTimestamp = expected[i].Period.FromTimestamp
232		actual[i].Period.ToTimestamp = expected[i].Period.ToTimestamp
233		actual[i].Coordinator.ItemID = expected[i].Coordinator.ItemID
234		actual[i].Coordinator.EthBlockNum = expected[i].Coordinator.EthBlockNum
235		assert.Equal(t, expected[i], actual[i])
236	}
237}