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