arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/db/l2db/apiqueries.go
db/l2db/apiqueries.goRaw
 1package l2db
 2
 3import (
 4	ethCommon "github.com/ethereum/go-ethereum/common"
 5	"github.com/hermeznetwork/hermez-node/common"
 6	"github.com/hermeznetwork/tracerr"
 7	"github.com/russross/meddler"
 8)
 9
10// AddAccountCreationAuthAPI inserts an account creation authorization into the DB
11func (l2db *L2DB) AddAccountCreationAuthAPI(auth *common.AccountCreationAuth) error {
12	cancel, err := l2db.apiConnCon.Acquire()
13	defer cancel()
14	if err != nil {
15		return tracerr.Wrap(err)
16	}
17	defer l2db.apiConnCon.Release()
18	return l2db.AddAccountCreationAuth(auth)
19}
20
21// GetAccountCreationAuthAPI returns an account creation authorization from the DB
22func (l2db *L2DB) GetAccountCreationAuthAPI(addr ethCommon.Address) (*AccountCreationAuthAPI, error) {
23	cancel, err := l2db.apiConnCon.Acquire()
24	defer cancel()
25	if err != nil {
26		return nil, tracerr.Wrap(err)
27	}
28	defer l2db.apiConnCon.Release()
29	auth := new(AccountCreationAuthAPI)
30	return auth, tracerr.Wrap(meddler.QueryRow(
31		l2db.db, auth,
32		"SELECT * FROM account_creation_auth WHERE eth_addr = $1;",
33		addr,
34	))
35}
36
37// AddTxAPI inserts a tx to the pool
38func (l2db *L2DB) AddTxAPI(tx *PoolL2TxWrite) error {
39	cancel, err := l2db.apiConnCon.Acquire()
40	defer cancel()
41	if err != nil {
42		return tracerr.Wrap(err)
43	}
44	defer l2db.apiConnCon.Release()
45	row := l2db.db.QueryRow(
46		"SELECT COUNT(*) FROM tx_pool WHERE state = $1;",
47		common.PoolL2TxStatePending,
48	)
49	var totalTxs uint32
50	if err := row.Scan(&totalTxs); err != nil {
51		return tracerr.Wrap(err)
52	}
53	if totalTxs >= l2db.maxTxs {
54		return tracerr.New(
55			"The pool is at full capacity. More transactions are not accepted currently",
56		)
57	}
58	return tracerr.Wrap(meddler.Insert(l2db.db, "tx_pool", tx))
59}
60
61// selectPoolTxAPI select part of queries to get PoolL2TxRead
62const selectPoolTxAPI = `SELECT  tx_pool.tx_id, hez_idx(tx_pool.from_idx, token.symbol) AS from_idx, tx_pool.effective_from_eth_addr, 
63tx_pool.effective_from_bjj, hez_idx(tx_pool.to_idx, token.symbol) AS to_idx, tx_pool.effective_to_eth_addr, 
64tx_pool.effective_to_bjj, tx_pool.token_id, tx_pool.amount, tx_pool.fee, tx_pool.nonce, 
65tx_pool.state, tx_pool.info, tx_pool.signature, tx_pool.timestamp, tx_pool.batch_num, hez_idx(tx_pool.rq_from_idx, token.symbol) AS rq_from_idx, 
66hez_idx(tx_pool.rq_to_idx, token.symbol) AS rq_to_idx, tx_pool.rq_to_eth_addr, tx_pool.rq_to_bjj, tx_pool.rq_token_id, tx_pool.rq_amount, 
67tx_pool.rq_fee, tx_pool.rq_nonce, tx_pool.tx_type, 
68token.item_id AS token_item_id, token.eth_block_num, token.eth_addr, token.name, token.symbol, token.decimals, token.usd, token.usd_update 
69FROM tx_pool INNER JOIN token ON tx_pool.token_id = token.token_id `
70
71// GetTxAPI return the specified Tx in PoolTxAPI format
72func (l2db *L2DB) GetTxAPI(txID common.TxID) (*PoolTxAPI, error) {
73	cancel, err := l2db.apiConnCon.Acquire()
74	defer cancel()
75	if err != nil {
76		return nil, tracerr.Wrap(err)
77	}
78	defer l2db.apiConnCon.Release()
79	tx := new(PoolTxAPI)
80	return tx, tracerr.Wrap(meddler.QueryRow(
81		l2db.db, tx,
82		selectPoolTxAPI+"WHERE tx_id = $1;",
83		txID,
84	))
85}