From bc021c6d9a46c2c5bc270f8563b5ee08ae615162 Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:16:45 +0200 Subject: [PATCH] feat(explorers): revamp the onboarding/explorers page, use actonscan across the docs, rework the page on traces * Adjust links in prose and cross-links * Remove redundant top and bottom margins for the Image component, and use `cn()` over direct string manipulation * Minor fix of nested elements along the way * Highlight Actonscan in selected places * Correct minor things in WalletTg --- content/applications/payments/setup.mdx | 2 +- .../standard/tokens/jettons/burn.mdx | 2 +- .../standard/tokens/jettons/comparison.mdx | 2 +- .../standard/tokens/jettons/create.mdx | 6 +- .../standard/tokens/jettons/find.mdx | 16 +- .../standard/tokens/jettons/supply-data.mdx | 50 +++--- .../standard/tokens/jettons/wallet-data.mdx | 39 ++--- .../contracts/standard/tokens/metadata.mdx | 6 +- content/contracts/standard/vesting.mdx | 11 +- .../contracts/standard/wallets/comparison.mdx | 23 ++- .../standard/wallets/telegram/contract.mdx | 20 ++- .../standard/wallets/telegram/overview.mdx | 2 +- content/contribute/snippets/overview.mdx | 2 +- content/foundations/precompiled.mdx | 2 +- content/foundations/proofs/overview.mdx | 2 +- content/foundations/system.mdx | 10 +- content/foundations/traces.mdx | 82 +++++---- content/foundations/whitepapers/tblkch.mdx | 136 +++++++-------- content/from-ethereum.mdx | 6 +- content/languages/func/dictionaries.mdx | 2 +- content/nodes/cpp/run-validator.mdx | 2 +- content/nodes/staking/single-nominator.mdx | 2 +- content/onboarding/explorers.mdx | 163 ++++++++++++++++-- content/onboarding/wallet-apps/deep-links.mdx | 86 +++++++-- content/onboarding/wallet-apps/telegram.mdx | 2 +- public/images/actonscan/nft-failure.png | Bin 0 -> 105032 bytes public/images/actonscan/nft-mint.png | Bin 0 -> 109238 bytes public/images/actonscan/overview.png | Bin 0 -> 52156 bytes public/images/actonscan/swap-result.png | Bin 0 -> 130177 bytes .../images/actonscan/usdt-get-jetton-data.png | Bin 0 -> 144641 bytes .../images/actonscan/usdt-get-wallet-data.png | Bin 0 -> 123434 bytes public/images/methods.png | Bin 73757 -> 106584 bytes .../images/tonviewer/get-wallet-data-dark.png | Bin 191655 -> 0 bytes public/images/tonviewer/get-wallet-data.png | Bin 186084 -> 0 bytes public/images/tonviewer/jetton-data-dark.png | Bin 437204 -> 0 bytes public/images/tonviewer/jetton-data.png | Bin 329094 -> 0 bytes src/components/mdx/image-zoom.tsx | 2 +- src/components/mdx/image.jsx | 17 +- src/dictionaries/custom.txt | 4 + vercel.json | 23 ++- 40 files changed, 467 insertions(+), 255 deletions(-) create mode 100644 public/images/actonscan/nft-failure.png create mode 100644 public/images/actonscan/nft-mint.png create mode 100644 public/images/actonscan/overview.png create mode 100644 public/images/actonscan/swap-result.png create mode 100644 public/images/actonscan/usdt-get-jetton-data.png create mode 100644 public/images/actonscan/usdt-get-wallet-data.png delete mode 100644 public/images/tonviewer/get-wallet-data-dark.png delete mode 100644 public/images/tonviewer/get-wallet-data.png delete mode 100644 public/images/tonviewer/jetton-data-dark.png delete mode 100644 public/images/tonviewer/jetton-data.png diff --git a/content/applications/payments/setup.mdx b/content/applications/payments/setup.mdx index 41df759ad..b43498c45 100644 --- a/content/applications/payments/setup.mdx +++ b/content/applications/payments/setup.mdx @@ -456,4 +456,4 @@ docker compose up -d payment-processor - [Guide for running a liteserver](/nodes/cpp/run-liteserver) - [Liteserver proof verification](/foundations/proofs/verifying-liteserver-proofs) -[usdt]: https://tonscan.org/jetton/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs +[usdt]: https://actonscan.com/address/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?network=mainnet diff --git a/content/contracts/standard/tokens/jettons/burn.mdx b/content/contracts/standard/tokens/jettons/burn.mdx index 42901395e..2cc26aae2 100644 --- a/content/contracts/standard/tokens/jettons/burn.mdx +++ b/content/contracts/standard/tokens/jettons/burn.mdx @@ -22,7 +22,7 @@ To burn Jettons manually, use a web service, for example [TON Minter](https://mi ## Another approach -An alternative way to burn tokens is to send them to a ["zero" account](https://tonscan.org/UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKZ), see [How to transfer](/contracts/standard/tokens/jettons/transfer) page. A wallet app can be used for this. +An alternative way to burn tokens is to send them to a ["zero" account](https://actonscan.com/address/UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKZ?network=mainnet), see [How to transfer](/contracts/standard/tokens/jettons/transfer) page. A wallet app can be used for this. ## Programmatically diff --git a/content/contracts/standard/tokens/jettons/comparison.mdx b/content/contracts/standard/tokens/jettons/comparison.mdx index cebc0e7f9..2f30220b5 100644 --- a/content/contracts/standard/tokens/jettons/comparison.mdx +++ b/content/contracts/standard/tokens/jettons/comparison.mdx @@ -38,7 +38,7 @@ With the USDT release on TON, an advanced version of the Jetton contract was dev Another noticeable advantage of this implementation is extensive testing. All previous versions did not test edge cases of config changes that will affect storage or forward fees. This test suite became the foundation for all future Jetton versions. - On TON, multiple jettons can share the same name — a counterfeit jetton may look identical to the real USDT but have no value. Verify legitimacy by confirming [USDT's jetton master address](https://tonscan.org/jetton/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs). + On TON, multiple jettons can share the same name — a counterfeit jetton may look identical to the real USDT but have no value. Verify legitimacy by confirming [USDT's jetton master address](https://actonscan.com/address/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?network=mainnet). See important [recommendations when processing jettons](/applications/payments/jettons#security-considerations). diff --git a/content/contracts/standard/tokens/jettons/create.mdx b/content/contracts/standard/tokens/jettons/create.mdx index b1b618422..632d3c462 100644 --- a/content/contracts/standard/tokens/jettons/create.mdx +++ b/content/contracts/standard/tokens/jettons/create.mdx @@ -7,7 +7,7 @@ Jettons (Fungible Tokens, FTs) serve as TON's counterpart to Ethereum's ERC-20 t Unlike ERC-20 tokens, jettons use the [contract sharding](/contracts/techniques/contract-sharding) approach and are split into two contracts: a master (minter) contract and a wallet contract. The jetton minter stores key jetton data, such as the owner's address and total supply, while provisioning jetton wallets for each TON wallet holder. Deploying a new jetton means deploying the jetton minter contract. -For example, USDT on TON is implemented as a jetton, and its minter contract address is [`EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs`](https://tonscan.org/jetton/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs). +For example, USDT on TON is implemented as a jetton, and its minter contract address is [`EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs`](https://actonscan.com/address/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?network=mainnet). This guide creates a jetton project from the Acton `jetton` template, edits the metadata, deploys the jetton minter, and runs common post-deployment operations. @@ -236,7 +236,7 @@ acton run jetton-info --fork-net testnet The expected output includes total supply, admin address, metadata fields, and the owner (admin) jetton wallet address. -Alternatively, enter the `JETTON_MINTER_ADDRESS` value to any of the [TON explorers](/onboarding/explorers). +Alternatively, enter the `JETTON_MINTER_ADDRESS` value to a [TON explorer](/onboarding/explorers). #### Mint jettons @@ -292,7 +292,7 @@ Use the following script aliases to run optional follow-up actions after the ini | (dangerous) `jetton-claim-admin` | Claim pending admin status from the new admin wallet. | `JETTON_MINTER_ADDRESS` | | (dangerous) `jetton-change-metadata` | Update jetton metadata. | `JETTON_MINTER_ADDRESS` and [metadata variables](#3-configure-metadata) | -Once the jetton is deployed to mainnet, its metadata is correct, and its supply is capped, it is good practice to revoke ownership, i.e., transfer the admin rights to the so-called [_burn address_ on mainnet](https://tonscan.org/address/UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKZ). It is one of the requirements for listing on some popular [DEXes](/foundations/glossary#decentralized-exchange-dex). +Once the jetton is deployed to mainnet, its metadata is correct, and its supply is capped, it is good practice to revoke ownership, i.e., transfer the admin rights to the so-called [_burn address_ (or _zero address_) on mainnet](https://actonscan.com/address/UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKZ?network=mainnet). It is one of the requirements for listing on some popular [DEXes](/foundations/glossary#decentralized-exchange-dex). ```bash JETTON_NEW_ADMIN_ADDRESS=UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKZ \ diff --git a/content/contracts/standard/tokens/jettons/find.mdx b/content/contracts/standard/tokens/jettons/find.mdx index 6b2efa68e..5b702f520 100644 --- a/content/contracts/standard/tokens/jettons/find.mdx +++ b/content/contracts/standard/tokens/jettons/find.mdx @@ -81,18 +81,12 @@ const jettonWalletAddress = contractAddress(BASECHAIN, jettonWalletStateInit); console.log(jettonWalletAddress.toString()); ``` -{/* TODO(an explorer that supports calling get methods): +Additionally, one can use [blockchain explorers](/onboarding/explorers) to call a contract's get methods without writing any code. For example, inspect the [Tether USD (USDT)](https://actonscan.com/address/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?network=mainnet#get-methods) master (minter) contract page: calling `get_wallet_address()` with the owner's TON wallet address yields the USDT jetton wallet address for that owner. - There are also various web services that allow you to call contract's get methods without writing any code. - For example, let's inspect the [Tether USD](https://tonviewer.com/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?section=method) master - contract page on Tonviewer. Inserting the owner's address in any format and executing the get method, you obtain the Jetton wallet address. - - Tether USDT master contract - - */} + alt="Tether USDT master contract get-methods list" +/> -Finally, you can use [API v3 endpoints](/api/v3/overview#endpoints). +Finally, one can use [API v3 endpoints](/api/v3/overview#endpoints). diff --git a/content/contracts/standard/tokens/jettons/supply-data.mdx b/content/contracts/standard/tokens/jettons/supply-data.mdx index 9210a38cb..983b081f4 100644 --- a/content/contracts/standard/tokens/jettons/supply-data.mdx +++ b/content/contracts/standard/tokens/jettons/supply-data.mdx @@ -3,7 +3,7 @@ title: "How to get jetton supply data" sidebarTitle: "Get jetton supply data" --- -To retrieve specific Jetton data, use the Jetton master contract's `get_jetton_data()` method. +To retrieve jetton-specific data, use the jetton master contract's `get_jetton_data()` method. This method returns the following data: @@ -15,45 +15,45 @@ This method returns the following data: | `jetton_content` | `Cell` | data formatted according to [TEP-64](https://github.com/ton-blockchain/TEPs/blob/master/text/0064-token-data-standard.md) | | `jetton_wallet_code` | `Cell` | a code of the corresponding Jetton wallet | -You can call the `get_jetton_data()` method from your favorite IDE: +Call the `get_jetton_data()` method from TypeScript by using an API wrapper in `@ton/ton`: -```javascript -import { TonClient, Address } from "@ton/ton" +```ts +import { TonClient, Address } from "@ton/ton"; async function main() { - const client = new TonClient({ + const client = new TonClient({ endpoint: 'https://toncenter.com/api/v2/jsonRPC', - }); - - const JettonMasterAddress = Address + }); + const JettonMasterAddress = Address .parse('0:b113a994b5024a16719f69139328eb759596c38a25f59028b146fecdc3621dfe'); - const data = await client.runMethod(JettonMasterAddress, - 'get_jetton_data'); - - const Stack = data.stack; + const data = await client.runMethod(JettonMasterAddress, 'get_jetton_data'); + const Stack = data.stack; - console.log(Stack.readNumber()); // Total supply + // Total supply + console.log(Stack.readNumber()); - console.log(Stack.readNumber()); // mintable + // Mintable flag + console.log(Stack.readNumber()); - console.log(Stack.readAddress().toString()); // Admin address + // Admin address + console.log(Stack.readAddress().toString()); - console.log(Stack.readCell()); // jetton_content + // jetton_content + console.log(Stack.readCell()); - console.log(Stack.readCell()) // jetton_wallet_code + // jetton_wallet_code + console.log(Stack.readCell()); } void main(); ``` -{/* TODO(an explorer that supports calling get methods): - - Or call it through an [explorer](https://tonviewer.com/EQDmVdCZ2SALvyfCDVlPLr0hoPhUxgjNFtTAxemz9V_C5wbN?section=method): +Or [call it](https://actonscan.com/address/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?network=mainnet#get-methods) through a [blockchain explorer](/onboarding/explorers): - */} + -Finally, you can get this information using the [API](/api/overview). +Finally, one can obtain this information by directly using the [APIs](/api/overview). diff --git a/content/contracts/standard/tokens/jettons/wallet-data.mdx b/content/contracts/standard/tokens/jettons/wallet-data.mdx index 301d69310..980a95a45 100644 --- a/content/contracts/standard/tokens/jettons/wallet-data.mdx +++ b/content/contracts/standard/tokens/jettons/wallet-data.mdx @@ -3,7 +3,7 @@ title: "How to get jetton wallet data" sidebarTitle: "Get jetton wallet data" --- -To retrieve the Jetton wallet's account jetton amount, owner identification information, and other details related to a specific Jetton wallet contract, use the `get_wallet_data()` [get method](/foundations/messages/overview) within the Jetton wallet contract. +To retrieve the jetton wallet's account jetton amount, owner identification information, and other details related to a specific Jetton wallet contract, use the `get_wallet_data()` [get method](/foundations/messages/overview) on the jetton wallet contract. This method returns the following data: @@ -14,7 +14,7 @@ This method returns the following data: | `jetton_master_address` | `MsgAddress` | the address of the Jetton master contract | | `jetton_wallet_code` | `Cell` | a code of the Jetton wallet | -You can call the `get_wallet_data()` method from your favorite IDE: +Call the `get_wallet_data()` method from TypeScript by using an API wrapper in `@ton/ton`: ```javascript import { Address, TonClient } from "@ton/ton"; @@ -23,36 +23,33 @@ async function main() { const client = new TonClient({ endpoint: "https://toncenter.com/api/v2/jsonRPC", }); - - const JettonwalletAddress = Address.parse( - "EQDmVdCZ2SALvyfCDVlPLr0hoPhUxgjNFtTAxemz9V_C5wbN", - ); + const JettonwalletAddress = Address + .parse("EQDmVdCZ2SALvyfCDVlPLr0hoPhUxgjNFtTAxemz9V_C5wbN"); const data = await client.runMethod(JettonwalletAddress, "get_wallet_data"); - const Stack = data.stack; - console.log("Balance in nano tokens: ", Stack.readNumber()); + // Balance + console.log("Balance in nano tokens: ", Stack.readNumber()); - // wallet address - console.log("Owner: ", Stack.readAddress().toString({ bounceable: false })); + // TON wallet's address of the owner of this jetton wallet + console.log("Owner: ", Stack.readAddress().toString({ bounceable: false })); - console.log("Jetton Master address: ", Stack.readAddress().toString()); + // Jetton master (minter) address + console.log("Jetton master address: ", Stack.readAddress().toString()); - // default BoC encoding in viewers - console.log("Jetton Wallet code: ", Stack.readCell().toBoc().toString('hex')); + // jetton_wallet_code + console.log("Jetton wallet code: ", Stack.readCell().toBoc().toString('hex')); } void main(); ``` -{/* TODO(an explorer that supports calling get methods): - - Or call it through an [explorer](https://tonviewer.com/EQDmVdCZ2SALvyfCDVlPLr0hoPhUxgjNFtTAxemz9V_C5wbN?section=method): +Or [call it](https://actonscan.com/address/EQDmVdCZ2SALvyfCDVlPLr0hoPhUxgjNFtTAxemz9V_C5wbN?network=mainnet#get-methods) through a [blockchain explorer](/onboarding/explorers): - */} + -Finally, you can get this information using the [API](https://toncenter.com/api/v3/jetton/wallets). +Finally, one can obtain this information by directly using the [APIs](/api/overview). diff --git a/content/contracts/standard/tokens/metadata.mdx b/content/contracts/standard/tokens/metadata.mdx index 7d8e6f485..9a49a7400 100644 --- a/content/contracts/standard/tokens/metadata.mdx +++ b/content/contracts/standard/tokens/metadata.mdx @@ -217,11 +217,11 @@ Read known attributes such as `uri`, `name`, `image`, `description`, and `image_ Examples: -On-chain NFT: [`EQBq5z4N_GeJyBdvNh4tPjMpSkA08p8vWyiAX6LNbr3aLjI0`](https://tonscan.org/EQBq5z4N_GeJyBdvNh4tPjMpSkA08p8vWyiAX6LNbr3aLjI0) +On-chain NFT: [`EQBq5z4N_GeJyBdvNh4tPjMpSkA08p8vWyiAX6LNbr3aLjI0`](https://actonscan.com/address/EQBq5z4N_GeJyBdvNh4tPjMpSkA08p8vWyiAX6LNbr3aLjI0?network=mainnet) -Semi-chain NFT: [`EQB2NJFK0H5OxJTgyQbej0fy5zuicZAXk2vFZEDrqbQ_n5YW`](https://tonscan.org/EQB2NJFK0H5OxJTgyQbej0fy5zuicZAXk2vFZEDrqbQ_n5YW) +Semi-chain NFT: [`EQB2NJFK0H5OxJTgyQbej0fy5zuicZAXk2vFZEDrqbQ_n5YW`](https://actonscan.com/address/EQB2NJFK0H5OxJTgyQbej0fy5zuicZAXk2vFZEDrqbQ_n5YW?network=mainnet) -On-chain jetton master: [`EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs`](https://tonscan.org/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs) +On-chain jetton master: [`EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs`](https://actonscan.com/address/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?network=mainnet) ## How to parse diff --git a/content/contracts/standard/vesting.mdx b/content/contracts/standard/vesting.mdx index 7d8c2137a..521a4b75f 100644 --- a/content/contracts/standard/vesting.mdx +++ b/content/contracts/standard/vesting.mdx @@ -395,11 +395,10 @@ To verify: ## See also -- [Vesting contract source code](https://github.com/ton-blockchain/vesting-contract) -- [Vesting contract technical documentation](https://github.com/ton-blockchain/vesting-contract/blob/main/README.md) -- [Vesting contract instruction (old and low level)](https://github.com/ton-blockchain/vesting-contract/blob/main/instruction.md) - single-nominator-pool#run-a-single-nominator-pool-with-a-vesting-contract) -- [Standard wallets documentation](/contracts/standard/wallets/history) -- [Staking organization scenarios on TON](/nodes/staking/overview) +- [Vesting contract source code, GitHub](https://github.com/ton-blockchain/vesting-contract) +- [Vesting contract technical documentation, GitHub](https://github.com/ton-blockchain/vesting-contract/blob/main/README.md) +- [Vesting contract instruction (old and low level), GitHub](https://github.com/ton-blockchain/vesting-contract/blob/main/instruction.md) +- [History of standard wallets](/contracts/standard/wallets/history) +- [Staking scenarios on TON](/nodes/staking/overview) [block explorer]: /onboarding/explorers diff --git a/content/contracts/standard/wallets/comparison.mdx b/content/contracts/standard/wallets/comparison.mdx index df16e6392..66e652cf4 100644 --- a/content/contracts/standard/wallets/comparison.mdx +++ b/content/contracts/standard/wallets/comparison.mdx @@ -6,18 +6,17 @@ title: "Wallets comparison" ## Comparison table -| Feature | [V4](/contracts/standard/wallets/v4) | [V5](/contracts/standard/wallets/v5) | [WalletTg](/contracts/standard/wallets/telegram/overview) | [Highload v3](/contracts/standard/wallets/highload/overview) | [Preprocessed v2](/contracts/standard/wallets/preprocessed-v2/specification) | Multisig | -| ------------------------------- | ------------------------------------ | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------- | -| **Seqno1 based** | ✅ Yes | ✅ Yes | ✅ Yes | ❌ No (`query_id` based) | ✅ Yes | Contract-specific | -| **Messages per request/batch** | Up to 4 per request | Up to 255 per request | Up to 255 per request | Up to 254 per batch | Up to 255 per request | Contract-specific | -| **Query-ID capacity** | — | — | — | 8,380,416 possible values4 | — | Contract-specific | -| **Multi-owner** | ❌ No | ❌ No | ❌ No | ❌ No | ❌ No | ✅ Yes | -| **Message cost** | Standard | Standard; optimized for more messages per request | Lower for up to 5 messages per request, then Standard | Lower; depends on batch size | Lowest3 | Contract-specific; signatures add verification work | -| **Support plugins** | ✅ Yes | ✅ Yes | ❌ No | ❌ No | ❌ No | ❌ No | -| **Support gasless2** | ❌ No | ✅ Yes | ✅ Yes; [relay is required](/contracts/standard/wallets/telegram/interact#relay-gasless-requests) | ❌ No built-in support | ❌ No built-in support | Contract-specific | -| **Subwallet ID** | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes | ❌ No | Contract-specific | -| **Signing-key rotation** | ❌ No | ❌ No | ✅ Yes; [address stays the same](/contracts/standard/wallets/telegram/overview#two-key-rotation-architecture) | ❌ No | ❌ No | Contract-specific | -| **Implementation** | Per-account code | Per-account code | Trampoline; shared implementation code in validator-governed config | Per-account code | Per-account code | Contract-specific | +| Feature | [V5](/contracts/standard/wallets/v5) | [V4](/contracts/standard/wallets/v4) | [WalletTg](/contracts/standard/wallets/telegram/overview) | [Highload v3](/contracts/standard/wallets/highload/overview) | [Preprocessed v2](/contracts/standard/wallets/preprocessed-v2/specification) | Multisig | +| ------------------------------- | ------------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------- | ----------------------------------------- | +| **Seqno1 based** | ✅ Yes | ✅ Yes | ✅ Yes | ❌ No (`query_id` based) | ✅ Yes | Contract-specific | +| **Messages per request/batch** | Up to 255 per request | Up to 4 per request | Up to 255 per request | Up to 254 per batch | Up to 255 per request | Contract-specific | +| **Query-ID capacity** | — | — | — | 8,380,416 possible values4 | — | Contract-specific | +| **Multi-owner** | ❌ No | ❌ No | ❌ No | ❌ No | ❌ No | ✅ Yes | +| **Message cost** | Standard; optimized for more messages per request | Standard | Lower for up to 5 messages per request, then Standard | Lower; depends on batch size | Lowest3 | Higher; depends on a number of signatures | +| **Support plugins** | ✅ Yes | ✅ Yes | ❌ No | ❌ No | ❌ No | ❌ No | +| **Support gasless2** | ✅ Yes | ❌ No | ✅ Yes; [relay is required](/contracts/standard/wallets/telegram/interact#relay-gasless-requests) | ❌ No built-in support | ❌ No built-in support | Contract-specific | +| **Subwallet ID** | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes | ❌ No | Contract-specific | +| **Signing-key rotation** | ❌ No | ❌ No | ✅ Yes; [address stays the same](/contracts/standard/wallets/telegram/overview#two-key-rotation-architecture) | ❌ No | ❌ No | Contract-specific | 1 A sequence number (`seqno`) is a stored counter used for replay protection. Request-consumption behavior varies by contract.
2 A gasless request lets a relayer submit an owner-authorized request. WalletTg requires enough attached Gram for compute; its existing balance can fund outgoing values and fees. The contract does not provide a relayer service.
diff --git a/content/contracts/standard/wallets/telegram/contract.mdx b/content/contracts/standard/wallets/telegram/contract.mdx index c68373be2..0ab6738f4 100644 --- a/content/contracts/standard/wallets/telegram/contract.mdx +++ b/content/contracts/standard/wallets/telegram/contract.mdx @@ -3,7 +3,7 @@ title: "WalletTg code and storage" sidebarTitle: "Code and storage" --- -Every deployed wallet stores an immutable _trampoline_ code. The trampoline code hash is `9149AE51C1E4689710CEBF7830297B16ACFBADB363A920A537893E7FFEECA768`. It is the root-cell hash of [`WalletTrampoline.boc`](https://github.com/ton-blockchain/tg-wallet-contract/blob/1a29ae5d90e03c3d585d3e42e6ecef691d727a3c/contracts/WalletTrampoline.boc). +Every deployed wallet stores an immutable _trampoline_ code. The trampoline code hash is `9149AE51C1E4689710CEBF7830297B16ACFBADB363A920A537893E7FFEECA768`. It is the root-cell hash of [`WalletTrampoline.boc`](https://github.com/ton-blockchain/tg-wallet-contract/blob/rev00/contracts/WalletTrampoline.boc). ## Trampoline @@ -26,7 +26,13 @@ JMPX // ... jump to WalletTg code to process // or a getter call ``` -Validators can change the [active shared implementation](https://actonscan.com/config?network=mainnet#config-parameter--123) by voting. Every mainnet WalletTg account uses this implementation — a wallet owner cannot pin a version, change the code, or opt out of code updates. +## Active implementation + +Validators can change the active shared implementation in [config param `-123`](https://actonscan.com/config?network=mainnet#config-parameter--123) by voting. Every mainnet WalletTg account uses this implementation — a wallet owner cannot pin a version, change the code, or opt out of code updates. + +- Latest revision: [`rev00` tag in GitHub](https://github.com/ton-blockchain/tg-wallet-contract/tree/rev00). +- Revision code hash: `e30911420bef1191c09dce58b9df2b4ca4c2d9c383cc3b6a91170349ffa70e2c`. +- Source: [`WalletTg.tolk`](https://github.com/ton-blockchain/tg-wallet-contract/blob/rev00/contracts/WalletTg/WalletTg.tolk). ## Initial state @@ -66,7 +72,7 @@ After rotation, the `get_public_key()` getter returns the active signing key, no See [request failure behavior](/contracts/standard/wallets/telegram/messages#failure-and-sequence-number-behavior) for external-send commit timing. -Revision 0 stores prefix `0x00`, has no old layouts in `UnionOfOldStorages`, and uses a no-op `runMigrationAndUpdateC4()`. Later revisions must preserve prior layouts and define migrations to the current schema. The [migration rules](https://github.com/ton-blockchain/tg-wallet-contract/blob/1a29ae5d90e03c3d585d3e42e6ecef691d727a3c/MIGRATION.md) also require existing messages and getters to remain compatible as new ones are added. +Revision 0 stores prefix `0x00`, has no old layouts in `UnionOfOldStorages`, and uses a no-op `runMigrationAndUpdateC4()`. Later revisions must preserve prior layouts and define migrations to the current schema. The [migration rules](https://github.com/ton-blockchain/tg-wallet-contract/blob/rev00/MIGRATION.md) also require existing messages and getters to remain compatible as new ones are added. The call to a `revision()` get-method can report an older storage revision while the account already executes newer shared code. It does not identify the active implementation. @@ -75,7 +81,7 @@ Revision 0 stores prefix `0x00`, has no old layouts in `UnionOfOldStorages`, and ## Source files - [WalletTg repository on GitHub](https://github.com/ton-blockchain/tg-wallet-contract): - - [trampoline assembly](https://github.com/ton-blockchain/tg-wallet-contract/blob/1a29ae5d90e03c3d585d3e42e6ecef691d727a3c/contracts/WalletTrampoline.fif), - - [shared implementation](https://github.com/ton-blockchain/tg-wallet-contract/blob/1a29ae5d90e03c3d585d3e42e6ecef691d727a3c/contracts/WalletTg/WalletTg.tolk), - - [storage](https://github.com/ton-blockchain/tg-wallet-contract/blob/1a29ae5d90e03c3d585d3e42e6ecef691d727a3c/contracts/WalletTg/storage.tolk), - - [migration code](https://github.com/ton-blockchain/tg-wallet-contract/blob/1a29ae5d90e03c3d585d3e42e6ecef691d727a3c/contracts/WalletTg/migration.tolk) + - [trampoline assembly](https://github.com/ton-blockchain/tg-wallet-contract/blob/rev00/contracts/WalletTrampoline.fif), + - [shared implementation](https://github.com/ton-blockchain/tg-wallet-contract/blob/rev00/contracts/WalletTg/WalletTg.tolk), + - [storage](https://github.com/ton-blockchain/tg-wallet-contract/blob/rev00/contracts/WalletTg/storage.tolk), + - [migration code](https://github.com/ton-blockchain/tg-wallet-contract/blob/rev00/contracts/WalletTg/migration.tolk) diff --git a/content/contracts/standard/wallets/telegram/overview.mdx b/content/contracts/standard/wallets/telegram/overview.mdx index 64f2a196c..fa8c5274b 100644 --- a/content/contracts/standard/wallets/telegram/overview.mdx +++ b/content/contracts/standard/wallets/telegram/overview.mdx @@ -3,7 +3,7 @@ title: "WalletTg: Telegram wallet contract" sidebarTitle: "Overview" --- -WalletTg is the TON wallet contract used by [Telegram's native Gram wallet](/onboarding/wallet-apps/telegram). +WalletTg (`tg-wallet`, TgWallet, or Telegram Wallet) is the TON wallet contract used by [Telegram's native Gram wallet](/onboarding/wallet-apps/telegram). ## Features diff --git a/content/contribute/snippets/overview.mdx b/content/contribute/snippets/overview.mdx index ade9da105..d593290ed 100644 --- a/content/contribute/snippets/overview.mdx +++ b/content/contribute/snippets/overview.mdx @@ -158,7 +158,7 @@ When explaining a complex topic or writing a tutorial, use concise diagrams to c href="https://www.mintlify.com/docs/components/mermaid-diagrams" horizontal="true" > - Use code blocks with [Mermaid.js](https://mermaid.js.org/) syntax to create flowcharts, sequence diagrams, and more. + Use code blocks with `Mermaid.js` syntax to create flowcharts, sequence diagrams, and more. ### Do not use diff --git a/content/foundations/precompiled.mdx b/content/foundations/precompiled.mdx index acc96205f..59ee26183 100644 --- a/content/foundations/precompiled.mdx +++ b/content/foundations/precompiled.mdx @@ -17,7 +17,7 @@ _ PrecompiledContractsConfig = ConfigParam 45; The `list:(HashmapE 256 PrecompiledSmc)` represents a mapping of contract code hash to constant gas amount. A contract is considered precompiled if its code hash exists in this map. - View current values on mainnet in [ConfigParam 45](https://tonscan.org/config#45). + View current values on mainnet in [ConfigParam 45](https://actonscan.com/config?network=mainnet#config-parameter-45). ## Accessing precompiled gas value diff --git a/content/foundations/proofs/overview.mdx b/content/foundations/proofs/overview.mdx index ba6056256..41a80d632 100644 --- a/content/foundations/proofs/overview.mdx +++ b/content/foundations/proofs/overview.mdx @@ -72,7 +72,7 @@ masterchain_block_extra#cca5 The `shard_hashes` field is essential, as it holds the latest known shardchain blocks, which are critical for basechain proofs. -For detailed inspections, it is convenient to use the [official explorer](https://explorer.toncoin.org/). +For detailed inspections, it is convenient to use either [low-level TON explorer](https://explorer.toncoin.org/) or [Actonscan](https://actonscan.com/blocks?network=mainnet). ## High-level overview of proofs diff --git a/content/foundations/system.mdx b/content/foundations/system.mdx index 8c0d31578..34aa0f103 100644 --- a/content/foundations/system.mdx +++ b/content/foundations/system.mdx @@ -7,7 +7,7 @@ title: "System contracts" - System contracts are smart contracts and have on-chain addresses. See [config parameters 1–4](https://tonscan.org/config). The Config account stores the Config contract address. To track changes, review proposals to the Config contract. + System contracts are smart contracts and have on-chain addresses. See [config parameters 1–4](https://actonscan.com/config?network=mainnet). The Config account stores the Config contract address. To track changes, review proposals to the Config contract. In TON, a set of special smart contracts controls consensus parameters for node operation — including TVM, catchain, fees, and chain topology — and how these parameters are stored and updated. Unlike older blockchains that hardcode these parameters, TON enables transparent on-chain governance. The current governance contracts include the **Elector** and **Config** contracts, with expansion plans (for example, the extra-currency **Minter**). Their source code is in the [governance contract repository](https://github.com/ton-blockchain/governance-contract). @@ -24,7 +24,7 @@ The Elector stores: - Non-withdrawn Gram in the `credits` hashmap. - New validator applications in the `elect` hashmap. -- Past election data in the `past_elections` hashmap (including complaints and `frozen` stakes held for `stake_held_for` periods, defined in [**ConfigParam 15**](https://tonscan.org/config#15)). +- Past election data in the `past_elections` hashmap (including complaints and `frozen` stakes held for `stake_held_for` periods, defined in [**ConfigParam 15**](https://actonscan.com/config?network=mainnet#config-parameter-15)). ### Key functions @@ -47,9 +47,9 @@ The Elector is a special smart contract triggered by **Tick and Tock transaction **Process details:** -- Take applications with stake ≥ `min_stake` ([**ConfigParam 17**](https://tonscan.org/config#17)). +- Take applications with stake ≥ `min_stake` ([**ConfigParam 17**](https://actonscan.com/config?network=mainnet#config-parameter-17)). - Arrange candidates by stake in descending order. -- If applicants exceed `max_validators` ([**ConfigParam 16**](https://tonscan.org/config#16)), discard the lowest-staked candidates. +- If applicants exceed `max_validators` ([**ConfigParam 16**](https://actonscan.com/config?network=mainnet#config-parameter-16)), discard the lowest-staked candidates. - For each subset size `i` (from 1 to remaining candidates): - Assume the `i`-th candidate (lowest in the subset) defines the baseline. - Calculate effective stake (`true_stake`) for each `j`-th candidate (`j < i`) as: @@ -101,7 +101,7 @@ To report misbehavior, a user must: The Elector registers the complaint in the `past_elections` hashmap. Current round validators then verify the complaint. If the proof is valid and the proposed fine aligns with the severity of the misbehavior, validators vote on the complaint. Approval requires agreement from over **two-thirds of the total validator weight** (not just a majority of participants). -The fine is deducted from the validator's `frozen` stake in the relevant `past_elections` record if approved. These funds stay locked for the period defined by [**ConfigParam 15**](https://tonscan.org/config#15) (`stake_held_for`). +The fine is deducted from the validator's `frozen` stake in the relevant `past_elections` record if approved. These funds stay locked for the period defined by [**ConfigParam 15**](https://actonscan.com/config?network=mainnet#config-parameter-15) (`stake_held_for`). #### Distributing rewards diff --git a/content/foundations/traces.mdx b/content/foundations/traces.mdx index e7b39b45f..effb5675f 100644 --- a/content/foundations/traces.mdx +++ b/content/foundations/traces.mdx @@ -2,47 +2,58 @@ title: "Traces" --- -A trace is a partially ordered set of messages. This set includes all dependent messages. In other words, if message B was sent while message A was being processed, then both of these messages belong to exactly one trace. Strictly speaking, this set is partially ordered according to the causal relation “A is sent as a result of processing B.” +A _trace_ is a partially ordered set of messages according to the causal relation: "`A` is sent as a result of processing `B`". This set includes all dependent messages and related transactions. A trace can span several accounts and blocks. -When drawing a trace, messages are usually drawn on the edges, and the addresses of the accounts to which the messages are sent are drawn at the vertices. Transactions that occurred on the account at that moment in time are also usually signed at the vertex. +In other words, if message `B` was sent while message `A` was being processed, then both of these messages belong to exactly **one** trace. -### Start of the trace +## Start of the trace -Most often, a trace begins with an [external message](/foundations/messages/external-in). It is the first one, since there is no message that could generate an external-in. However, trace may be started not only by external messages but also by [tick-tock transactions](/foundations/messages/overview#transactions), commonly used within TON Blockchain [system contracts](/foundations/system). Traces can also start with split and merge transactions, but since they are not currently implemented, this will not occur in a real network. +Most traces begin with an [external-in message](/foundations/messages/external-in) to a wallet contract, triggering a wallet transaction. -
- Trace diagram -
+Messages connect transactions into causally related branches of a trace -As a result, messages in the trace are partially ordered by their [logical time (lt)](/foundations/whitepapers/tblkch#141-logical-time), reflecting their logical dependencies. The diagram shows transactions on independent accounts, each triggered by an incoming message, with `lt` values indicated for every message. It is important to note that in the network in general, lt is formed as follows: +[Tick-tock transactions](/foundations/messages/overview#transactions) can also start traces. These [election system-triggered](/foundations/system#elector) events do not have an incoming message. -- lt transactions = lt incoming message + 1 -- lt outgoing message = lt transaction + outgoing message index - This scheme is not applicable to the first vertex if the trace is started by special transactions mentioned above, as in that case there is no `incoming message` for the first vertex. + + In explorers, traces that start with a tick-tock transaction are often marked as initiated by the blockchain protocol. + Traces with logical time -## Representation in explorers +## Logical time -In explorers, traces are visualized as [directed acyclic graphs (DAGs)](https://en.wikipedia.org/wiki/Directed_acyclic_graph), where _transactions are nodes_ and _messages are edges_, showing the full sequence of account state changes. +Transactions and messages in a trace are ordered by [logical time (or `lt`)](/foundations/whitepapers/tblkch#1-4-1-logical-time), a non-negative 64-bit integer representing each event in a logically-dependent event sequence. The first event in a trace has the smallest `lt` value. -## Examples + + Logical time is **not** the elapsed wall-clock time. + + +A transaction receiving an internal message has a logical time greater than that message's creation time, and less than the logical times of its outgoing messages. + +A receiving transaction's `lt` is not necessarily the incoming message's `lt` plus one: account history and the block's logical-time constraints also affect its assignment. + +Example logical-time assignments along the branches of a trace -The NFT transfer illustrates a single operation that consists of multiple messages. + + The [first produced masterchain block](https://actonscan.com/block/-1/8000000000000000/1?network=mainnet) has the `lt` of `1,000,000`. + -{/* TODO: To learn how to read traces, follow [this article](/explorers/tonviewer#steps-to-read-a-trace). */} +## Representation in explorers -This trace is started with an external message and [can be inspected](https://tonscan.org/tx/47d0989633fc03ff3fdca05880ab5760d0321c196501a6a4cbb5578dea2624cb#details): +Explorers visualize traces as [directed acyclic graphs (DAGs)](https://en.wikipedia.org/wiki/Directed_acyclic_graph), showing the full sequence of account state changes. Transactions appear as _nodes_ associated with accounts, and messages connect them as _edges_. The same account can have several transactions in one trace. NFT transfer trace -Here is the [example](https://tonscan.org/tx/9effb91e18be732033fe6aa8c39941f26f5e9566848bc487aa7c6bfecdd9d89d#details) of the trace that started with tick-tock transaction: +Explorers may display a partial trace if some messages or related transactions are unavailable or currently inaccessible from the [indexer](/api/v3/overview). -Trace initiated by tick-tock transaction + + Successful execution of an individual transaction in a trace does not by itself establish the success of the whole operation. Higher-level summaries given by explorers are interpretations of the trace data. + + +## Examples + +See the [explorers overview](/onboarding/explorers) page for practical examples on how to: + +- [read a trace](/onboarding/explorers#read-a-trace), +- or [investigate a failed operation](/onboarding/explorers#investigate-a-failed-operation). ## Access using API -To fetch traces data, use the [`GET /traces`](/api/v3/actions-and-traces/get-traces) endpoint. This method allows finding a trace if any of its parameters are known. +Use the [`GET /traces`](/api/v3/actions-and-traces/get-traces) endpoint to retrieve traces. It can filter and locate traces by related accounts or time ranges. diff --git a/content/foundations/whitepapers/tblkch.mdx b/content/foundations/whitepapers/tblkch.mdx index c7a28393e..9997f917f 100644 --- a/content/foundations/whitepapers/tblkch.mdx +++ b/content/foundations/whitepapers/tblkch.mdx @@ -47,7 +47,7 @@ The above is particularly applicable to the blocks and state of the TON Blockcha ### 1.1.3. The layout of a single cell -Each single cell consists of up to 1023 data bits and up to four references to other cells. When a cell is kept in memory, its exact representation is implementation-dependent. However, there is a standard representation of cells, useful for instance, for serializing cells for file storage or network transmission. +Each single cell consists of up to 1023 data bits and up to four references to other cells. When a cell is kept in memory, its exact representation is implementation-dependent. However, there is a standard representation of cells, useful for instance, for serializing cells for file storage or network transmission. This "standard representation" or "standard layout" $\text{CellRepr}(c)$ of a cell $c$ consists of the following: - Two *descriptor bytes* come first, sometimes denoted by $d_1$ and $d_2$. The first of these bytes $d_1$ equals (in the simplest case) the number of references $0\leq r\leq 4$ in the cell. The second descriptor byte $d_2$ encodes the bit length $l$ of the data part of the cell as follows: the first seven bits of $d_2$ equal $\lfloor l/8\rfloor$, the number of complete data bytes present in the cell, while the last bit of $d_2$ is the *completion tag*, equal to one if $l$ is not divisible by eight. Therefore, @@ -928,12 +928,12 @@ The serialization of source and destination addresses is defined by the followin ``` addr_none$00 = MsgAddressExt; -addr_extern$01 len:(## 9) external_address:(len * Bit) +addr_extern$01 len:(## 9) external_address:(len * Bit) = MsgAddressExt; anycast_info$_ depth:(## 5) rewrite_pfx:(depth * Bit) = Anycast; -addr_std$10 anycast:(Maybe Anycast) +addr_std$10 anycast:(Maybe Anycast) workchain_id:int8 address:uint256 = MsgAddressInt; -addr_var$11 anycast:(Maybe Anycast) addr_len:(## 9) +addr_var$11 anycast:(Maybe Anycast) addr_len:(## 9) workchain_id:int32 address:(addr_len * Bit) = MsgAddressInt; _ MsgAddressInt = MsgAddress; _ MsgAddressExt = MsgAddress; @@ -960,7 +960,7 @@ Amounts of Grams are expressed with the aid of two types representing variable-l ``` var_uint$_ {n:#} len:(#< n) value:(uint (len * 8)) = VarUInteger n; -var_int$_ {n:#} len:(#< n) value:(int (len * 8)) +var_int$_ {n:#} len:(#< n) value:(int (len * 8)) = VarInteger n; nanograms$_ amount:(VarUInteger 16) = Grams; ``` @@ -976,9 +976,9 @@ Recall that the TON Blockchain allows its users to define arbitrary cryptocurren When some amounts of one or several such cryptocurrencies need to be represented, a [dictionary](/foundations/whitepapers/tvm#33---hashmaps-or-dictionaries) with 32-bit $\textit{currency\_id}$s as keys and `VarUInteger 32` values is used: ``` -extra_currencies$_ dict:(HashmapE 32 (VarUInteger 32)) +extra_currencies$_ dict:(HashmapE 32 (VarUInteger 32)) = ExtraCurrencyCollection; -currencies$_ grams:Grams other:ExtraCurrencyCollection +currencies$_ grams:Grams other:ExtraCurrencyCollection = CurrencyCollection; ``` @@ -990,10 +990,10 @@ A message consists of its *header* followed by its *body, or payload*. The body ``` int_msg_info$0 ihr_disabled:Bool bounce:Bool - src:MsgAddressInt dest:MsgAddressInt + src:MsgAddressInt dest:MsgAddressInt value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams created_lt:uint64 created_at:uint32 = CommonMsgInfo; -ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt +ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt import_fee:Grams = CommonMsgInfo; ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt created_lt:uint64 created_at:uint32 = CommonMsgInfo; @@ -1054,14 +1054,14 @@ Notice that *the source address and the logical creation time of an internal or [Message envelopes](#2116-message-envelopes) are used for attaching routing information, such as the current (transit) address and the next-hop address, to inbound, transit, and outbound messages. The message itself is kept in a separate cell and referred to from the message envelope by a cell reference. ``` -interm_addr_regular$0 use_src_bits:(#<= 96) +interm_addr_regular$0 use_src_bits:(#<= 96) = IntermediateAddress; -interm_addr_simple$10 workchain_id:int8 addr_pfx:(64 * Bit) +interm_addr_simple$10 workchain_id:int8 addr_pfx:(64 * Bit) = IntermediateAddress; interm_addr_ext$11 workchain_id:int32 addr_pfx:(64 * Bit) = IntermediateAddress; -msg_envelope cur_addr:IntermediateAddress - next_addr:IntermediateAddress fwd_fee_remaining:Grams +msg_envelope cur_addr:IntermediateAddress + next_addr:IntermediateAddress fwd_fee_remaining:Grams msg:^(Message Any) = MsgEnvelope; ``` @@ -1079,12 +1079,12 @@ Each inbound message mentioned in *InMsgDescr* is described by a value of type * Inbound messages may be classified as follows: -- *Inbound external messages* — Need no additional reason for being imported into the block, but must be immediately processed by a transaction in the same block. -- *Internal IHR messages with destination addresses in this block* — The reason for their being imported into the block includes a Merkle proof of their generation (i.e., their inclusion in *OutMsgDescr* of their original block). Such a message must be immediately delivered to its final destination and processed by a transaction. -- *Internal messages with destinations in this block* — The reason for their inclusion is their presence in *OutMsgQueue* of the most recent state of a neighboring shardchain,
[26](#fn26) or their presence in *OutMsgDescr* of this very block. This neighboring shardchain is completely determined by the transit address indicated in the forwarded message envelope, which is replicated in *InMsg* as well. The "fate" of this message is again described by a reference to the processing transaction inside the current block. -- *Immediately routed internal messages* — Essentially a subclass of the previous class of messages. In this case, the imported message is one of the outbound messages generated in this very block. -- *Transit internal messages* — Have the same reason for inclusion as the previous class of messages. However, they are not processed inside the block, but internally forwarded into *OutMsgDescr* and *OutMsgQueue*. This fact, along with a reference to the new envelope of the transit message, must be registered in *InMsg*. -- *Discarded internal messages with destinations in this block* — An internal message with a destination in this block may be imported and immediately discarded instead of being processed by a transaction if it has already been received and processed via IHR in a preceding block of this shardchain. In this case, a reference to the previous processing transaction must be provided. +- *Inbound external messages* — Need no additional reason for being imported into the block, but must be immediately processed by a transaction in the same block. +- *Internal IHR messages with destination addresses in this block* — The reason for their being imported into the block includes a Merkle proof of their generation (i.e., their inclusion in *OutMsgDescr* of their original block). Such a message must be immediately delivered to its final destination and processed by a transaction. +- *Internal messages with destinations in this block* — The reason for their inclusion is their presence in *OutMsgQueue* of the most recent state of a neighboring shardchain,[26](#fn26) or their presence in *OutMsgDescr* of this very block. This neighboring shardchain is completely determined by the transit address indicated in the forwarded message envelope, which is replicated in *InMsg* as well. The "fate" of this message is again described by a reference to the processing transaction inside the current block. +- *Immediately routed internal messages* — Essentially a subclass of the previous class of messages. In this case, the imported message is one of the outbound messages generated in this very block. +- *Transit internal messages* — Have the same reason for inclusion as the previous class of messages. However, they are not processed inside the block, but internally forwarded into *OutMsgDescr* and *OutMsgQueue*. This fact, along with a reference to the new envelope of the transit message, must be registered in *InMsg*. +- *Discarded internal messages with destinations in this block* — An internal message with a destination in this block may be imported and immediately discarded instead of being processed by a transaction if it has already been received and processed via IHR in a preceding block of this shardchain. In this case, a reference to the previous processing transaction must be provided. - *Discarded transit internal messages* — Similarly, a transit message may be discarded immediately after import if it has already been delivered via IHR to its final destination. In this case, a Merkle proof of its processing in the final block (as an IHR message) is required. @@ -1093,19 +1093,19 @@ Inbound messages may be classified as follows: Each [inbound message](#321-types-and-sources-of-inbound-messages) is described by an instance of the `InMsg` type, which has six constructors corresponding to the cases: ``` -msg_import_ext$000 msg:^(Message Any) transaction:^Transaction +msg_import_ext$000 msg:^(Message Any) transaction:^Transaction = InMsg; -msg_import_ihr$010 msg:^(Message Any) transaction:^Transaction +msg_import_ihr$010 msg:^(Message Any) transaction:^Transaction ihr_fee:Grams proof_created:^Cell = InMsg; msg_import_imm$011 in_msg:^MsgEnvelope transaction:^Transaction fwd_fee:Grams = InMsg; -msg_import_fin$100 in_msg:^MsgEnvelope +msg_import_fin$100 in_msg:^MsgEnvelope transaction:^Transaction fwd_fee:Grams = InMsg; -msg_import_tr$101 in_msg:^MsgEnvelope out_msg:^MsgEnvelope +msg_import_tr$101 in_msg:^MsgEnvelope out_msg:^MsgEnvelope transit_fee:Grams = InMsg; -msg_discard_fin$110 in_msg:^MsgEnvelope transaction_id:uint64 +msg_discard_fin$110 in_msg:^MsgEnvelope transaction_id:uint64 fwd_fee:Grams = InMsg; -msg_discard_tr$111 in_msg:^MsgEnvelope transaction_id:uint64 +msg_discard_tr$111 in_msg:^MsgEnvelope transaction_id:uint64 fwd_fee:Grams proof_delivered:^Cell = InMsg; ``` @@ -1147,16 +1147,16 @@ These augmentation values must satisfy certain *aggregation conditions*. Typical The [serialization of augmented hashmaps](/foundations/whitepapers/tvm#333-serialization-of-hashmaps) with $n$-bit keys, values of type $X$, and augmentation values of type $Y$ is given by the following TL-B scheme, which is an extension: ``` -ahm_edge#_ {n:#} {X:Type} {Y:Type} {l:#} {m:#} - label:(HmLabel ~l n) {n = (~m) + l} +ahm_edge#_ {n:#} {X:Type} {Y:Type} {l:#} {m:#} + label:(HmLabel ~l n) {n = (~m) + l} node:(HashmapAugNode m X Y) = HashmapAug n X Y; -ahmn_leaf#_ {X:Type} {Y:Type} extra:Y value:X +ahmn_leaf#_ {X:Type} {Y:Type} extra:Y value:X = HashmapAugNode 0 X Y; ahmn_fork#_ {n:#} {X:Type} {Y:Type} - left:^(HashmapAug n X Y) right:^(HashmapAug n X Y) extra:Y + left:^(HashmapAug n X Y) right:^(HashmapAug n X Y) extra:Y = HashmapAugNode (n + 1) X Y; -ahme_empty$0 {n:#} {X:Type} {Y:Type} extra:Y +ahme_empty$0 {n:#} {X:Type} {Y:Type} extra:Y = HashmapAugE n X Y; ahme_root$1 {n:#} {X:Type} {Y:Type} root:^(HashmapAug n X Y) extra:Y = HashmapAugE n X Y; @@ -1167,7 +1167,7 @@ ahme_root$1 {n:#} {X:Type} {Y:Type} root:^(HashmapAug n X Y) The collection of inbound message descriptors is augmented by a vector of two currency values, representing the imported value and the forwarding and transit fees collected from a message or a collection of messages: ``` -import_fees$_ fees_collected:Grams +import_fees$_ fees_collected:Grams value_imported:CurrencyCollection = ImportFees; ``` @@ -1213,15 +1213,15 @@ Each outbound message is described by an instance of *OutMsg*: ``` msg_export_ext$000 msg:^(Message Any) transaction:^Transaction = OutMsg; -msg_export_imm$010 out_msg:^MsgEnvelope +msg_export_imm$010 out_msg:^MsgEnvelope transaction:^Transaction reimport:^InMsg = OutMsg; -msg_export_new$001 out_msg:^MsgEnvelope +msg_export_new$001 out_msg:^MsgEnvelope transaction:^Transaction = OutMsg; -msg_export_tr$011 out_msg:^MsgEnvelope +msg_export_tr$011 out_msg:^MsgEnvelope imported:^InMsg = OutMsg; -msg_export_deq$110 out_msg:^MsgEnvelope +msg_export_deq$110 out_msg:^MsgEnvelope import_block_lt:uint64 = OutMsg; -msg_export_tr_req$111 out_msg:^MsgEnvelope +msg_export_tr_req$111 out_msg:^MsgEnvelope imported:^InMsg = OutMsg; ``` @@ -1312,8 +1312,8 @@ There are three kinds of accounts: The *storage profile* of an account is a data structure describing the amount of persistent blockchain state storage used by that account. It describes the total amount of cells, data bits, and internal and external cell references used. ``` -storage_used$_ cells:(VarUInteger 7) bits:(VarUInteger 7) - ext_refs:(VarUInteger 7) int_refs:(VarUInteger 7) +storage_used$_ cells:(VarUInteger 7) bits:(VarUInteger 7) + ext_refs:(VarUInteger 7) int_refs:(VarUInteger 7) public_cells:(VarUInteger 7) = StorageUsed; ``` @@ -1335,7 +1335,7 @@ account$1 addr:MsgAddressInt storage_stat:StorageInfo storage:AccountStorage = Account; account_storage$_ last_trans_lt:uint64 - balance:CurrencyCollection state:AccountState + balance:CurrencyCollection state:AccountState = AccountStorage; account_uninit$00 = AccountState; @@ -1520,7 +1520,7 @@ Any transaction contains the [fields](#423-generic-components-of-a-transaction). ``` transaction$_ account_addr:uint256 lt:uint64 outmsg_cnt:uint15 orig_status:AccountStatus end_status:AccountStatus - in_msg:(Maybe ^(Message Any)) + in_msg:(Maybe ^(Message Any)) out_msgs:(HashmapE 15 ^(Message Any)) total_fees:Grams state_update:^(MERKLE_UPDATE Account) description:^TransactionDescr = Transaction; @@ -1615,7 +1615,7 @@ On the other hand, we want to minimize the size of each transaction, because we The storage phase is present in several kinds of transactions, so a common representation for this phase is used: ``` -tr_phase_storage$_ storage_fees_collected:Grams +tr_phase_storage$_ storage_fees_collected:Grams storage_fees_due:(Maybe Grams) status_change:AccStatusChange = TrStoragePhase; @@ -1643,7 +1643,7 @@ The computing phase consists in invoking TVM with correct inputs. On some occasi ``` tr_phase_compute_skipped$0 reason:ComputeSkipReason = TrComputePhase; -tr_phase_compute_vm$1 success:Bool msg_state_used:Bool +tr_phase_compute_vm$1 success:Bool msg_state_used:Bool account_activated:Bool gas_fees:Grams _:^[ gas_used:(VarUInteger 7) gas_limit:(VarUInteger 7) gas_credit:(Maybe (VarUInteger 3)) @@ -1687,8 +1687,8 @@ tr_phase_action$_ success:Bool valid:Bool no_funds:Bool status_change:AccStatusChange total_fwd_fees:(Maybe Grams) total_action_fees:(Maybe Grams) result_code:int32 result_arg:(Maybe int32) tot_actions:int16 - spec_actions:int16 msgs_created:int16 - action_list_hash:uint256 tot_msg_size:StorageUsed + spec_actions:int16 msgs_created:int16 + action_list_hash:uint256 tot_msg_size:StorageUsed = TrActionPhase; ``` @@ -1698,7 +1698,7 @@ tr_phase_action$_ success:Bool valid:Bool no_funds:Bool tr_phase_bounce_negfunds$00 = TrBouncePhase; tr_phase_bounce_nofunds$01 msg_size:StorageUsed req_fwd_fees:Grams = TrBouncePhase; -tr_phase_bounce_ok$1 msg_size:StorageUsed +tr_phase_bounce_ok$1 msg_size:StorageUsed msg_fees:Grams fwd_fees:Grams = TrBouncePhase; ``` @@ -1878,9 +1878,9 @@ The smart-contract information structure *SmartContractInfo*, passed in the firs ``` [ magic:0x076ef1ea actions:Integer msgs_sent:Integer - unixtime:Integer block_lt:Integer trans_lt:Integer + unixtime:Integer block_lt:Integer trans_lt:Integer rand_seed:Integer balance_remaining:[Integer (Maybe Cell)] - myself:MsgAddressInt global_config:(Maybe Cell) + myself:MsgAddressInt global_config:(Maybe Cell) ] = SmartContractInfo; ``` @@ -1953,10 +1953,10 @@ ext_blk_ref$_ start_lt:uint64 end_lt:uint64 master_info$_ master:ExtBlkRef = BlkMasterInfo; -shard_ident$00 shard_pfx_bits:(## 6) +shard_ident$00 shard_pfx_bits:(## 6) workchain_id:int32 shard_prefix:uint64 = ShardIdent; -shard_state shard_id:ShardIdent +shard_state shard_id:ShardIdent out_msg_queue:OutMsgQueue total_balance:CurrencyCollection total_validator_fees:CurrencyCollection @@ -1985,13 +1985,13 @@ Here `publishers` is a hashmap with keys equal to the addresses of all accounts The precise format of an [unsigned](#126-validator-signatures-signed-and-unsigned-blocks) shardchain block is given by the following TL-B scheme: ``` -block_info version:uint32 - not_master:(## 1) +block_info version:uint32 + not_master:(## 1) after_merge:(## 1) before_split:(## 1) flags:(## 13) - seq_no:# vert_seq_no:# + seq_no:# vert_seq_no:# shard:ShardIdent gen_utime:uint32 start_lt:uint64 end_lt:uint64 - master_ref:not_master?^BlkMasterInfo + master_ref:not_master?^BlkMasterInfo prev_ref:seq_no?^(BlkPrevInfo after_merge) prev_vert_ref:vert_seq_no?^(BlkPrevInfo 0) = BlockInfo; @@ -2000,7 +2000,7 @@ prev_blk_info#_ {merged:#} prev:ExtBlkRef prev_alt:merged?ExtBlkRef = BlkPrevInfo merged; unsigned_block info:^BlockInfo value_flow:^ValueFlow - state_update:^(MERKLE_UPDATE ShardState) + state_update:^(MERKLE_UPDATE ShardState) extra:^BlockExtra = Block; block_extra in_msg_descr:^InMsgDescr @@ -2017,7 +2017,7 @@ The field `custom` is usually present only in the masterchain and contains all t The total value flow through a block is serialized according to the following TL-B scheme: ``` -value_flow _:^[ from_prev_blk:CurrencyCollection +value_flow _:^[ from_prev_blk:CurrencyCollection to_next_blk:CurrencyCollection imported:CurrencyCollection exported:CurrencyCollection ] @@ -2036,7 +2036,7 @@ Recall that `_:^[`...`]` is a TL-B construction indicating that a group of field A signed shardchain block is just an unsigned block augmented by a collection of validator signatures: ``` -ed25519_signature#5 R:uint256 s:uint256 = CryptoSignature; +ed25519_signature#5 R:uint256 s:uint256 = CryptoSignature; signed_block block:^Block blk_serialize_hash:uint256 signatures:(HashmapE 64 CryptoSignature) @@ -2093,14 +2093,14 @@ In addition to the [components of the shardchain block](#512-components-of-a-sha *ShardHashes* is represented by a dictionary with 32-bit $\mathit{workchain\_id}$s as keys, and "shard binary trees", represented by TL-B type *BinTree ShardDescr*, as values. Each leaf of this shard binary tree contains a value of type *ShardDescr*, which describes a single shard by indicating the sequence number `seq_no`, the logical time `lt`, and the hash `hash` of the latest (signed) block of the corresponding shardchain. ``` bt_leaf$0 {X:Type} leaf:X = BinTree X; -bt_fork$1 {X:Type} left:^(BinTree X) right:^(BinTree X) +bt_fork$1 {X:Type} left:^(BinTree X) right:^(BinTree X) = BinTree X; fsm_none$0 = FutureSplitMerge; fsm_split$10 mc_seqno:uint32 = FutureSplitMerge; fsm_merge$11 mc_seqno:uint32 = FutureSplitMerge; -shard_descr$_ seq_no:uint32 lt:uint64 hash:uint256 +shard_descr$_ seq_no:uint32 lt:uint64 hash:uint256 split_merge_at:FutureSplitMerge = ShardDescr; _ (HashmapE 32 ^(BinTree ShardDescr)) = ShardHashes; @@ -2116,7 +2116,7 @@ Notice that the masterchain itself is omitted from *ShardHashes* (i.e., 32-bit i ``` bta_leaf$0 {X:Type} {Y:Type} leaf:X extra:Y = BinTreeAug X Y; -bta_fork$1 {X:Type} {Y:Type} left:^(BinTreeAug X Y) +bta_fork$1 {X:Type} {Y:Type} left:^(BinTreeAug X Y) right:^(BinTreeAug X Y) extra:Y = BinTreeAug X Y; _ (HashmapAugE 32 ^(BinTreeAug True CurrencyCollection) @@ -2130,7 +2130,7 @@ The structure of *ShardFees* is similar to that of [ShardHashes](#523-descriptio Recall that the [configurable parameters](#16---configurable-parameters-and-smart-contracts) or the *configuration dictionary* is a dictionary `config` with 32-bit keys kept inside the first cell reference of the persistent data of the configuration smart contract $\gamma$. The address $\gamma$ of the configuration smart contract and a copy of the configuration dictionary are duplicated in fields `config_addr` and `config` of a *ConfigParams* structure, explicitly included into masterchain state to [facilitate access](#163-quick-access-through-the-header-of-masterchain-blocks) to the current values of the configurable parameters: ``` -_ config_addr:uint256 config:^(Hashmap 32 ^Cell) +_ config_addr:uint256 config:^(Hashmap 32 ^Cell) = ConfigParams; ``` @@ -2242,11 +2242,11 @@ In addition to the [values](#537-a-classification-of-serialization-schemes-for-b Several TL-B constructors can be used to serialize bags of cells into octet (i.e., 8-bit byte) sequences. The only one that is currently used to serialize new bags of cell is ``` -serialized_boc#b5ee9c72 has_idx:(## 1) has_crc32c:(## 1) +serialized_boc#b5ee9c72 has_idx:(## 1) has_crc32c:(## 1) has_cache_bits:(## 1) flags:(## 2) { flags = 0 } size:(## 3) { size <= 4 } - off_bytes:(## 8) { off_bytes <= 8 } - cells:(##(size * 8)) + off_bytes:(## 8) { off_bytes <= 8 } + cells:(##(size * 8)) roots:(##(size * 8)) { roots >= 1 } absent:(##(size * 8)) { roots + absent <= cells } tot_cells_size:(##(off_bytes * 8)) @@ -2263,8 +2263,8 @@ Two older constructors are still supported in the bag-of-cells deserialization f ``` serialized_boc_idx#68ff65f3 size:(## 8) { size <= 4 } - off_bytes:(## 8) { off_bytes <= 8 } - cells:(##(size * 8)) + off_bytes:(## 8) { off_bytes <= 8 } + cells:(##(size * 8)) roots:(##(size * 8)) { roots = 1 } absent:(##(size * 8)) { roots + absent <= cells } tot_cells_size:(##(off_bytes * 8)) @@ -2273,8 +2273,8 @@ serialized_boc_idx#68ff65f3 size:(## 8) { size <= 4 } = BagOfCells; serialized_boc_idx_crc32c#acc3a728 size:(## 8) { size <= 4 } - off_bytes:(## 8) { off_bytes <= 8 } - cells:(##(size * 8)) + off_bytes:(## 8) { off_bytes <= 8 } + cells:(##(size * 8)) roots:(##(size * 8)) { roots = 1 } absent:(##(size * 8)) { roots + absent <= cells } tot_cells_size:(##(off_bytes * 8)) @@ -2295,7 +2295,7 @@ compiled_smart_contract compiler_version:(Maybe ^TinyString) ] = CompiledSmartContract; -tiny_string#_ len:(#<= 126) str:(len * [ uint8 ]) = TinyString; +tiny_string#_ len:(#<= 126) str:(len * [ uint8 ]) = TinyString; ``` Then a compiled smart contract may be represented by a value of type *CompiledSmartContract*, transformed into a tree of cells and then into a bag of cells, and then serialized using one of the [constructors](#539-tl-b-scheme-for-serializing-bags-of-cells). The resulting octet string may be then written into a file with suffix `.tvc` ("TVM smart contract"), and this file may be used to distribute the compiled smart contract, download it into a wallet application for deploying into the TON Blockchain, and so on. diff --git a/content/from-ethereum.mdx b/content/from-ethereum.mdx index 8d5c9dd48..f6378ee36 100644 --- a/content/from-ethereum.mdx +++ b/content/from-ethereum.mdx @@ -36,7 +36,7 @@ Consider a practical example: liquidity withdrawal on a DEX. alt="GRAM burn" /> -Executing a large transaction on Ethereum or any other EVM-based blockchain comes with certain limitations: [call depth](https://ethereum.org/developers/docs/evm/#evm-instructions) of 1,024 nested calls and the [block gas limit](https://ethereum.org/developers/docs/blocks/#block-size). With TON's asynchronous execution model, a trace — a chain of transactions — can have any length, as long as there are enough fees to continue it. For example, the [trace](https://tonscan.org/tx/e887503f7dac857be80487e3ed0774db962379d1c153e6df7b9b5313c657ab94) resulting from this message consisted of more than 1.5 million transactions, lasting more than 4,000 blocks until completion. +Executing a large transaction on Ethereum or any other EVM-based blockchain comes with certain limitations: [call depth](https://ethereum.org/developers/docs/evm/#evm-instructions) of 1,024 nested calls and the [block gas limit](https://ethereum.org/developers/docs/blocks/#block-size). With TON's asynchronous execution model, a trace — a chain of transactions — can have any length, as long as there are enough fees to continue it. For example, the [trace](https://actonscan.com/tx/e887503f7dac857be80487e3ed0774db962379d1c153e6df7b9b5313c657ab94?network=mainnet) resulting from this message consisted of more than 1.5 million transactions, lasting more than 4,000 blocks until completion. ### On-chain get methods @@ -83,9 +83,9 @@ For low-level manipulation of TON-specific data structures, there is [`@ton/core ### Services -[TON Explorer](https://explorer.toncoin.org/) is a low-level open-source dev explorer. +[Actonscan](https://actonscan.com/) is an [open-source](https://github.com/ton-blockchain/acton/tree/master/packages/explorer-ui) blockchain explorer for smart-contract developers with many supplementary tools built-in, such as transaction retracer, emulator, contract ABI catalog, UI for the testnet faucet, and others. For the low-level and per-block raw [BoC](/foundations/serialization/boc) inspection, switch to the [`explorer.toncoin.org`](https://explorer.toncoin.org/). -[TxTracer](https://txtracer.ton.org/) is a set of web tools to trace and analyze TON Blockchain transactions, visualize execution, and inspect and debug smart contracts with a code editor and user-friendly interface. +[TxTracer](https://txtracer.ton.org/) is a set of web tools to trace and analyze blockchain transactions, visualize execution, and inspect and debug smart contracts with a code editor and user-friendly interface. Additionally, TxTracer hosts several interactive playgrounds: diff --git a/content/languages/func/dictionaries.mdx b/content/languages/func/dictionaries.mdx index 168dd1c4b..62e6a3e05 100644 --- a/content/languages/func/dictionaries.mdx +++ b/content/languages/func/dictionaries.mdx @@ -18,7 +18,7 @@ Smart contracts in TON can utilize dictionaries structured as ordered key-value - **Gas consumption for updates** - Every update operation generates many new cells, costing 500 gas, as detailed on the [TVM instructions](/tvm/instructions) page. - Careless updates can lead to excessive gas usage, potentially causing operations to fail due to gas exhaustion. - - Example: This issue occurred with the **Wallet bot** using the **highload-v2 wallet**. Each iteration's unbounded loop and expensive dictionary updates led to gas depletion. As a result, the bot triggered repeated transactions, eventually draining its balance ([see transaction details](https://tonscan.org/tx/fd78228f352f582a544ab7ad7eb716610668b23b88dae48e4f4dbd4404b5d7f6#details)). + - Example: This issue occurred with the **Wallet bot** using the **highload-v2 wallet**. Each iteration's unbounded loop and expensive dictionary updates led to gas depletion. As a result, the bot triggered repeated transactions, eventually draining its balance ([see transaction details](https://actonscan.com/tx/fd78228f352f582a544ab7ad7eb716610668b23b88dae48e4f4dbd4404b5d7f6?network=mainnet\&tab=transactions)). - **Storage limitation** - A binary tree containing $N$ key-value pairs requires $N-1$ forks, resulting in **at least** $2N-1$ cells. diff --git a/content/nodes/cpp/run-validator.mdx b/content/nodes/cpp/run-validator.mdx index d91d3af1f..fc36d6781 100644 --- a/content/nodes/cpp/run-validator.mdx +++ b/content/nodes/cpp/run-validator.mdx @@ -785,7 +785,7 @@ Top up the single nominator pool with the effective validation stake. In the nex ### 4.1 Retrieve stakes for last two cycles -Check the [current validator stakes](https://tonscan.org/validators) and the [minimum network stake](https://tonscan.org/config#17). +Check the [current validator stakes](https://tonscan.org/validators) and the [minimum network stake](https://actonscan.com/config?network=mainnet#config-parameter-17). Retrieve `min_stake` and `max_stake` from [Validation API](https://elections.toncenter.com/getValidationCycles?return_participants=false\&offset=0\&limit=2) for two last cycles. diff --git a/content/nodes/staking/single-nominator.mdx b/content/nodes/staking/single-nominator.mdx index 5949c37da..e03bcdb65 100644 --- a/content/nodes/staking/single-nominator.mdx +++ b/content/nodes/staking/single-nominator.mdx @@ -3,7 +3,7 @@ title: "Single nominator pool contracts" sidebarTitle: "Single nominator pools" --- -[Single nominator pool contracts](https://github.com/ton-blockchain/single-nominator) are designed for validators with [sufficient self-stake](https://tonscan.org/validators) who want to validate independently, without involving other participants. +[Single nominator pool contracts](https://github.com/ton-blockchain/single-nominator) are designed for validators with [sufficient self-stake](https://actonscan.com/elections?network=mainnet) who want to validate independently, without involving other participants. ## How it works diff --git a/content/onboarding/explorers.mdx b/content/onboarding/explorers.mdx index 39f3442d0..caec341cd 100644 --- a/content/onboarding/explorers.mdx +++ b/content/onboarding/explorers.mdx @@ -1,28 +1,163 @@ --- -title: "Blockchain explorers" +title: "TON blockchain explorers" sidebarTitle: "Explorers" --- -Explorers are web tools designed for reading blockchain data, allowing users to look up accounts, transactions, blocks, and smart contracts. They provide a searchable user interface (UI) that indexes on-chain data, making it easy to verify activity and debug issues. +An explorer displays blockchain data through a searchable web interface. Use one to inspect an account, follow a transfer, or investigate contract execution. ## What explorers show -In TON, explorers typically display account balances, transactions, tokens, contract code and state, as well as links to related blocks and messages. +TON explorers display account balances, Gram and token transfers, contract code and storage, transactions and messages. Available views depend on the explorer and its data sources. -More precisely, explorers show: +Some explorers also show masterchain and shardchain block details, validator activity, and network metrics such as transaction volume, gas usage, and fees. Contract views may identify known contract types or show disassembled code. -- Balances and assets: Grams, jettons (FTs), and NFTs held by an address -- Transactions and messages: history, fees, phases, and traces -- Blocks and validators: block contents, masterchain and shardchain details -- Smart contracts: code, state, disassembly, and known contract type -- Analytics: top entities, volumes, gas, fees, and network health +## Data sources -## Indexers +Explorers take data from TON Center's [API v2](/api/v2/overview) and [API v3](/api/v3/overview). The former is a direct wrapper for [liteservers in TON](/nodes/overview#interacting-with-ton-nodes), and the latter is an indexer — it organizes blockchain data and helps with sophisticated data retrieval. Indexers also connect transactions into [traces](/foundations/traces) and recognize common contract operations such as jetton or NFT transfers. -Indexers such as [TON Center API v3](/api/v3/overview) continuously read blocks from nodes, parse messages and transactions, and store them in a database optimized for queries. Explorers rely on these indexers to provide fast search, traces, higher-level events, and historical views beyond what a single node exposes by default. +## Actonscan -## Examples +[Actonscan](https://actonscan.com/?network=mainnet) combines account and transaction browsing with tools for inspecting smart contracts. -[TON explorer](https://explorer.toncoin.org/) is a low-level developer-oriented explorer that displays transactions and blocks. It works on [mainnet](https://explorer.toncoin.org/) and [testnet](https://test-explorer.toncoin.org). +Select **Mainnet** or **Testnet** in the network menu before searching. A shared link can specify the network with `?network=mainnet` or `?network=testnet`. The network menu also supports custom networks configured with compatible [API v2](/api/v2/overview) and [API v3](/api/v3/overview) endpoints. -Discover other [TON explorers](https://duckduckgo.com/?q=ton+explorer). +Actonscan mainnet home page with search, network selection, and links to the emulator and cell inspector + +### Accounts and assets + +Account pages show status, balances, history, jettons, and non-fungible tokens (NFTs). Contract views expose code and storage; available application binary interfaces (ABIs) describe messages and get methods. Verified source files are available for contracts with matching published sources. The [ABI catalog](https://actonscan.com/abi?network=mainnet) exposes known contract interfaces. + +- [Find an account or transaction](#find-an-account-or-transaction). +- [Check a transfer](#check-a-transfer). +- [Inspect jettons and NFTs](#inspect-jettons-and-nfts). +- [Inspect a smart contract and call get methods](#inspect-a-smart-contract). + +### Transactions and execution + +A transaction page combines an operation summary, value flow, transaction details, and a message tree. Select individual transactions to inspect their incoming messages, fees, and execution phases. The debugger replays a transaction to expose its virtual-machine execution. + +- [Read a trace](#read-a-trace). +- [Investigate a failed operation](#investigate-a-failed-operation). +- [Decode a message body](#decode-a-message-body). +- [Replay a transaction](#replay-a-transaction). + +### Additional tools + +- [Blocks](https://actonscan.com/blocks?network=mainnet), [elections](https://actonscan.com/elections?network=mainnet), and [configuration](https://actonscan.com/config?network=mainnet) expose network activity and parameters. +- [Address converter](https://actonscan.com/address-converter?network=mainnet) displays alternative address forms. +- [Cell inspector](https://actonscan.com/cell?network=mainnet) parses [BoC](/foundations/serialization/boc)-serialized cell data. +- [Transaction emulator](https://actonscan.com/emulate?network=mainnet) evaluates transactions out of constructed messages without submitting them to the blockchain. + +## Find an account or transaction + +To find an account, copy its address from a wallet app or the application being investigated. Paste it into search and press Enter. Actonscan accepts [raw and user-friendly addresses](/foundations/addresses/overview). Check the address and network on the result, then open **History** for transactions, **Tokens** for jettons, or **Collectibles** for NFTs. An account can hold Gram without deployed code; check its [status](/foundations/status) before treating it as an active contract. + +To find a transaction, open its link from the wallet app. If there is no link, search the sender or recipient address and find the entry in **History** by time, counterparty, and amount. If application logs or an API response provide a transaction hash, paste it into search. A wallet submission may instead return a **message hash** — use [message lookup](/applications/ton-connect/how-to/message-lookup) to find its transaction. + + + Recent activity may take time to appear in an explorer. + + +## Check a transfer + +1. Open the transaction and check **Event overview** for the asset, amount, sender, and recipient. +1. Open **Transactions** and follow the messages to the recipient. A successful sender transaction shows that a message was sent; check the receiving transaction too. +1. Inspect the receiving transaction's **Compute phase** and **Action phase** for errors. Check **Value flow** or **State changes** for the resulting balance or owner. +1. Follow any bounce or refund before concluding that the transfer arrived. + +For a jetton, compare the **master address** with the intended token. The jetton amount is in the message body; attached Gram pays for processing. For an NFT, compare the **item address** and owner. Names and images do not identify either asset. The account page shows the latest state; use the historical transaction to check what happened at a particular time. + +## Read a trace + +A [trace](/foundations/traces) follows messages across accounts. Each node in Actonscan's message tree shows one account's transaction. + +1. Start at the sender's transaction. **Event overview** summarizes recognized operations, but its label does not establish that every step succeeded. +1. Follow the message to the next account. Select its node and check **Message route**, attached Gram, and **Parsed body**. +1. Check **Compute phase** and **Action phase**, then follow outgoing messages until reaching the intended recipient, a bounce, or a refund. +1. Use **Value flow** and **State changes** to confirm the result. If a branch is pending or missing, let the explorer load or index it before declaring failure. + +This [NFT mint trace](https://actonscan.com/tx/47d0989633fc03ff3fdca05880ab5760d0321c196501a6a4cbb5578dea2624cb?network=mainnet) runs from a wallet to a collection and then to an NFT item. Select each node to distinguish the wallet's request from the item's deployment. + +Actonscan NFT mint trace showing wallet, collection, and item transactions + +## Investigate a failed operation + +Find the transaction that should have produced the missing result. One operation can span several transactions, and a successful sender transaction does not establish that the recipient accepted its message. + +1. Follow the trace from the sender to the intended recipient. +1. Select the receiving transaction. Check **Compute phase** for its success flag and [exit code](/tvm/exit-codes). A skipped phase differs from failed execution. +1. Check **Action phase** separately: computation can succeed while an outgoing action fails. +1. Follow any **Bounced** message or refund. Not every failed request bounces, and fees can reduce returned Gram. +1. If the phases succeeded but the result is missing, inspect the decoded response and refund branch. A contract can reject a request through its own messages without a TVM error. + +In this [failed jetton transfer](https://actonscan.com/tx/d5d50c3e5bde493ddc7853f784bdff75a37bf89473e77ba8d04615323c7c8117?network=mainnet), the receiving jetton wallet's compute phase exits with `48`, labeled `WalletErrors.NotEnoughGas` by its ABI. The failure belongs to the receiving transaction; `48` is a contract-specific code. Record the failing account, transaction link, and exit code before changing the contract or resending the request. + +## Inspect jettons and NFTs + +### Jettons + +1. On the owner's account, open **Tokens** and select the jetton. Its balance belongs to a separate **jetton wallet** contract. +1. Open that wallet and check its owner and **jetton master** addresses. Compare the master address with the one supplied by the token project or application. +1. Use the token's decimals to interpret the raw amount. The jetton wallet's Gram balance pays fees; it is not the token balance. + +To verify the wallet relationship, call `get_wallet_data` on the jetton wallet using [the get-method steps](#call-a-get-method). See [jetton wallet data](/contracts/standard/tokens/jettons/wallet-data) for the returned fields. + +### NFTs + +1. On the owner's account, open **Collectibles** and select an item, or search its address directly. +1. Check the **item address**, owner, and collection. The address identifies the NFT; its name and image can change or be copied. +1. To check a past owner, open the item's **History** and inspect the transfer. The account page shows the latest owner. + +Missing images or metadata do not establish that a token is absent. Check its contract address and account state. + +## Inspect a smart contract + +Open a contract address in Actonscan. The [USDT master](https://actonscan.com/address/EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs?network=mainnet) is an example with a get method. + +1. Check the account [status](/foundations/status). An uninitialized account has no deployed code. +1. Open **Contract**. Use **Source** for published code, **Storage** for current account data, and **ABI** for recognized messages and methods. + +Without matching source or a storage schema, raw storage cannot be interpreted from the explorer alone. **Storage** shows current state; inspect the historical transaction for an older state. + +### Call a get method + +1. Open **Methods** and select a method. On the USDT master, `get_jetton_data` needs no arguments. +1. Select **Run** and inspect the returned values. See [jetton supply data](/contracts/standard/tokens/jettons/supply-data) for this example. + +A [get method](/tvm/get-method) reads contract state without sending a transaction. If **Methods** is absent, the explorer may lack an ABI for this contract; the code may still have get methods. + +## Decode a message body + +Select the message in a transaction's trace. An internal message's **value** is attached Gram; its **body** can contain contract-specific data such as an opcode and a jetton amount. + +1. Check **Message route** for sender and recipient. +1. Under **Message data**, inspect the opcode and expand **Parsed body** with **Show**, if available. +1. Interpret fields using the receiving contract's interface. A decoded opcode identifies a requested operation; it does not establish that the contract completed it. Check the receiving transaction's execution result. + +If the body is not decoded, select **Copy raw body** and paste it into Actonscan's [cell inspector](https://actonscan.com/cell?network=mainnet). Inspect the bits and references. If the contract publishes a [TL-B schema](/foundations/tlb/overview), use **Parsing options** to parse the body with that schema. An unknown opcode may be valid for a contract the explorer does not recognize. + +## Replay a transaction + +Replay a transaction when its exit code and messages do not explain a contract failure. Select the **receiving transaction** that ran the relevant code. + +1. Select **Debug** beside **Message route**. It allows replaying historical transactions. +1. In **Disassembled**, step through the instructions and inspect the stack and gas usage before the failure. Use **Sources** if source-level mapping is available. +1. Compare the replay with the recorded **Compute phase** result on the transaction page. + +There, **Edit & emulate** changes inputs to simulate another outcome — that result did not occur on-chain. Neither **Debug** nor **Edit & emulate** actions submit a message. + + + If the debugger reports **Trace incomplete**, rely on the recorded transaction for the actual result. + diff --git a/content/onboarding/wallet-apps/deep-links.mdx b/content/onboarding/wallet-apps/deep-links.mdx index 15c17f839..7ba6ca9c5 100644 --- a/content/onboarding/wallet-apps/deep-links.mdx +++ b/content/onboarding/wallet-apps/deep-links.mdx @@ -2,7 +2,7 @@ title: "Deep links" --- -Deep links allow to seamlessly direct users from a dApp back to a meaningful location within a TON wallet and invoke corresponding actions. +Deep links allow directing users from a dApp to a meaningful location within a TON wallet and invoking corresponding actions. Issue wallet invoices using deep links. See [transaction link formats](#explorers-links) for popular explorers. @@ -31,7 +31,7 @@ Explore [TON Connect](/applications/ton-connect/overview). ## Deep links invoices - The TON link `ton://` is less preferred in the ecosystem, but may be useful for simple and tiny one-time payment flow. + The `ton://` link is less common in the ecosystem than `tc://`, but it may be useful for a simple, one-time payment flow. ```bash @@ -251,26 +251,76 @@ Example: transferring 1 USDT to `EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sD https://my.tt/transfer/UQDYzZmfsrGzhObKJUw4gzdeIxEai3jAFbiGKGwxvxHinf4K?amount=1000000&jetton=EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs ``` -## Explorers links +## Explorer links -To generate a transaction link, the service must obtain the account address, logical time (lt), and transaction hash by calling the [`getTransactions`](https://toncenter.com/api/v2/#/transactions/get_transactions_getTransactions_get) method. Using these values, [TON Explorer](https://explorer.toncoin.org/) renders the transaction page. +[Actonscan](/onboarding/explorers#actonscan) links can open accounts, transactions, and blocks by providing their respective values: -### Mainnet +- `
` is a raw or user-friendly TON address, +- `` is a hexadecimal transaction hash, +- and ``, ``, and `` identify a block. -```bash title="Mainnet link" -https://explorer.toncoin.org/transaction?account=<=&hash= -``` +The low-level [TON Explorer](https://explorer.toncoin.org/) only provides direct links to transactions — they require an account address, logical time (`lt`), and a transaction hash. Obtain these values by calling the [`getTransactions`](https://toncenter.com/api/v2/#/transactions/get_transactions_getTransactions_get) API endpoint. Convert the hexadecimal transaction hash to uppercase before composing a link. -```bash title="Example" -https://explorer.toncoin.org/transaction?account=Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF<=63333243000002&hash=AEE8D185A0C8F73C787BF1872EE9659AC53CE11A90B16B384856A7821EFF8C29 -``` +### Mainnet -### Testnet + + + ```text title="Links" + https://actonscan.com/address/
?network=mainnet + https://actonscan.com/tx/?network=mainnet + https://actonscan.com/block///?network=mainnet + ``` + + ```text title="Transaction example" + https://actonscan.com/tx/47d0989633fc03ff3fdca05880ab5760d0321c196501a6a4cbb5578dea2624cb?network=mainnet + ``` + + + + ```text title="Transaction link" + https://explorer.toncoin.org/transaction?account=
<=&hash= + ``` + + ```text title="Example" + https://explorer.toncoin.org/transaction?account=Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF<=63333243000002&hash=AEE8D185A0C8F73C787BF1872EE9659AC53CE11A90B16B384856A7821EFF8C29 + ``` + + -```bash title="Testnet link" -https://test-explorer.toncoin.org/transaction?account=<=&hash= -``` +### Testnet -```bash title="Example" -https://test-explorer.toncoin.org/transaction?account=Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF<=40988257000002&hash=61EF8FAC43EDF408FCC041AA8AFAEC14AC2C4F68FAAFE6EB18C50A921697D2F6 -``` + + + ```text title="Links" + https://actonscan.com/address/
?network=testnet + https://actonscan.com/tx/?network=testnet + https://actonscan.com/block///?network=testnet + ``` + + ```text title="Transaction example" + https://actonscan.com/tx/59ac226ac63ba4ecfcf4b9da1a02510fc787cc1f52fdfddb3a2b8f1bf54bbd77?network=testnet + ``` + + + + ```text title="Transaction link" + https://test-explorer.toncoin.org/transaction?account=
<=&hash= + ``` + + ```text title="Example" + https://test-explorer.toncoin.org/transaction?account=Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF<=40988257000002&hash=61EF8FAC43EDF408FCC041AA8AFAEC14AC2C4F68FAAFE6EB18C50A921697D2F6 + ``` + + diff --git a/content/onboarding/wallet-apps/telegram.mdx b/content/onboarding/wallet-apps/telegram.mdx index 54e276953..9892ccffc 100644 --- a/content/onboarding/wallet-apps/telegram.mdx +++ b/content/onboarding/wallet-apps/telegram.mdx @@ -4,7 +4,7 @@ sidebarTitle: "Telegram Money" tag: "new" --- -Telegram Money is a [_mainnet_](/start-here#mainnet-and-testnet) wallet on The Open Network (TON) for receiving assets and connecting to decentralized apps (dApps) through [TON Connect](/applications/ton-connect/overview). +Telegram Money is a [mainnet](/start-here#mainnet-and-testnet) wallet on The Open Network (TON) for receiving assets and connecting to decentralized apps (dApps) through [TON Connect](/applications/ton-connect/overview). - **On-chain transfers:** send Gram to Telegram users, including those who have not opened the wallet yet. Transfers execute on TON through the [WalletTg smart contract](/contracts/standard/wallets/telegram/overview). diff --git a/public/images/actonscan/nft-failure.png b/public/images/actonscan/nft-failure.png new file mode 100644 index 0000000000000000000000000000000000000000..f2685f8d2fada3d967c6f05b8bb4c47ce4fc2752 GIT binary patch literal 105032 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ℜFf^N+Xx|Q1K@(;;o;~zG(dz#3w)XteMAO?h40_7V-;XRQAD!aj$1?}WjE8wTc%RS>X;&Q z!-#u(3tfyQCK;=vRB*Ji^A2wS*^(`nM<_RFdZ_#|Y~{DyBz?y;G6 z#Ky(~J}rg8<#{U8Jfd^7R}NAeF&{n&8O%ROpb*{7%gN!kx^FsOszmMW(BmzfZ=;_a zT5fMDn&@s%I-F#OtZx8L&dN(iu$?{$<$ZV27DN<$a}X?ouJse|_?Huy?NU!P7Q7oi zh1!oiq@npTasKq|p1F(`4sz&l2%1*rSor@%QiN0Bim*RUD@ELBH9Hv_+nK=1_8yc) z;8pwi+T*bsm>;ThHo*=;4f_$bNbfJzQH+CwH-_rT+JQ+x>Bf0U`AtzkTLws!23#m* zRU1Qy{5*>vE+HyORpq$^guEhioGOyr-@JEkdtv7Uasg;HN{y_<9ZogEir{p4&K>U4 zRXn|N>?Y8>#=vFsBmFSjMPErtKvq^(H4y#bUuWgH^mKw1o8fqA>^+WX;dNP=Jx~iX zeYPgRZ(h}qz~^jaRPH?dS%Kk_sUTU7V;o!L9hsEanom9f^{L_vAW#jIH5%o@z6puE zm!2nwo#tz`<64cim6*?=m9rw9nVqeGVJs6AEL#N+c2}EYV&-1B0v;Y-*}7{|4N9)6 zwYgsuNK|Avm+1&&Wi0gdMDDr9#sfUppT|+sT4Xl542-<(4N+m9SxZTdjQq}W)Nas3^H>57OP}(r#g0ah=tzO0O z@SzCza5ddE?@RxLIC=y}>fzy)qZ`W-K5thZJ|3%k=xp(AO`>AbolenFoV_ozsCX+j zOWxMj*0*$J3};O^JIQyz)_76usHRJ@g19j?)!<0j{68o7zk-hy4D3QyGg)qJs-nVS z_~Ku2qD#R$2_zI-($1=#&*E#gF#?k~rcW1MUVpqZrSXjIrp~1ozb+-bzVIOA<%8Fk zpWWBGZxN&~FIq@58bmuDG#8+EH!D1}I16kB^#@()s>TLQ{CTPa?N?j%3=NCJ^n}AU zrgzn9ySQw}Vwj5J7KS<^rH)0OA%6$I3l~t(Fi_CUBCiq(C0Xm}ysE+AqNmsU`Nr)@ zV1w4;28rIvLU2)?=gXY1Zf(ZMkth?q@swkZSPO}Tj#XVUZ*P8sT`@_?VB0-Z8}41- zvxLj<93EKxb!o3lSG+Ej9-{`pfaKWw523D3t0_%GITAouHV{;bTU>Nf9G(o>1e9-T zszTQnKV@yzftjtW(Cmku<31UAWZfAU6<^D}^5&s_JDzYU^`l3AIVA?YFZA^1M#n1Y z&whSS8*y$cfkFx4(}i z^$Cg0@9iz9u6`)l?XIrQjTalDoFe1weBkq10Hihb4Hu+|O{{HXbWK;Dfph`0G)bxX zc*8Zq+iU;6;j3-85#YByVqj#1V{XE%l2Cu^E~Rd?Y8eL+uZLd>H`ktv^IDpKygcpP zi|5bR7Z)FLI&D%Yb|aDWDf{cYFhLg+Gm!rZFP6{_!OdMWI(iU7&c&5lUF~5yMyKU%hNbM3}; ze}hn4O%LraXxND4@i+B3b=j~F%pb3aY!VT)SE5s-9XRCm?@PkRSFbT z215&r2Pyu3ZDM4>A}Km3!uIw=k3kJc+5EwSPX>}!Z%eLw{WU6fm5~1T3;({AR7pSp z@%sAI?(PQ>{dRCdI5`d|;DT%-nsroI=&QZ`E*Ou?%2QHC!s4(qF@^UX90ywTX&;UmM0-uaErvl&Wt28O^xx zvi_oX{YBMMl$K_p6dBVJyrEyrkz%^K-_N%bIRkq}WYi(uLepy#JG=KO!NE)*!ZI~E zsViQkm|EWp9Cq6@-=ZQ>XyhJm+1cBlty#to4-P8Rh+>C-yzgjZYt`Kk-#q*@?`UT?aL82p`EyT0gLMn$@YtA& z>EZn_%?`S+j~6rT;($i$Aa0F!>lQ=Z0m!H&My;(8+1T3B5+@0$>gYGmkC{z0eQj!+ zsTn!F&P`3zH#Ai0aRL(awez5i_Jl4^t1BVlfep`24=MB{UEJMI4rZ1QfzNgBv&}Z; zBs;4|{~eSw35bd3JzlG;Pk!5mP9NAknlj%L+58YQyPza&ZOv|2QgY*M)P)Ow9(h3POf36QRP-qD*X;N2hL#(pJLHx2 z*+&he8`Z>nISqCavDV$Z4wCiJ4|ZRO=45Si`WLIL`P`VE1OwS((F{2i=dV|;T$!}% zrvnVDWwKH{0pv%iiv)10CkMi_770WgDF-gQSKAvAR@@^zm^Qr)N}) z+rbe@B8TU%ndxXYOW@uRcpNiGIlb30SEiw69sXingdiKj+GyU>>`{KukmpeXf^9iT zNxFdO+o`Pqj6A&xZ>o6{MbKUo;gI8Qq#>xa6+3&V&xOa@Qjn38x85ZpVhTJ+{H#dk zuWQW9>lsDl-(pli>kqp}MJcVBp}@n5uJr6x7dpct`A?9bM8@5#0^hW#=;+a7@Q3P% zamTcN6(GlU{jrggaum_3fh@n55~?Cdb>v%1j($! ztd4YpzRrB!BWX#-P1I=0u(!Vc0(I9H71OSf$f9Y*wmFn9P)ncViGA+*5t?5tZ>>~` z817bAwS|@#P`J6BTOnG^bmtL)0L}6(;v^Px>wgx*=6o@pb)%aanVYAOFqa&zmUX+k z@7L}0ZB$lPf+n~BIYhVqQTf%W`+CK~8*;7|xK;ZLyq?c_-@##%t70#1X-Se|S-BLp zl6!REhnq#g2kEP|$EVKdGAV-sbapTPJhsbdzU_0AF_6;IeW&|$@xpzp`rogY?UKlJ zP&ug5sP#<@kWG7))4kovHthkkBpsAEhT0Ry(V7n`I-wc&SYID{ZGA&+HUH4SfST%fzIil+ z*`u&A0!hlXH~W{Xje}=I&&KqL9(5;c9El+{HLf3}x=2M1Ngw}uhgJ7+<9?k@aq!kL zr@dsL%cfnk-D4OM_OkO|9pA z&rIc!D*A;V(m8w3$i!FWc}HjUV;(OwR9;dn9RZWfIk~wlXQdY|{GEGfWn3kME~Fhn z=YI88n`w*{ypRh)fSoPpWSm$U}-Ame+ZKn(Ir1B zo$sHIOZ@ETB~*x|Th=>YE-}eE#s7|1$UNdal%dziY7Utvg(#Q+P zL;PB?*z7mROSig=8tVchACL1UY*Boled6Fb)vUWCE>4@068dWz@4|)OH3XCqG`L<# zIXNFJVh=gL*^Xlp=x&`kHI@v_Ybz^hg%jjvTie?JdzhJ(a>G6Cu!URi zvD534xwevbCdgial`3_gFB&5B#ZkaNC5UQfK@8)?jnd*QvE;pCMPi}aIHyo$k17)ep73DzRA9r0oBwXW=XtE`q zryI`wpRmieQ3E1J*<=ZcV$*?5w$ywZ@%G#E(Jf+_ex&TqQBPz$HS9&(EjAcS-;lZS3kOY>xcdtU9p65l z6P~qp4vQg;ch?Q{G+!T|Y_9P)2Pr4E=!CaBf7ZRWNl>3_6CnvmOB;r0&$e-JkBErd z(30o)%#S^t`Vc z(w}Z3pe<@qxrArIeTxCqZ=q(n4;Ax2$9l>WtDAd!nBb^#48aQZ5yb6q-s2hZ`GpoO zyzRx^Lq1}dCQOH%#$rYi)9+?(#eC(-5!U;_Kv}EV4Ns%NOjAZCrZ*_Ukp8{lwnLj9 z8xtv;w;S$~eKM@+daeksVP!JTMR* zt~ffz;p)7m`AUp30D`^fP9wgaU{!jzPkG%-A4b#!&+HZ{!Z z1oof2g`@W@GfTnB56ks3*^?)ypfT-%^g^?&Jy3w`DU6AldIg5f&PC9TA4$d_T0Lkz zfBO4UTEn3W!!fy=h=NF1PNF$xA=pY^)n~p%{X*=RfC<+7%RE ziL|5DqB@{unZP~%{e=5OkO;qn-Q=|(gzSE}p2}MZ;<43yNQYTy0D!<4Er3Mp)W874R>-N-!~4EBDY z9w}xG+GMWm?ChYB&=x$GmR8o+&yg8zQ?{^>78T_@EknKV6#0_x{B=R}IZ`Wq(4?r2 zf9pF%0T=$|P$FXDS~uU2htwr5TZJoo9}Uc&rLo%H6aT8Q+mo!}x^$#_qWp;K65Y;w zbtjUh^0~0_a;&!+1M}IGRhx~UI6Mt1cJ%Ri1n|c_Q?!}ynVQ@a5urkun!l;M_*az; zg?3mnKoR*twY44=p=#$i$UmP43i5KA-X%LT_B;Rm_ve59&n3?Hb}u9ge}3bCf3x3z^QZcU&-E`zBVYf4RlOGd9gHj94O;Xgh0FqOP`Nt2x`e#; z*OfOfp96I8f(!h)^k2vd=I`h8{IC8_P~h#e*#WBot=&OZfn{hR9m1xlwye=Yy> zet%ybS%`z!adCHW;CudDPT(~Snb6d5Sp@l47+ZI8qDlP&)co_c@fDHZzI~&lpkTQ7 zA!L1p;OdPJ3K;_v8t^q=U^8?qF+_^VrAZ<4l^*>0Qh(R$^~b1~B`QRCc#Q)$gq)r2 zm6ZoaMx03F?F}4ALlKCznZFpm<%F6s< z(W-ZdVqg9rKIQrOx*5H=3r(P(|7kS zJG!6=T>i+x%-vm9PcKF-?lyjS6Hn=v?MD(~=}M)`%axl}ci9j8-^)md1P7ZC6B9QO z{`(oz>b;EV(`z)abh@n{Tu@*gN%QHptSrYVn}U)=j)TZpqaF6M5kGqJ-(T@Rk1VXH zfz^NS&H6bitHoWPgamC2(tqEQC%XUIgMcjly>tG#UdOW$Nc(kYIsWFwPae_2AzAH1$p69K*ckX0nnJ%ucmym4( z{;H^mHJzGjH!(Fdw70n#(bGdw;$lP04O2@or2-l@nag*t2rX>rsF2fZr!Y{$p}0sfp;YFhQsuJNDU_DI()Z?$EhY z7^U$9e)zzTM3yh5s(S1dW$mwxw>Sfx*bdNLeQ=L_?V7}+= z-3ah$S4a0oghE#6liS3^jdO-WBk4c7x@lDj*VZO62@%g&G>r^>e1-Q`+3V$97kjQT zXn*Ol@U1(u4zn;_u>#=xAR}9AF;iK-v(tQbS;*DHqu@NkL9YOC`Sq;d%l)UvQG7Wd zgObSKii^wbmxrUH<^00gPv<3YHlZNOxkWA+hk5N?b>HOx@E=O3shLcypV{zy%ldtG zmhuEJ%xU{!?hamN=3<+ z3}l-F5{YMFClr+a95~0PbR6&A8QTd73VZ|judlC=!hKmT-R_fa%d40e2NqT;_GoAq zs6(4T4xArPjyZ}v&$I~$76AD5@_O**;hRjqK*=CHL`Yj$XEYH-jeAvAWPQS*Nk%-R z&W|7Cis)xWE;2DP`W#W6f9pRd9j&03cQd=WIZ?-GU!PDk7>^jB__peS$~qp8ilp=5 z5!!1{vC>7hI~ahze-TMdOKX)Zz_#~*E|aT`K(@5M{u>luWm~Gyv7w>SL3=iqhBNF+ zrMxiT`k&*|wN^lf0fVuPtEiZV;oOGja4UciG@_n+qtgJs8^fGnt#CAq=Vl`p7Z)?- zhe33rF2xR}Ez{EQKg_uAPj+8Er0R7OGRc|iJ5M_5RR-76_On~|N}d#`WKjLhow8^Q4r1o@*!s+8wv9TI6(!S$wS zc6Q5|%lA*z`~7@6+(O0l>!eUZ#|qT$>XGtui$S^6y@?vIw3G&`G1RTY0eS?m25iLi>w%C4@i(3q~Ss@d89qb?ZtX%CabX?^s2cp5J>`;=Dw#_ds z=?{7CJ?Q`>!)P09ln=mDIk#rdWjWdbuZTy9$qvH5orr)?8$!~-fq4I_PyBR&`M4V7 z1#s|{TG(?~Ka7~Ow%I~B&`{9QQd3X}JdvEoW0=uUx3=5S>b?mL#J<$s9j!OzO^lzEX+VqB4|x|9f$H`Qb%y` zJy_Vxx`c#`%1WRV5{V&inuc^A6jt547a}iTB9^Ar8`V4yr#@wYaj?6vF#d-irBZz| zE2-y_-Uo|Gfe?1Mlai7EyZLpvp4R#5)vL%e55YH-n9!ryK1X9%r=1rh6*X%L^YY>~ z>q1e`)?`NFE{c>)w1MS>4PVcUD-8-#c7KJc{KG#=a8<2l-r6Bb5G zIUl7~ctlT6K}{_>a+Z*g0ILd&U0yD_!8d)m;5T*kNb74P(=9l0aEiBM?H=|Xe2j@{ zaHgU*{U$3VCAQSiaDKQk89tPZ;}Rz)mz`duSX@oyI@%*bzlx}EF7k%GnmhLXJ>j}E zWr<7B-r=ub1-|z|uWN}hpfG9*BD=a3_=e7^ zM_qrEobLtSU`qRws?p1454;m5LruJ%{hgh{=Bp!2q%_2&SncJ3zQZ6Pl>zbU5ekECCebYcy0tF5GJ|O56-_G{NZvaH80H}Mo z=4tTW(9n20^`+K0al}>g~anqH$MYtg)UFkxU!l3TK`I5nTj!Ci?=fD*|Akz zT-=jdQ`6Wnx=*@;#l3UY9+~HPqWZL6d#qW$dBampjVpyR4Z4$~Lpi0z2fM>(g(GM@ z!U31ZMi7DT-*3g{pJMAz z@KMJ@5k?5UgogPWA0gk@0svL4*m2YXOc&hEtuAR`xgm5`h>J$?RA<`g^T(yl84`Ia zmMrDP;s5SmqhI%*r^?IXETch@y$jj+J0bS2aPuGG`n^#~wh+*iO6SO}ZpM3_Hp?sK zAZ+K~@1h91xNxjZ7PW9PGWy--<4c<-w{nB1RDr?I&o9Yyumi!U8enN?(z$>y-~m)3 zMF3s0mRXkZdVX^c(Wr8m98}DEbk-G1{N=Prm^FPKek-I1Bq7m{w636Te%ZByqkhQ^ zYNlB(v)EoAA6x$*9Q^PC+2WMu!lzn{k&7m?#aC+UL3grsSOn2@Y;Xs|N4;uqbOa&W zt$a&DFF~l4j?Aiu&wO;Y+%eDd#S8Yx_-Sc}E~c8shp@>>Np=5fO8*HD&Q}SU3>B5G zCLlc*BsP%9B5Iba@yO2zKmRKSEK=Em()|bB9FP1CM$tbD3hLv$%#fp!5J}I?{eBk9 z_2^O1*=65mA@&jKOB3-`q!0CC;9-r4tbY(@u8dCT?d=V%rG-lSZWY)#`Ec%E0!H>2 z*rpAFw-6f-Ppy^L_aCh!t)#)Rsz$-IjSpz8q}ZT&AuQa@qs>51zuAN>nXBPWtE%;C z+H=pUEr2LD2ECp*H9{77v$4}W(BGe2^-^e55|bgsF9+##ITJLreL&4OCRa9Q3c_oC z0zHxNrWGS^T?DQnU0_ejBOC;@XAT0d16}YDxgiDy#=8SwU*U9v(_kWKIwr&b%)YnR zHHzQawgEeRq7E*wB#h@gs$V2(S_;4+{&d6R%QH zQ3d4CJa_H5T`L*x*T%!e^*q_FGg1U1cQq>J-m=2e`c}vmfqx>>^0jUB zN#)a0Gi$;-cg!p-9@mMbY6Z1*#ZHx$KCv6a#}9Xg!%^Li{VHm}XdGIPeo$# z?6`h71kpu>D9v(d5^oCWTNC3GDS7L3S5t5+xFS#Il3&->dXWmFP zygxi710qb@)8^6shvxw@H!(3PN3bpGMi zAV3+%%UiZbx-N8#w&?kcxRR{4^E`e$ zrzUTJ($dr<0PC{7p}qFQ#_zz8WERnY$B@$1)BJ_j3WR{4<6qqd(=C~*+oo2Vw>*@U zF*r7(qI`ma(7RMr6D)ogFu!pkv(~GG_U0wGs{R%ueHaAXZjf% z%EfgVU0q#ub@d5h8T_jsuEe$i%yszi-iI(hrT&X;FUaex>YI=45+TzrWYf7k+}ng| z|3`lF_orHI!$mx~vYO#xxS$TA<_rwi-~pSOLc^zKR{vVJbm#K#FYtGZNY|Kwhvyb{ zu+=8A7j(S8>7kdn+^!q@H~Xfa^n%a-HIDXA5&my9;3@Ly1&se62*SUi!TO8;2LwSW zObm!3x^p}{9+0dAwaeO78ruYX_;7SYlIF?4^ZWb$gJbpGMgWONOY6CllbMnd#)+!p zu+yhQCKeXK-Dq~u#?vosYR)vj^>g>e=GGQ?9dvcl+S!Bf&<|r9OiWDkiSpRf=26t& z*Zds@&bw^v=k529l)>dzfNJpTf%G&+P4k7=Q0wkhfBP*q%D`Tu5Ih78Yx1zFmB;{@ zm&~Y6O7I<$_>ppJSFolZH?!OTqMt2_u&Jr*vu83+PGXQjI#vT<1@tQ*qEm%NafODm z0N2dSQbR);e9=YI(hN1ZuKn>x{}bEKZ%qs-dD`a$z8CLay$X7JRoTuC#W}*Sq3LZ? z6El=Jtk