> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ton.org/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.ton.org/feedback

```json
{
  "path": "/ecosystem/explorers/tonviewer",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# Using Tonviewer

export const Image = ({src, darkSrc, alt = '', darkAlt, href, target, height = 342, width = 608, noZoom = false, center = false}) => {
  const isSVG = src.match(/\.svg(?:[#?].*?)?$/i) !== null;
  const shouldInvert = isSVG && !darkSrc;
  const shouldCreateLink = href !== undefined;
  const minPx = 9;
  const maxPx = 608;
  const expectedPx = `a number or a string with a number that is greater than ${minPx - 1} and less than or equal to ${maxPx}`;
  const createInvalidPropCallout = (title, received, expected) => {
    return <Danger>
        <span className="font-bold">
          Invalid <code>{title.toString()}</code> passed!
        </span>
        <br />
        <span className="font-bold">Received: </span>
        {received.toString()}
        <br />
        <span className="font-bold">Expected: </span>
        {expected.toString()}
        {}
      </Danger>;
  };
  const checkValidDimensionValue = value => {
    switch (typeof value) {
      case "string":
      case "number":
        const num = Number(value);
        return Number.isSafeInteger(num) && num >= minPx && num <= maxPx;
      default:
        return false;
    }
  };
  let callouts = [];
  if (height && !checkValidDimensionValue(height)) {
    callouts.push(createInvalidPropCallout("height", height, expectedPx));
  }
  if (width && !checkValidDimensionValue(width)) {
    callouts.push(createInvalidPropCallout("width", width, expectedPx));
  }
  if (callouts.length !== 0) {
    return callouts;
  }
  const heightPx = Number(height);
  const widthPx = Number(width);
  const shouldCenter = center === "true" || center === true ? true : false;
  const shouldNotZoom = noZoom === "true" || noZoom === true ? true : false;
  const images = <>
      <img className="block dark:hidden" src={src} alt={alt} {...height && ({
    height: heightPx
  })} {...width && ({
    width: widthPx
  })} {...(shouldCreateLink || shouldInvert || shouldNotZoom) && ({
    noZoom: "true"
  })} />
      <img className={`hidden dark:block ${shouldInvert ? "invert" : ""}`} src={darkSrc ?? src} alt={darkAlt ?? alt} {...height && ({
    height: heightPx
  })} {...width && ({
    width: widthPx
  })} {...(shouldCreateLink || shouldInvert || shouldNotZoom) && ({
    noZoom: "true"
  })} />
    </>;
  if (shouldCreateLink) {
    if (shouldCenter) {
      return <div style={{
        display: "flex",
        justifyContent: "center"
      }}>
          <a href={href} target={target ?? "_self"}>
            {images}
          </a>
        </div>;
    }
    return <a href={href} target={target ?? "_self"}>
        {images}
      </a>;
  }
  if (shouldCenter) {
    return <div style={{
      display: "flex",
      justifyContent: "center"
    }}>{images}</div>;
  }
  return images;
};

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

Tonviewer is a TON Blockchain explorer that allows you to inspect blocks, transactions, contracts, and tokens, as well as analyze activity.

## High-level entities

High-level entities provide the foundation for exploring TON Blockchain, understanding and tracking operations.
They are essential for identifying transactions and tracing data flow across the network.

* [Accounts](/foundations/status) — the primary entities representing actors on the blockchain.
* [Addresses](/foundations/addresses/overview) — unique identifiers for accounts, showing balances and activity in Tonviewer.
* [Messages](/foundations/messages/overview) — instructions sent between addresses. In explorers, they reveal what actions are initiated and how they lead to transactions.
* [Transactions](/foundations/messages/ordinary-tx) — records of executed messages. Explorers display their details linked to a specific address.
* Blocks — containers of transactions. In explorers, they expose block metadata and configuration parameters, allowing you to trace activity and understand how the blockchain operates.

## Reading traces

### Traces

In Tonviewer, operations are visualized through traces.
A trace is a directed acyclic graph (DAG) where:

* transactions are nodes on an account's address
* messages are edges between addresses

<Image src="/resources/images/tonviewer/trace.svg" darkSrc="/resources/images/tonviewer/trace-dark.svg" alt="Trace overview" />

### Using the UI

Tonviewer provides a visual interface for exploring traces:

* Hover over a "node" to see details about the account where a transaction succeeded or failed.
* Hover over an "edge" to inspect the message contents.
* Use "Show details" to examine full transaction and message information.

<Aside>
  The UI may change, but the approach to reading traces remains consistent.
</Aside>

<Image src="/resources/images/tonviewer/ui-overview.png" darkSrc="/resources/images/tonviewer/ui-overview-dark.png" alt="UI overview" />

### Steps to read a trace

1. **Determine the operation**

The external-in message initiates the trace and defines the operation, such as a transfer, swap, or staking action.

2. **Clarify accounts' roles**

Examine the accounts involved — wallet addresses, jetton wallets, jetton master wallets, and DEX contracts. It clarifies the role of each account in the operation flow.

3. **Read messages**

Examine each message (edge in the trace). Its payload defines the intended actions and the transferred value:

* value — amount of TON or jettons transferred
* opcode — instruction type
* payload — instructions

4. **Check transaction phases**

Each transaction executes in phases. In the compute and action phases, an exit code of 0 indicates success; a non-zero code signals an error. This identifies which action succeeded and which failed.

5. **Find the failure point**

Some failures can occur even if all transactions are successful. Examine messages and payloads to identify where an operation was constrained or prevented from proceeding.

## Failed use cases

The following examples illustrate traces where operations did not complete as intended, even when transactions appear successful. They demonstrate a general approach to reading traces and identifying the point of failure.

### Jetton transfer

Analyze a [jetton transfer](https://tonviewer.com/transaction/d5d50c3e5bde493ddc7853f784bdff75a37bf89473e77ba8d04615323c7c8117) attempt.

<Image src="/resources/images/tonviewer/jetton-transfer.png" darkSrc="/resources/images/tonviewer/jetton-transfer-dark.png" alt="Jetton transfer" />

1. **Determine the operation**

At point **A** (mintmachine.ton), an external-in message initiates the operation, instructing *a jetton transfer*.

2. **Clarify accounts' roles**

* A — sender’s wallet contract (mintmachine.ton), initiates the transfer.
* B — jetton wallet contract governed by the jetton master, holds the tokens and executes the transfer.

3. **Read messages**

* A → B: jetton transfer message with 0.2 TON attached to cover execution fees.

4. **Check transaction phases**

The transaction at **B** failed during execution, with a non-zero exit code.

5. **Find the failure point**

Exit code `48` per [jetton contract logic](https://github.com/ton-blockchain/jetton-contract/blob/main/contracts/op-codes.fc#L33) indicates that there isn't enough gas to complete the transfer.
The attached TON was insufficient to cover execution and forwarding, so the contract aborted the transfer.

### NFT transfer

Analyze an [NFT transfer](https://tonviewer.com/transaction/d8b5dbfe1c115178f47b486d03982159ec8abe684cdbe1c75587293e877564d4) attempt.

<Image src="/resources/images/tonviewer/nft-transfer.png" darkSrc="/resources/images/tonviewer/nft-transfer-dark.png" alt="NFT transfer" />

1. **Determine the operation**

At point **A** (address `UQDj…D0lN`), the user’s wallet sends an external-in message to *transfer an NFT*.

2. **Clarify accounts' roles**

* A — the user's wallet, initiates the transfer.
* B — the NFT contract at address `EQCo…gJdV`, validates ownership and executes the transfer.

3. **Read messages**

* A → B: NFT transfer message with 0.04 TON attached.
* B → A: bounce returning 0.036514 TON.

4. **Check transaction phases**

The transaction at **B** failed in the compute phase, with an exit code of `401`.

5. **Find the failure point**

According to the [NFT standard](https://github.com/ton-blockchain/token-contract/blob/main/nft/nft-item.fc#L65), exit code `401`  means that the sender is not the owner of the NFT.
Because the ownership check failed, the contract rejected the transfer and returned the unused funds to **A**.

### DEX swap

Analyze a [token swap](https://tonviewer.com/transaction/fa8e119f8911d20bb078b9b81a3fc1f8ff2bcc723eda3ac7e873e97f455812e7) attempt from **DYX** to **pTON**.

<Image src="/resources/images/tonviewer/dex-swap.png" darkSrc="/resources/images/tonviewer/dex-swap-dark.png" alt="DEX swap" />

1. **Determine the operation**

The trace begins at point **A** (the user’s `mintmachine.ton` contract). An external-in message initiates the *token swap attempt*.

2. **Clarify accounts' roles**

* A — user's mintmachine.ton account, sending the initial funds.
* B — user's jetton wallet, holds the tokens.
* C — DEX jetton wallet, forwards tokens to the DEX.
* D — DEX smart contract executing the swap.
* E — jetton master (minter), authorizes token operations.

3. **Read messages**

* A → B: 0.3 TON transferred via a jetton transfer.
* B → C: jetton internal transfer to the DEX wallet.
* C → D: swap request sent to the DEX contract.
* C → A: return of excess funds.
* D → E: request to the jetton master.
* E → D: reply with `exit_code: 962605456 (0x39603190)`.

4. **Check transaction phases**

Transactions in A, B, C, D, and E all completed with exit code 0. No phase errors were reported.

5. **Find the failure point**

The issue appears in the payload of **E → D**. According to [STON.fi docs](https://docs.ston.fi/developer-section/dex/smart-contracts/v2/op-codes#transfer-exit-codes), the `exit_code: 962605456` corresponds to *Swap out token amount is less than provided minimum value*.

This explains why, despite all transactions succeeding, the swap reverted: the output did not satisfy the minimum slippage tolerance.

## Successful use case

Analyze a [token swap](https://tonviewer.com/transaction/b1dce2881224590a7c60e61594c68bd477f84fe81519b373da8fbed9c0269565) from **REDO** to **TON**.

<Image src="/resources/images/tonviewer/dex-swap-successful.png" darkSrc="/resources/images/tonviewer/dex-swap-successful-dark.png" alt="DEX swap successful case" />

1. **Determine the operation**

An **external-in** message arrives at point **A** (mintmachine.ton), initiating the *token swap*.

2. **Clarify accounts' roles**

* A — mintmachine.ton account, provides initial funds for the swap.
* B — user's jetton wallet, holds the tokens.
* C — DEX jetton wallet, forwards tokens to the DEX.
* D — DEX smart contract executing the swap.
* E — jetton master (minter), authorizes token operations.
* F — DEX payout account (mergesort.t.me), receives the swapped tokens.

3. **Read messages**

* A → B: 0.2 TON transferred via a jetton transfer.
* B → C: internal jetton transfer to the DEX wallet.
* C → D: valid amount forwarded to the DEX contract for swap execution.
* C → A: return of excess funds.
* D → E: request to the jetton master (minter) to mint/settle token movements.
* E → external-out: issues an **external-out message** — confirmation that the operation succeeded.
* E → F: sends an internal message to the payout pool account.
* F → A: forwards the swap result to the initiator (`mintmachine.ton`).

4. **Check transaction phases**

All transactions along the trace completed their phases without error, no warning markers; exit codes are `0`. There are no bounces, failed compute or action phases reported in the nodes.

5. **Find the failure point**

No failure point — the operation completed successfully.

## Debugging with retracer

Sometimes, reading messages and transaction phases is not enough.
A transaction may show *successful compute and action phases, exit codes of `0`, and no errors in messages* — yet still produce no effect on-chain.

In such cases, you need to trace the **TVM execution path**.
[Retracer](https://retracer.ton.org/) lets you replay the transaction and inspect what happened inside the virtual machine.

See [Debugging with TVM Retracer](/contract-dev/debug#debugging-with-tvm-retracer) for details.
