Skip to content

Commit c6057fa

Browse files
committed
fix(statistics): consider deposit-requests when calculating validator-stats
1 parent 48781bc commit c6057fa

File tree

1 file changed

+89
-34
lines changed

1 file changed

+89
-34
lines changed

backend/pkg/commons/db/statistics.go

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -831,54 +831,109 @@ func gatherValidatorDepositWithdrawals(day uint64, data []*types.ValidatorStatsT
831831
DepositsAmount uint64 `db:"deposits_amount"`
832832
}
833833
resDeposits := make([]*resRowDeposits, 0, 1024)
834+
// In this query we are collecting all deposits per validator and sum them up. We need to consider that all deposits after the first valid deposits are valid. Note that there are currently only valid requests in the deposit_requests table.
834835
depositsQry := `
835-
with first_valid_deposits as (
836-
select
837-
distinct on (publickey)
836+
with
837+
first_valid_deposits as (
838+
select distinct on (publickey)
838839
publickey,
839840
block_slot,
840841
block_index
841842
from
842843
blocks_deposits
843844
where
844845
valid_signature
845-
and publickey in ( -- doesnt need to be 100% accurate, we only filter for performance reasons
846-
select
847-
publickey
848-
from
849-
blocks_deposits
850-
where
851-
blocks_deposits.block_slot >= $1
852-
and blocks_deposits.block_slot <= $2
853-
)
846+
and publickey in (select bd.publickey from blocks_deposits bd where bd.valid_signature and bd.block_slot >= $1 and bd.block_slot <= $2)
854847
order by
855848
publickey,
856849
block_slot,
857850
block_index
851+
),
852+
first_valid_deposit_requests as (
853+
select
854+
distinct on (pubkey)
855+
pubkey,
856+
block_slot,
857+
request_index
858+
from
859+
blocks_deposit_requests
860+
where
861+
pubkey in (select bdr.pubkey from blocks_deposit_requests bdr where bdr.block_slot >= $1 and bdr.block_slot <= $2)
862+
order by
863+
pubkey,
864+
block_slot,
865+
request_index
866+
),
867+
deposits as (
868+
select
869+
validators.validatorindex,
870+
count(*) as deposits,
871+
sum(amount) as deposits_amount
872+
from
873+
blocks_deposits
874+
inner join validators on
875+
blocks_deposits.publickey = validators.pubkey
876+
inner join blocks on
877+
blocks_deposits.block_root = blocks.blockroot
878+
inner join first_valid_deposits on
879+
blocks_deposits.publickey = first_valid_deposits.publickey
880+
where
881+
blocks_deposits.valid_signature
882+
and blocks.slot >= $1
883+
and blocks.slot <= $2
884+
and (blocks.status = '1'
885+
or blocks.slot = 0)
886+
and (blocks_deposits.block_slot > first_valid_deposits.block_slot -- any slot after the first valid deposit
887+
or (blocks_deposits.block_slot = first_valid_deposits.block_slot -- or the same slot but a equal or higher block-index
888+
and blocks_deposits.block_index >= first_valid_deposits.block_index)
889+
)
890+
group by
891+
validators.validatorindex
892+
),
893+
deposit_requests as (
894+
select
895+
validators.validatorindex,
896+
count(*) as deposits,
897+
sum(amount) as deposits_amount
898+
from
899+
blocks_deposit_requests bdr
900+
inner join validators on
901+
bdr.pubkey = validators.pubkey
902+
inner join blocks on
903+
bdr.block_root = blocks.blockroot
904+
left join first_valid_deposits on
905+
bdr.pubkey = first_valid_deposits.publickey
906+
left join first_valid_deposit_requests on
907+
bdr.pubkey = first_valid_deposit_requests.pubkey
908+
where
909+
blocks.slot >= $1
910+
and blocks.slot <= $2
911+
and (blocks.status = '1'
912+
or blocks.slot = 0)
913+
and (
914+
(first_valid_deposits.block_slot is not null
915+
and bdr.block_slot > first_valid_deposits.block_slot) -- any slot after the first valid deposit
916+
or (first_valid_deposit_requests.block_slot is not null
917+
and (bdr.block_slot > first_valid_deposit_requests.block_slot -- or any slot after the first valid deposit request
918+
or (bdr.block_slot = first_valid_deposit_requests.block_slot -- or the same slot but a equal or higher index
919+
and bdr.request_index >= first_valid_deposit_requests.request_index)
920+
)
921+
)
922+
)
923+
group by
924+
validators.validatorindex
858925
)
859926
select
860-
validators.validatorindex,
861-
count(*) as deposits,
862-
sum(amount) as deposits_amount
863-
from
864-
blocks_deposits
865-
inner join validators on
866-
blocks_deposits.publickey = validators.pubkey
867-
inner join blocks on
868-
blocks_deposits.block_root = blocks.blockroot
869-
inner join first_valid_deposits on
870-
blocks_deposits.publickey = first_valid_deposits.publickey
871-
where
872-
blocks.slot >= $1
873-
and blocks.slot <= $2
874-
and (blocks.status = '1'
875-
or blocks.slot = 0)
876-
and (blocks_deposits.block_slot > first_valid_deposits.block_slot -- any slot after the valid deposit
877-
or (blocks_deposits.block_slot = first_valid_deposits.block_slot -- or the same slot but a higher index
878-
and blocks_deposits.block_index >= first_valid_deposits.block_index)
879-
)
880-
group by
881-
validators.validatorindex;`
927+
validatorindex,
928+
sum(deposits) as deposits,
929+
sum(deposits_amount) as deposits_amount
930+
from (
931+
select validatorindex, deposits, deposits_amount from deposits
932+
union all
933+
select validatorindex, deposits, deposits_amount from deposit_requests
934+
) a
935+
group by validatorindex
936+
;`
882937

883938
err := WriterDb.Select(&resDeposits, depositsQry, firstSlot, lastSlot)
884939
if err != nil {

0 commit comments

Comments
 (0)