The ton.assets.jetton_transfers contains jetton transfers identified from ton.raw.messages with the opcode 0x0f8a7ea5.

This model does not include internal transfers and transfer notifications to prevent duplicate volume counts (read more Ton and Jetton Wallet Communication below for context).

This table is in Beta

  • There may be unaccounted edge cases involving jetton transfers that do not involve transfer

All address fields used in this table will be in Hex format and upper casing

  • There are up to 5 equivalent addresses for a given address on Ton.

  • Example of Hex address: 0:B113A994B5024A16719F69139328EB759596C38A25F59028B146FECDC3621DFE

Asynchronous and Non-Atomic Transactions in TON

The TON blockchain operates differently from many other blockchains, particularly in how it handles transactions.

Two key characteristics of TON transactions are their asynchronous and non-atomic nature:

Asynchronous Transactions:

In TON, when a transaction is initiated, it isn’t immediately complete. Instead, it triggers a series of message-passing events between smart contracts. These messages are processed in subsequent blocks, which means the full execution of a transaction can span multiple blocks.

Implications:

  • The final state of a transaction isn’t known immediately after it’s sent.

  • There can be a delay between when a transaction is initiated and when it’s fully executed.

Non-Atomic Transactions:

Atomicity in database systems means that a transaction is treated as a single, indivisible unit that either completes entirely or not at all. In TON, transactions are not atomic. This means that a single logical operation (like a token transfer) might involve multiple separate steps that can be partially completed.

Implications:

  • A transaction can partially succeed or fail.

  • Some effects of a transaction can occur while others don’t.

  • Error handling and state management become more complex.

Jetton Wallets Communication

For Jetton (TON’s equivalent of ERC20) transfers, this asynchronous and non-atomic nature manifests as follows:

https://docs.ton.org/develop/dapps/asset-processing/jettons#jetton-wallets-communication-overview

  1. The initial transfer operation is just the first step of the transfer

  2. This triggers an internal transfer between two Jetton wallets.

  3. To confirm a successful transfer, we must check that this internal transfer has occurred.

In our Jetton Transfers, we check that there is a corresponding internal_transfer message that has succeded. This will be represented by succcess = true

Table Columns

Unique Key: unique_id

ColumnDescription
from_addressAddress that initiated the transfer [Bob’s Wallet]
from_jetton_addressJetton address of the user that initiated the transfer [Bob’s Jetton Wallet]
to_address

Address that received the transfer [Alice’s wallet]

Note: to_jetton_address included in our schema, this field is not present in the decoded transfer payload.

jetton_masterJetton master address in hex. This is the token contract equivalent (like ERC20) on TON.
token_nameName of the token
token_symbolSymbol of the token
amount_strAmount of the token in string format
amountAmount of the token in float format
raw_amount_strThe unnormalized amount of the token in string format
raw_amountThe unnormalized amount of the token in float format
response_destinationResponse destination of the transfer [Joe’s wallet address]
forward_ton_amountForward TON amount of the transfer
forward_payloadForward payload of the transfer
block_timestampTimestamp of the block that contains the transfer
utimeTimestamp of the transfer
hashMessage hash of the transfer
created_ltLogical time of the transfer
masterchain_seqnoSequence number on the masterchain
seqnoSequence number on the workchain
shardShard of the transfer
workchainWorkchain of the transfer
bounceBounce of the transfer
bouncedBounced of the transfer
tokens_updated_atTimestamp of the last update of the token
created_atTimestamp of the creation of the transfer
updated_atTimestamp of the last update of the transfer
changed_since_full_refreshWhether the transfer has changed since the last full refresh