Transaction Fields and Global Parameters
PyTeal smart contracts can access properties of the current transaction and the state of the blockchain when they are running.
Transaction Fields
Information about the current transaction being evaluated can be obtained using the Txn
object using the PyTeal expressions shown below.
Since numerous transaction fields exist, the fields are logically organized into tables by transaction type.
Fields by Transaction Type
Common Fields
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
||
|
2 |
see table below |
|
|
2 |
32 byte address |
|
|
2 |
in microAlgos |
|
|
2 |
round number |
|
|
7 |
UNIX timestamp of block before |
|
|
2 |
round number |
|
|
2 |
transaction note in bytes |
|
|
2 |
transaction lease in bytes |
|
|
2 |
position of this transaction within a transaction group, starting at 0 |
|
|
2 |
the computed ID for this transaction, 32 bytes |
|
|
2 |
32 byte address |
Application Call
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
||
|
2 |
||
|
2 |
||
|
3 |
Maximum global integers in app schema |
|
|
3 |
Maximum global byte strings in app schema |
|
|
3 |
Maximum local integers in app schema |
|
|
3 |
Maximum local byte strings in app schema |
|
|
2 |
Array of accounts available to the application |
|
|
3 |
Array of assets available to the application |
|
|
3 |
Array of applications |
|
|
2 |
||
|
4 |
Number of extra program pages for app |
|
|
2 |
Array of application arguments |
|
|
5 |
The ID of the newly created application in this transaction. In v5, only valid on inner transactions. >= v6 works with top-level and inner transactions. |
|
|
5 |
Array of application logged items. In v5, only valid on inner transactions. >= v6 works with top-level and inner transactions. |
|
|
6 |
The last message emitted. Empty bytes if none were emitted. Application mode only. |
|
|
7 |
The pages of the approval program as an array |
|
|
7 |
The pages of a clear state program as an array |
Asset Config
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
ID of asset being configured |
|
|
2 |
||
|
2 |
||
|
2 |
||
|
2 |
||
|
2 |
||
|
2 |
||
|
2 |
||
|
2 |
32 byte address |
|
|
2 |
32 byte address |
|
|
2 |
32 byte address |
|
|
2 |
32 byte address |
|
|
5 |
The ID of the newly created asset in this transaction. In v5, only valid on inner transactions. >= v6 works with top-level and inner transactions. |
Asset Freeze
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
||
|
2 |
32 byte address |
|
|
2 |
Asset Transfer
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
ID of asset being transferred |
|
|
2 |
value in Asset’s units |
|
|
2 |
32 byte address, causes clawback of all value if sender is the clawback |
|
|
2 |
32 byte address |
|
|
2 |
32 byte address |
Key Registration
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
32 byte address |
|
|
2 |
32 byte address |
|
|
6 |
64 byte state proof public key commitment. |
|
|
2 |
||
|
2 |
||
|
2 |
||
|
5 |
Marks an account nonparticipating for rewards |
Payment
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
32 byte address |
|
|
2 |
in microAlgos |
|
|
2 |
32 byte address |
Transaction Types
The Txn.type_enum()
values can be checked using the TxnType
enum:
Value |
Numerical Value |
Type String |
Description |
---|---|---|---|
|
unknown |
unknown type, invalid |
|
|
pay |
payment |
|
|
keyreg |
key registration |
|
|
acfg |
asset config |
|
|
axfer |
asset transfer |
|
|
afrz |
asset freeze |
|
|
appl |
application call |
Transaction Array Fields
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
, Txn.applications
,
and InnerTxn.logs
.
The length of these array fields can be found using the .length()
method, and individual
items can be accessed 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
# as of AVM v5, PyTeal expressions can be used to dynamically index into array properties as well
Txn.application_args[Txn.application_args.length() - Int(1)] # get the last application argument
Special case: Txn.accounts
and Txn.applications
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 Transfer Groups
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 Gtxn
object. This object acts
like a list of 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
# as of AVM v3, PyTeal expressions can be used to dynamically index into Gtxn as well
Gtxn[Txn.group_index() - Int(1)].sender() # get the sender of the previous 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 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 Txn.group_index()
. If the
current transaction is standalone, it’s group index will be 0
.
Inner Transactions
Note
Inner transactions are only available in AVM version 5 or higher.
Inner transactions can be created and submitted with expressions from the InnerTxnBuilder
class.
The properties of the most recently submitted inner transaction can be accessed using the InnerTxn
object. This object is an instance of TxnObject
, meaning all of the above transaction fields
on Txn
are available on InnerTxn
as well.
Global Parameters
Information about the current state of the blockchain can be obtained using the following
Global
expressions:
Operator |
Type |
Min Program Version |
Notes |
---|---|---|---|
|
2 |
in microAlgos |
|
|
2 |
in microAlgos |
|
|
2 |
number of rounds |
|
|
2 |
32 byte address of all zero bytes |
|
|
2 |
number of txns in this atomic transaction group, at least 1 |
|
|
2 |
the maximum supported program version |
|
|
2 |
the current round number |
|
|
2 |
the latest confirmed block UNIX timestamp |
|
|
2 |
the ID of the current application executing |
|
|
3 |
32 byte address of the creator of the current application |
|
|
5 |
32 byte address of the current application controlled account |
|
|
5 |
32 byte ID of the current transaction group |