diff --git a/contrib/test/test-vectors-commit-sha.txt b/contrib/test/test-vectors-commit-sha.txt index c372c92256a..59bc5540e9f 100644 --- a/contrib/test/test-vectors-commit-sha.txt +++ b/contrib/test/test-vectors-commit-sha.txt @@ -1 +1 @@ -c2f0bc1d4153f8f962a808f27e36a048adbdaeff +8c92099402fbf0d97538969d247b5bc5f457f3f1 diff --git a/src/flamenco/runtime/context/fd_exec_instr_ctx.c b/src/flamenco/runtime/context/fd_exec_instr_ctx.c index e3232a11bd5..55225e14194 100644 --- a/src/flamenco/runtime/context/fd_exec_instr_ctx.c +++ b/src/flamenco/runtime/context/fd_exec_instr_ctx.c @@ -127,7 +127,7 @@ fd_exec_instr_ctx_get_signers( fd_exec_instr_ctx_t const * ctx, fd_pubkey_t const * signers[static FD_TXN_SIG_MAX] ) { ulong j = 0UL; for( ushort i=0; iinstr->acct_cnt && jinstr, i ) ) { + if( fd_instr_acc_is_signer_idx( ctx->instr, i, NULL ) ) { ushort idx_in_txn = ctx->instr->accounts[i].index_in_transaction; int err = fd_exec_txn_ctx_get_key_of_account_at_index( ctx->txn_ctx, idx_in_txn, @@ -146,7 +146,7 @@ fd_exec_instr_ctx_any_signed( fd_exec_instr_ctx_t const * ctx, for( ushort j=0; jinstr->acct_cnt; j++ ) { ushort idx_in_txn = ctx->instr->accounts[ j ].index_in_transaction; is_signer |= - ( ( !!fd_instr_acc_is_signer_idx( ctx->instr, j ) ) & + ( ( !!fd_instr_acc_is_signer_idx( ctx->instr, j, NULL ) ) & ( 0==memcmp( pubkey->key, ctx->txn_ctx->account_keys[ idx_in_txn ].key, sizeof(fd_pubkey_t) ) ) ); } return is_signer; diff --git a/src/flamenco/runtime/fd_borrowed_account.h b/src/flamenco/runtime/fd_borrowed_account.h index 7605c3503a4..244c9d5b0a3 100644 --- a/src/flamenco/runtime/fd_borrowed_account.h +++ b/src/flamenco/runtime/fd_borrowed_account.h @@ -318,7 +318,7 @@ fd_borrowed_account_is_signer( fd_borrowed_account_t const * borrowed_acct ) { return 0; } - return fd_instr_acc_is_signer_idx( instr, borrowed_acct->index_in_instruction ); + return fd_instr_acc_is_signer_idx( instr, borrowed_acct->index_in_instruction, NULL ); } /* fd_borrowed_account_is_writer mirrors the Agave function diff --git a/src/flamenco/runtime/info/fd_instr_info.h b/src/flamenco/runtime/info/fd_instr_info.h index 7339311aed5..8a1d05208da 100644 --- a/src/flamenco/runtime/info/fd_instr_info.h +++ b/src/flamenco/runtime/info/fd_instr_info.h @@ -109,23 +109,38 @@ fd_instr_info_init_from_txn_instr( fd_instr_info_t * instr, fd_exec_txn_ctx_t * txn_ctx, fd_txn_instr_t const * txn_instr ); +/* https://github.com/anza-xyz/solana-sdk/blob/589e6237f203c2719c300dc044f4e00f48e66a8f/message/src/versions/v0/loaded.rs#L152-L157 */ FD_FN_PURE static inline int fd_instr_acc_is_writable_idx( fd_instr_info_t const * instr, ushort idx ) { if( FD_UNLIKELY( idx>=instr->acct_cnt ) ) { - return FD_EXECUTOR_INSTR_ERR_MISSING_ACC; + return 0; } return !!(instr->accounts[idx].is_writable); } +/* fd_instr_acc_is_signer_idx returns: + - 1 if account is signer + - 0 (with *out_opt_err==0) if account is not signer + If an error occurs during query, returns 0 and writes the + error code to *out_opt_err. Possible values for out_opt_err: + - FD_EXECUTOR_INSTR_ERR_MISSING_ACC occurs when the instr account + index provided is invalid (out of bounds). + - 0 if the query was successful. Check the return value to see + if the account is a signer. + + https://github.com/firedancer-io/agave/blob/9e6bb8209d012e819e55ad90949dec17bc150fca/transaction-context/src/lib.rs#L782-L791 */ FD_FN_PURE static inline int fd_instr_acc_is_signer_idx( fd_instr_info_t const * instr, - ushort idx ) { + ushort idx, + int * out_opt_err ) { if( FD_UNLIKELY( idx>=instr->acct_cnt ) ) { - return FD_EXECUTOR_INSTR_ERR_MISSING_ACC; + if( out_opt_err ) *out_opt_err = FD_EXECUTOR_INSTR_ERR_MISSING_ACC; + return 0; } + if( out_opt_err ) *out_opt_err = 0; return !!(instr->accounts[idx].is_signer); } diff --git a/src/flamenco/runtime/program/fd_address_lookup_table_program.c b/src/flamenco/runtime/program/fd_address_lookup_table_program.c index 1c89e7e5559..d9485d447c4 100644 --- a/src/flamenco/runtime/program/fd_address_lookup_table_program.c +++ b/src/flamenco/runtime/program/fd_address_lookup_table_program.c @@ -225,7 +225,7 @@ create_lookup_table( fd_exec_instr_ctx_t * ctx, /* https://github.com/solana-labs/solana/blob/v1.17.4/programs/address-lookup-table/src/processor.rs#L76-L83 */ if( !FD_FEATURE_ACTIVE_BANK( ctx->txn_ctx->bank, relax_authority_signer_check_for_lookup_table_creation ) - && !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY ) ) { + && !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY, NULL ) ) { fd_log_collector_msg_literal( ctx, "Authority account must be a signer" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -242,7 +242,7 @@ create_lookup_table( fd_exec_instr_ctx_t * ctx, payer_key = payer_acct.acct->pubkey; /* https://github.com/solana-labs/solana/blob/v1.17.4/programs/address-lookup-table/src/processor.rs#L89-L92 */ - if( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_PAYER ) ) { + if( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_PAYER, NULL ) ) { fd_log_collector_msg_literal( ctx, "Payer account must be a signer" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -491,7 +491,7 @@ freeze_lookup_table( fd_exec_instr_ctx_t * ctx ) { authority_key = authority_acct.acct->pubkey; /* https://github.com/solana-labs/solana/blob/v1.17.4/programs/address-lookup-table/src/processor.rs#L186-L189 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY, NULL ) ) ) { fd_log_collector_msg_literal( ctx, "Authority account must be a signer" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -599,7 +599,7 @@ extend_lookup_table( fd_exec_instr_ctx_t * ctx, authority_key = authority_acct.acct->pubkey; /* https://github.com/solana-labs/solana/blob/v1.17.4/programs/address-lookup-table/src/processor.rs#L241-L244 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY, NULL ) ) ) { fd_log_collector_msg_literal( ctx, "Authority account must be a signer" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -728,7 +728,7 @@ extend_lookup_table( fd_exec_instr_ctx_t * ctx, payer_key = payer_acct.acct->pubkey; /* https://github.com/solana-labs/solana/blob/v1.17.4/programs/address-lookup-table/src/processor.rs#L327-L330 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_PAYER ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_PAYER, NULL ) ) ) { fd_log_collector_msg_literal( ctx, "Payer account must be a signer" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -823,7 +823,7 @@ deactivate_lookup_table( fd_exec_instr_ctx_t * ctx ) { authority_key = authority_acct.acct->pubkey; /* https://github.com/solana-labs/solana/blob/v1.17.4/programs/address-lookup-table/src/processor.rs#L356-L359 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY, NULL ) ) ) { fd_log_collector_msg_literal( ctx, "Authority account must be a signer" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -931,7 +931,7 @@ close_lookup_table( fd_exec_instr_ctx_t * ctx ) { authority_key = authority_acct.acct->pubkey; /* https://github.com/solana-labs/solana/blob/v1.17.4/programs/address-lookup-table/src/processor.rs#L405-L408 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_AUTHORITY, NULL ) ) ) { fd_log_collector_msg_literal( ctx, "Authority account must be a signer" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } diff --git a/src/flamenco/runtime/program/fd_bpf_loader_program.c b/src/flamenco/runtime/program/fd_bpf_loader_program.c index 6af66b42365..223723fa231 100644 --- a/src/flamenco/runtime/program/fd_bpf_loader_program.c +++ b/src/flamenco/runtime/program/fd_bpf_loader_program.c @@ -355,7 +355,9 @@ common_close_account( fd_pubkey_t * authority_address, } /* https://github.com/anza-xyz/agave/blob/v2.1.14/programs/bpf_loader/src/lib.rs#L1319-L1322 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -757,7 +759,9 @@ common_extend_program( fd_exec_instr_ctx_t * instr_ctx, } /* https://github.com/anza-xyz/agave/blob/v2.3.1/programs/bpf_loader/src/lib.rs#L1468-L1471 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, AUTHORITY_ACCOUNT_INDEX ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, AUTHORITY_ACCOUNT_INDEX, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Upgrade authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -997,7 +1001,9 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Incorrect buffer authority provided" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Buffer authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -1129,7 +1135,9 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Buffer and upgrade authority don't match" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 7UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 7UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Upgrade authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -1458,7 +1466,9 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Buffer and upgrade authority don't match" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 6UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 6UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Upgrade authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -1524,7 +1534,9 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Incorrect upgrade authority provided" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 6UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 6UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Upgrade authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -1684,7 +1696,9 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Incorrect buffer authority provided" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Buffer authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -1709,7 +1723,9 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Incorrect upgrade authority provided" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Upgrade authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -1780,11 +1796,17 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Incorrect buffer authority provided" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL ) ) ) { + int instr_err_code = 0; + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL, &instr_err_code ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!instr_err_code ) ) return instr_err_code; fd_log_collector_msg_literal( instr_ctx, "Buffer authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL ) ) ) { + instr_err_code = 0; + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL, &instr_err_code ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!instr_err_code ) ) return instr_err_code; fd_log_collector_msg_literal( instr_ctx, "New authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -1803,11 +1825,17 @@ process_loader_upgradeable_instruction( fd_exec_instr_ctx_t * instr_ctx ) { fd_log_collector_msg_literal( instr_ctx, "Incorrect upgrade authority provided" ); return FD_EXECUTOR_INSTR_ERR_INCORRECT_AUTHORITY; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL ) ) ) { + int instr_err_code = 0; + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL, &instr_err_code ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!instr_err_code ) ) return instr_err_code; fd_log_collector_msg_literal( instr_ctx, "Upgrade authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL ) ) ) { + instr_err_code = 0; + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL, &instr_err_code ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!instr_err_code ) ) return instr_err_code; fd_log_collector_msg_literal( instr_ctx, "New authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } diff --git a/src/flamenco/runtime/program/fd_bpf_loader_serialization.c b/src/flamenco/runtime/program/fd_bpf_loader_serialization.c index 42eac521bf4..bb7d939de65 100644 --- a/src/flamenco/runtime/program/fd_bpf_loader_serialization.c +++ b/src/flamenco/runtime/program/fd_bpf_loader_serialization.c @@ -249,7 +249,7 @@ fd_bpf_loader_input_serialize_aligned( fd_exec_instr_ctx_t * ctx, /* https://github.com/anza-xyz/agave/blob/b5f5c3cdd3f9a5859c49ebc27221dc27e143d760/programs/bpf_loader/src/serialization.rs#L465 */ fd_account_meta_t const * metadata = fd_borrowed_account_get_acc_meta( &view_acc ); - uchar is_signer = (uchar)fd_instr_acc_is_signer_idx( ctx->instr, (uchar)i ); + uchar is_signer = (uchar)fd_instr_acc_is_signer_idx( ctx->instr, (uchar)i, NULL ); FD_STORE( uchar, serialized_params, is_signer ); serialized_params += sizeof(uchar); @@ -540,7 +540,7 @@ fd_bpf_loader_input_serialize_unaligned( fd_exec_instr_ctx_t * ctx, fd_account_meta_t const * metadata = fd_borrowed_account_get_acc_meta( &view_acc ); - uchar is_signer = (uchar)fd_instr_acc_is_signer_idx( ctx->instr, (uchar)i ); + uchar is_signer = (uchar)fd_instr_acc_is_signer_idx( ctx->instr, (uchar)i, NULL ); FD_STORE( uchar, serialized_params, is_signer ); serialized_params += sizeof(uchar); diff --git a/src/flamenco/runtime/program/fd_config_program.c b/src/flamenco/runtime/program/fd_config_program.c index 16210bbc4f4..ca0aa8953d2 100644 --- a/src/flamenco/runtime/program/fd_config_program.c +++ b/src/flamenco/runtime/program/fd_config_program.c @@ -51,7 +51,7 @@ _process_config_instr( fd_exec_instr_ctx_t * ctx ) { /* https://github.com/solana-labs/solana/blob/v1.17.17/programs/config/src/config_processor.rs#L27 */ - is_config_account_signer = fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_CONFIG ); + is_config_account_signer = fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_CONFIG, NULL ); /* https://github.com/solana-labs/solana/blob/v1.17.17/programs/config/src/config_processor.rs#L29-L31 */ @@ -128,7 +128,7 @@ _process_config_instr( fd_exec_instr_ctx_t * ctx ) { /* https://github.com/solana-labs/solana/blob/v1.17.17/programs/config/src/config_processor.rs#L72-L79 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, (uchar)counter ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, (uchar)counter, NULL ) ) ) { /* Max msg_sz: 33 - 2 + 45 = 76 < 127 => we can use printf */ fd_log_collector_printf_dangerous_max_127( ctx, "account %s signer_key().is_none()", FD_BASE58_ENC_32_ALLOCA( signer ) ); diff --git a/src/flamenco/runtime/program/fd_loader_v4_program.c b/src/flamenco/runtime/program/fd_loader_v4_program.c index a3dab6a094d..3a394a73c92 100644 --- a/src/flamenco/runtime/program/fd_loader_v4_program.c +++ b/src/flamenco/runtime/program/fd_loader_v4_program.c @@ -92,7 +92,11 @@ check_program_account( fd_exec_instr_ctx_t * instr_ctx, } /* https://github.com/anza-xyz/agave/blob/v2.2.6/programs/loader-v4/src/lib.rs#L75-L78 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL, err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!(*err) ) ) { + return NULL; + } fd_log_collector_msg_literal( instr_ctx, "Authority did not sign" ); *err = FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; return NULL; @@ -314,7 +318,9 @@ fd_loader_v4_program_instruction_set_program_length( fd_exec_instr_ctx_t * } /* https://github.com/anza-xyz/agave/blob/v2.2.6/programs/loader-v4/src/lib.rs#L205-L208 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 1UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "Authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -639,7 +645,9 @@ fd_loader_v4_program_instruction_transfer_authority( fd_exec_instr_ctx_t * instr } /* https://github.com/anza-xyz/agave/blob/v2.2.6/programs/loader-v4/src/lib.rs#L414-L417 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( instr_ctx->instr, 2UL, &err ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!err ) ) return err; fd_log_collector_msg_literal( instr_ctx, "New authority did not sign" ); return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } diff --git a/src/flamenco/runtime/program/fd_stake_program.c b/src/flamenco/runtime/program/fd_stake_program.c index c5adaf65ec1..1c1c4ac0121 100644 --- a/src/flamenco/runtime/program/fd_stake_program.c +++ b/src/flamenco/runtime/program/fd_stake_program.c @@ -1362,7 +1362,7 @@ authorize_with_seed( fd_exec_instr_ctx_t const * ctx, int rc; fd_pubkey_t const * signers[FD_TXN_SIG_MAX] = {0}; fd_pubkey_t out = {0}; - if( FD_LIKELY( fd_instr_acc_is_signer_idx( ctx->instr, authority_base_index ) ) ) { + if( FD_LIKELY( fd_instr_acc_is_signer_idx( ctx->instr, authority_base_index, NULL ) ) ) { // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_state.rs#L289 fd_pubkey_t const * base_pubkey = NULL; @@ -1934,7 +1934,7 @@ move_stake_or_lamports_shared_checks( fd_exec_instr_ctx_t * invoke_context, // int rc; // https://github.com/anza-xyz/agave/blob/cdff19c7807b006dd63429114fb1d9573bf74172/programs/stake/src/stake_state.rs#L145-L153 - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( invoke_context->instr, stake_authority_index ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( invoke_context->instr, stake_authority_index, NULL ) ) ) { return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } @@ -2251,7 +2251,7 @@ withdraw( fd_exec_instr_ctx_t const * ctx, if( FD_UNLIKELY( rc ) ) return rc; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_state.rs#L813 - int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, withdraw_authority_index ); + int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, withdraw_authority_index, NULL ); if( FD_UNLIKELY( !is_signer ) ) return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_state.rs#L817 @@ -2333,7 +2333,7 @@ withdraw( fd_exec_instr_ctx_t const * ctx, fd_pubkey_t custodian_pubkey_ = {0}; fd_pubkey_t const * custodian_pubkey = &custodian_pubkey_; if( custodian_index ) { - int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, *custodian_index ); + int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, *custodian_index, NULL ); if( is_signer ) { int err = fd_exec_instr_ctx_get_key_of_account_at_index( ctx, *custodian_index, &custodian_pubkey ); if( FD_UNLIKELY( err ) ) return err; @@ -2490,7 +2490,7 @@ get_optional_pubkey( fd_exec_instr_ctx_t * ctx, // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L32 if( FD_LIKELY( acc_idxinstr->acct_cnt ) ) { // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L33 - if( FD_UNLIKELY( should_be_signer && !fd_instr_acc_is_signer_idx( ctx->instr, acc_idx ) ) ) { + if( FD_UNLIKELY( should_be_signer && !fd_instr_acc_is_signer_idx( ctx->instr, acc_idx, NULL ) ) ) { return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L39 @@ -2961,7 +2961,7 @@ fd_stake_program_execute( fd_exec_instr_ctx_t * ctx ) { if( FD_UNLIKELY( rc ) ) return rc; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L237 - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, 3 ) ) ) + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, 3, NULL ) ) ) return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L241 fd_stake_authorized_t authorized = { .staker = *staker_pubkey, @@ -3013,7 +3013,7 @@ fd_stake_program_execute( fd_exec_instr_ctx_t * ctx ) { if( FD_UNLIKELY( rc ) ) return rc; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L257 - int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, 3 ); + int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, 3, NULL ); if( FD_UNLIKELY( !is_signer ) ) return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L260 fd_pubkey_t const * custodian_pubkey = NULL; @@ -3067,7 +3067,7 @@ fd_stake_program_execute( fd_exec_instr_ctx_t * ctx ) { if( FD_UNLIKELY( rc ) ) return rc; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L281 - int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, 3 ); + int is_signer = fd_instr_acc_is_signer_idx( ctx->instr, 3, NULL ); if( FD_UNLIKELY( !is_signer ) ) return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; // https://github.com/anza-xyz/agave/blob/c8685ce0e1bb9b26014f1024de2cd2b8c308cbde/programs/stake/src/stake_instruction.rs#L284 fd_pubkey_t const * custodian_pubkey = NULL; diff --git a/src/flamenco/runtime/program/fd_system_program.c b/src/flamenco/runtime/program/fd_system_program.c index 1e9567bebbe..9088265583b 100644 --- a/src/flamenco/runtime/program/fd_system_program.c +++ b/src/flamenco/runtime/program/fd_system_program.c @@ -135,7 +135,10 @@ fd_system_program_transfer( fd_exec_instr_ctx_t * ctx, /* https://github.com/anza-xyz/agave/blob/v2.0.9/programs/system/src/system_processor.rs#L222-L232 */ - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, from_acct_idx ) ) ) { + int instr_err_code = 0; + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, from_acct_idx, &instr_err_code ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!instr_err_code ) ) return instr_err_code; /* Max msg_sz: 37 - 2 + 45 = 80 < 127 => we can use printf */ ushort idx_in_txn = ctx->instr->accounts[ from_acct_idx ].index_in_transaction; fd_log_collector_printf_dangerous_max_127( ctx, @@ -572,7 +575,10 @@ fd_system_program_exec_transfer_with_seed( fd_exec_instr_ctx_t * ushort const from_base_idx = 1UL; ushort const to_idx = 2UL; - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, from_base_idx ) ) ) { + int instr_err_code = 0; + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, from_base_idx, &instr_err_code ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!instr_err_code ) ) return instr_err_code; /* Max msg_sz: 37 - 2 + 45 = 80 < 127 => we can use printf */ ushort idx_in_txn = ctx->instr->accounts[ from_base_idx ].index_in_transaction; fd_log_collector_printf_dangerous_max_127( ctx, diff --git a/src/flamenco/runtime/program/fd_vote_program.c b/src/flamenco/runtime/program/fd_vote_program.c index 4d85afa2768..2e405ab5890 100644 --- a/src/flamenco/runtime/program/fd_vote_program.c +++ b/src/flamenco/runtime/program/fd_vote_program.c @@ -2195,7 +2195,7 @@ process_authorize_with_seed_instruction( return FD_EXECUTOR_INSTR_ERR_MISSING_ACC; // https://github.com/anza-xyz/agave/blob/v2.0.1/programs/vote/src/vote_processor.rs#L33 - if( fd_instr_acc_is_signer_idx( ctx->instr, 2 ) ) { + if( fd_instr_acc_is_signer_idx( ctx->instr, 2, &rc ) ) { // https://github.com/anza-xyz/agave/blob/v2.1.14/programs/vote/src/vote_processor.rs#L34 fd_pubkey_t const * base_pubkey = NULL; @@ -2411,7 +2411,9 @@ fd_vote_program_execute( fd_exec_instr_ctx_t * ctx ) { if( FD_UNLIKELY( rc ) ) return rc; // https://github.com/anza-xyz/agave/blob/v2.0.1/programs/vote/src/vote_processor.rs#L116 - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, 3 ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, 3, &rc ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!rc ) ) break; // https://github.com/anza-xyz/agave/blob/v2.0.1/programs/vote/src/vote_processor.rs#L117 rc = FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; break; @@ -2744,7 +2746,10 @@ fd_vote_program_execute( fd_exec_instr_ctx_t * ctx ) { if( FD_UNLIKELY( rc ) ) return rc; // https://github.com/anza-xyz/agave/blob/v2.0.1/programs/vote/src/vote_processor.rs#L239 - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, 3 ) ) ) { + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, 3, &rc ) ) ) { + /* https://github.com/anza-xyz/agave/blob/v3.0.3/transaction-context/src/lib.rs#L789 */ + if( FD_UNLIKELY( !!rc ) ) break; + rc = FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; break; } diff --git a/src/flamenco/runtime/program/zksdk/fd_zksdk.c b/src/flamenco/runtime/program/zksdk/fd_zksdk.c index 4ef16640aae..1d2a9586a21 100644 --- a/src/flamenco/runtime/program/zksdk/fd_zksdk.c +++ b/src/flamenco/runtime/program/zksdk/fd_zksdk.c @@ -18,11 +18,13 @@ fd_zksdk_process_close_context_state( fd_exec_instr_ctx_t * ctx ) { https://github.com/anza-xyz/agave/blob/master/programs/zk-elgamal-proof/src/lib.rs#L133-L141 */ do { fd_guarded_borrowed_account_t owner_acc = {0}; - FD_TRY_BORROW_INSTR_ACCOUNT_DEFAULT_ERR_CHECK( ctx, ACC_IDX_OWNER, &owner_acc ); - - if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_OWNER ) ) ) { + int instr_err_code = 0; + if( FD_UNLIKELY( !fd_instr_acc_is_signer_idx( ctx->instr, ACC_IDX_OWNER, &instr_err_code ) ) ) { + if( FD_UNLIKELY( !!instr_err_code ) ) return instr_err_code; return FD_EXECUTOR_INSTR_ERR_MISSING_REQUIRED_SIGNATURE; } + + FD_TRY_BORROW_INSTR_ACCOUNT_DEFAULT_ERR_CHECK( ctx, ACC_IDX_OWNER, &owner_acc ); *owner_pubkey = *owner_acc.acct->pubkey; /* implicit drop of borrowed owner_acc */ } while (0);