PyTeal smart contracts can access properties of the current transaction and the state of the blockchain when they are running.
Information about the current transaction being evaluated can be obtained using the :any:`Txn` object. Below are the PyTeal expressions that refer to transaction fields:
The :any:`Txn.type_enum() <TxnObject.type_enum>` values can be checked using the :any:`TxnType` enum:
Value | Numerical Value | Type String | Description |
---|---|---|---|
:any:`TxnType.Unknown` | 0 |
unkown | unknown type, invalid |
:any:`TxnType.Payment` | 1 |
pay | payment |
:any:`TxnType.KeyRegistration` | 2 |
keyreg | key registration |
:any:`TxnType.AssetConfig` | 3 |
acfg | asset config |
:any:`TxnType.AssetTransfer` | 4 |
axfer | asset transfer |
:any:`TxnType.AssetFreeze` | 5 |
afrz | asset freeze |
:any:`TxnType.ApplicationCall` | 6 |
appl | application call |
Some of the exposed transaction fields are arrays with the type TealType.uint64[]
or TealType.bytes[]
.
These fields are Txn.application_args
, Txn.assets
, Txn.accounts
, and Txn.applications
.
The length of these array fields can be found using the .length()
method, and individual
items can be accesses using bracket notation. For example:
Txn.application_args.length() # get the number of application arguments in the transaction
Txn.application_args[0] # get the first application argument
Txn.application_args[1] # get the second application argument
The Txn.accounts
and Txn.applications
arrays are special cases. Normal arrays in
PyTeal are 0
-indexed, but these are 1
-indexed with special values at index 0
.
For the accounts array, Txn.accounts[0]
is always equivalent to Txn.sender()
.
For the applications array, Txn.applications[0]
is always equivalent to Txn.application_id()
.
IMPORTANT: Since these arrays are 1
-indexed, their lengths are handled differently.
For example, if Txn.accounts.length()
or Txn.applications.length()
is 2, then
indexes 0
, 1
, and 2
will be present. In fact, the index 0
will
always evaluate to the special values above, even when length()
is 0
.
Atomic Transfers are irreducible
batch transactions that allow groups of transactions to be submitted at one time. If any of the
transactions fail, then all the transactions will fail. PyTeal allows programs to access information
about the transactions in an atomic transfer group using the :any:`Gtxn` object. This object acts
like a list of :any:`TxnObject`, meaning all of the above transaction fields on Txn
are
available on the elements of Gtxn
. For example:
Gtxn[0].sender() # get the sender of the first transaction in the atomic transfer group
Gtxn[1].receiver() # get the receiver of the second transaction in the atomic transfer group
Gtxn
is zero-indexed and the maximum size of an atomic transfer group is 16. The size of the
current transaction group is available as :any:`Global.group_size()`. A standalone transaction will
have a group size of 1
.
To find the current transaction's index in the transfer group, use :any:`Txn.group_index() <TxnObject.group_index>`. If the
current transaction is standalone, it's group index will be 0
.
Information about the current state of the blockchain can be obtained using the following :any:`Global` expressions:
Operator | Type | Notes |
---|---|---|
:any:`Global.min_txn_fee()` | TealType.uint64 |
in microAlgos |
:any:`Global.min_balance()` | TealType.uint64 |
in mircoAlgos |
:any:`Global.max_txn_life()` | TealType.uint64 |
number of rounds |
:any:`Global.zero_address()` | TealType.bytes |
32 byte address of all zero bytes |
:any:`Global.group_size()` | TealType.uint64 |
number of txns in this atomic transaction group, at least 1 |
:any:`Global.logic_sig_version()` | TealType.uint64 |
the maximum supported TEAL version |
:any:`Global.round()` | TealType.uint64 |
the current round number |
:any:`Global.latest_timestamp()` | TealType.uint64 |
the latest confirmed block UNIX timestamp |
:any:`Global.current_application_id()` | TealType.uint64 |
the ID of the current application executing |