Line data Source code
1 : #ifndef HEADER_fd_src_flamenco_runtime_program_fd_vote_program_h 2 : #define HEADER_fd_src_flamenco_runtime_program_fd_vote_program_h 3 : 4 : /* The vote program (native program) allows node operators to register 5 : their nodes and participate in consensus. The vote program 6 : implements various Tower BFT logic like voting and lockouts. The set 7 : of vote accounts is the 'source of truth' for Solana's consensus 8 : algorithm. 9 : 10 : Address: Vote111111111111111111111111111111111111111 */ 11 : 12 : #include "../context/fd_exec_instr_ctx.h" 13 : 14 : /* Vote program custom error codes */ 15 : 16 0 : #define FD_VOTE_ERROR_VOTE_TOO_OLD ( 0 ) 17 0 : #define FD_VOTE_ERR_SLOTS_MISMATCH ( 1 ) 18 0 : #define FD_VOTE_ERR_SLOTS_HASH_MISMATCH ( 2 ) 19 0 : #define FD_VOTE_ERR_EMPTY_SLOTS ( 3 ) 20 0 : #define FD_VOTE_ERR_TIMESTAMP_TOO_OLD ( 4 ) 21 0 : #define FD_VOTE_ERR_TOO_SOON_TO_REAUTHORIZE ( 5 ) 22 0 : #define FD_VOTE_ERR_LOCKOUT_CONFLICT ( 6 ) 23 0 : #define FD_VOTE_ERR_NEW_VOTE_STATE_LOCKOUT_MISMATCH ( 7 ) 24 0 : #define FD_VOTE_ERR_SLOTS_NOT_ORDERED ( 8 ) 25 0 : #define FD_VOTE_ERR_CONFIRMATIONS_NOT_ORDERED ( 9 ) 26 0 : #define FD_VOTE_ERR_ZERO_CONFIRMATIONS ( 10 ) 27 0 : #define FD_VOTE_ERR_CONFIRMATION_TOO_LARGE ( 11 ) 28 0 : #define FD_VOTE_ERR_ROOT_ROLL_BACK ( 12 ) 29 0 : #define FD_VOTE_ERR_CONFIRMATION_ROLL_BACK ( 13 ) 30 0 : #define FD_VOTE_ERR_SLOT_SMALLER_THAN_ROOT ( 14 ) 31 0 : #define FD_VOTE_ERR_TOO_MANY_VOTES ( 15 ) 32 0 : #define FD_VOTE_ERR_VOTES_TOO_OLD_ALL_FILTERED ( 16 ) 33 0 : #define FD_VOTE_ERR_ROOT_ON_DIFFERENT_FORK ( 17 ) 34 0 : #define FD_VOTE_ERR_ACTIVE_VOTE_ACCOUNT_CLOSE ( 18 ) 35 0 : #define FD_VOTE_ERR_COMMISSION_UPDATE_TOO_LATE ( 19 ) 36 : 37 0 : #define FD_VOTE_STATE_V2_SZ (3731UL) 38 24 : #define FD_VOTE_STATE_V3_SZ (3762UL) 39 : 40 : FD_PROTOTYPES_BEGIN 41 : 42 : /* fd_vote_program_execute is the instruction processing entrypoint 43 : for the vote program. On return, ctx.txn_ctx->dirty_vote_acc==1 if a 44 : vote account may have been modified. */ 45 : 46 : int 47 : fd_vote_program_execute( fd_exec_instr_ctx_t * ctx ); 48 : 49 : /* Queries the delegated stake amount for the given vote account pubkey, 50 : given the vote accounts map. Returns 0 if nonexistent. */ 51 : ulong 52 : fd_query_pubkey_stake( fd_pubkey_t const * pubkey, fd_vote_accounts_t const * vote_accounts ); 53 : 54 : /* An implementation of solana_sdk::transaction_context::BorrowedAccount::get_state 55 : for setting the vote state. 56 : 57 : https://github.com/anza-xyz/agave/blob/v2.1.14/sdk/src/transaction_context.rs#L965 */ 58 : int 59 : fd_vote_get_state( fd_txn_account_t const * self, 60 : fd_spad_t * spad, 61 : fd_vote_state_versioned_t * * versioned /* out */ ); 62 : 63 : void 64 : fd_vote_convert_to_current( fd_vote_state_versioned_t * self, 65 : fd_spad_t * spad ); 66 : 67 : void 68 : fd_vote_record_timestamp_vote_with_slot( fd_exec_slot_ctx_t * slot_ctx, 69 : fd_pubkey_t const * vote_acc, 70 : long timestamp, 71 : ulong slot ); 72 : 73 : struct fd_commission_split { 74 : ulong voter_portion; 75 : ulong staker_portion; 76 : uint is_split; 77 : }; 78 : typedef struct fd_commission_split fd_commission_split_t; 79 : 80 : void 81 : fd_vote_commission_split( fd_vote_state_versioned_t * vote_state_versioned, 82 : ulong on, 83 : fd_commission_split_t * result ); 84 : 85 : void 86 : fd_vote_store_account( fd_exec_slot_ctx_t * slot_ctx, 87 : fd_txn_account_t * vote_account ); 88 : 89 : FD_PROTOTYPES_END 90 : 91 : #endif /* HEADER_fd_src_flamenco_runtime_program_fd_vote_program_h */