arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
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}