From 144d5018ea011d4d4b12479c66f2a5087e8fc2a7 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Thu, 16 Mar 2023 08:48:45 +0000 Subject: [PATCH] feat: add network account status (nonce, balance) --- cmd/service/api.go | 1 + internal/api/network.go | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 internal/api/network.go diff --git a/cmd/service/api.go b/cmd/service/api.go index a628507..679ca82 100644 --- a/cmd/service/api.go +++ b/cmd/service/api.go @@ -50,6 +50,7 @@ func initApiServer(custodialContainer *custodial.Custodial) *echo.Echo { apiRoute := server.Group("/api", systemGlobalLock) apiRoute.POST("/account/create", api.HandleAccountCreate) + apiRoute.GET("/account/status/:address", api.HandleNetworkAccountStatus) apiRoute.POST("/sign/transfer", api.HandleSignTransfer) apiRoute.GET("/track/:trackingId", api.HandleTrackTx) diff --git a/internal/api/network.go b/internal/api/network.go new file mode 100644 index 0000000..baeb597 --- /dev/null +++ b/internal/api/network.go @@ -0,0 +1,51 @@ +package api + +import ( + "fmt" + "math/big" + "net/http" + + "github.com/grassrootseconomics/cic-custodial/internal/custodial" + "github.com/grassrootseconomics/w3-celo-patch" + "github.com/grassrootseconomics/w3-celo-patch/module/eth" + "github.com/labstack/echo/v4" +) + +func HandleNetworkAccountStatus(c echo.Context) error { + var ( + cu = c.Get("cu").(*custodial.Custodial) + accountStatusRequest struct { + Address string `param:"address" validate:"required,eth_checksum"` + } + networkBalance big.Int + networkNonce uint64 + ) + + if err := c.Bind(&accountStatusRequest); err != nil { + return NewBadRequestError(ErrInvalidJSON) + } + + if err := c.Validate(accountStatusRequest); err != nil { + return err + } + + if err := cu.CeloProvider.Client.CallCtx( + c.Request().Context(), + eth.Nonce(w3.A(accountStatusRequest.Address), nil).Returns(&networkNonce), + eth.Balance(w3.A(accountStatusRequest.Address), nil).Returns(&networkBalance), + ); err != nil { + return err + } + + if networkNonce > 0 { + networkNonce-- + } + + return c.JSON(http.StatusOK, OkResp{ + Ok: true, + Result: H{ + "balance": fmt.Sprintf("%s CELO", w3.FromWei(&networkBalance, 18)), + "nonce": networkNonce, + }, + }) +}