add: (feat) balances query api

- add address utils
- return uint64 for balances instead of float
This commit is contained in:
2022-05-19 09:52:34 +03:00
parent 7d431f1c8f
commit f0690d62be
11 changed files with 170 additions and 98 deletions

View File

@@ -1,6 +1,7 @@
package public
import (
batch_balance "github.com/grassrootseconomics/cic-go/batch_balance"
"github.com/jackc/pgx/v4/pgxpool"
"github.com/labstack/echo/v4"
"github.com/nleof/goyesql"
@@ -9,9 +10,10 @@ import (
type api struct {
db *pgxpool.Pool
q goyesql.Queries
c *batch_balance.BatchBalance
}
func InitPublicApi(e *echo.Echo, db *pgxpool.Pool, queries goyesql.Queries) {
func InitPublicApi(e *echo.Echo, db *pgxpool.Pool, batchBalance *batch_balance.BatchBalance, queries goyesql.Queries) {
g := e.Group("/public")
g.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
@@ -19,6 +21,7 @@ func InitPublicApi(e *echo.Echo, db *pgxpool.Pool, queries goyesql.Queries) {
c.Set("api", &api{
db: db,
q: queries,
c: batchBalance,
})
return next(c)
}

View File

@@ -1,12 +1,21 @@
package public
import (
"cic-dw/pkg/address"
"context"
"net/http"
"github.com/ethereum/go-ethereum/common"
"github.com/georgysavva/scany/pgxscan"
"github.com/labstack/echo/v4"
"net/http"
"github.com/lmittmann/w3"
)
type balanceRes struct {
TokenSymbol string `json:"symbol"`
Balance int64 `json:"balance"`
}
type dbRes struct {
TokenSymbol string `db:"token_symbol"`
TokenAddress string `db:"token_address"`
@@ -14,11 +23,19 @@ type dbRes struct {
func handleBalancesQuery(c echo.Context) error {
var (
api = c.Get("api").(*api)
data []dbRes
api = c.Get("api").(*api)
data []dbRes
tokenAddresses []common.Address
res []balanceRes
)
rows, err := api.db.Query(context.Background(), api.q["all-known-tokens"], c.Param("address"))
// TODO: return 400
qAddress, err := address.SarafuAddress(c.Param("address"))
if err != nil {
return err
}
rows, err := api.db.Query(context.Background(), api.q["all-known-tokens"], qAddress)
if err != nil {
return err
}
@@ -27,5 +44,23 @@ func handleBalancesQuery(c echo.Context) error {
return err
}
return c.JSON(http.StatusOK, data)
for _, rowData := range data {
tokenAddresses = append(tokenAddresses, w3.A(address.Checksum(rowData.TokenAddress)))
}
balances, err := api.c.TokensBalance(context.Background(), w3.A(address.Checksum(qAddress)), tokenAddresses)
if err != nil {
return err
}
for i, balance := range balances {
var d balanceRes
d.Balance = balance.Int64()
d.TokenSymbol = data[i].TokenSymbol
res = append(res, d)
}
return c.JSON(http.StatusOK, res)
}

View File

@@ -2,34 +2,36 @@ package syncer
import (
"context"
"math/big"
"strconv"
"github.com/georgysavva/scany/pgxscan"
"github.com/hibiken/asynq"
"github.com/jackc/pgx/v4"
"github.com/lmittmann/w3"
"github.com/rs/zerolog/log"
"math/big"
"strconv"
)
type tokenCursor struct {
cursorPos string `db:"cursor_pos"`
CursorPos string `db:"cursor_pos"`
}
func (s *Syncer) TokenSyncer(ctx context.Context, t *asynq.Task) error {
var lastCursor tokenCursor
if err := pgxscan.Get(ctx, s.db, &lastCursor, s.queries["cursor-pos"], 3); err != nil {
log.Err(err).Msg("pgxscan: token syncer task failed")
return err
}
latestChainIdx, err := s.cicnetClient.EntryCount(ctx)
if err != nil {
log.Err(err).Msg("token syncer task failed")
log.Err(err).Msg("cicnet: token syncer task failed")
return err
}
lastCursorPos, err := strconv.ParseInt(lastCursor.cursorPos, 10, 64)
lastCursorPos, err := strconv.ParseInt(lastCursor.CursorPos, 10, 64)
if err != nil {
log.Err(err).Msg("token syncer task failed")
log.Err(err).Msg("parse: token syncer task failed")
return err
}