diff --git a/docs/v3/guidelines/dapps/asset-processing/jettons.md b/docs/v3/guidelines/dapps/asset-processing/jettons.md
index 56f5eae3b2..c599075058 100644
--- a/docs/v3/guidelines/dapps/asset-processing/jettons.md
+++ b/docs/v3/guidelines/dapps/asset-processing/jettons.md
@@ -4,19 +4,92 @@ import Button from '@site/src/components/button';
# Jetton Processing
+## Best Practices on Jettons Processing
+
+Jettons are tokens on TON Blockchain - one can consider them similarly to ERC-20 tokens on Ethereum.
+
+:::info Transaction Confirmation
+TON transactions are irreversible after just one confirmation. For the best UX/UI avoid additional waiting.
+:::
+
+#### Withdrawal
+
+[Highload Wallet v3](v3/documentation/smart-contracts/contracts-specs/highload-wallet#highload-wallet-v3) - this is TON Blockchain latest solution which is the gold standard for jetton withdrawals. It allows you to take advantage of batched withdrawals.
+
+[Batched withdrawals](https://github.com/toncenter/examples/blob/main/withdrawals-jettons-highload-batch.js) - Meaning that multiple withdrawals are sent in batches, allowing for quick and cheap withdrawals.
+
+#### Deposits
:::info
-For clear understanding, the reader should be familiar with the basic principles of asset processing described in [payments processing section](/v3/guidelines/dapps/asset-processing/payments-processing) of our documentation.
+It is suggested to set several MEMO deposit wallets for better performance.
:::
-Jettons are tokens on TON Blockchain set with [TEP-74](https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md). One can consider them similarly to ERC-20 tokens on Ethereum.
+[Memo Deposits](https://github.com/toncenter/examples/blob/main/deposits-jettons.js) - This allows you to keep one deposit wallet, and users add a memo in order to be identified by your system. This means that you don’t need to scan the entire blockchain, but is slightly less easy for users.
+
+[Memo-less deposits](https://github.com/gobicycle/bicycle) - This solution also exists, but is more difficult to integrate. However, we can assist with this, if you would prefer to take this route. Please notify us before deciding to implement this approach.
+
+### Additional Info
+
+:::caution Transaction Notification
+It is expected that every service in the Ecosystem will set the `forward_ton_amount` to 0.000000001 TON (1 nanoton) when a jetton withdrawal is made in order to send a Jetton Notify upon [successful transfer](https://testnet.tonviewer.com/transaction/a0eede398d554318326b6e13081c2441f8b9a814bf9704e2e2f44f24adb3d407), otherwise the transfer will not be standard compliant and will not be able to be processed by other CEXes and services.
+:::
+
+- Please find the JS lib example - [tonweb](https://github.com/toncenter/tonweb) - which is the official JS library from the TON Foundation.
+
+- If you want to use Java, you can look into [ton4j](https://github.com/neodix42/ton4j/tree/main).
+
+- For Go, one should consider [tonutils-go](https://github.com/xssnick/tonutils-go). At the moment, we recommend the JS lib.
+
+
+## Content List
+
+
+:::tip
+In following docs offers details about Jettons architecture generally, as well as core concepts of TON which may be different from EVM-like and other blockchains. This is crucial reading in order for one to grasp a good understanding of TON, and will greatly help you.
+:::
+
+This document describes the following in order:
+1. Overview
+2. Architecture
+2. Jetton Master Contract (Token Minter)
+3. Jetton Wallet Contract (User Wallet)
+4. Message Layouts
+4. Jetton Processing (off-chain)
+5. Jetton Processing (on-chain)
+6. Wallet processing
+7. Best Practices
+
+## Overview
+
+:::info
+TON transactions are irreversible after just one confirmation.
+For clear understanding, the reader should be familiar with the basic principles of asset processing described in [this section of our documentation](/v3/documentation/dapps/assets/overview). In particular, it is important to be familiar with [contracts](/v3/documentation/smart-contracts/addresses#everything-is-a-smart-contract), [wallets](/v3/guidelines/smart-contracts/howto/wallet), [messages](/v3/documentation/smart-contracts/message-management/messages-and-transactions) and deployment process.
+:::
+
+:::Info
+For the best user experience, it is suggested to avoid waiting on additional blocks once transactions are finalized on the TON Blockchain. Read more in the [Catchain.pdf](https://docs.ton.org/catchain.pdf#page=3).
+:::
+
+Quick jump to the core description of jetton processing:
+
+
+
+
+
+
+
+TON Blockchain and its underlying ecosystem classifies fungible tokens (FTs) as jettons. Because sharding is applied on TON Blockchain, our implementation of fungible tokens is unique when compared to similar blockchain models.
In this analysis, we take a deeper dive into the formal standards detailing jetton [behavior](https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md) and [metadata](https://github.com/ton-blockchain/TEPs/blob/master/text/0064-token-data-standard.md).
A less formal sharding-focused overview of jetton architecture can be found in our
[anatomy of jettons blog post](https://blog.ton.org/how-to-shard-your-ton-smart-contract-and-why-studying-the-anatomy-of-tons-jettons).
-Also, you should keep in mind that there are two approaches to working with jetton withdraws:
-- [Memo Deposits](https://github.com/toncenter/examples/blob/main/deposits-jettons.js) - This allows you to keep one deposit wallet, and users add a memo in order to be identified by your system. This means that you don’t need to scan the entire blockchain, but this is slightly less easy for your users.
-- [Memo-less deposits](https://github.com/gobicycle/bicycle) - This solution also exists. However, it is more difficult to integrate. If you would prefer to take this route, please notify us before deciding to implement this approach as we can assist with this.
+We have also provided specific details discussing our third-party open-source TON Payment Processor ([bicycle](https://github.com/gobicycle/bicycle)) which allows users to deposit and withdraw both Toncoin and jettons using a separate deposit address without using a text memo.
+
+
+
## Jetton Architecture
@@ -46,27 +119,22 @@ To eliminate the possibility of fraud for TON users, please look up the **origin
### Retrieving Jetton data
-To retrieve more specific Jetton data use the contract's _get_ method `get_jetton_data()`.
+To retrieve more specific Jetton data use contract's _get_ method `get_jetton_data()`.
This method returns the following data:
-| Name | Type | Description |
-|--------------------|-------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `total_supply` | `int` | the total number of issued jettons measured in indivisible units. |
-| `mintable` | `int` | details whether new jettons can be minted or not. This value is either -1 (can be minted) or 0 (cannot be minted). |
-| `admin_address` | `slice` | |
-| `jetton_content` | `cell` | data in accordance with [TEP-64](https://github.com/ton-blockchain/TEPs/blob/master/text/0064-token-data-standard.md), check [jetton metadata parsing page](/v3/guidelines/dapps/asset-processing/nft-processing/metadata-parsing) for more. |
-| `jetton_wallet_code` | `cell` | |
-
-You can call it via [Toncenter API](https://toncenter.com/api/v3/#/default/get_jetton_masters_api_v3_jetton_masters_get) or one of the [SDKs](/v3/guidelines/dapps/apis-sdks/sdk).
+| Name | Type | Description |
+|----------------------|---------|----------------------|
+| `total_supply` | `int` | the total number of issued jettons measured in indivisible units. |
+| `mintable` | `int` | details whether new jettons can be minted or not. This value is either -1 (can be minted) or 0 (cannot be minted). |
+| `admin_address` | `slice` | |
+| `jetton_content` | `cell` | data in accordance with [TEP-64](https://github.com/ton-blockchain/TEPs/blob/master/text/0064-token-data-standard.md), check [jetton metadata parsing page](/v3/guidelines/dapps/asset-processing/nft-processing/metadata-parsing) for more. |
+| `jetton_wallet_code` | `cell` | |
-
-
-> Run `jetton/masters` method from the [Toncenter API](https://toncenter.com/api/v3/#/default/get_jetton_masters_api_v3_jetton_masters_get)
+It is also possible to use the method `/jetton/masters` from the [Toncenter API](https://toncenter.com/api/v3/#/default/get_jetton_masters_api_v3_jetton_masters_get) to retrieve the already decoded Jetton data and metadata. We have also developed methods for (js) [tonweb](https://github.com/toncenter/tonweb/blob/master/src/contract/token/ft/JettonMinter.js#L85) and (js) [ton-core/ton](https://github.com/ton-core/ton/blob/master/src/jetton/JettonMaster.ts#L28), (go) [tongo](https://github.com/tonkeeper/tongo/blob/master/liteapi/jetton.go#L48) and (go) [tonutils-go](https://github.com/xssnick/tonutils-go/blob/33fd62d754d3a01329ed5c904db542ab4a11017b/ton/jetton/jetton.go#L79), (python) [pytonlib](https://github.com/toncenter/pytonlib/blob/d96276ec8a46546638cb939dea23612876a62881/pytonlib/client.py#L742) and many other [SDKs](/v3/guidelines/dapps/apis-sdks/sdk).
-
-
+Example of using [Tonweb](https://github.com/toncenter/tonweb) to run a get method and get url for off-chain metadata:
```js
import TonWeb from "tonweb";
@@ -77,9 +145,6 @@ console.log('Total supply:', data.totalSupply.toString());
console.log('URI to off-chain metadata:', data.jettonContentUri);
```
-
-
-
### Jetton minter
As mentioned before, jettons can be either `mintable` or `non-mintable`.
@@ -92,7 +157,7 @@ If the jetton admin wants to restrict jetton creation, there are three ways to d
1. If you can't or do not want to update the contract's code, the admin needs to transfer ownership from the current admin to the zero address. This will leave the contract without a valid admin, thus preventing anyone from minting jettons. However, it will also prevent any changes to the jetton metadata.
2. If you have access to source code and can change it, you can create a method in the contract that sets a flag to abort any minting process after it is called, and add a statement to check this flag in the mint function.
-3. If you can update the contract's code, you can add restrictions by updating the code of the already deployed contract.
+3. If you can update contract's code, you can add restrictions by updating the code of the already deployed contract.
## Jetton wallet smart contract
`Jetton wallet` contracts are used to **send**, **receive**, and **burn** jettons. Each _jetton wallet contract_ stores wallet balance information for specific users.
@@ -116,7 +181,7 @@ the `Jetton master contract` provides the get method `get_wallet_address(slice o
-> Run `get_wallet_address(slice owner_address)` through `/runGetMethod` method from the [Toncenter API](https://toncenter.com/api/v3/#/default/run_get_method_api_v3_runGetMethod_post). In real cases (not test ones) it is important to always check that the wallet indeed is attributed to desired Jetton Master. Check code example for more.
+> Run `get_wallet_address(slice owner_address)` through `/runGetMethod` method from the [Toncenter API](https://toncenter.com/api/v3/#/default/run_get_method_api_v3_runGetMethod_post). In real cases (not test ones) it is important to always check that wallet indeed is attributed to desired Jetton Master. Check code example for more.
@@ -142,6 +207,11 @@ console.log('Jetton wallet address:', jettonWalletAddress.toString(true, true, t
+:::tip
+For more examples read the [TON Cookbook](/v3/guidelines/dapps/cookbook#tep-74-jettons-standard).
+:::
+
+
### Retrieving data for a specific Jetton wallet
To retrieve the wallet’s account balance, owner identification information, and other info related to a specific jetton wallet contract use the `get_wallet_data()` get method within the jetton wallet contract.
@@ -186,7 +256,11 @@ console.log('Jetton master address:', data.jettonMinterAddress.toString(true, tr
-## Jetton wallets communication overview
+## Message Layouts
+
+:::tip Messages
+Read more about Messages [here](/v3/documentation/smart-contracts/message-management/messages-and-transactions).
+:::
Communication between Jetton wallets and TON wallets occurs through the following communication sequence:
@@ -199,7 +273,7 @@ Communication between Jetton wallets and TON wallets occurs through the followin
|------------------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `query_id` | uint64 | Allows applications to link three messaging types `Transfer`, `Transfer notification` and `Excesses` to each other. For this process to be carried out correctly it is recommended to **always use a unique query id**. |
| `amount` | coins | Total `ton coin` amount, that will be send with message. |
-| `destination` | address | Address of the new owner of the jettons. |
+| `destination` | address | Address of the new owner of the jettons |
| `response_destination` | address | Wallet address used to return remained ton coins with excesses message. |
| `custom_payload` | maybe cell | Size always is >= 1 bit. Custom data (which is used by either sender or receiver jetton wallet for inner logic). |
| `forward_ton_amount` | coins | Must be > 0 if you want to send `transfer notification message` with `forward payload`. It's a **part of `amount` value** and **must be lesser than `amount`** |
@@ -223,25 +297,27 @@ Here `sender` address is an address of Alice's `Jetton wallet`.
| Name | Type |
|----------------------|----------------|
-| `query_id` | uint64 |
+| `query_id` | uint64 |
:::tip Jettons standard
A detailed description of the jetton wallet contract fields can be found in the [TEP-74](https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md) `Jetton standard` interface description.
:::
-## Send Jettons with comments
-
-This transfer requires some ton coins for **fees** and, optionally, **transfer notification message** (check forward amount field).
+## How to send Jetton transfers with comments and notifications
-To send a **comment** you need set up a `forward payload`. Set the **first 32 bits to 0x0** and append **your text**.
+This transfer require some ton coins for **fees** and **transfer notification message**.
-`forward payload` is sent in `transfer notification` internal message. It will be generated only if `forward_ton_amount` > 0. Recommended `forward_ton_amount` for jetton transfer with comment is 1 nanoton.
+To send **comment** you need to set up `forward payload`. Set **first 32 bits to 0x0** and append **your text**, `forward payload` is sent in `jetton notify 0x7362d09c` internal message. It will be generated only if `forward_ton_amount` > 0.
+:::info
+Recommended `forward_ton_amount` for jetton transfer with comment is 1 nanoton.
+:::
-Finally, to retrieve an `Excess` message you must set up a `response destination`.
+Finally, to retrieve `Excess 0xd53276db` message you must set up `response destination`.
-Sometimes you may encounter a `709` error when sending jetton. It says that the value of the toncoin attached to the message is not enough to send it. Make sure that `Toncoin > to_nano(TRANSFER_CONSUMPTION) + forward_ton_amount`. `TRANSFER_CONSUMPTION` in most cases may be 0.037 if the `forward_payload` is not too large.
+Sometimes, you may encounter an error `709` when sending a jetton. This error indicates that the amount of Toncoin attached to the message is not sufficient to send it. Make sure that `Toncoin > to_nano(TRANSFER_CONSUMPTION) + forward_ton_amount`, which is typically >0.04 unless the forward payload is very large. The commission depends on various factors, including the Jetton code details and whether a new Jetton wallet needs to be deployed for the recipient.
+It is recommended to add a margin of Toncoin to the message and set your address as the `response_destination` to retrieve `Excess 0xd53276db` messages. For instance, you can add 0.05 TON to the message, while setting the `forward_ton_amount` to 1 nanoton (this amount of TON will be attached to the `jetton notify 0x7362d09c` message).
-You may also encounter the error `cskip_no_gas`, which indicates that the jettons were successfully transferred, but no other calculations were performed. This is a common situation when the value of `forward_ton_amount` is equal to 1 nanoton.
+You may also encounter the error [`cskip_no_gas`](/v3/documentation/tvm/tvm-overview#compute-phase-skipped), which indicates that the jettons were successfully transferred, but no other calculations were performed. This is a common situation when the value of `forward_ton_amount` is equal to 1 nanoton.
:::tip
Check [best practices](/v3/guidelines/dapps/asset-processing/jettons#best-practices) for _"send jettons with comments"_ example.
@@ -276,7 +352,7 @@ The sender address of the internal message containing the `Transfer notification
It should not to be confused with the `sender` field in the `Transfer notification` [body](/v3/guidelines/dapps/asset-processing/jettons#jetton-wallets-communication-overview).
1. Retrieve the Jetton master address for the new Jetton wallet by [getting wallet data](/v3/guidelines/dapps/asset-processing/jettons#retrieving-data-for-a-specific-jetton-wallet).
-2. Retrieve the Jetton wallet address for your wallet address (as an owner) using the Jetton master contract: [How to retrieve Jetton wallet address for a given user](#retrieving-jetton-wallet-addresses-for-a-given-user).
+2. Retrieve the Jetton wallet address for your wallet address (as an owner) using the Jetton master contract: [How to retrieve Jetton wallet address for a given user](#retrieving-jetton-wallet-addresses-for-a-given-user)
3. Compare the address returned by the master contract and the actual address of the wallet token.
If they match, it’s ideal. If not, then you likely received a scam token that is counterfeit.
4. Retrieve Jetton metadata: [How to receive Jetton metadata](#retrieving-jetton-data).
@@ -286,7 +362,11 @@ It should not to be confused with the `sender` field in the `Transfer notificati
### Accepting Jettons from users through a centralized wallet
:::info
-To prevent a bottleneck of incoming transactions to a single wallet, it is suggested to accept deposits across multiple wallets and to expand the number of these wallets as needed.
+To prevent a bottleneck in incoming transactions to a single wallet, it is suggested to accept deposits across multiple wallets and to expand the number of these wallets as needed.
+:::
+
+:::caution Transaction Notification
+It is expected that every service in the Ecosystem will set the `forward_ton_amount` to 0.000000001 TON (1 nanoton) when a jetton withdrawal is made in order to send a Jetton Notify upon [successful transfer](https://testnet.tonviewer.com/transaction/a0eede398d554318326b6e13081c2441f8b9a814bf9704e2e2f44f24adb3d407), otherwise the transfer will not be standard compliant and will not be able to be processed by other CEXes and services.
:::
In this scenario, the payment service creates a unique memo identifier for each sender disclosing
@@ -305,7 +385,7 @@ Tonweb examples:
#### Preparations
1. [Prepare a list of accepted Jettons](/v3/guidelines/dapps/asset-processing/jettons#adding-new-jettons-for-asset-processing-and-initial-verification) (Jetton master addresses).
-2. Deploy hot wallet (using v3R2 if no Jetton withdrawals are expected; highload v3 - if Jetton withdrawals are expected). [Wallet deployment](/v3/guidelines/dapps/asset-processing/payments-processing/#wallet-deployment).
+2. Deploy hot wallet (using v3R2 if no Jetton withdrawals are expected; highload v3 - if Jetton withdrawals are expected). [Wallet deployment](/v3/guidelines/dapps/asset-processing/payments-processing#wallet-deployment).
3. Perform a test Jetton transfer using the hot wallet address to initialize the wallet.
#### Processing incoming Jettons
@@ -315,7 +395,7 @@ Tonweb examples:
4. Compare the addresses of the Jetton master contracts from step 1. and step 3 (directly above).
If the addresses do not match, a Jetton address verification error must be reported.
5. Retrieve a list of the most recent unprocessed transactions using a hot wallet account and
- iterate it (by sorting through each transaction one by one). See: [Checking contract's transactions](v3/guidelines/dapps/asset-processing/payments-processing/#checking-contracts-transactions).
+ iterate it (by sorting through each transaction one by one). See: [Checking contract's transactions](https://docs.ton.org/develop/dapps/asset-processing/#checking-contracts-transactions).
6. Check the input message (in_msg) for transactions and retrieve the source address from the input message. [Tonweb example](https://github.com/toncenter/examples/blob/9f20f7104411771793dfbbdf07f0ca4860f12de2/deposits-jettons-single-wallet.js#L84)
7. If the source address matches the address within a Jetton wallet, then it is necessary to continue processing the transaction.
If not, then skip processing the transaction and check the next transaction.
@@ -358,7 +438,7 @@ const wallet = new WalletClass(tonweb.provider, {
#### Preparation
1. [Prepare a list of accepted Jettons](#adding-new-jettons-for-asset-processing-and-initial-verification).
-2. Deploy hot wallet (using v3R2 if no Jetton withdrawals are expected; highload v3 - if Jetton withdrawals are expected). [Wallet deployment](/v3/guidelines/dapps/asset-processing/payments-processing/#wallet-deployment).
+2. Deploy hot wallet (using v3R2 if no Jetton withdrawals are expected; highload v3 - if Jetton withdrawals are expected). [Wallet deployment](/v3/guidelines/dapps/asset-processing/payments-processing#wallet-deployment).
#### Creating deposits
@@ -413,11 +493,11 @@ transfer worthwhile (and thus deposit).
By default, wallet owners of Jetton deposit wallets are not initialized. This is because there is no predetermined
requirement to pay storage fees. Jetton deposit wallets can be deployed when sending messages with a
`transfer` body which can then be destroyed immediately. To do this, the engineer must use a special
-mechanism for sending messages: [128 + 32](/v3/documentation/smart-contracts/message-management/sending-messages#message-modes).
+mechanism for sending messages: [128 + 32](/develop/smart-contracts/messages#message-modes).
-1. Retrieve a list of deposits marked for withdrawal to a hot wallet.
-2. Retrieve saved owner addresses for each deposit.
+1. Retrieve a list of deposits marked for withdrawal to a hot wallet
+2. Retrieve saved owner addresses for each deposit
3. Messages are then sent to each owner address (by combining several such messages into a batch) from a highload
wallet with an attached TON Jetton amount. This is determined by adding the fees used for v3R2 wallet
initialization + the fees for sending a message with the `transfer` body + an arbitrary TON amount related to the `forward_ton_amount`
@@ -438,24 +518,24 @@ mechanism for sending messages: [128 + 32](/v3/documentation/smart-contracts/mes
:::info Important
It's **recommended** to read and **understand** [how does jetton transfer work](/v3/guidelines/dapps/asset-processing/jettons#jetton-wallets-communication-overview) and [how to send jettons with comment](/v3/guidelines/dapps/asset-processing/jettons#jetton-off-chain-processing) articles before reading this section.
-Below you'll find a step-by-step guide on how to process jetton withdrawals.
+Below you'll find step-by-step guide how to process jetton withdrawals.
:::
To withdraw Jettons, the wallet sends messages with the `transfer` body to its corresponding Jetton wallet.
-The Jetton wallet then sends the Jettons to the recipient. In good faith, it is important to attach some TON
+The Jetton wallet then sends the Jettons to the recipient. It is important to attach some TON (1 nanoTON at least)
as the `forward_ton_amount` (and optional comment to `forward_payload`) to trigger a `transfer notification`.
See: [Jetton contracts message layouts](#jetton-contract-message-layouts)
#### Preparation
1. Prepare a list of Jettons for withdrawals: [Adding new Jettons for processing and initial verification](#adding-new-jettons-for-asset-processing-and-initial-verification)
-2. Hot wallet deployment is initiated. Highload v3 is recommended. [Wallet Deployment](/v3/guidelines/dapps/asset-processing/payments-processing/#wallet-deployment)
+2. Hot wallet deployment is initiated. Highload v3 is recommended. [Wallet Deployment](/v3/guidelines/dapps/asset-processing/payments-processing#wallet-deployment)
3. Carry out a Jetton transfer using a hot wallet address to initialize the Jetton wallet and replenish its balance.
#### Processing withdrawals
-1. Load a list of processed Jettons.
-2. Retrieve Jetton wallet addresses for the deployed hot wallet: [How to retrieve Jetton wallet addresses for a given user](#retrieving-jetton-wallet-addresses-for-a-given-user).
+1. Load a list of processed Jettons
+2. Retrieve Jetton wallet addresses for the deployed hot wallet: [How to retrieve Jetton wallet addresses for a given user](#retrieving-jetton-wallet-addresses-for-a-given-user)
3. Retrieve Jetton master addresses for each Jetton wallet: [How to retrieve data for Jetton wallets](#retrieving-data-for-a-specific-jetton-wallet).
A `jetton` parameter is required (which is actually the address of Jetton master contract).
4. Compare the addresses from Jetton master contracts from step 1. and step 3. If the addresses do not match, then a Jetton address verification error should be reported.
@@ -464,10 +544,10 @@ See: [Jetton contracts message layouts](#jetton-contract-message-layouts)
7. Generate a [message](/v3/guidelines/dapps/asset-processing/jettons#message-0).
8. When using a highload wallet, it is recommended that a batch of messages is collected and that one batch at a time is sent to optimize fees.
9. Save the expiration time for outgoing external messages (this is the time until the wallet successfully
- processes the message, after this is completed, the wallet will no longer accept the message).
+ processes the message, after this is completed, the wallet will no longer accept the message)
10. Send a single message or more than one message (batch messaging).
11. Retrieve the list of the latest unprocessed transactions within the hot wallet account and iterate it.
- Learn more here: [Checking contract's transactions](/v3/guidelines/dapps/asset-processing/payments-processing/#checking-contracts-transactions),
+ Learn more here: [Checking contract's transactions](/develop/dapps/asset-processing/#checking-contracts-transactions),
[Tonweb example](https://github.com/toncenter/examples/blob/9f20f7104411771793dfbbdf07f0ca4860f12de2/deposits-single-wallet.js#L43) or
use the Toncenter API `/getTransactions` method.
12. Look at outgoing messages in the account.
@@ -477,7 +557,7 @@ See: [Jetton contracts message layouts](#jetton-contract-message-layouts)
the expiration time and the outgoing message with the given `query_id`
is not found, then the request should (this is optional) be marked as expired and should be safely resent.
15. Look for incoming messages in the account.
-16. If a message that uses the `excesses` op code exists, the message should be decoded and the `query_id`
+16. If a message that uses the `Excess 0xd53276db` op code exists, the message should be decoded and the `query_id`
value should be retrieved. A found `query_id` must be marked as successfully delivered.
17. Go to step 5. Expired requests that have not been successfully sent should be pushed back to the withdrawal list.