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}