Skip to content

Commit

Permalink
add endpoints for total withdrawals & deposits (#232)
Browse files Browse the repository at this point in the history
  • Loading branch information
LuccaBitfly authored Apr 24, 2024
1 parent 038055a commit f36699f
Show file tree
Hide file tree
Showing 9 changed files with 187 additions and 50 deletions.
53 changes: 4 additions & 49 deletions backend/pkg/api/data_access/data_access.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"time"

"github.com/go-redis/redis/v8"
"github.com/gobitfly/beaconchain/pkg/api/enums"
"github.com/gobitfly/beaconchain/pkg/api/services"
t "github.com/gobitfly/beaconchain/pkg/api/types"
"github.com/gobitfly/beaconchain/pkg/commons/cache"
Expand All @@ -17,60 +16,16 @@ import (
"github.com/gobitfly/beaconchain/pkg/commons/utils"
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
"github.com/shopspring/decimal"
)

type DataAccessor interface {
GetUserInfo(email string) (*t.User, error)
GetValidatorDashboardInfo(dashboardId t.VDBIdPrimary) (*t.DashboardInfo, error)
GetValidatorDashboardInfoByPublicId(publicDashboardId t.VDBIdPublic) (*t.DashboardInfo, error)
ValidatorDashboardRepository

GetValidatorsFromSlices(indices []uint64, publicKeys []string) ([]t.VDBValidator, error)
CloseDataAccessService()

GetUserInfo(email string) (*t.User, error)
GetValidatorsFromSlices(indices []uint64, publicKeys []string) ([]t.VDBValidator, error)
GetUserDashboards(userId uint64) (*t.UserDashboardsData, error)

// TODO move dashboard functions to a new interface+file
CreateValidatorDashboard(userId uint64, name string, network uint64) (*t.VDBPostReturnData, error)
RemoveValidatorDashboard(dashboardId t.VDBIdPrimary) error

GetValidatorDashboardOverview(dashboardId t.VDBId) (*t.VDBOverviewData, error)

CreateValidatorDashboardGroup(dashboardId t.VDBIdPrimary, name string) (*t.VDBPostCreateGroupData, error)
UpdateValidatorDashboardGroup(dashboardId t.VDBIdPrimary, groupId uint64, name string) (*t.VDBPostCreateGroupData, error)
RemoveValidatorDashboardGroup(dashboardId t.VDBIdPrimary, groupId uint64) error

GetValidatorDashboardGroupExists(dashboardId t.VDBIdPrimary, groupId uint64) (bool, error)
AddValidatorDashboardValidators(dashboardId t.VDBIdPrimary, groupId int64, validators []t.VDBValidator) ([]t.VDBPostValidatorsData, error)
RemoveValidatorDashboardValidators(dashboardId t.VDBIdPrimary, validators []t.VDBValidator) error
GetValidatorDashboardValidators(dashboardId t.VDBId, groupId int64, cursor string, colSort t.Sort[enums.VDBManageValidatorsColumn], search string, limit uint64) ([]t.VDBManageValidatorsTableRow, *t.Paging, error)

CreateValidatorDashboardPublicId(dashboardId t.VDBIdPrimary, name string, showGroupNames bool) (*t.VDBPostPublicIdData, error)
UpdateValidatorDashboardPublicId(publicDashboardId t.VDBIdPublic, name string, showGroupNames bool) (*t.VDBPostPublicIdData, error)
RemoveValidatorDashboardPublicId(publicDashboardId t.VDBIdPublic) error

GetValidatorDashboardSlotViz(dashboardId t.VDBId) ([]t.SlotVizEpoch, error)

GetValidatorDashboardSummary(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBSummaryColumn], search string, limit uint64) ([]t.VDBSummaryTableRow, *t.Paging, error)
GetValidatorDashboardGroupSummary(dashboardId t.VDBId, groupId int64) (*t.VDBGroupSummaryData, error)
GetValidatorDashboardSummaryChart(dashboardId t.VDBId) (*t.ChartData[int, float64], error)
GetValidatorDashboardValidatorIndices(dashboardId t.VDBId, groupId int64, duty enums.ValidatorDuty, period enums.TimePeriod) ([]uint64, error)

GetValidatorDashboardRewards(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBRewardsColumn], search string, limit uint64) ([]t.VDBRewardsTableRow, *t.Paging, error)
GetValidatorDashboardGroupRewards(dashboardId t.VDBId, groupId int64, epoch uint64) (*t.VDBGroupRewardsData, error)
GetValidatorDashboardRewardsChart(dashboardId t.VDBId) (*t.ChartData[int, decimal.Decimal], error)

GetValidatorDashboardDuties(dashboardId t.VDBId, epoch uint64, groupId int64, cursor string, colSort t.Sort[enums.VDBDutiesColumn], search string, limit uint64) ([]t.VDBEpochDutiesTableRow, *t.Paging, error)

GetValidatorDashboardBlocks(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBBlocksColumn], search string, limit uint64) ([]t.VDBBlocksTableRow, *t.Paging, error)

GetValidatorDashboardHeatmap(dashboardId t.VDBId) (*t.VDBHeatmap, error)
GetValidatorDashboardGroupHeatmap(dashboardId t.VDBId, groupId uint64, epoch uint64) (*t.VDBHeatmapTooltipData, error)

GetValidatorDashboardElDeposits(dashboardId t.VDBId, cursor string, search string, limit uint64) ([]t.VDBExecutionDepositsTableRow, *t.Paging, error)
GetValidatorDashboardClDeposits(dashboardId t.VDBId, cursor string, search string, limit uint64) ([]t.VDBConsensusDepositsTableRow, *t.Paging, error)
GetValidatorDashboardWithdrawals(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBWithdrawalsColumn], search string, limit uint64) ([]t.VDBWithdrawalsTableRow, *t.Paging, error)

CloseDataAccessService()
}

type DataAccessService struct {
Expand Down
18 changes: 18 additions & 0 deletions backend/pkg/api/data_access/dummy.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,10 +226,28 @@ func (d *DummyService) GetValidatorDashboardClDeposits(dashboardId t.VDBId, curs
return r, &p, err
}

func (d *DummyService) GetValidatorDashboardTotalElDeposits(dashboardId t.VDBId) (*t.VDBTotalExecutionDepositsData, error) {
r := t.VDBTotalExecutionDepositsData{}
err := commonFakeData(&r)
return &r, err
}

func (d *DummyService) GetValidatorDashboardTotalClDeposits(dashboardId t.VDBId) (*t.VDBTotalConsensusDepositsData, error) {
r := t.VDBTotalConsensusDepositsData{}
err := commonFakeData(&r)
return &r, err
}

func (d *DummyService) GetValidatorDashboardWithdrawals(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBWithdrawalsColumn], search string, limit uint64) ([]t.VDBWithdrawalsTableRow, *t.Paging, error) {
r := []t.VDBWithdrawalsTableRow{}
p := t.Paging{}
_ = commonFakeData(&r)
err := commonFakeData(&p)
return r, &p, err
}

func (d *DummyService) GetValidatorDashboardTotalWithdrawals(dashboardId t.VDBId) (*t.VDBTotalWithdrawalsData, error) {
r := t.VDBTotalWithdrawalsData{}
err := commonFakeData(&r)
return &r, err
}
10 changes: 10 additions & 0 deletions backend/pkg/api/data_access/vdb_deposits.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,3 +334,13 @@ func (d *DataAccessService) GetValidatorDashboardClDeposits(dashboardId t.VDBId,

return responseData, p, nil
}

func (d *DataAccessService) GetValidatorDashboardTotalElDeposits(dashboardId t.VDBId) (*t.VDBTotalExecutionDepositsData, error) {
// TODO @ data access team
return d.dummy.GetValidatorDashboardTotalElDeposits(dashboardId)
}

func (d *DataAccessService) GetValidatorDashboardTotalClDeposits(dashboardId t.VDBId) (*t.VDBTotalConsensusDepositsData, error) {
// TODO @ data access team
return d.dummy.GetValidatorDashboardTotalClDeposits(dashboardId)
}
50 changes: 50 additions & 0 deletions backend/pkg/api/data_access/vdb_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,59 @@ package dataaccess
import (
"database/sql"

"github.com/gobitfly/beaconchain/pkg/api/enums"
t "github.com/gobitfly/beaconchain/pkg/api/types"
"github.com/shopspring/decimal"
)

type ValidatorDashboardRepository interface {
GetValidatorDashboardInfo(dashboardId t.VDBIdPrimary) (*t.DashboardInfo, error)
GetValidatorDashboardInfoByPublicId(publicDashboardId t.VDBIdPublic) (*t.DashboardInfo, error)
CreateValidatorDashboard(userId uint64, name string, network uint64) (*t.VDBPostReturnData, error)
RemoveValidatorDashboard(dashboardId t.VDBIdPrimary) error

GetValidatorDashboardOverview(dashboardId t.VDBId) (*t.VDBOverviewData, error)

CreateValidatorDashboardGroup(dashboardId t.VDBIdPrimary, name string) (*t.VDBPostCreateGroupData, error)
UpdateValidatorDashboardGroup(dashboardId t.VDBIdPrimary, groupId uint64, name string) (*t.VDBPostCreateGroupData, error)
RemoveValidatorDashboardGroup(dashboardId t.VDBIdPrimary, groupId uint64) error

GetValidatorDashboardGroupExists(dashboardId t.VDBIdPrimary, groupId uint64) (bool, error)
AddValidatorDashboardValidators(dashboardId t.VDBIdPrimary, groupId int64, validators []t.VDBValidator) ([]t.VDBPostValidatorsData, error)
RemoveValidatorDashboardValidators(dashboardId t.VDBIdPrimary, validators []t.VDBValidator) error
GetValidatorDashboardValidators(dashboardId t.VDBId, groupId int64, cursor string, colSort t.Sort[enums.VDBManageValidatorsColumn], search string, limit uint64) ([]t.VDBManageValidatorsTableRow, *t.Paging, error)

CreateValidatorDashboardPublicId(dashboardId t.VDBIdPrimary, name string, showGroupNames bool) (*t.VDBPostPublicIdData, error)
UpdateValidatorDashboardPublicId(publicDashboardId t.VDBIdPublic, name string, showGroupNames bool) (*t.VDBPostPublicIdData, error)
RemoveValidatorDashboardPublicId(publicDashboardId t.VDBIdPublic) error

GetValidatorDashboardSlotViz(dashboardId t.VDBId) ([]t.SlotVizEpoch, error)

GetValidatorDashboardSummary(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBSummaryColumn], search string, limit uint64) ([]t.VDBSummaryTableRow, *t.Paging, error)
GetValidatorDashboardGroupSummary(dashboardId t.VDBId, groupId int64) (*t.VDBGroupSummaryData, error)
GetValidatorDashboardSummaryChart(dashboardId t.VDBId) (*t.ChartData[int, float64], error)
GetValidatorDashboardValidatorIndices(dashboardId t.VDBId, groupId int64, duty enums.ValidatorDuty, period enums.TimePeriod) ([]uint64, error)

GetValidatorDashboardRewards(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBRewardsColumn], search string, limit uint64) ([]t.VDBRewardsTableRow, *t.Paging, error)
GetValidatorDashboardGroupRewards(dashboardId t.VDBId, groupId int64, epoch uint64) (*t.VDBGroupRewardsData, error)
GetValidatorDashboardRewardsChart(dashboardId t.VDBId) (*t.ChartData[int, decimal.Decimal], error)

GetValidatorDashboardDuties(dashboardId t.VDBId, epoch uint64, groupId int64, cursor string, colSort t.Sort[enums.VDBDutiesColumn], search string, limit uint64) ([]t.VDBEpochDutiesTableRow, *t.Paging, error)

GetValidatorDashboardBlocks(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBBlocksColumn], search string, limit uint64) ([]t.VDBBlocksTableRow, *t.Paging, error)

GetValidatorDashboardHeatmap(dashboardId t.VDBId) (*t.VDBHeatmap, error)
GetValidatorDashboardGroupHeatmap(dashboardId t.VDBId, groupId uint64, epoch uint64) (*t.VDBHeatmapTooltipData, error)

GetValidatorDashboardElDeposits(dashboardId t.VDBId, cursor string, search string, limit uint64) ([]t.VDBExecutionDepositsTableRow, *t.Paging, error)
GetValidatorDashboardClDeposits(dashboardId t.VDBId, cursor string, search string, limit uint64) ([]t.VDBConsensusDepositsTableRow, *t.Paging, error)
GetValidatorDashboardTotalElDeposits(dashboardId t.VDBId) (*t.VDBTotalExecutionDepositsData, error)
GetValidatorDashboardTotalClDeposits(dashboardId t.VDBId) (*t.VDBTotalConsensusDepositsData, error)

GetValidatorDashboardWithdrawals(dashboardId t.VDBId, cursor string, colSort t.Sort[enums.VDBWithdrawalsColumn], search string, limit uint64) ([]t.VDBWithdrawalsTableRow, *t.Paging, error)
GetValidatorDashboardTotalWithdrawals(dashboardId t.VDBId) (*t.VDBTotalWithdrawalsData, error)
}

//////////////////// Helper functions (must be used by more than one VDB endpoint!)

func (d DataAccessService) getDashboardValidators(dashboardId t.VDBId) ([]uint32, error) {
Expand Down
5 changes: 5 additions & 0 deletions backend/pkg/api/data_access/vdb_withdrawals.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,3 +275,8 @@ func (d *DataAccessService) GetValidatorDashboardWithdrawals(dashboardId t.VDBId

return result, p, nil
}

func (d *DataAccessService) GetValidatorDashboardTotalWithdrawals(dashboardId t.VDBId) (*t.VDBTotalWithdrawalsData, error) {
// TODO @ data access team
return d.dummy.GetValidatorDashboardTotalWithdrawals(dashboardId)
}
57 changes: 57 additions & 0 deletions backend/pkg/api/handlers/internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,44 @@ func (h *HandlerService) InternalGetValidatorDashboardConsensusLayerDeposits(w h
returnOk(w, response)
}

func (h *HandlerService) InternalGetValidatorDashboardTotalConsensusDeposits(w http.ResponseWriter, r *http.Request) {
var err error
dashboardId, err := h.handleDashboardId(mux.Vars(r)["dashboard_id"])
if err != nil {
handleError(w, err)
return
}
data, err := h.dai.GetValidatorDashboardTotalClDeposits(*dashboardId)
if err != nil {
handleError(w, err)
return
}

response := types.InternalGetValidatorDashboardTotalConsensusDepositsResponse{
Data: *data,
}
returnOk(w, response)
}

func (h *HandlerService) InternalGetValidatorDashboardTotalExecutionDeposits(w http.ResponseWriter, r *http.Request) {
var err error
dashboardId, err := h.handleDashboardId(mux.Vars(r)["dashboard_id"])
if err != nil {
handleError(w, err)
return
}
data, err := h.dai.GetValidatorDashboardTotalElDeposits(*dashboardId)
if err != nil {
handleError(w, err)
return
}

response := types.InternalGetValidatorDashboardTotalExecutionDepositsResponse{
Data: *data,
}
returnOk(w, response)
}

func (h *HandlerService) InternalGetValidatorDashboardWithdrawals(w http.ResponseWriter, r *http.Request) {
var err error
q := r.URL.Query()
Expand All @@ -853,3 +891,22 @@ func (h *HandlerService) InternalGetValidatorDashboardWithdrawals(w http.Respons
}
returnOk(w, response)
}

func (h *HandlerService) InternalGetValidatorDashboardTotalWithdrawals(w http.ResponseWriter, r *http.Request) {
var err error
dashboardId, err := h.handleDashboardId(mux.Vars(r)["dashboard_id"])
if err != nil {
handleError(w, err)
return
}
data, err := h.dai.GetValidatorDashboardTotalWithdrawals(*dashboardId)
if err != nil {
handleError(w, err)
return
}

response := types.InternalGetValidatorDashboardTotalWithdrawalsResponse{
Data: *data,
}
returnOk(w, response)
}
3 changes: 3 additions & 0 deletions backend/pkg/api/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,10 @@ func addValidatorDashboardRoutes(hs *handlers.HandlerService, publicRouter, inte
{http.MethodGet, "/{dashboard_id}/groups/{group_id}/heatmap", hs.PublicGetValidatorDashboardGroupHeatmap, hs.InternalGetValidatorDashboardGroupHeatmap},
{http.MethodGet, "/{dashboard_id}/execution-layer-deposits", hs.PublicGetValidatorDashboardExecutionLayerDeposits, hs.InternalGetValidatorDashboardExecutionLayerDeposits},
{http.MethodGet, "/{dashboard_id}/consensus-layer-deposits", hs.PublicGetValidatorDashboardConsensusLayerDeposits, hs.InternalGetValidatorDashboardConsensusLayerDeposits},
{http.MethodGet, "/{dashboard_id}/total-execution-deposits", nil, hs.InternalGetValidatorDashboardTotalExecutionDeposits},
{http.MethodGet, "/{dashboard_id}/total-consensus-deposits", nil, hs.InternalGetValidatorDashboardTotalConsensusDeposits},
{http.MethodGet, "/{dashboard_id}/withdrawals", hs.PublicGetValidatorDashboardWithdrawals, hs.InternalGetValidatorDashboardWithdrawals},
{http.MethodGet, "/{dashboard_id}/total-withdrawals", nil, hs.InternalGetValidatorDashboardTotalWithdrawals},
}
addEndpointsToRouters(endpoints, publicDashboardRouter, internalDashboardRouter)
}
Expand Down
18 changes: 18 additions & 0 deletions backend/pkg/api/types/validator_dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,18 @@ type VDBConsensusDepositsTableRow struct {
}
type InternalGetValidatorDashboardConsensusLayerDepositsResponse ApiPagingResponse[VDBConsensusDepositsTableRow]

type VDBTotalExecutionDepositsData struct {
TotalAmount decimal.Decimal `json:"total_amount"`
}

type InternalGetValidatorDashboardTotalExecutionDepositsResponse ApiDataResponse[VDBTotalExecutionDepositsData]

type VDBTotalConsensusDepositsData struct {
TotalAmount decimal.Decimal `json:"total_amount"`
}

type InternalGetValidatorDashboardTotalConsensusDepositsResponse ApiDataResponse[VDBTotalConsensusDepositsData]

// ------------------------------------------------------------
// Withdrawals Tab
type VDBWithdrawalsTableRow struct {
Expand All @@ -221,6 +233,12 @@ type VDBWithdrawalsTableRow struct {
}
type InternalGetValidatorDashboardWithdrawalsResponse ApiPagingResponse[VDBWithdrawalsTableRow]

type VDBTotalWithdrawalsData struct {
TotalAmount decimal.Decimal `json:"total_amount"`
}

type InternalGetValidatorDashboardTotalWithdrawalsResponse ApiDataResponse[VDBTotalWithdrawalsData]

// ------------------------------------------------------------
// Manage Modal
type VDBManageValidatorsTableRow struct {
Expand Down
23 changes: 22 additions & 1 deletion frontend/types/api/validator_dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,18 @@ export interface VDBHeatmapCell {
y: number /* uint64 */; // Group ID
value: number /* float64 */; // Attestaton Rewards
}
export interface VDBHeatmapEvent {
x: number /* uint64 */; // Epoch
y: number /* uint64 */; // Group ID
proposal: boolean;
slash: boolean;
sync: boolean;
}
export interface VDBHeatmap {
epochs: number /* uint64 */[]; // X-Axis Categories
group_ids: number /* uint64 */[]; // Y-Axis Categories
data: VDBHeatmapCell[];
events: VDBHeatmapEvent[];
}
export type InternalGetValidatorDashboardHeatmapResponse = ApiDataResponse<VDBHeatmap>;
export interface VDBHeatmapTooltipDuty {
Expand All @@ -145,12 +153,13 @@ export interface VDBHeatmapTooltipDuty {
export interface VDBHeatmapTooltipData {
epoch: number /* uint64 */;
proposers: VDBHeatmapTooltipDuty[];
syncs: VDBHeatmapTooltipDuty[];
syncs: number /* uint64 */[];
slashings: VDBHeatmapTooltipDuty[];
attestations_head: StatusCount;
attestations_source: StatusCount;
attestations_target: StatusCount;
attestation_income: string /* decimal.Decimal */;
attestation_efficiency: number /* float64 */;
}
export type InternalGetValidatorDashboardGroupHeatmapResponse = ApiDataResponse<VDBHeatmapTooltipData>;
/**
Expand Down Expand Up @@ -182,6 +191,14 @@ export interface VDBConsensusDepositsTableRow {
signature: Hash;
}
export type InternalGetValidatorDashboardConsensusLayerDepositsResponse = ApiPagingResponse<VDBConsensusDepositsTableRow>;
export interface VDBTotalExecutionDepositsData {
total_amount: string /* decimal.Decimal */;
}
export type InternalGetValidatorDashboardTotalExecutionDepositsResponse = ApiDataResponse<VDBTotalExecutionDepositsData>;
export interface VDBTotalConsensusDepositsData {
total_amount: string /* decimal.Decimal */;
}
export type InternalGetValidatorDashboardTotalConsensusDepositsResponse = ApiDataResponse<VDBTotalConsensusDepositsData>;
/**
* ------------------------------------------------------------
* Withdrawals Tab
Expand All @@ -195,6 +212,10 @@ export interface VDBWithdrawalsTableRow {
amount: string /* decimal.Decimal */;
}
export type InternalGetValidatorDashboardWithdrawalsResponse = ApiPagingResponse<VDBWithdrawalsTableRow>;
export interface VDBTotalWithdrawalsData {
total_amount: string /* decimal.Decimal */;
}
export type InternalGetValidatorDashboardTotalWithdrawalsResponse = ApiDataResponse<VDBTotalWithdrawalsData>;
/**
* ------------------------------------------------------------
* Manage Modal
Expand Down

0 comments on commit f36699f

Please sign in to comment.