Line data Source code
1 : #include "fd_vote_lockout.h" 2 : #include "../fd_vote_program.h" 3 : 4 : // https://github.com/anza-xyz/agave/blob/v2.0.1/sdk/program/src/vote/state/mod.rs#L104 5 : ulong 6 0 : fd_vote_lockout_get_lockout( fd_vote_lockout_t * self ) { 7 : /* Confirmation count can never be greater than MAX_LOCKOUT_HISTORY, preventing overflow. 8 : Although Agave does not consider overflow, we do for fuzzing conformance. */ 9 0 : ulong confirmation_count = fd_ulong_min( self->confirmation_count, MAX_LOCKOUT_HISTORY ); 10 0 : return 1UL<<confirmation_count; 11 0 : } 12 : 13 : // https://github.com/anza-xyz/agave/blob/v2.0.1/sdk/program/src/vote/state/mod.rs#L110 14 : ulong 15 0 : fd_vote_lockout_last_locked_out_slot( fd_vote_lockout_t * self ) { 16 0 : return fd_ulong_sat_add( self->slot, fd_vote_lockout_get_lockout( self ) ); 17 0 : } 18 : 19 : // https://github.com/anza-xyz/agave/blob/v2.0.1/sdk/program/src/vote/state/mod.rs#L114 20 : ulong 21 0 : fd_vote_lockout_is_locked_out_at_slot( fd_vote_lockout_t * self, ulong slot ) { 22 0 : return fd_vote_lockout_last_locked_out_slot( self ) >= slot; 23 0 : } 24 : 25 : // https://github.com/anza-xyz/agave/blob/v2.0.1/sdk/program/src/vote/state/mod.rs#L122 26 : void 27 0 : fd_vote_lockout_increase_confirmation_count( fd_vote_lockout_t * self, uint by ) { 28 0 : self->confirmation_count = fd_uint_sat_add( self->confirmation_count, by ); 29 0 : } 30 : 31 : fd_landed_vote_t * 32 : fd_vote_lockout_landed_votes_from_lockouts( fd_vote_lockout_t * lockouts, 33 0 : uchar * mem ) { 34 0 : if( !lockouts ) return NULL; 35 : 36 : /* Allocate MAX_LOCKOUT_HISTORY (sane case) by default. In case the 37 : vote account is corrupt, allocate as many entries are needed. */ 38 : 39 0 : ulong cnt = deq_fd_vote_lockout_t_cnt( lockouts ); 40 0 : cnt = fd_ulong_max( cnt, MAX_LOCKOUT_HISTORY ); 41 : 42 0 : fd_landed_vote_t * landed_votes = deq_fd_landed_vote_t_join( deq_fd_landed_vote_t_new( mem, cnt ) ); 43 0 : if( FD_UNLIKELY( !landed_votes ) ) { 44 0 : FD_LOG_CRIT(( "failed to join landed votes" )); 45 0 : } 46 : 47 0 : for( deq_fd_vote_lockout_t_iter_t iter = deq_fd_vote_lockout_t_iter_init( lockouts ); 48 0 : !deq_fd_vote_lockout_t_iter_done( lockouts, iter ); 49 0 : iter = deq_fd_vote_lockout_t_iter_next( lockouts, iter ) ) { 50 0 : fd_vote_lockout_t const * ele = deq_fd_vote_lockout_t_iter_ele_const( lockouts, iter ); 51 : 52 0 : fd_landed_vote_t * elem = deq_fd_landed_vote_t_push_tail_nocopy( landed_votes ); 53 0 : fd_landed_vote_new( elem ); 54 : 55 0 : elem->latency = 0; 56 0 : elem->lockout.slot = ele->slot; 57 0 : elem->lockout.confirmation_count = ele->confirmation_count; 58 0 : } 59 : 60 0 : return landed_votes; 61 0 : }