Transaction Parameters
Description
Section titled “Description”This example demonstrates how to get suggested transaction parameters using suggested_params(). These parameters are essential for constructing valid transactions on the Algorand network. Prerequisites:
Prerequisites
Section titled “Prerequisites”- LocalNet running (via
algokit localnet start)
Run This Example
Section titled “Run This Example”From the repository’s examples directory:
cd examplesuv run python algod_client/05_transaction_params.py# ruff: noqa: N999, C901, PLR0912, PLR0915"""Example: Transaction Parameters
This example demonstrates how to get suggested transaction parameters usingsuggested_params(). These parameters are essential for constructing validtransactions on the Algorand network.
Prerequisites:- LocalNet running (via `algokit localnet start`)"""
import base64
from shared import ( create_algod_client, print_error, print_header, print_info, print_step, print_success,)
def format_as_base64(data: bytes | str) -> str: """Format bytes or base64 string for display.""" if isinstance(data, bytes): return base64.b64encode(data).decode("utf-8") return data
def format_fee(micro_algos: int) -> str: """Format a fee as microAlgos and Algos.""" algo_value = micro_algos / 1_000_000 return f"{micro_algos:,} uALGO ({algo_value:.6f} ALGO)"
def main() -> None: print_header("Transaction Parameters Example")
# Create an Algod client connected to LocalNet algod = create_algod_client()
# ========================================================================= # Step 1: Get Suggested Parameters using suggested_params() # ========================================================================= print_step(1, "Getting suggested transaction parameters with suggested_params()")
try: suggested_params = algod.suggested_params()
print_success("Suggested parameters retrieved successfully!") print_info("")
# ===================================================================== # Step 2: Display Core Parameters # ===================================================================== print_step(2, "Displaying suggested transaction parameters")
print_info("Core Transaction Parameters:") print_info(f" fee: {format_fee(suggested_params.fee)}") print_info(f" min_fee: {format_fee(suggested_params.min_fee)}") print_info(f" flat_fee: {suggested_params.flat_fee}") print_info("")
# ===================================================================== # Step 3: Display Validity Window Parameters # ===================================================================== print_step(3, "Displaying validity window parameters (first_valid, last_valid)")
print_info("Validity Window:") print_info(f" first_valid: {suggested_params.first_valid:,}") print_info(f" last_valid: {suggested_params.last_valid:,}") print_info("")
validity_window = suggested_params.last_valid - suggested_params.first_valid print_info(f" Validity Window: {validity_window:,} rounds") print_info("The default validity window is 1000 rounds (~1 hour on MainNet)") print_info("A transaction is only valid between first_valid and last_valid rounds") print_info("")
# ===================================================================== # Step 4: Display Network Identification Parameters # ===================================================================== print_step(4, "Displaying network identification parameters")
print_info("Network Identification:") print_info(f" genesis_id: {suggested_params.genesis_id}") print_info(f" genesis_hash: {format_as_base64(suggested_params.genesis_hash)}") print_info(f" consensus_version: {suggested_params.consensus_version}") print_info("")
print_info("genesis_id and genesis_hash uniquely identify the network") print_info("Transactions are rejected if sent to the wrong network") print_info("")
# ===================================================================== # Step 5: Explain Each Parameter's Purpose # ===================================================================== print_step(5, "Explaining each parameter's purpose")
print_info("Parameter Purposes:") print_info("") print_info(" fee:") print_info(" The suggested fee per byte for the transaction.") print_info(" During network congestion, this value may increase.") print_info("") print_info(" min_fee:") print_info(" The minimum fee required regardless of transaction size.") print_info(" Currently 1000 uALGO (0.001 ALGO) on all Algorand networks.") print_info("") print_info(" flat_fee:") print_info(" When false, fee is calculated as: fee * transactionSize") print_info(" When true, fee is used directly as the total fee.") print_info("") print_info(" first_valid:") print_info(" The first round this transaction is valid for.") print_info(" Usually set to the current round from the node.") print_info("") print_info(" last_valid:") print_info(" The last round this transaction is valid for.") print_info(" Transaction will fail if not confirmed by this round.") print_info("") print_info(" genesis_id:") print_info(' A human-readable network identifier (e.g., "mainnet-v1.0").') print_info(" Prevents replaying transactions across networks.") print_info("") print_info(" genesis_hash:") print_info(" The SHA256 hash of the genesis block, uniquely identifying the network.") print_info(" Cryptographically ensures transaction is for the correct chain.") print_info("") print_info(" consensus_version:") print_info(" The consensus protocol version at the current round.") print_info(" Indicates which features and rules are active.") print_info("")
# ===================================================================== # Step 6: Demonstrate Customizing Parameters # ===================================================================== print_step(6, "Demonstrating how to customize transaction parameters")
print_info("Customizing Parameters:") print_info("")
# Example 1: Setting a specific flat fee custom_fee_value = 2000 # Set a fixed 2000 uALGO fee
print_info(" Example 1: Setting a flat fee") print_info(f" Original fee: {format_fee(suggested_params.fee)}") print_info(f" Original flat_fee: {suggested_params.flat_fee}") print_info(f" Custom fee: {format_fee(custom_fee_value)}") print_info(" Custom flat_fee: True") print_info("Set flat_fee=True to use a fixed fee instead of per-byte") print_info("")
# Example 2: Extending the validity window first_valid = suggested_params.first_valid last_valid = suggested_params.last_valid extended_window = 2000 # 2000 rounds instead of default 1000 extended_last_valid = first_valid + extended_window
print_info(" Example 2: Extending the validity window") print_info(f" Original last_valid: {last_valid:,}") print_info(f" Extended last_valid: {extended_last_valid:,}") print_info(f" Original window: {validity_window:,} rounds") print_info(f" Extended window: {extended_window:,} rounds") print_info("Extend validity window for offline signing or delayed submission") print_info("")
# Example 3: Shortening the validity window short_window = 100 # Only 100 rounds validity short_last_valid = first_valid + short_window
print_info(" Example 3: Shortening the validity window") print_info(f" Original last_valid: {last_valid:,}") print_info(f" Shortened last_valid: {short_last_valid:,}") print_info(f" Shortened window: {short_window:,} rounds") print_info("Shorter windows provide better replay protection") print_info("")
# Example 4: Setting a specific first_valid for delayed execution future_round = first_valid + 10 # Valid starting 10 rounds from now future_last_valid = future_round + 1000
print_info(" Example 4: Delayed execution (future first_valid)") print_info(f" Original first_valid: {first_valid:,}") print_info(f" Delayed first_valid: {future_round:,}") print_info(f" Delayed last_valid: {future_last_valid:,}") print_info("Set future first_valid to prevent immediate execution")
except Exception as e: print_error(f"Failed to get transaction parameters: {e}") print_info("Make sure LocalNet is running with `algokit localnet start`") raise SystemExit(1) from e
# ========================================================================= # Summary # ========================================================================= print_header("Summary") print_info("This example demonstrated:") print_info(" 1. suggested_params() - Get parameters for building transactions") print_info(" 2. Parameter fields: fee, min_fee, flat_fee, first_valid, last_valid") print_info(" 3. Network identification: genesis_id, genesis_hash, consensus_version") print_info(" 4. How first_valid and last_valid define the validity window") print_info(" 5. Customizing parameters: fees and validity windows") print_info("") print_info("Key suggested_params fields:") print_info(" - fee: Suggested fee per byte (int)") print_info(" - min_fee: Minimum transaction fee (int)") print_info(" - flat_fee: Whether fee is flat or per-byte (bool)") print_info(" - first_valid: First valid round (int)") print_info(" - last_valid: Last valid round (int)") print_info(" - genesis_id: Network identifier string") print_info(" - genesis_hash: Genesis block hash (base64 string)") print_info(" - consensus_version: Protocol version string") print_info("") print_info("Use cases:") print_info(" - Building transactions with correct fees") print_info(" - Setting appropriate validity windows") print_info(" - Ensuring network compatibility") print_info(" - Offline transaction signing with extended windows")
if __name__ == "__main__": main()Other examples in Algod Client
Section titled “Other examples in Algod Client”- Node Health and Status
- Version and Genesis Information
- Ledger Supply Information
- Account Information
- Transaction Parameters
- Send and Confirm Transaction
- Pending Transactions
- Block Data
- Asset Information
- Application Information
- Application Boxes
- TEAL Compile and Disassemble
- Transaction Simulation
- Ledger State Deltas
- Transaction Proof
- Light Block Header Proof
- State Proof
- DevMode Timestamp Offset
- Sync Round Management