Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.thru.org/llms.txt

Use this file to discover all available pages before exploring further.

Use this page when you need to inspect the current transaction, understand account indexing, or safely read account and block metadata.

Transaction root

Most in-program reads start from:
tsdk_txn_t const * txn = tsdk_get_txn( );
From there, the inline helpers in tn_sdk_txn.h expose the fields you usually care about.

Transaction helper reference

HelperWhat it returns
tsdk_txn_get_instr_data(txn)Pointer to instruction bytes.
tsdk_txn_get_instr_data_sz(txn)Instruction byte length.
tsdk_txn_get_msg(txn)Message portion of the transaction.
tsdk_txn_get_msg_sz(txn_sz)Message size excluding trailing signature.
tsdk_txn_get_fee_payer_signature(txn, txn_sz)Pointer to the trailing fee-payer signature.
tsdk_txn_get_fee(txn)Requested fee.
tsdk_txn_get_nonce(txn)Transaction nonce.
tsdk_txn_get_start_slot(txn)First valid slot.
tsdk_txn_get_expiry_slot(txn)Last valid slot derived from start_slot + expiry_after.
tsdk_txn_get_chain_id(txn)Chain identifier.
tsdk_txn_get_requested_compute_units(txn)Requested compute units.
tsdk_txn_get_requested_memory_units(txn)Requested memory units.
tsdk_txn_has_fee_payer_state_proof(txn)Whether a fee-payer proof is present.
tsdk_txn_get_acct_addrs(txn)Pointer to fee payer, program, and remaining account pubkeys.
tsdk_txn_account_cnt(txn)Total account count exposed to the transaction.
tsdk_txn_readwrite_account_cnt(txn)Read-write account count from the header.
tsdk_txn_readonly_account_cnt(txn)Read-only account count from the header.
tsdk_txn_is_account_idx_writable(txn, idx)Whether the account index is writable in the transaction.
tsdk_txn_get_msg_sz(txn_sz) is the one helper in this group that only needs the total transaction size. It computes message size = txn_sz - TN_TXN_SIGNATURE_SZ, so it does not need the transaction pointer.

Account indexing

The public helpers assume transaction account indexing like this:
Index rangeMeaning
0Fee payer
1Current program account
2+User-supplied read-write and read-only accounts
Use tsdk_is_account_idx_valid(idx) before indexing transaction-linked account data.

Account metadata

tsdk_get_account_meta(account_idx) returns a tsdk_account_meta_t const * with:
FieldMeaning
versionWhether the metadata is present and versioned.
flagsBitfield of account properties (see flag constants below).
data_szAccount data size.
seqSequence number.
ownerOwner program pubkey.
balanceNative token balance.
nonceAccount nonce.
tsdk_account_exists(account_idx) is a convenient existence check built on top of metadata version.

Account flag constants

The flags field on tsdk_account_meta_t is a bitfield. Test individual flags with bitwise AND:
ConstantValueMeaning
TSDK_ACCOUNT_FLAG_PROGRAM0x01Account contains executable program code.
TSDK_ACCOUNT_FLAG_PRIVILEGED0x02Account has privileged system-level access.
TSDK_ACCOUNT_FLAG_UNCOMPRESSABLE0x04Account cannot be compressed.
TSDK_ACCOUNT_FLAG_EPHEMERAL0x08Account exists only for the current transaction.
TSDK_ACCOUNT_FLAG_DELETED0x10Account has been deleted.
TSDK_ACCOUNT_FLAG_NEW0x20Account has never existed before this transaction.
TSDK_ACCOUNT_FLAG_COMPRESSED0x40Account state is compressed (removed from active ledger).
tsdk_account_meta_t const * meta = tsdk_get_account_meta( account_idx );
if( meta->flags & TSDK_ACCOUNT_FLAG_PROGRAM ) {
  /* account is a program */
}
Use tsys_account_set_flags(account_idx, flags) to modify flags on accounts owned by the current program.

Account data pointers

tsdk_get_account_data_ptr(account_idx) returns a raw pointer into the VM account-data segment. Typical pattern:
ushort account_idx = 2U;

if( !tsdk_is_account_idx_valid( account_idx ) ) tsdk_revert( 1UL );
if( !tsdk_account_exists( account_idx ) ) tsdk_revert( 2UL );

void * data = tsdk_get_account_data_ptr( account_idx );
tsdk_account_meta_t const * meta = tsdk_get_account_meta( account_idx );

Block context

HelperUse it for
tsdk_get_current_block_ctx()Current slot, block time, block price, state root, current block hash, and block producer.
tsdk_get_past_block_ctx(blocks_in_past)Access a previous block context spaced by TSDK_BLOCK_CTX_VM_SPACING.
The block context struct is tsdk_block_ctx_t.

Shadow stack and current program identity

HelperUse it for
tsdk_get_shadow_stack()Read call depth and CPI frame information.
tsdk_get_current_program_acc_idx()Resolve the current program’s transaction account index.
tsdk_get_current_program_acc_addr()Resolve the current program’s pubkey.
tsdk_is_program_reentrant()Detect whether the current program already appears lower in the call chain.
tsdk_is_account_authorized_by_idx(...)Check effective authorization by account index, including CPI auth/deauth state.
tsdk_is_account_authorized_by_pubkey(...)Check effective authorization by pubkey.
tsdk_is_account_owned_by_current_program(...)Check whether the current program owns an account.

Notes

  • Do not assume every account index is valid just because the instruction payload contains it.
  • Metadata and data pointers come from VM-managed memory; treat them as borrowed pointers, not owned allocations.
  • Writable status comes from transaction context and syscalls, not from the presence of a data pointer alone.