hermez-node/api/dbtoapistructs.go
api/dbtoapistructs.goRaw
1package api
2
3import (
4 "encoding/base64"
5 "math/big"
6 "strconv"
7 "time"
8
9 ethCommon "github.com/ethereum/go-ethereum/common"
10 "github.com/hermeznetwork/hermez-node/common"
11 "github.com/hermeznetwork/hermez-node/db"
12 "github.com/hermeznetwork/hermez-node/db/historydb"
13 "github.com/hermeznetwork/hermez-node/eth"
14 "github.com/iden3/go-iden3-crypto/babyjub"
15 "github.com/iden3/go-merkletree"
16)
17
18type errorMsg struct {
19 Message string
20}
21
22func bjjToString(bjj *babyjub.PublicKey) string {
23 pkComp := [32]byte(bjj.Compress())
24 sum := pkComp[0]
25 for i := 1; i < len(pkComp); i++ {
26 sum += pkComp[i]
27 }
28 bjjSum := append(pkComp[:], sum)
29 return "hez:" + base64.RawURLEncoding.EncodeToString(bjjSum)
30}
31
32func ethAddrToHez(addr ethCommon.Address) string {
33 return "hez:" + addr.String()
34}
35
36func idxToHez(idx common.Idx, tokenSymbol string) string {
37 return "hez:" + tokenSymbol + ":" + strconv.Itoa(int(idx))
38}
39
40// History Tx
41
42type historyTxsAPI struct {
43 Txs []historyTxAPI `json:"transactions"`
44 Pagination *db.Pagination `json:"pagination"`
45}
46
47func (htx *historyTxsAPI) GetPagination() *db.Pagination {
48 if htx.Txs[0].ItemID < htx.Txs[len(htx.Txs)-1].ItemID {
49 htx.Pagination.FirstReturnedItem = htx.Txs[0].ItemID
50 htx.Pagination.LastReturnedItem = htx.Txs[len(htx.Txs)-1].ItemID
51 } else {
52 htx.Pagination.LastReturnedItem = htx.Txs[0].ItemID
53 htx.Pagination.FirstReturnedItem = htx.Txs[len(htx.Txs)-1].ItemID
54 }
55 return htx.Pagination
56}
57func (htx *historyTxsAPI) Len() int { return len(htx.Txs) }
58
59type l1Info struct {
60 ToForgeL1TxsNum *int64 `json:"toForgeL1TransactionsNum"`
61 UserOrigin bool `json:"userOrigin"`
62 FromEthAddr string `json:"fromHezEthereumAddress"`
63 FromBJJ string `json:"fromBJJ"`
64 LoadAmount string `json:"loadAmount"`
65 HistoricLoadAmountUSD *float64 `json:"historicLoadAmountUSD"`
66 EthBlockNum int64 `json:"ethereumBlockNum"`
67}
68
69type l2Info struct {
70 Fee common.FeeSelector `json:"fee"`
71 HistoricFeeUSD *float64 `json:"historicFeeUSD"`
72 Nonce common.Nonce `json:"nonce"`
73}
74
75type historyTxAPI struct {
76 IsL1 string `json:"L1orL2"`
77 TxID string `json:"id"`
78 ItemID int `json:"itemId"`
79 Type common.TxType `json:"type"`
80 Position int `json:"position"`
81 FromIdx *string `json:"fromAccountIndex"`
82 ToIdx string `json:"toAccountIndex"`
83 Amount string `json:"amount"`
84 BatchNum *common.BatchNum `json:"batchNum"`
85 HistoricUSD *float64 `json:"historicUSD"`
86 Timestamp time.Time `json:"timestamp"`
87 L1Info *l1Info `json:"L1Info"`
88 L2Info *l2Info `json:"L2Info"`
89 Token tokenAPI `json:"token"`
90}
91
92func historyTxsToAPI(dbTxs []historydb.HistoryTx) []historyTxAPI {
93 apiTxs := []historyTxAPI{}
94 for i := 0; i < len(dbTxs); i++ {
95 apiTx := historyTxAPI{
96 TxID: dbTxs[i].TxID.String(),
97 ItemID: dbTxs[i].ItemID,
98 Type: dbTxs[i].Type,
99 Position: dbTxs[i].Position,
100 ToIdx: idxToHez(dbTxs[i].ToIdx, dbTxs[i].TokenSymbol),
101 Amount: dbTxs[i].Amount.String(),
102 HistoricUSD: dbTxs[i].HistoricUSD,
103 BatchNum: dbTxs[i].BatchNum,
104 Timestamp: dbTxs[i].Timestamp,
105 Token: tokenAPI{
106 TokenID: dbTxs[i].TokenID,
107 EthBlockNum: dbTxs[i].TokenEthBlockNum,
108 EthAddr: dbTxs[i].TokenEthAddr,
109 Name: dbTxs[i].TokenName,
110 Symbol: dbTxs[i].TokenSymbol,
111 Decimals: dbTxs[i].TokenDecimals,
112 USD: dbTxs[i].TokenUSD,
113 USDUpdate: dbTxs[i].TokenUSDUpdate,
114 },
115 L1Info: nil,
116 L2Info: nil,
117 }
118 if dbTxs[i].FromIdx != nil {
119 fromIdx := new(string)
120 *fromIdx = idxToHez(*dbTxs[i].FromIdx, dbTxs[i].TokenSymbol)
121 apiTx.FromIdx = fromIdx
122 }
123 if dbTxs[i].IsL1 {
124 apiTx.IsL1 = "L1"
125 apiTx.L1Info = &l1Info{
126 ToForgeL1TxsNum: dbTxs[i].ToForgeL1TxsNum,
127 UserOrigin: *dbTxs[i].UserOrigin,
128 FromEthAddr: ethAddrToHez(*dbTxs[i].FromEthAddr),
129 FromBJJ: bjjToString(dbTxs[i].FromBJJ),
130 LoadAmount: dbTxs[i].LoadAmount.String(),
131 HistoricLoadAmountUSD: dbTxs[i].HistoricLoadAmountUSD,
132 EthBlockNum: dbTxs[i].EthBlockNum,
133 }
134 } else {
135 apiTx.IsL1 = "L2"
136 apiTx.L2Info = &l2Info{
137 Fee: *dbTxs[i].Fee,
138 HistoricFeeUSD: dbTxs[i].HistoricFeeUSD,
139 Nonce: *dbTxs[i].Nonce,
140 }
141 }
142 apiTxs = append(apiTxs, apiTx)
143 }
144 return apiTxs
145}
146
147// Exit
148
149type exitsAPI struct {
150 Exits []exitAPI `json:"exits"`
151 Pagination *db.Pagination `json:"pagination"`
152}
153
154func (e *exitsAPI) GetPagination() *db.Pagination {
155 if e.Exits[0].ItemID < e.Exits[len(e.Exits)-1].ItemID {
156 e.Pagination.FirstReturnedItem = e.Exits[0].ItemID
157 e.Pagination.LastReturnedItem = e.Exits[len(e.Exits)-1].ItemID
158 } else {
159 e.Pagination.LastReturnedItem = e.Exits[0].ItemID
160 e.Pagination.FirstReturnedItem = e.Exits[len(e.Exits)-1].ItemID
161 }
162 return e.Pagination
163}
164func (e *exitsAPI) Len() int { return len(e.Exits) }
165
166type exitAPI struct {
167 ItemID int `json:"itemId"`
168 BatchNum common.BatchNum `json:"batchNum"`
169 AccountIdx string `json:"accountIndex"`
170 MerkleProof *merkletree.CircomVerifierProof `json:"merkleProof"`
171 Balance string `json:"balance"`
172 InstantWithdrawn *int64 `json:"instantWithdrawn"`
173 DelayedWithdrawRequest *int64 `json:"delayedWithdrawRequest"`
174 DelayedWithdrawn *int64 `json:"delayedWithdrawn"`
175 Token tokenAPI `json:"token"`
176}
177
178func historyExitsToAPI(dbExits []historydb.HistoryExit) []exitAPI {
179 apiExits := []exitAPI{}
180 for i := 0; i < len(dbExits); i++ {
181 apiExits = append(apiExits, exitAPI{
182 ItemID: dbExits[i].ItemID,
183 BatchNum: dbExits[i].BatchNum,
184 AccountIdx: idxToHez(dbExits[i].AccountIdx, dbExits[i].TokenSymbol),
185 MerkleProof: dbExits[i].MerkleProof,
186 Balance: dbExits[i].Balance.String(),
187 InstantWithdrawn: dbExits[i].InstantWithdrawn,
188 DelayedWithdrawRequest: dbExits[i].DelayedWithdrawRequest,
189 DelayedWithdrawn: dbExits[i].DelayedWithdrawn,
190 Token: tokenAPI{
191 TokenID: dbExits[i].TokenID,
192 EthBlockNum: dbExits[i].TokenEthBlockNum,
193 EthAddr: dbExits[i].TokenEthAddr,
194 Name: dbExits[i].TokenName,
195 Symbol: dbExits[i].TokenSymbol,
196 Decimals: dbExits[i].TokenDecimals,
197 USD: dbExits[i].TokenUSD,
198 USDUpdate: dbExits[i].TokenUSDUpdate,
199 },
200 })
201 }
202 return apiExits
203}
204
205// Tokens
206
207type tokensAPI struct {
208 Tokens []tokenAPI `json:"tokens"`
209 Pagination *db.Pagination `json:"pagination"`
210}
211
212func (t *tokensAPI) GetPagination() *db.Pagination {
213 if t.Tokens[0].ItemID < t.Tokens[len(t.Tokens)-1].ItemID {
214 t.Pagination.FirstReturnedItem = t.Tokens[0].ItemID
215 t.Pagination.LastReturnedItem = t.Tokens[len(t.Tokens)-1].ItemID
216 } else {
217 t.Pagination.LastReturnedItem = t.Tokens[0].ItemID
218 t.Pagination.FirstReturnedItem = t.Tokens[len(t.Tokens)-1].ItemID
219 }
220 return t.Pagination
221}
222func (t *tokensAPI) Len() int { return len(t.Tokens) }
223
224type tokenAPI struct {
225 ItemID int `json:"itemId"`
226 TokenID common.TokenID `json:"id"`
227 EthBlockNum int64 `json:"ethereumBlockNum"` // Ethereum block number in which this token was registered
228 EthAddr ethCommon.Address `json:"ethereumAddress"`
229 Name string `json:"name"`
230 Symbol string `json:"symbol"`
231 Decimals uint64 `json:"decimals"`
232 USD *float64 `json:"USD"`
233 USDUpdate *time.Time `json:"fiatUpdate"`
234}
235
236func tokensToAPI(dbTokens []historydb.TokenRead) []tokenAPI {
237 apiTokens := []tokenAPI{}
238 for i := 0; i < len(dbTokens); i++ {
239 apiTokens = append(apiTokens, tokenAPI{
240 ItemID: dbTokens[i].ItemID,
241 TokenID: dbTokens[i].TokenID,
242 EthBlockNum: dbTokens[i].EthBlockNum,
243 EthAddr: dbTokens[i].EthAddr,
244 Name: dbTokens[i].Name,
245 Symbol: dbTokens[i].Symbol,
246 Decimals: dbTokens[i].Decimals,
247 USD: dbTokens[i].USD,
248 USDUpdate: dbTokens[i].USDUpdate,
249 })
250 }
251 return apiTokens
252}
253
254// Config
255
256type rollupConstants struct {
257 PublicConstants eth.RollupPublicConstants `json:"publicConstants"`
258 MaxFeeIdxCoordinator int `json:"maxFeeIdxCoordinator"`
259 ReservedIdx int `json:"reservedIdx"`
260 ExitIdx int `json:"exitIdx"`
261 LimitLoadAmount *big.Int `json:"limitLoadAmount"`
262 LimitL2TransferAmount *big.Int `json:"limitL2TransferAmount"`
263 LimitTokens int `json:"limitTokens"`
264 L1CoordinatorTotalBytes int `json:"l1CoordinatorTotalBytes"`
265 L1UserTotalBytes int `json:"l1UserTotalBytes"`
266 MaxL1UserTx int `json:"maxL1UserTx"`
267 MaxL1Tx int `json:"maxL1Tx"`
268 InputSHAConstantBytes int `json:"inputSHAConstantBytes"`
269 NumBuckets int `json:"numBuckets"`
270 MaxWithdrawalDelay int `json:"maxWithdrawalDelay"`
271 ExchangeMultiplier int `json:"exchangeMultiplier"`
272}
273
274type configAPI struct {
275 RollupConstants rollupConstants `json:"hermez"`
276 AuctionConstants eth.AuctionConstants `json:"auction"`
277 WDelayerConstants eth.WDelayerConstants `json:"withdrawalDelayer"`
278}