{"id":15158,"date":"2026-07-28T14:43:57","date_gmt":"2026-07-28T14:43:57","guid":{"rendered":"https:\/\/tokpie.io\/blog\/?p=15158"},"modified":"2026-09-10T04:55:31","modified_gmt":"2026-09-10T04:55:31","slug":"add-token-logo-robinhood-chain-blockscout","status":"publish","type":"post","link":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/","title":{"rendered":"How to Add a Logo to Your Token on Robinhood Chain Blockscout"},"content":{"rendered":"\n<p>A finished logo file does not automatically create a finished token page. On Robinhood Chain Blockscout, the logo sits behind an ownership check, a direct image URL, a metadata form, and a QA review. Therefore, the real job is not simply to upload a picture. It is to connect the right wallet, the right contract, and the right project information in one consistent request.<\/p>\n\n\n\n<p>This guide shows how to add a token logo on Robinhood Chain through the official <a href=\"https:\/\/robinhoodchain.blockscout.com\/token\/0xE49A1C3033EcC6b804bc423021D3F71F1A3e0F9B\">Blockscout<\/a> workflow. You will see the normal deployer-wallet route, the fallback when that wallet is unavailable, the exact logo format, the review choices, and the checks that can delay or stop a request.<\/p>\n\n\n\n<p>Most importantly, prepare the whole package before opening the form. A clean 48 x 48 icon cannot compensate for the wrong contract address, an indirect image link, or branding that conflicts with the official website.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"566\" src=\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example-1024x566.webp\" alt=\"RobinWifHat token page on Robinhood Chain Blockscout with the token logo highlighted.\" class=\"wp-image-15162\" srcset=\"https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example.webp?size=168x93&amp;lossy=2&amp;strip=1&amp;webp=1 168w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example-300x166.webp?lossy=2&amp;strip=1&amp;webp=1 300w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example.webp?size=504x279&amp;lossy=2&amp;strip=1&amp;webp=1 504w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example.webp?size=672x371&amp;lossy=2&amp;strip=1&amp;webp=1 672w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example-768x424.webp?lossy=2&amp;strip=1&amp;webp=1 768w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example.webp?size=840x464&amp;lossy=2&amp;strip=1&amp;webp=1 840w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example-1024x566.webp?lossy=2&amp;strip=1&amp;webp=1 1024w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/robinhood_chain_token_logo_example.webp?lossy=2&amp;strip=1&amp;webp=1 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Example of a token logo displayed on the Robinhood Chain Blockscout explorer.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-blockscout-needs-before-it-can-add-the-logo\">What Blockscout needs before it can add the logo<\/h2>\n\n\n\n<p>Blockscout treats a token logo as verified project metadata. The image is not written into the token contract, and the form does not simply attach a local file. Instead, you provide an Icon URL that points to a public SVG or PNG file.<\/p>\n\n\n\n<p>However, the update begins with ownership. Blockscout requires the contract source code to be verified before an owner can submit changes to the name, logo, website, or social links. Then the account must prove its relationship to the token contract.<\/p>\n\n\n\n<p>The <a href=\"https:\/\/docs.blockscout.com\/using-blockscout\/token-info\">official Blockscout token-information instructions<\/a> describe two submission paths. First, the deployer-wallet route supports automatic checks. Alternatively, manual evidence can support a request when the original deployment relationship cannot be confirmed through the interface.<\/p>\n\n\n\n<p>As a result, think of the workflow as four connected gates:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verify the contract source code.<\/li>\n\n\n\n<li>Verify the requester&#8217;s relationship to the contract.<\/li>\n\n\n\n<li>Supply a direct 48 x 48 Icon URL and consistent project metadata.<\/li>\n\n\n\n<li>Pass Blockscout&#8217;s QA review.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-official-route-when-you-control-the-deployer-wallet\">Official route when you control the deployer wallet<\/h2>\n\n\n\n<p>When you still control the wallet that deployed the token, use Blockscout&#8217;s primary submission route. This path lets automated checks connect the account to the deployment record.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-1-verify-the-token-contract-source-code\">1. Verify the token contract source code<\/h3>\n\n\n\n<p>First, open the token contract on the Robinhood Chain Blockscout explorer and complete source-code verification. A deployed contract alone is not enough for owner-submitted metadata changes.<\/p>\n\n\n\n<p>Because verification makes the public code comparable with the deployed bytecode, complete this step before troubleshooting the logo form. Otherwise, the Verified addresses workflow may not be available for the contract.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-2-log-in-with-the-deployer-wallet\">2. Log in with the deployer wallet<\/h3>\n\n\n\n<p>Next, sign in to Blockscout with the same address that deployed the token. Also, associate an email address with the Blockscout account so the review team can contact you if it needs more information.<\/p>\n\n\n\n<p>If a team member signs in with an unrelated treasury or marketing wallet, Blockscout cannot automatically connect that wallet to the deployment. In that case, use the manual path described later instead of repeatedly trying the primary form.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-3-open-add-token-info-from-the-token-page\">3. Open Add Token Info from the token page<\/h3>\n\n\n\n<p>After logging in, search for the token contract and open its token page. Then select the three-dot menu and choose <strong>Add Token Info<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"649\" src=\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu-1024x649.webp\" alt=\"Robinhood Chain Blockscout token page with the three-dot menu open and Add Token Info highlighted\" class=\"wp-image-15159\" srcset=\"https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu.webp?size=168x106&amp;lossy=2&amp;strip=1&amp;webp=1 168w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu-300x190.webp?lossy=2&amp;strip=1&amp;webp=1 300w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu.webp?size=504x319&amp;lossy=2&amp;strip=1&amp;webp=1 504w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu.webp?size=672x426&amp;lossy=2&amp;strip=1&amp;webp=1 672w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu-768x486.webp?lossy=2&amp;strip=1&amp;webp=1 768w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu.webp?size=840x532&amp;lossy=2&amp;strip=1&amp;webp=1 840w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu-1024x649.webp?lossy=2&amp;strip=1&amp;webp=1 1024w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/01_add_token_info_menu.webp?lossy=2&amp;strip=1&amp;webp=1 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Open the token page&#8217;s three-dot menu and select Add Token Info after ownership verification.<\/figcaption><\/figure>\n\n\n\n<p>This route is usually the fastest because you begin on the exact token page you intend to update. Nevertheless, copy the contract address from your deployment records and compare it carefully before entering any information.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-4-use-verified-addresses-as-the-alternative-entry-point\">4. Use Verified addresses as the alternative entry point<\/h3>\n\n\n\n<p>Alternatively, open <strong>My Account<\/strong>, select <strong>Verified addresses<\/strong>, choose the token contract, and click <strong>Add details<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"649\" src=\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details-1024x649.webp\" alt=\"Blockscout Verified addresses dashboard showing the Add details button for a Robinhood Chain token\" class=\"wp-image-15160\" srcset=\"https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details.webp?size=168x106&amp;lossy=2&amp;strip=1&amp;webp=1 168w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details-300x190.webp?lossy=2&amp;strip=1&amp;webp=1 300w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details.webp?size=504x319&amp;lossy=2&amp;strip=1&amp;webp=1 504w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details.webp?size=672x426&amp;lossy=2&amp;strip=1&amp;webp=1 672w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details-768x486.webp?lossy=2&amp;strip=1&amp;webp=1 768w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details.webp?size=840x532&amp;lossy=2&amp;strip=1&amp;webp=1 840w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details-1024x649.webp?lossy=2&amp;strip=1&amp;webp=1 1024w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/02_verified_addresses_add_details.webp?lossy=2&amp;strip=1&amp;webp=1 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">The same request can start from My Account, Verified addresses, and the token&#8217;s Add details button.<\/figcaption><\/figure>\n\n\n\n<p>Both entry points lead to the same practical job: submit public information for a contract whose ownership has been verified. Therefore, choose the route that is easiest to confirm in your account.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-5-complete-the-request-and-send-it-for-review\">5. Complete the request and send it for review<\/h3>\n\n\n\n<p>Finally, enter the token information, check every link, and select <strong>Send request<\/strong>. The submission then moves to Blockscout QA.<\/p>\n\n\n\n<p>Do not rush this screen. Once the request is sent, a typo in the contract address, an expired image link, or a conflicting project name can create a preventable review problem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-information-required-for-the-token-request\">Information required for the token request<\/h2>\n\n\n\n<p>Blockscout separates required fields from context that is suggested or optional. Even so, a complete package makes it easier for reviewers to connect the contract, project, and branding.<\/p>\n\n\n\n<div id=\"fat-incoming-widget-v2\" class=\"fat-scan-widget\" data-rpc-proxy=\"\">\n  <div class=\"fat-scan-panel\">\n    <div class=\"fat-scan-heading\">\n      <div>\n        <p class=\"fat-scan-kicker\">Datachain Rope \u00b7 Chain ID 271828<\/p>\n        <h2>FAT Incoming Transaction Finder<\/h2>\n        <p class=\"fat-scan-intro\">\n          Enter a wallet address to find historical incoming native FAT transfers,\n          including the amount, sender, block, confirmations, and transaction hash.\n        <\/p>\n      <\/div>\n    <\/div>\n\n    <form class=\"fat-scan-form\" novalidate>\n      <label for=\"fat-wallet-address-v2\">Wallet address<\/label>\n      <div class=\"fat-scan-input-row\">\n        <input\n          id=\"fat-wallet-address-v2\"\n          name=\"wallet\"\n          type=\"text\"\n          inputmode=\"text\"\n          autocomplete=\"off\"\n          spellcheck=\"false\"\n          placeholder=\"0x1a22d6601b32608588105907722Ba930aEe5C247\"\n          maxlength=\"42\"\n          aria-describedby=\"fat-wallet-help-v2\"\n        >\n        <button class=\"fat-scan-primary\" type=\"submit\">Find incoming FAT<\/button>\n        <button class=\"fat-scan-secondary fat-scan-reset\" type=\"button\">Reset<\/button>\n      <\/div>\n      <p id=\"fat-wallet-help-v2\" class=\"fat-scan-help\">\n        Native FAT on Datachain Rope only. No wallet connection, signature, seed phrase,\n        or private key is required.\n      <\/p>\n    <\/form>\n\n    <p class=\"fat-scan-runtime-status\" role=\"status\" aria-live=\"polite\">\n      Loading scanner\u2026\n    <\/p>\n    <noscript>\n      <div class=\"fat-scan-alert\" data-kind=\"error\">\n        JavaScript is required to run the FAT transaction finder.\n      <\/div>\n    <\/noscript>\n\n    <div class=\"fat-scan-alert\" role=\"alert\" aria-live=\"polite\" hidden><\/div>\n\n    <section class=\"fat-scan-progress\" aria-live=\"polite\" hidden>\n      <div class=\"fat-scan-progress-head\">\n        <strong class=\"fat-scan-progress-title\">Preparing search\u2026<\/strong>\n        <span class=\"fat-scan-progress-percent\">0%<\/span>\n      <\/div>\n      <div class=\"fat-scan-progress-track\" aria-hidden=\"true\">\n        <span class=\"fat-scan-progress-bar\"><\/span>\n      <\/div>\n      <div class=\"fat-scan-log\" aria-label=\"Search progress\"><\/div>\n    <\/section>\n\n    <section class=\"fat-scan-results\" hidden>\n      <div class=\"fat-scan-summary\">\n        <div class=\"fat-scan-stat\">\n          <span>Current balance<\/span>\n          <strong data-summary=\"balance\">\u2014<\/strong>\n        <\/div>\n        <div class=\"fat-scan-stat\">\n          <span>Incoming records<\/span>\n          <strong data-summary=\"count\">\u2014<\/strong>\n        <\/div>\n        <div class=\"fat-scan-stat\">\n          <span>Total incoming found<\/span>\n          <strong data-summary=\"total\">\u2014<\/strong>\n        <\/div>\n        <div class=\"fat-scan-stat\">\n          <span>Head block<\/span>\n          <strong data-summary=\"head\">\u2014<\/strong>\n        <\/div>\n      <\/div>\n\n      <div class=\"fat-scan-result-head\">\n        <div>\n          <h3>Incoming FAT transactions<\/h3>\n          <p class=\"fat-scan-result-note\">\n            \u201cTotal incoming found\u201d is gross historical inflow. It can be higher than the\n            current balance if this address later sent FAT out.\n          <\/p>\n        <\/div>\n        <button class=\"fat-scan-secondary fat-scan-download\" type=\"button\" disabled>\n          Download CSV\n        <\/button>\n      <\/div>\n\n      <div class=\"fat-scan-empty\" hidden>\n        No incoming FAT transactions were found by the available historical RPC.\n      <\/div>\n\n      <div class=\"fat-scan-table-wrap\" hidden>\n        <table class=\"fat-scan-table\">\n          <thead>\n            <tr>\n              <th>#<\/th>\n              <th>Amount<\/th>\n              <th>Time (UTC)<\/th>\n              <th>From<\/th>\n              <th>Transaction hash<\/th>\n              <th>Block<\/th>\n              <th>Confirmations<\/th>\n              <th>Type<\/th>\n              <th>Status<\/th>\n            <\/tr>\n          <\/thead>\n          <tbody><\/tbody>\n        <\/table>\n      <\/div>\n\n      <details class=\"fat-scan-diagnostics\">\n        <summary>Technical details<\/summary>\n        <dl>\n          <div><dt>Wallet<\/dt><dd data-detail=\"wallet\">\u2014<\/dd><\/div>\n          <div><dt>RPC used<\/dt><dd data-detail=\"rpc\">\u2014<\/dd><\/div>\n          <div><dt>Chain ID<\/dt><dd>271828<\/dd><\/div>\n          <div><dt>Asset<\/dt><dd>Native FAT<\/dd><\/div>\n          <div><dt>Scan completed<\/dt><dd data-detail=\"completed\">\u2014<\/dd><\/div>\n        <\/dl>\n      <\/details>\n    <\/section>\n  <\/div>\n<\/div>\n\n<style>\n#fat-incoming-widget-v2,\n  #fat-incoming-widget-v2 * {\n    box-sizing: border-box;\n  }\n\n  #fat-incoming-widget-v2 {\n    --fat-bg: #ffffff;\n    --fat-text: #16181d;\n    --fat-muted: #626a76;\n    --fat-border: #dfe3e8;\n    --fat-soft: #f5f7f9;\n    --fat-accent: #111827;\n    --fat-accent-hover: #2b3443;\n    --fat-success: #137a42;\n    --fat-success-bg: #eaf7ef;\n    --fat-warning: #8a5a00;\n    --fat-warning-bg: #fff6da;\n    --fat-error: #b42318;\n    --fat-error-bg: #fff0ee;\n    --fat-link: #155eef;\n    width: 100%;\n    margin: 28px 0;\n    color: var(--fat-text);\n    font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,\n      \"Segoe UI\", sans-serif;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-panel {\n    width: 100%;\n    padding: clamp(18px, 3vw, 32px);\n    border: 1px solid var(--fat-border);\n    border-radius: 16px;\n    background: var(--fat-bg);\n    box-shadow: 0 12px 34px rgba(17, 24, 39, 0.08);\n  }\n\n  #fat-incoming-widget-v2 h2,\n  #fat-incoming-widget-v2 h3,\n  #fat-incoming-widget-v2 p {\n    margin-top: 0;\n  }\n\n  #fat-incoming-widget-v2 h2 {\n    margin-bottom: 8px;\n    font-size: clamp(24px, 3.3vw, 36px);\n    line-height: 1.15;\n  }\n\n  #fat-incoming-widget-v2 h3 {\n    margin-bottom: 6px;\n    font-size: 20px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-kicker {\n    margin-bottom: 8px;\n    color: var(--fat-muted);\n    font-size: 12px;\n    font-weight: 700;\n    letter-spacing: 0.08em;\n    text-transform: uppercase;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-intro,\n  #fat-incoming-widget-v2 .fat-scan-help,\n  #fat-incoming-widget-v2 .fat-scan-result-note {\n    color: var(--fat-muted);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-intro {\n    max-width: 880px;\n    margin-bottom: 0;\n    font-size: 15px;\n    line-height: 1.65;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-form {\n    margin-top: 24px;\n    padding: 20px;\n    border: 1px solid var(--fat-border);\n    border-radius: 12px;\n    background: var(--fat-soft);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-form label {\n    display: block;\n    margin-bottom: 8px;\n    font-size: 14px;\n    font-weight: 700;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-input-row {\n    display: grid;\n    grid-template-columns: minmax(220px, 1fr) auto auto;\n    gap: 10px;\n  }\n\n  #fat-incoming-widget-v2 input,\n  #fat-incoming-widget-v2 button {\n    min-height: 46px;\n    border-radius: 9px;\n    font: inherit;\n  }\n\n  #fat-incoming-widget-v2 input {\n    width: 100%;\n    padding: 10px 13px;\n    border: 1px solid #b8c0ca;\n    background: #fff;\n    color: var(--fat-text);\n    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n      \"Liberation Mono\", monospace;\n    font-size: 14px;\n  }\n\n  #fat-incoming-widget-v2 input:focus {\n    border-color: var(--fat-link);\n    outline: 3px solid rgba(21, 94, 239, 0.14);\n  }\n\n  #fat-incoming-widget-v2 button {\n    padding: 10px 16px;\n    border: 1px solid transparent;\n    cursor: pointer;\n    font-weight: 700;\n    transition: transform 0.12s ease, background 0.12s ease, opacity 0.12s ease;\n  }\n\n  #fat-incoming-widget-v2 button:hover:not(:disabled) {\n    transform: translateY(-1px);\n  }\n\n  #fat-incoming-widget-v2 button:disabled {\n    cursor: not-allowed;\n    opacity: 0.55;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-primary {\n    background: var(--fat-accent);\n    color: #fff;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-primary:hover:not(:disabled) {\n    background: var(--fat-accent-hover);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-secondary {\n    border-color: var(--fat-border);\n    background: #fff;\n    color: var(--fat-text);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-help {\n    margin: 10px 0 0;\n    font-size: 12px;\n    line-height: 1.55;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-alert {\n    margin-top: 16px;\n    padding: 13px 15px;\n    border: 1px solid var(--fat-border);\n    border-radius: 10px;\n    font-size: 14px;\n    line-height: 1.55;\n    white-space: pre-wrap;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-alert[data-kind=\"error\"] {\n    border-color: #f1b8b2;\n    background: var(--fat-error-bg);\n    color: var(--fat-error);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-alert[data-kind=\"warning\"] {\n    border-color: #ead28f;\n    background: var(--fat-warning-bg);\n    color: var(--fat-warning);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-alert[data-kind=\"success\"] {\n    border-color: #a8d8bd;\n    background: var(--fat-success-bg);\n    color: var(--fat-success);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-progress {\n    margin-top: 18px;\n    padding: 16px;\n    border: 1px solid var(--fat-border);\n    border-radius: 12px;\n    background: #fff;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-progress-head {\n    display: flex;\n    justify-content: space-between;\n    gap: 12px;\n    margin-bottom: 10px;\n    font-size: 14px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-progress-track {\n    height: 8px;\n    overflow: hidden;\n    border-radius: 999px;\n    background: #e9edf2;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-progress-bar {\n    display: block;\n    width: 0;\n    height: 100%;\n    border-radius: inherit;\n    background: var(--fat-accent);\n    transition: width 0.2s ease;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-log {\n    max-height: 180px;\n    margin-top: 12px;\n    overflow: auto;\n    color: var(--fat-muted);\n    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n      \"Liberation Mono\", monospace;\n    font-size: 12px;\n    line-height: 1.6;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-log div + div {\n    margin-top: 2px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-results {\n    margin-top: 24px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-summary {\n    display: grid;\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n    gap: 12px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-stat {\n    min-width: 0;\n    padding: 16px;\n    border: 1px solid var(--fat-border);\n    border-radius: 11px;\n    background: var(--fat-soft);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-stat span {\n    display: block;\n    margin-bottom: 6px;\n    color: var(--fat-muted);\n    font-size: 12px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-stat strong {\n    display: block;\n    overflow-wrap: anywhere;\n    font-size: 18px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-result-head {\n    display: flex;\n    align-items: flex-end;\n    justify-content: space-between;\n    gap: 16px;\n    margin-top: 24px;\n    margin-bottom: 12px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-result-note {\n    max-width: 780px;\n    margin-bottom: 0;\n    font-size: 12px;\n    line-height: 1.55;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-empty {\n    padding: 24px;\n    border: 1px dashed #b8c0ca;\n    border-radius: 11px;\n    text-align: center;\n    color: var(--fat-muted);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-table-wrap {\n    width: 100%;\n    overflow-x: auto;\n    border: 1px solid var(--fat-border);\n    border-radius: 12px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-table {\n    width: 100%;\n    min-width: 1220px;\n    border-collapse: collapse;\n    background: #fff;\n    font-size: 12px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-table th,\n  #fat-incoming-widget-v2 .fat-scan-table td {\n    padding: 12px;\n    border-bottom: 1px solid var(--fat-border);\n    text-align: left;\n    vertical-align: top;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-table th {\n    background: var(--fat-soft);\n    color: #4d5561;\n    font-size: 11px;\n    letter-spacing: 0.04em;\n    text-transform: uppercase;\n    white-space: nowrap;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-table tbody tr:last-child td {\n    border-bottom: 0;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-table a {\n    color: var(--fat-link);\n    text-decoration: none;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-table a:hover {\n    text-decoration: underline;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-mono {\n    display: inline-block;\n    max-width: 260px;\n    overflow-wrap: anywhere;\n    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n      \"Liberation Mono\", monospace;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-amount {\n    font-weight: 800;\n    white-space: nowrap;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-badge {\n    display: inline-flex;\n    align-items: center;\n    min-height: 24px;\n    padding: 3px 8px;\n    border-radius: 999px;\n    background: var(--fat-soft);\n    color: #434b56;\n    font-size: 11px;\n    font-weight: 700;\n    white-space: nowrap;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-badge[data-status=\"success\"] {\n    background: var(--fat-success-bg);\n    color: var(--fat-success);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-badge[data-status=\"warning\"] {\n    background: var(--fat-warning-bg);\n    color: var(--fat-warning);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-diagnostics {\n    margin-top: 18px;\n    padding: 13px 15px;\n    border: 1px solid var(--fat-border);\n    border-radius: 10px;\n    background: var(--fat-soft);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-diagnostics summary {\n    cursor: pointer;\n    font-weight: 700;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-diagnostics dl {\n    margin: 14px 0 0;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-diagnostics dl > div {\n    display: grid;\n    grid-template-columns: 140px minmax(0, 1fr);\n    gap: 12px;\n    padding: 7px 0;\n    border-top: 1px solid var(--fat-border);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-diagnostics dt {\n    color: var(--fat-muted);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-diagnostics dd {\n    min-width: 0;\n    margin: 0;\n    overflow-wrap: anywhere;\n    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,\n      \"Liberation Mono\", monospace;\n  }\n\n  @media (max-width: 900px) {\n    #fat-incoming-widget-v2 .fat-scan-input-row {\n      grid-template-columns: 1fr 1fr;\n    }\n\n    #fat-incoming-widget-v2 .fat-scan-input-row input {\n      grid-column: 1 \/ -1;\n    }\n\n    #fat-incoming-widget-v2 .fat-scan-summary {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n  }\n\n  @media (max-width: 580px) {\n    #fat-incoming-widget-v2 .fat-scan-panel {\n      padding: 16px;\n      border-radius: 12px;\n    }\n\n    #fat-incoming-widget-v2 .fat-scan-input-row,\n    #fat-incoming-widget-v2 .fat-scan-summary {\n      grid-template-columns: 1fr;\n    }\n\n    #fat-incoming-widget-v2 .fat-scan-input-row input {\n      grid-column: auto;\n    }\n\n    #fat-incoming-widget-v2 .fat-scan-result-head {\n      align-items: stretch;\n      flex-direction: column;\n    }\n\n    #fat-incoming-widget-v2 .fat-scan-download {\n      width: 100%;\n    }\n\n    #fat-incoming-widget-v2 .fat-scan-diagnostics dl > div {\n      grid-template-columns: 1fr;\n      gap: 3px;\n    }\n  }\n\n\n  #fat-incoming-widget-v2 .fat-scan-runtime-status {\n    margin: 12px 0 0;\n    color: var(--fat-muted);\n    font-size: 13px;\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-runtime-status[data-state=\"ready\"] {\n    color: var(--fat-success);\n  }\n\n  #fat-incoming-widget-v2 .fat-scan-runtime-status[data-state=\"error\"] {\n    color: var(--fat-error);\n  }\n<\/style>\n\n<script data-cfasync=\"false\">\n(() => {\n  'use strict';\n\n  function initializeFatIncomingFinder() {\n    const root = document.getElementById('fat-incoming-widget-v2');\n    if (!root) return false;\n    if (root.dataset.initialized === '1') return true;\n\n    const CHAIN_ID = 271828n;\n    const MAX_OUTGOING_NONCE = 1000n;\n    const MAX_BALANCE_CHANGES = 1000;\n\n    const FALLBACK_RPC_URLS = [\n      'https:\/\/erpc.datachain.network',\n      'https:\/\/archive.erpc.datachain.network',\n      'https:\/\/erpc.rope.network',\n      'https:\/\/dcscan.io\/api\/rpc'\n    ];\n\n    const form = root.querySelector('.fat-scan-form');\n    const addressInput = root.querySelector('input[name=\"wallet\"]');\n    const submitButton = root.querySelector('.fat-scan-primary');\n    const resetButton = root.querySelector('.fat-scan-reset');\n    const downloadButton = root.querySelector('.fat-scan-download');\n    const alertBox = root.querySelector('.fat-scan-alert');\n    const progressBox = root.querySelector('.fat-scan-progress');\n    const progressTitle = root.querySelector('.fat-scan-progress-title');\n    const progressPercent = root.querySelector('.fat-scan-progress-percent');\n    const progressBar = root.querySelector('.fat-scan-progress-bar');\n    const logBox = root.querySelector('.fat-scan-log');\n    const resultsBox = root.querySelector('.fat-scan-results');\n    const tableWrap = root.querySelector('.fat-scan-table-wrap');\n    const tableBody = root.querySelector('.fat-scan-table tbody');\n    const emptyBox = root.querySelector('.fat-scan-empty');\n    const runtimeStatus = root.querySelector('.fat-scan-runtime-status');\n\n    const requiredElements = [\n      form, addressInput, submitButton, resetButton, downloadButton, alertBox,\n      progressBox, progressTitle, progressPercent, progressBar, logBox, resultsBox,\n      tableWrap, tableBody, emptyBox\n    ];\n\n    if (requiredElements.some(element => !element)) {\n      if (runtimeStatus) {\n        runtimeStatus.dataset.state = 'error';\n        runtimeStatus.textContent = 'Scanner could not initialize because required page elements are missing.';\n      }\n      console.error('FAT Incoming Finder: required DOM elements are missing.');\n      return false;\n    }\n\n    root.dataset.initialized = '1';\n\n    let activeRun = 0;\n    let latestCsv = '';\n    let latestAddress = '';\n\n    const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));\n    const blockHex = n => `0x${BigInt(n).toString(16)}`;\n    const asBigInt = value => (!value || value === '0x' ? 0n : BigInt(value));\n    const errorText = error => error instanceof Error ? error.message : String(error);\n    const isAddress = value => \/^0x[0-9a-fA-F]{40}$\/.test(value);\n    const isHash = value => \/^0x[0-9a-fA-F]{64}$\/.test(value || '');\n\n    function formatFat(wei) {\n      let value = asBigInt(wei);\n      const sign = value < 0n ? '-' : '';\n      if (value < 0n) value = -value;\n\n      const text = value.toString().padStart(19, '0');\n      const whole = text.slice(0, -18) || '0';\n      const fraction = text.slice(-18).replace(\/0+$\/, '');\n      return sign + whole + (fraction ? `.${fraction}` : '');\n    }\n\n    function formatInteger(value) {\n      try {\n        return BigInt(value).toLocaleString('en-US');\n      } catch {\n        return String(value ?? '');\n      }\n    }\n\n    function formatType(type) {\n      const labels = {\n        DIRECT_NATIVE_FAT: 'Direct transfer',\n        INTERNAL_NATIVE_FAT: 'Internal transfer',\n        SELFDESTRUCT_NATIVE_FAT: 'Self-destruct transfer',\n        GENESIS_OR_STATE_ALLOCATION: 'Genesis\/state allocation',\n        SYSTEM_OR_UNTRACED_FAT: 'System or untraced'\n      };\n      return labels[type] || type || 'Unknown';\n    }\n\n    function setAlert(kind, message) {\n      if (!message) {\n        alertBox.hidden = true;\n        alertBox.textContent = '';\n        alertBox.removeAttribute('data-kind');\n        return;\n      }\n      alertBox.hidden = false;\n      alertBox.dataset.kind = kind;\n      alertBox.textContent = message;\n    }\n\n    function setProgress(percent, title, logMessage) {\n      const safePercent = Math.max(0, Math.min(100, Number(percent) || 0));\n      progressBox.hidden = false;\n      progressTitle.textContent = title;\n      progressPercent.textContent = `${Math.round(safePercent)}%`;\n      progressBar.style.width = `${safePercent}%`;\n\n      if (logMessage) {\n        const line = document.createElement('div');\n        const now = new Date().toLocaleTimeString('en-GB', { hour12: false });\n        line.textContent = `[${now}] ${logMessage}`;\n        logBox.appendChild(line);\n        logBox.scrollTop = logBox.scrollHeight;\n      }\n    }\n\n    function ensureCurrent(runId) {\n      if (runId !== activeRun) {\n        throw new Error('Search cancelled.');\n      }\n    }\n\n    function clearResults() {\n      latestCsv = '';\n      latestAddress = '';\n      resultsBox.hidden = true;\n      tableWrap.hidden = true;\n      emptyBox.hidden = true;\n      tableBody.innerHTML = '';\n      downloadButton.disabled = true;\n    }\n\n    function resetUi() {\n      activeRun += 1;\n      submitButton.disabled = false;\n      submitButton.textContent = 'Find incoming FAT';\n      addressInput.disabled = false;\n      resetButton.disabled = false;\n      addressInput.value = '';\n      setAlert('', '');\n      progressBox.hidden = true;\n      logBox.innerHTML = '';\n      progressBar.style.width = '0%';\n      progressPercent.textContent = '0%';\n      clearResults();\n      addressInput.focus();\n    }\n\n    function unsupportedMethod(error) {\n      const text = errorText(error).toLowerCase();\n      return (\n        text.includes('method not found') ||\n        text.includes('not supported') ||\n        text.includes('unsupported') ||\n        text.includes('disabled') ||\n        text.includes('forbidden') ||\n        text.includes('-32601')\n      );\n    }\n\n    async function fetchJson(url, options, timeoutMs = 15000) {\n      const controller = new AbortController();\n      const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n      try {\n        const response = await fetch(url, {\n          ...options,\n          signal: controller.signal,\n          cache: 'no-store',\n          credentials: 'omit'\n        });\n        const text = await response.text();\n        let data;\n\n        try {\n          data = JSON.parse(text);\n        } catch {\n          throw new Error(`HTTP ${response.status}; the server did not return JSON.`);\n        }\n\n        if (!response.ok) {\n          throw new Error(`HTTP ${response.status}: ${data?.message || text.slice(0, 180)}`);\n        }\n\n        return data;\n      } catch (error) {\n        if (error?.name === 'AbortError') {\n          throw new Error('Request timed out.');\n        }\n        throw error;\n      } finally {\n        clearTimeout(timer);\n      }\n    }\n\n    async function loadRpcCandidates() {\n      const candidates = [];\n      const configuredProxy = String(root.dataset.rpcProxy || '').trim();\n      if (configuredProxy) candidates.push(configuredProxy);\n\n      try {\n        const config = await fetchJson(\n          'https:\/\/dcscan.io\/api\/v1\/network\/config',\n          { method: 'GET' },\n          10000\n        );\n\n        const remoteUrls = [\n          ...(config?.eip3085?.rpcUrls || []),\n          ...(config?.rpcUrls || []),\n          ...(config?.network?.rpcUrls || [])\n        ];\n\n        for (const url of remoteUrls) {\n          if (typeof url === 'string' && url.startsWith('https:\/\/')) {\n            candidates.push(url.replace(\/\\\/$\/, ''));\n          }\n        }\n      } catch {\n        \/\/ Fall back to the embedded official endpoints below.\n      }\n\n      candidates.push(...FALLBACK_RPC_URLS);\n      return [...new Set(candidates.filter(Boolean))];\n    }\n\n    function makeRpcCaller(runId) {\n      let requestId = 0;\n\n      return async function callRpc(url, method, params = [], attempts = 3) {\n        const failures = [];\n\n        for (let attempt = 1; attempt <= attempts; attempt += 1) {\n          ensureCurrent(runId);\n\n          try {\n            const json = await fetchJson(\n              url,\n              {\n                method: 'POST',\n                headers: { 'content-type': 'application\/json' },\n                body: JSON.stringify({\n                  jsonrpc: '2.0',\n                  id: ++requestId,\n                  method,\n                  params\n                })\n              },\n              30000\n            );\n\n            if (json?.error) {\n              throw new Error(\n                `${json.error.message || JSON.stringify(json.error)} (${json.error.code ?? ''})`\n              );\n            }\n\n            if (!Object.prototype.hasOwnProperty.call(json || {}, 'result')) {\n              throw new Error('The RPC response did not contain a result.');\n            }\n\n            await sleep(90);\n            return json.result;\n          } catch (error) {\n            failures.push(`attempt ${attempt}: ${errorText(error)}`);\n            if (unsupportedMethod(error)) break;\n            if (attempt < attempts) await sleep(500 * attempt);\n          }\n        }\n\n        throw new Error(`${method} via ${url}: ${failures.join(' | ')}`);\n      };\n    }\n\n    async function chooseRpc(address, runId, callRpc) {\n      const urls = await loadRpcCandidates();\n      let lastError = '';\n\n      for (const url of urls) {\n        ensureCurrent(runId);\n        setProgress(14, 'Connecting to Datachain Rope\u2026', `Testing ${url}`);\n\n        try {\n          const chainId = asBigInt(await callRpc(url, 'eth_chainId', [], 2));\n          if (chainId !== CHAIN_ID) {\n            throw new Error(`Wrong chain ID: ${chainId.toString()}`);\n          }\n\n          const head = asBigInt(await callRpc(url, 'eth_blockNumber', [], 2));\n          const historicalProbe = head > 1n ? head \/ 2n : 0n;\n          await callRpc(url, 'eth_getBalance', [address, '0x0'], 2);\n          await callRpc(url, 'eth_getTransactionCount', [address, '0x0'], 2);\n          await callRpc(url, 'eth_getBalance', [address, blockHex(historicalProbe)], 1);\n          await callRpc(url, 'eth_getTransactionCount', [address, blockHex(historicalProbe)], 1);\n\n          setProgress(22, 'Connected to Datachain Rope', `RPC selected: ${url}`);\n          return { url, head };\n        } catch (error) {\n          lastError = errorText(error);\n          setProgress(14, 'Connecting to Datachain Rope\u2026', `${url} was unavailable; trying the next RPC.`);\n        }\n      }\n\n      throw new Error(\n        'Unable to reach a Datachain Rope RPC with historical state from this website. ' +\n        'The public RPC may be temporarily unavailable, or this WordPress domain may be blocked by CORS. ' +\n        (lastError ? `Last error: ${lastError}` : '')\n      );\n    }\n\n    async function scanAddress(address, runId) {\n      const normalizedAddress = address.toLowerCase();\n      const callRpc = makeRpcCaller(runId);\n      const selected = await chooseRpc(normalizedAddress, runId, callRpc);\n      const rpcUrl = selected.url;\n      const head = selected.head;\n      const rpc = (method, params = [], attempts = 3) =>\n        callRpc(rpcUrl, method, params, attempts);\n\n      const balanceCache = new Map();\n      const nonceCache = new Map();\n      const blockCache = new Map();\n      const receiptCache = new Map();\n      const scannedBlocks = new Map();\n      const rows = [];\n      const seen = new Set();\n      let traceAvailable = true;\n      let traceWarningShown = false;\n      let locatedChanges = 0;\n\n      const addRow = row => {\n        const key = [row.type, row.txHash, row.block, row.traceAddress, row.amountWei].join('|');\n        if (seen.has(key)) return;\n        seen.add(key);\n        rows.push({ chainId: '271828', asset: 'FAT', ...row });\n      };\n\n      async function balanceAt(block) {\n        const blockNumber = asBigInt(block);\n        const key = blockNumber.toString();\n        if (!balanceCache.has(key)) {\n          balanceCache.set(\n            key,\n            asBigInt(await rpc('eth_getBalance', [normalizedAddress, blockHex(blockNumber)]))\n          );\n        }\n        return balanceCache.get(key);\n      }\n\n      async function nonceAt(block) {\n        const blockNumber = asBigInt(block);\n        const key = blockNumber.toString();\n        if (!nonceCache.has(key)) {\n          nonceCache.set(\n            key,\n            asBigInt(\n              await rpc('eth_getTransactionCount', [normalizedAddress, blockHex(blockNumber)])\n            )\n          );\n        }\n        return nonceCache.get(key);\n      }\n\n      async function getBlock(block) {\n        const blockNumber = asBigInt(block);\n        const key = blockNumber.toString();\n        if (!blockCache.has(key)) {\n          const value = await rpc('eth_getBlockByNumber', [blockHex(blockNumber), true]);\n          if (!value) throw new Error(`Block ${key} was not returned by the RPC.`);\n          blockCache.set(key, value);\n        }\n        return blockCache.get(key);\n      }\n\n      async function getReceipt(hash) {\n        const key = String(hash || '').toLowerCase();\n        if (receiptCache.has(key)) return receiptCache.get(key);\n\n        let value = null;\n        for (let attempt = 1; attempt <= 3 &#038;&#038; !value; attempt += 1) {\n          value = await rpc('eth_getTransactionReceipt', [key]);\n          if (!value) await sleep(350 * attempt);\n        }\n        receiptCache.set(key, value);\n        return value;\n      }\n\n      function receiptSucceeded(receipt) {\n        return Boolean(\n          receipt &#038;&#038;\n          (receipt.status === undefined || receipt.status === null || asBigInt(receipt.status) === 1n)\n        );\n      }\n\n      function blockTimes(block) {\n        const unix = asBigInt(block?.timestamp || '0x0');\n        if (!unix) return { timestampUnix: '', timeUTC: '', timeLocal: '' };\n        const date = new Date(Number(unix) * 1000);\n        return {\n          timestampUnix: unix.toString(),\n          timeUTC: date.toISOString(),\n          timeLocal: date.toLocaleString('en-GB')\n        };\n      }\n\n      async function fullTransactions(block) {\n        const transactions = [];\n        for (const item of block?.transactions || []) {\n          if (item &#038;&#038; typeof item === 'object') {\n            transactions.push(item);\n          } else if (typeof item === 'string') {\n            const tx = await rpc('eth_getTransactionByHash', [item]);\n            if (tx) transactions.push(tx);\n          }\n        }\n        return transactions;\n      }\n\n      async function scanBlock(blockNumber) {\n        const number = asBigInt(blockNumber);\n        const key = number.toString();\n        if (scannedBlocks.has(key)) return scannedBlocks.get(key);\n\n        const block = await getBlock(number);\n        const transactions = await fullTransactions(block);\n        const times = blockTimes(block);\n        let explained = 0n;\n\n        for (let index = 0; index < transactions.length; index += 1) {\n          const tx = transactions[index];\n          const to = String(tx.to || '').toLowerCase();\n          const from = String(tx.from || '').toLowerCase();\n          const value = asBigInt(tx.value || '0x0');\n\n          if (to !== normalizedAddress || value <= 0n) continue;\n          const receipt = await getReceipt(tx.hash);\n          if (!receiptSucceeded(receipt)) continue;\n\n          explained += value;\n\n          \/\/ A self-transfer is used only for balance reconciliation and is not\n          \/\/ listed as an external incoming payment.\n          if (from === normalizedAddress) continue;\n\n          addRow({\n            type: 'DIRECT_NATIVE_FAT',\n            block: key,\n            transactionIndex:\n              receipt?.transactionIndex !== undefined\n                ? asBigInt(receipt.transactionIndex).toString()\n                : String(index),\n            ...times,\n            from,\n            to: normalizedAddress,\n            amountWei: value.toString(),\n            amountFAT: formatFat(value),\n            txHash: tx.hash || '',\n            traceAddress: '',\n            status: 'SUCCESS',\n            confirmations: (head - number + 1n).toString(),\n            explorerUrl: tx.hash ? `https:\/\/dcscan.io\/tx\/${tx.hash}` : ''\n          });\n        }\n\n        if (traceAvailable) {\n          try {\n            const traces = await rpc('trace_block', [blockHex(number)], 1);\n\n            for (const trace of Array.isArray(traces) ? traces : []) {\n              if (trace?.error) continue;\n\n              const type = String(trace.type || '').toLowerCase();\n              const action = trace.action || {};\n              const txHash = trace.transactionHash || '';\n              const traceAddress = Array.isArray(trace.traceAddress)\n                ? trace.traceAddress.join('.')\n                : '';\n\n              if (txHash) {\n                const receipt = await getReceipt(txHash);\n                if (receipt &#038;&#038; !receiptSucceeded(receipt)) continue;\n              }\n\n              if (type === 'call') {\n                const callType = String(action.callType || 'call').toLowerCase();\n                if (\n                  callType !== 'call' ||\n                  !Array.isArray(trace.traceAddress) ||\n                  trace.traceAddress.length === 0\n                ) {\n                  continue;\n                }\n\n                const to = String(action.to || '').toLowerCase();\n                const from = String(action.from || '').toLowerCase();\n                const value = asBigInt(action.value || '0x0');\n\n                if (to === normalizedAddress &#038;&#038; value > 0n) {\n                  explained += value;\n                  if (from === normalizedAddress) continue;\n\n                  addRow({\n                    type: 'INTERNAL_NATIVE_FAT',\n                    block: key,\n                    transactionIndex: String(trace.transactionPosition ?? ''),\n                    ...times,\n                    from,\n                    to: normalizedAddress,\n                    amountWei: value.toString(),\n                    amountFAT: formatFat(value),\n                    txHash,\n                    traceAddress,\n                    status: 'SUCCESS',\n                    confirmations: (head - number + 1n).toString(),\n                    explorerUrl: txHash ? `https:\/\/dcscan.io\/tx\/${txHash}` : ''\n                  });\n                }\n              }\n\n              if (type === 'suicide' || type === 'selfdestruct') {\n                const to = String(action.refundAddress || action.to || '').toLowerCase();\n                const from = String(action.address || action.from || '').toLowerCase();\n                const value = asBigInt(action.balance || action.value || '0x0');\n\n                if (to === normalizedAddress && value > 0n) {\n                  explained += value;\n                  if (from === normalizedAddress) continue;\n\n                  addRow({\n                    type: 'SELFDESTRUCT_NATIVE_FAT',\n                    block: key,\n                    transactionIndex: String(trace.transactionPosition ?? ''),\n                    ...times,\n                    from,\n                    to: normalizedAddress,\n                    amountWei: value.toString(),\n                    amountFAT: formatFat(value),\n                    txHash,\n                    traceAddress,\n                    status: 'SUCCESS',\n                    confirmations: (head - number + 1n).toString(),\n                    explorerUrl: txHash ? `https:\/\/dcscan.io\/tx\/${txHash}` : ''\n                  });\n                }\n              }\n            }\n          } catch (error) {\n            traceAvailable = false;\n            if (!traceWarningShown) {\n              traceWarningShown = true;\n              setProgress(\n                58,\n                'Searching historical balance changes\u2026',\n                'The RPC does not expose trace_block. Direct native transfers will still be found.'\n              );\n            }\n          }\n        }\n\n        const data = { block, transactions, times, explained };\n        scannedBlocks.set(key, data);\n        return data;\n      }\n\n      async function outgoingCost(scan) {\n        let total = 0n;\n\n        for (const tx of scan.transactions) {\n          if (String(tx.from || '').toLowerCase() !== normalizedAddress) continue;\n          const receipt = await getReceipt(tx.hash);\n          if (!receipt) continue;\n\n          const fee =\n            asBigInt(receipt.gasUsed || '0x0') *\n            asBigInt(receipt.effectiveGasPrice || tx.gasPrice || '0x0');\n          const value = receiptSucceeded(receipt) ? asBigInt(tx.value || '0x0') : 0n;\n          total += fee + value;\n        }\n\n        return total;\n      }\n\n      async function findOutgoingBlocks() {\n        const blocks = [];\n        let cursorBlock = 0n;\n        let cursorNonce = await nonceAt(0n);\n        const finalNonce = await nonceAt(head);\n\n        if (finalNonce - cursorNonce > MAX_OUTGOING_NONCE) {\n          throw new Error(\n            `This address has more than ${MAX_OUTGOING_NONCE.toString()} outgoing transactions. ` +\n            'The public browser scanner stops here to protect the RPC from excessive requests.'\n          );\n        }\n\n        setProgress(\n          38,\n          'Locating outgoing wallet activity\u2026',\n          `Outgoing nonce range: ${cursorNonce.toString()} \u2192 ${finalNonce.toString()}`\n        );\n\n        while (cursorNonce < finalNonce) {\n          ensureCurrent(runId);\n          let low = cursorBlock;\n          let high = head;\n\n          while (high - low > 1n) {\n            const middle = (low + high) \/ 2n;\n            if (await nonceAt(middle) > cursorNonce) high = middle;\n            else low = middle;\n          }\n\n          const nextNonce = await nonceAt(high);\n          if (nextNonce <= cursorNonce) {\n            throw new Error('The scanner could not localize an outgoing nonce change.');\n          }\n\n          blocks.push(high);\n          cursorBlock = high;\n          cursorNonce = nextNonce;\n        }\n\n        return blocks;\n      }\n\n      async function scanQuietInterval(startBlock, endBlock) {\n        let cursor = asBigInt(startBlock);\n        const end = asBigInt(endBlock);\n        if (end <= cursor) return;\n\n        let baseline = await balanceAt(cursor);\n        const endBalance = await balanceAt(end);\n\n        if (endBalance < baseline) {\n          setProgress(\n            60,\n            'Searching historical balance changes\u2026',\n            `A non-monotonic balance interval (${cursor.toString()}\u2013${end.toString()}) was skipped.`\n          );\n          return;\n        }\n\n        while (cursor < end &#038;&#038; (await balanceAt(end)) > baseline) {\n          ensureCurrent(runId);\n          let low = cursor;\n          let high = end;\n\n          while (high - low > 1n) {\n            const middle = (low + high) \/ 2n;\n            if (await balanceAt(middle) > baseline) high = middle;\n            else low = middle;\n          }\n\n          const before = high > 0n ? await balanceAt(high - 1n) : 0n;\n          const after = await balanceAt(high);\n          const increase = after - before;\n          locatedChanges += 1;\n\n          if (locatedChanges > MAX_BALANCE_CHANGES) {\n            throw new Error(\n              `More than ${MAX_BALANCE_CHANGES} balance changes were found. ` +\n              'The browser scanner stopped to protect the public RPC.'\n            );\n          }\n\n          setProgress(\n            Math.min(88, 55 + locatedChanges),\n            'Searching historical balance changes\u2026',\n            `Balance increased by ${formatFat(increase)} FAT in block ${high.toString()}.`\n          );\n\n          const scan = await scanBlock(high);\n          const unexplained = increase - scan.explained;\n\n          if (unexplained > 0n) {\n            addRow({\n              type: 'SYSTEM_OR_UNTRACED_FAT',\n              block: high.toString(),\n              transactionIndex: '',\n              ...scan.times,\n              from: 'UNKNOWN_OR_PROTOCOL',\n              to: normalizedAddress,\n              amountWei: unexplained.toString(),\n              amountFAT: formatFat(unexplained),\n              txHash: '',\n              traceAddress: '',\n              status: 'NO_ORDINARY_HASH_FOUND',\n              confirmations: (head - high + 1n).toString(),\n              explorerUrl: ''\n            });\n          }\n\n          cursor = high;\n          baseline = after;\n        }\n      }\n\n      setProgress(28, 'Reading wallet state\u2026', 'Reading current and genesis balances.');\n\n      const code = String(await rpc('eth_getCode', [normalizedAddress, 'latest'])).toLowerCase();\n      if (code !== '0x' && code !== '0x0') {\n        throw new Error(\n          'This address is a smart contract. This public tool currently supports EOA wallet addresses only, ' +\n          'because contract balances can change without an EOA nonce change.'\n        );\n      }\n\n      const genesisBalance = await balanceAt(0n);\n      const currentBalance = await balanceAt(head);\n\n      if (genesisBalance > 0n) {\n        addRow({\n          type: 'GENESIS_OR_STATE_ALLOCATION',\n          block: '0',\n          transactionIndex: '',\n          timestampUnix: '',\n          timeUTC: 'GENESIS',\n          timeLocal: 'GENESIS',\n          from: 'PROTOCOL',\n          to: normalizedAddress,\n          amountWei: genesisBalance.toString(),\n          amountFAT: formatFat(genesisBalance),\n          txHash: '',\n          traceAddress: '',\n          status: 'NO_ORDINARY_TX_HASH',\n          confirmations: (head + 1n).toString(),\n          explorerUrl: ''\n        });\n      }\n\n      const outgoingBlocks = await findOutgoingBlocks();\n      let cursor = 0n;\n\n      setProgress(52, 'Searching historical balance changes\u2026', 'Scanning monotonic balance intervals.');\n\n      for (const blockNumber of outgoingBlocks) {\n        ensureCurrent(runId);\n\n        if (blockNumber > cursor + 1n) {\n          await scanQuietInterval(cursor, blockNumber - 1n);\n        }\n\n        const before = blockNumber > 0n ? await balanceAt(blockNumber - 1n) : 0n;\n        const after = await balanceAt(blockNumber);\n        const scan = await scanBlock(blockNumber);\n        const grossIncoming = after - before + (await outgoingCost(scan));\n        const unexplained = grossIncoming - scan.explained;\n\n        if (unexplained > 0n) {\n          addRow({\n            type: 'SYSTEM_OR_UNTRACED_FAT',\n            block: blockNumber.toString(),\n            transactionIndex: '',\n            ...scan.times,\n            from: 'UNKNOWN_OR_PROTOCOL',\n            to: normalizedAddress,\n            amountWei: unexplained.toString(),\n            amountFAT: formatFat(unexplained),\n            txHash: '',\n            traceAddress: '',\n            status: 'NO_ORDINARY_HASH_FOUND',\n            confirmations: (head - blockNumber + 1n).toString(),\n            explorerUrl: ''\n          });\n        }\n\n        cursor = blockNumber;\n      }\n\n      if (cursor < head) {\n        await scanQuietInterval(cursor, head);\n      }\n\n      rows.sort((a, b) => {\n        const blockDifference = BigInt(a.block) - BigInt(b.block);\n        if (blockDifference < 0n) return -1;\n        if (blockDifference > 0n) return 1;\n        return Number(a.transactionIndex || 999999) - Number(b.transactionIndex || 999999);\n      });\n\n      const totalIncomingWei = rows.reduce(\n        (sum, row) => sum + BigInt(row.amountWei || '0'),\n        0n\n      );\n\n      setProgress(100, 'Search complete', `Found ${rows.length} incoming record${rows.length === 1 ? '' : 's'}.`);\n\n      return {\n        address: normalizedAddress,\n        rpcUrl,\n        head,\n        currentBalance,\n        genesisBalance,\n        rows,\n        totalIncomingWei,\n        completedAt: new Date().toISOString()\n      };\n    }\n\n    function buildCsv(result) {\n      const columns = [\n        'chainId',\n        'asset',\n        'type',\n        'block',\n        'transactionIndex',\n        'timestampUnix',\n        'timeUTC',\n        'timeLocal',\n        'from',\n        'to',\n        'amountWei',\n        'amountFAT',\n        'txHash',\n        'traceAddress',\n        'status',\n        'confirmations',\n        'explorerUrl'\n      ];\n\n      const quote = value => {\n        const text = String(value ?? '');\n        return \/[\",\\n\\r]\/.test(text) ? `\"${text.replace(\/\"\/g, '\"\"')}\"` : text;\n      };\n\n      return [\n        columns.join(','),\n        ...result.rows.map(row => columns.map(column => quote(row[column])).join(','))\n      ].join('\\n');\n    }\n\n    function appendTextCell(row, text, className = '') {\n      const cell = document.createElement('td');\n      if (className) cell.className = className;\n      cell.textContent = text;\n      row.appendChild(cell);\n      return cell;\n    }\n\n    function appendLinkCell(row, text, href, className = '') {\n      const cell = document.createElement('td');\n      const link = document.createElement('a');\n      link.href = href;\n      link.target = '_blank';\n      link.rel = 'noopener noreferrer nofollow';\n      link.textContent = text;\n      if (className) link.className = className;\n      cell.appendChild(link);\n      row.appendChild(cell);\n      return cell;\n    }\n\n    function renderResult(result) {\n      resultsBox.hidden = false;\n      latestAddress = result.address;\n      latestCsv = buildCsv(result);\n      downloadButton.disabled = result.rows.length === 0;\n\n      root.querySelector('[data-summary=\"balance\"]').textContent =\n        `${formatFat(result.currentBalance)} FAT`;\n      root.querySelector('[data-summary=\"count\"]').textContent =\n        formatInteger(result.rows.length);\n      root.querySelector('[data-summary=\"total\"]').textContent =\n        `${formatFat(result.totalIncomingWei)} FAT`;\n      root.querySelector('[data-summary=\"head\"]').textContent =\n        formatInteger(result.head);\n\n      root.querySelector('[data-detail=\"wallet\"]').textContent = result.address;\n      root.querySelector('[data-detail=\"rpc\"]').textContent = result.rpcUrl;\n      root.querySelector('[data-detail=\"completed\"]').textContent = result.completedAt;\n\n      tableBody.innerHTML = '';\n\n      if (result.rows.length === 0) {\n        tableWrap.hidden = true;\n        emptyBox.hidden = false;\n        return;\n      }\n\n      emptyBox.hidden = true;\n      tableWrap.hidden = false;\n\n      result.rows.forEach((item, index) => {\n        const row = document.createElement('tr');\n        appendTextCell(row, String(index + 1));\n        appendTextCell(row, `${item.amountFAT} FAT`, 'fat-scan-amount');\n        appendTextCell(row, item.timeUTC || 'Unknown');\n\n        if (\/^0x[0-9a-fA-F]{40}$\/.test(item.from || '')) {\n          appendLinkCell(\n            row,\n            item.from,\n            `https:\/\/dcscan.io\/address\/${item.from}`,\n            'fat-scan-mono'\n          );\n        } else {\n          appendTextCell(row, item.from || 'Unknown', 'fat-scan-mono');\n        }\n\n        if (isHash(item.txHash)) {\n          appendLinkCell(\n            row,\n            item.txHash,\n            item.explorerUrl || `https:\/\/dcscan.io\/tx\/${item.txHash}`,\n            'fat-scan-mono'\n          );\n        } else {\n          appendTextCell(row, 'No ordinary transaction hash', 'fat-scan-mono');\n        }\n\n        appendLinkCell(\n          row,\n          formatInteger(item.block),\n          `https:\/\/dcscan.io\/string\/${item.block}`\n        );\n        appendTextCell(row, formatInteger(item.confirmations));\n\n        const typeCell = document.createElement('td');\n        const typeBadge = document.createElement('span');\n        typeBadge.className = 'fat-scan-badge';\n        typeBadge.textContent = formatType(item.type);\n        typeCell.appendChild(typeBadge);\n        row.appendChild(typeCell);\n\n        const statusCell = document.createElement('td');\n        const statusBadge = document.createElement('span');\n        statusBadge.className = 'fat-scan-badge';\n        statusBadge.dataset.status = item.status === 'SUCCESS' ? 'success' : 'warning';\n        statusBadge.textContent = item.status === 'SUCCESS'\n          ? 'Success'\n          : 'No ordinary hash found';\n        statusCell.appendChild(statusBadge);\n        row.appendChild(statusCell);\n\n        tableBody.appendChild(row);\n      });\n    }\n\n    form.addEventListener('submit', async event => {\n      event.preventDefault();\n\n      const rawAddress = addressInput.value.trim();\n      if (!isAddress(rawAddress)) {\n        setAlert(\n          'error',\n          'Enter a valid EVM address: 0x followed by exactly 40 hexadecimal characters.'\n        );\n        addressInput.focus();\n        return;\n      }\n\n      const runId = ++activeRun;\n      const address = rawAddress.toLowerCase();\n\n      setAlert('', '');\n      clearResults();\n      logBox.innerHTML = '';\n      submitButton.disabled = true;\n      submitButton.textContent = 'Searching\u2026';\n      addressInput.disabled = true;\n      resetButton.disabled = false;\n\n      setProgress(4, 'Starting search\u2026', `Wallet: ${address}`);\n\n      try {\n        const result = await scanAddress(address, runId);\n        ensureCurrent(runId);\n        renderResult(result);\n        setAlert(\n          'success',\n          `Search complete. ${result.rows.length} incoming FAT record${result.rows.length === 1 ? '' : 's'} found.`\n        );\n      } catch (error) {\n        if (runId !== activeRun) return;\n        setAlert('error', errorText(error));\n        setProgress(100, 'Search stopped', errorText(error));\n      } finally {\n        if (runId === activeRun) {\n          submitButton.disabled = false;\n          submitButton.textContent = 'Find incoming FAT';\n          addressInput.disabled = false;\n        }\n      }\n    });\n\n    resetButton.addEventListener('click', resetUi);\n\n    downloadButton.addEventListener('click', () => {\n      if (!latestCsv) return;\n\n      const blob = new Blob([latestCsv], { type: 'text\/csv;charset=utf-8' });\n      const url = URL.createObjectURL(blob);\n      const link = document.createElement('a');\n      const date = new Date().toISOString().slice(0, 10);\n      link.href = url;\n      link.download = `fat-incoming-${latestAddress}-${date}.csv`;\n      document.body.appendChild(link);\n      link.click();\n      link.remove();\n      URL.revokeObjectURL(url);\n    });\n\n    if (runtimeStatus) {\n      runtimeStatus.dataset.state = 'ready';\n      runtimeStatus.textContent = 'Scanner ready.';\n      window.setTimeout(() => {\n        if (runtimeStatus.dataset.state === 'ready') {\n          runtimeStatus.hidden = true;\n        }\n      }, 1800);\n    }\n\n    return true;\n  }\n\n  function bootFatIncomingFinder(attempt = 0) {\n    try {\n      if (initializeFatIncomingFinder()) return;\n    } catch (error) {\n      console.error('FAT Incoming Finder initialization error:', error);\n      const status = document.querySelector('#fat-incoming-widget-v2 .fat-scan-runtime-status');\n      if (status) {\n        status.dataset.state = 'error';\n        status.textContent = `Scanner initialization failed: ${error instanceof Error ? error.message : String(error)}`;\n      }\n      return;\n    }\n\n    if (attempt < 100) {\n      window.setTimeout(() => bootFatIncomingFinder(attempt + 1), 100);\n    } else {\n      console.error('FAT Incoming Finder: widget markup was not found.');\n    }\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () => bootFatIncomingFinder(), { once: true });\n  } else {\n    bootFatIncomingFinder();\n  }\n})();\n<\/script>\n\n\n\n<p>In addition, keep the token symbol available and make sure it matches the contract, website, and social profiles. Although the form&#8217;s minimum table focuses on the token name and contract, symbol consistency can matter during duplicate and impersonation checks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-prepare-a-48-x-48-icon-url-that-works\">Prepare a 48 x 48 Icon URL that works<\/h2>\n\n\n\n<p>The logo field expects a URL, not a file copied from your computer. Therefore, the asset must already be online and accessible without a login, cookie prompt, or private permission.<\/p>\n\n\n\n<p>Prepare one of these formats:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A 48 x 48 pixel PNG<\/li>\n\n\n\n<li>A 48 x 48 SVG<\/li>\n<\/ul>\n\n\n\n<p>Then check the asset against this list:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use a square canvas.<\/li>\n\n\n\n<li>Keep the background transparent when transparency suits the brand.<\/li>\n\n\n\n<li>Remove tiny text and thin details that disappear at small size.<\/li>\n\n\n\n<li>Use a direct public HTTPS URL.<\/li>\n\n\n\n<li>Prefer the official project domain or an official content delivery network.<\/li>\n\n\n\n<li>Match the logo used on the project&#8217;s website and social accounts.<\/li>\n<\/ul>\n\n\n\n<p>The URL should open the image itself. For example, a link that ends in <code>.png<\/code> or <code>.svg<\/code> and renders only the asset is safer than a cloud-storage preview page.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"649\" src=\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url-1024x649.webp\" alt=\"Blockscout Add token information form with the 48 x 48 Icon URL field highlighted\" class=\"wp-image-15161\" srcset=\"https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url.webp?size=168x106&amp;lossy=2&amp;strip=1&amp;webp=1 168w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url-300x190.webp?lossy=2&amp;strip=1&amp;webp=1 300w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url.webp?size=504x319&amp;lossy=2&amp;strip=1&amp;webp=1 504w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url.webp?size=672x426&amp;lossy=2&amp;strip=1&amp;webp=1 672w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url-768x486.webp?lossy=2&amp;strip=1&amp;webp=1 768w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url.webp?size=840x532&amp;lossy=2&amp;strip=1&amp;webp=1 840w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url-1024x649.webp?lossy=2&amp;strip=1&amp;webp=1 1024w, https:\/\/b3776367.assetcdn.net\/3776367\/wp-content\/uploads\/2026\/07\/03_token_information_icon_url.webp?lossy=2&amp;strip=1&amp;webp=1 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Provide a direct HTTPS link to a 48 x 48 SVG or PNG in the Icon URL field.<\/figcaption><\/figure>\n\n\n\n<p>Before submitting, open the URL in a private browser window. If the image fails there, asks for a login, redirects to an HTML page, or returns an access error, Blockscout may not be able to retrieve it either.<\/p>\n\n\n\n<p>Teams managing logos across several platforms should also note that image specifications differ. For comparison, Tokpie&#8217;s guides explain the separate processes for a <a href=\"https:\/\/tokpie.io\/blog\/how-to-add-token-logo-to-solscan\/\">Solscan token logo<\/a> and a <a href=\"https:\/\/tokpie.io\/blog\/how-to-add-token-logo-to-tronscan\/\">TronScan token logo and price<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-to-do-when-the-deployer-wallet-is-unavailable\">What to do when the deployer wallet is unavailable<\/h2>\n\n\n\n<p>Sometimes the token team cannot use the primary route. For example, a factory may have deployed the contract, the original deployer may be inaccessible, or control may have moved after a multisig migration, treasury change, team handoff, or launchpad deployment.<\/p>\n\n\n\n<p>In that situation, use Blockscout&#8217;s manual submission path. Contact the token-information team through the address published in the official instructions, explain your relationship to the project, and provide the requested wallet and token details.<\/p>\n\n\n\n<p>Next, Blockscout may ask for stronger evidence. That evidence can include a signed message, a post from an official project account, proof tied to the website domain, multisig signer verification, or other ownership documentation.<\/p>\n\n\n\n<p>Importantly, describe the control history clearly. A short timeline showing the deployer, migration, current signer structure, and official announcement can help a reviewer understand why the current wallet differs from the original deployment wallet.<\/p>\n\n\n\n<p>However, manual review is not a shortcut around ownership checks. It is the appropriate route when the automated deployer relationship no longer represents the project&#8217;s current control.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-standard-versus-expedited-review\">Standard versus expedited review<\/h2>\n\n\n\n<p>Blockscout offers a free standard queue and an optional expedited process.<\/p>\n\n\n\n<div id=\"blockscout-review-modes\" class=\"tokpie-table-wrap\">\n  <style>\n    #blockscout-review-modes{\n      margin:24px 0;\n      padding:18px;\n      border:1px solid #d8e1ea;\n      border-radius:10px;\n      background:#f8fbfd;\n      color:#102033;\n    }\n    #blockscout-review-modes .table-title{\n      margin-bottom:6px;\n      font-size:20px;\n      line-height:1.3;\n      font-weight:700;\n      color:#102033;\n    }\n    #blockscout-review-modes .table-note{\n      margin-bottom:14px;\n      font-size:14px;\n      line-height:1.5;\n      color:#526173;\n    }\n    #blockscout-review-modes .table-container{\n      overflow-x:auto;\n      border:1px solid #d8e1ea;\n      border-radius:8px;\n      background:#fff;\n      -webkit-overflow-scrolling:touch;\n    }\n    #blockscout-review-modes table{\n      width:100%;\n      min-width:720px;\n      border-collapse:collapse;\n      background:#fff;\n    }\n    #blockscout-review-modes th,\n    #blockscout-review-modes td{\n      padding:14px;\n      border-right:1px solid #d8e1ea;\n      border-bottom:1px solid #d8e1ea;\n      text-align:left;\n      vertical-align:top;\n      line-height:1.45;\n    }\n    #blockscout-review-modes th:last-child,\n    #blockscout-review-modes td:last-child{\n      border-right:none;\n    }\n    #blockscout-review-modes tbody tr:last-child td{\n      border-bottom:none;\n    }\n    #blockscout-review-modes th{\n      background:#eef5f9;\n      color:#102033;\n      font-size:14px;\n      font-weight:700;\n    }\n    #blockscout-review-modes .is-expedited td{\n      background:#f2fbf7;\n    }\n    #blockscout-review-modes .mode{\n      display:inline-block;\n      padding:5px 10px;\n      border-radius:999px;\n      font-size:13px;\n      line-height:1.2;\n      font-weight:700;\n      white-space:nowrap;\n    }\n    #blockscout-review-modes .mode-standard{\n      background:#edf1f5;\n      color:#425466;\n    }\n    #blockscout-review-modes .mode-expedited{\n      background:#dff6e9;\n      color:#116438;\n    }\n    #blockscout-review-modes .cost{\n      font-weight:700;\n      color:#102033;\n    }\n    #blockscout-review-modes .decision-note{\n      color:#425466;\n    }\n    #blockscout-review-modes .important-note{\n      margin-top:12px;\n      padding:12px 14px;\n      border-left:4px solid #1f8f5f;\n      border-radius:6px;\n      background:#eef9f3;\n      color:#1f3f31;\n      font-size:14px;\n      line-height:1.5;\n    }\n    @media (max-width:760px){\n      #blockscout-review-modes{\n        padding:14px;\n      }\n      #blockscout-review-modes table,\n      #blockscout-review-modes thead,\n      #blockscout-review-modes tbody,\n      #blockscout-review-modes th,\n      #blockscout-review-modes td,\n      #blockscout-review-modes tr{\n        display:block;\n      }\n      #blockscout-review-modes table{\n        min-width:0;\n      }\n      #blockscout-review-modes thead{\n        display:none;\n      }\n      #blockscout-review-modes tbody{\n        padding:10px;\n      }\n      #blockscout-review-modes tbody tr{\n        margin-bottom:12px;\n        overflow:hidden;\n        border:1px solid #d8e1ea;\n        border-radius:8px;\n        background:#fff;\n      }\n      #blockscout-review-modes tbody tr:last-child{\n        margin-bottom:0;\n      }\n      #blockscout-review-modes td,\n      #blockscout-review-modes .is-expedited td{\n        padding:10px 12px;\n        border-right:none;\n        border-bottom:1px solid #edf2f7;\n        background:#fff;\n      }\n      #blockscout-review-modes .is-expedited{\n        border-color:#a9dec2;\n      }\n      #blockscout-review-modes .is-expedited td:first-child{\n        background:#f2fbf7;\n      }\n      #blockscout-review-modes td:last-child{\n        border-bottom:none;\n      }\n      #blockscout-review-modes td:before{\n        content:attr(data-label);\n        display:block;\n        margin-bottom:5px;\n        color:#526173;\n        font-size:12px;\n        line-height:1.3;\n        font-weight:700;\n        text-transform:uppercase;\n        letter-spacing:.03em;\n      }\n    }\n  <\/style>\n\n  <div class=\"table-title\">Blockscout review options<\/div>\n  <div id=\"blockscout-review-note\" class=\"table-note\">\n    Choose based on timing, not expected approval. Expedited payment guarantees a faster decision, not acceptance.\n  <\/div>\n\n  <div class=\"table-container\" role=\"region\" aria-labelledby=\"blockscout-review-note\" tabindex=\"0\">\n    <table>\n      <thead>\n        <tr>\n          <th scope=\"col\">Review mode<\/th>\n          <th scope=\"col\">Cost<\/th>\n          <th scope=\"col\">Timing<\/th>\n          <th scope=\"col\">What it guarantees<\/th>\n        <\/tr>\n      <\/thead>\n      <tbody>\n        <tr>\n          <td data-label=\"Review mode\"><span class=\"mode mode-standard\">Standard review<\/span><\/td>\n          <td data-label=\"Cost\"><span class=\"cost\">Free<\/span><\/td>\n          <td data-label=\"Timing\">No guaranteed timeframe<\/td>\n          <td data-label=\"What it guarantees\" class=\"decision-note\">QA review when the request reaches the Blockscout team.<\/td>\n        <\/tr>\n        <tr class=\"is-expedited\">\n          <td data-label=\"Review mode\"><span class=\"mode mode-expedited\">Expedited review<\/span><\/td>\n          <td data-label=\"Cost\"><span class=\"cost\">99 USDC or USDT<\/span><\/td>\n          <td data-label=\"Timing\">Decision within 1 to 7 business days<\/td>\n          <td data-label=\"What it guarantees\" class=\"decision-note\">A review decision within the stated window. Approval is not guaranteed.<\/td>\n        <\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n\n  <div class=\"important-note\">\n    <strong>Important:<\/strong> Robinhood Chain supports the expedited process. Confirm the current network, asset, amount, and payment destination through Blockscout&#8217;s official instructions before sending funds.\n  <\/div>\n<\/div>\n\n\n\n<p>Robinhood Chain is supported for the expedited payment process. Still, payment does not make an incomplete or misleading request acceptable. Blockscout may approve it, reject it, or ask for more information.<\/p>\n\n\n\n<p>For that reason, use payment details only from the official instructions or the official submission thread. Do not send funds to an address supplied through an unsolicited Telegram message, Discord message, or private account.<\/p>\n\n\n\n<p>Also, confirm the current network, asset, amount, and destination on Blockscout&#8217;s official page immediately before paying. Platform payment instructions can change, while copied messages and old screenshots can become outdated.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-blockscout-checks-before-a-decision\">What Blockscout checks before a decision<\/h2>\n\n\n\n<p>Review is broader than image dimensions. Blockscout uses the request to decide whether the submitted public information belongs to the token and whether the linked project appears safe and consistent.<\/p>\n\n\n\n<p>The review can include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wallet control or credible evidence of a relationship to the project<\/li>\n\n\n\n<li>Duplicate token names, symbols, and branding<\/li>\n\n\n\n<li>Consistency between the token, logo, website, description, and social accounts<\/li>\n\n\n\n<li>Suspicious website redirects or phishing behavior<\/li>\n\n\n\n<li>Unusual wallet-connect permissions, including unexpected approvals<\/li>\n\n\n\n<li>Misleading information, impersonation, or copyrighted branding<\/li>\n\n\n\n<li>Accuracy of the contract address and submitted links<\/li>\n\n\n\n<li>Confirmation of any expedited transaction details<\/li>\n<\/ul>\n\n\n\n<p>Moreover, a missing website or social presence does not automatically block approval. However, official channels provide useful context and can make the project&#8217;s relationship to the token easier to verify.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-mistakes-that-create-avoidable-review-problems\">Mistakes that create avoidable review problems<\/h2>\n\n\n\n<p>Most preventable problems come from mismatched evidence rather than graphic design. Therefore, run a consistency check before you send the request.<\/p>\n\n\n\n<p>Avoid these mistakes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Signing in with the wrong wallet.<\/strong> Use the deployer wallet or follow the manual route.<\/li>\n\n\n\n<li><strong>Submitting a preview page as the Icon URL.<\/strong> The link should open the image itself.<\/li>\n\n\n\n<li><strong>Using different branding across channels.<\/strong> Align the name, symbol, logo, website, and social accounts.<\/li>\n\n\n\n<li><strong>Copying the wrong contract address.<\/strong> Verify the Robinhood Chain address character by character.<\/li>\n\n\n\n<li><strong>Opening a second request while the first is pending.<\/strong> Reply in the existing request thread instead.<\/li>\n\n\n\n<li><strong>Assuming payment guarantees approval.<\/strong> It guarantees a timed decision only.<\/li>\n\n\n\n<li><strong>Trusting a private payment message.<\/strong> Confirm current instructions on the official Blockscout page.<\/li>\n\n\n\n<li><strong>Writing a promotional description.<\/strong> Use a concise, factual project description.<\/li>\n<\/ol>\n\n\n\n<p>If you are also updating other EVM explorer profiles, workflows can differ by platform. Tokpie&#8217;s <a href=\"https:\/\/tokpie.io\/blog\/fast-update-bscscan-etherscan\/\">BscScan and Etherscan update guide<\/a> explains a separate priority-support path and should not be treated as a substitute for Blockscout&#8217;s rules.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-robinhood-chain-token-info-submission-checklist\">Robinhood Chain token-info submission checklist<\/h2>\n\n\n\n<p>Use this checklist as the final gate before pressing <strong>Send request<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list tokpie-submission-checklist\">\n<li><span aria-hidden=\"true\">\u2610<\/span> Token deployment on Robinhood Chain is complete.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> Source-code verification is complete on Blockscout.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> The correct deployer wallet is connected, or the manual ownership route is prepared.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> A monitored email is associated with the Blockscout account.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> Token name and symbol match official project channels.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> The contract address came from a trusted deployment record.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> Your Icon URL opens a 48 x 48 SVG or PNG directly over HTTPS.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> Logo details remain readable at the actual small size.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> Website and social links work without suspicious redirects.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> The description is concise, factual, and consistent.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> Ownership migration evidence is organized when relevant.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> Any expedited transaction details come from the official process.<\/li>\n\n\n\n<li><span aria-hidden=\"true\">\u2610<\/span> No duplicate request is already pending.<\/li>\n<\/ul>\n\n\n\n<p>Once every box is checked, save a private copy of the submitted fields and links. As a result, your team can answer follow-up questions without reconstructing the package from memory.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-connect-explorer-visibility-to-the-wider-token-visibility-plan\">Connect explorer visibility to the wider token visibility plan<\/h2>\n\n\n\n<p>A correct Blockscout logo improves the quality of one public token profile. However, it does not automatically update wallet icons, market data, or other explorers.<\/p>\n\n\n\n<p>Therefore, treat each visibility surface as a separate workstream. If holders still see a generic icon in a wallet, use the relevant wallet process, such as Tokpie&#8217;s <a href=\"https:\/\/tokpie.io\/blog\/how-to-add-token-logo-metamask\/\">MetaMask token logo guide<\/a>.<\/p>\n\n\n\n<p>Likewise, logo metadata and market data are different layers. Tokpie&#8217;s guide to <a href=\"https:\/\/tokpie.io\/blog\/token-price-market-cap-bscscan-etherscan\/\">token price and market cap on BscScan and Etherscan<\/a> explains how explorer market data can depend on external aggregators and should not be confused with a basic metadata request.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-frequently-asked-questions\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-does-adding-a-logo-change-the-token-contract\">Does adding a logo change the token contract?<\/h3>\n\n\n\n<p>No. Blockscout displays the logo as reviewed token metadata. The Icon URL is submitted through the explorer workflow rather than written into the deployed token contract.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-must-the-contract-source-code-be-verified-first\">Must the contract source code be verified first?<\/h3>\n\n\n\n<p>Yes. Blockscout requires source-code verification before it accepts owner-submitted updates to token information.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-which-wallet-should-log-in\">Which wallet should log in?<\/h3>\n\n\n\n<p>Use the wallet that deployed the token for the primary automated route. If that wallet is unavailable or no longer represents the project, use the manual ownership path.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-can-a-factory-deployed-token-still-submit-information\">Can a factory-deployed token still submit information?<\/h3>\n\n\n\n<p>Yes. The project can use the manual route and provide evidence that connects the current team to the token and project.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-what-image-formats-does-the-icon-url-accept\">What image formats does the Icon URL accept?<\/h3>\n\n\n\n<p>Blockscout&#8217;s current instructions specify a 48 x 48 SVG or PNG. The URL should open the public image directly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-does-the-99-usdc-or-usdt-payment-guarantee-approval\">Does the 99 USDC or USDT payment guarantee approval?<\/h3>\n\n\n\n<p>No. The expedited fee guarantees a decision within the stated review window. Blockscout can still approve, reject, or request more information.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-can-i-submit-another-request-while-one-is-pending\">Can I submit another request while one is pending?<\/h3>\n\n\n\n<p>No. Blockscout advises teams to reply within the existing request thread instead of sending duplicate submissions for the same contract.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-prepare-once-then-submit-through-the-right-route\">Prepare once, then submit through the right route<\/h2>\n\n\n\n<p>Adding a logo to a Robinhood Chain token is straightforward when the evidence is aligned. First, verify the contract and ownership. Next, host a clean 48 x 48 asset at a direct HTTPS URL. Then match the token name, symbol, website, description, and social links before sending the request.<\/p>\n\n\n\n<p>If the deployer wallet is unavailable, document the control history and use the manual path. If timing matters, consider the expedited option with the correct expectation: it buys a faster decision, not a guaranteed approval.<\/p>\n\n\n\n<p>Finally, use the checklist above as your submission record. A careful package gives Blockscout a clearer request to review and gives your team a reliable baseline for the next token visibility task.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Add your token logo through Robinhood Chain Blockscout&#8217;s verified owner workflow. Prepare the Icon URL, ownership proof, and review package correctly.<\/p>\n","protected":false},"author":2,"featured_media":15165,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,1779],"tags":[2056,2058,2059,2112,2123,2124,2125,2126,2127,2128],"class_list":["post-15158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-token-listing-guides","category-update-token-explorer","tag-token-logo","tag-token-metadata","tag-blockchain-explorer","tag-web3-founders","tag-robinhood-chain","tag-blockscout","tag-contract-verification","tag-verified-address","tag-token-information","tag-crypto-branding"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.7 (Yoast SEO v23.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Add a Logo to Your Token on Robinhood Chain Blockscout - Tokpie Blog<\/title>\n<meta name=\"description\" content=\"Learn how to add a token logo on Robinhood Chain Blockscout, verify ownership, prepare the Icon URL, and submit a clean review package.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Add a Logo to Your Token on Robinhood Chain Blockscout\" \/>\n<meta property=\"og:description\" content=\"Learn how to add a token logo on Robinhood Chain Blockscout, verify ownership, prepare the Icon URL, and submit a clean review package.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/\" \/>\n<meta property=\"og:site_name\" content=\"Tokpie Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/tokpie.io\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-28T14:43:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-10T04:55:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"tokpie\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TokpieE\" \/>\n<meta name=\"twitter:site\" content=\"@TokpieE\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tokpie\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/\"},\"author\":{\"name\":\"tokpie\",\"@id\":\"https:\/\/tokpie.io\/blog\/#\/schema\/person\/825d691ed21f457c2fe53e4e39fa0ed1\"},\"headline\":\"How to Add a Logo to Your Token on Robinhood Chain Blockscout\",\"datePublished\":\"2026-07-28T14:43:57+00:00\",\"dateModified\":\"2026-09-10T04:55:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/\"},\"wordCount\":2404,\"publisher\":{\"@id\":\"https:\/\/tokpie.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp\",\"keywords\":[\"Token Logo\",\"Token Metadata\",\"Blockchain Explorer\",\"Web3 founders\",\"Robinhood Chain\",\"Blockscout\",\"contract verification\",\"verified address\",\"token information\",\"crypto branding\"],\"articleSection\":[\"Token Listing Guides\",\"Explorers Updating\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/\",\"url\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/\",\"name\":\"How to Add a Logo to Your Token on Robinhood Chain Blockscout - Tokpie Blog\",\"isPartOf\":{\"@id\":\"https:\/\/tokpie.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp\",\"datePublished\":\"2026-07-28T14:43:57+00:00\",\"dateModified\":\"2026-09-10T04:55:31+00:00\",\"description\":\"Learn how to add a token logo on Robinhood Chain Blockscout, verify ownership, prepare the Icon URL, and submit a clean review package.\",\"breadcrumb\":{\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage\",\"url\":\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp\",\"contentUrl\":\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp\",\"width\":1200,\"height\":630,\"caption\":\"Four-step process for adding a token logo to a Blockscout blockchain explorer.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/tokpie.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Token Listing Guides\",\"item\":\"https:\/\/tokpie.io\/blog\/category\/token-listing-guides\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Add a Logo to Your Token on Robinhood Chain Blockscout\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/tokpie.io\/blog\/#website\",\"url\":\"https:\/\/tokpie.io\/blog\/\",\"name\":\"Tokpie Blog\",\"description\":\"Tokpie News\",\"publisher\":{\"@id\":\"https:\/\/tokpie.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/tokpie.io\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/tokpie.io\/blog\/#organization\",\"name\":\"Tokpie Exchange\",\"url\":\"https:\/\/tokpie.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/tokpie.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2019\/12\/tokpie_exchange.png\",\"contentUrl\":\"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2019\/12\/tokpie_exchange.png\",\"width\":537,\"height\":240,\"caption\":\"Tokpie Exchange\"},\"image\":{\"@id\":\"https:\/\/tokpie.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/tokpie.io\",\"https:\/\/x.com\/TokpieE\",\"https:\/\/www.linkedin.com\/company\/tokpie\",\"https:\/\/www.pinterest.ie\/TokpieExchange\/\",\"https:\/\/en.bitcoinwiki.org\/wiki\/Tokpie\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/tokpie.io\/blog\/#\/schema\/person\/825d691ed21f457c2fe53e4e39fa0ed1\",\"name\":\"tokpie\",\"url\":\"https:\/\/tokpie.io\/blog\/author\/tokpie\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Add a Logo to Your Token on Robinhood Chain Blockscout - Tokpie Blog","description":"Learn how to add a token logo on Robinhood Chain Blockscout, verify ownership, prepare the Icon URL, and submit a clean review package.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/","og_locale":"en_US","og_type":"article","og_title":"How to Add a Logo to Your Token on Robinhood Chain Blockscout","og_description":"Learn how to add a token logo on Robinhood Chain Blockscout, verify ownership, prepare the Icon URL, and submit a clean review package.","og_url":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/","og_site_name":"Tokpie Blog","article_publisher":"https:\/\/www.facebook.com\/tokpie.io","article_published_time":"2026-07-28T14:43:57+00:00","article_modified_time":"2026-09-10T04:55:31+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp","type":"image\/webp"}],"author":"tokpie","twitter_card":"summary_large_image","twitter_creator":"@TokpieE","twitter_site":"@TokpieE","twitter_misc":{"Written by":"tokpie","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#article","isPartOf":{"@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/"},"author":{"name":"tokpie","@id":"https:\/\/tokpie.io\/blog\/#\/schema\/person\/825d691ed21f457c2fe53e4e39fa0ed1"},"headline":"How to Add a Logo to Your Token on Robinhood Chain Blockscout","datePublished":"2026-07-28T14:43:57+00:00","dateModified":"2026-09-10T04:55:31+00:00","mainEntityOfPage":{"@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/"},"wordCount":2404,"publisher":{"@id":"https:\/\/tokpie.io\/blog\/#organization"},"image":{"@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage"},"thumbnailUrl":"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp","keywords":["Token Logo","Token Metadata","Blockchain Explorer","Web3 founders","Robinhood Chain","Blockscout","contract verification","verified address","token information","crypto branding"],"articleSection":["Token Listing Guides","Explorers Updating"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/","url":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/","name":"How to Add a Logo to Your Token on Robinhood Chain Blockscout - Tokpie Blog","isPartOf":{"@id":"https:\/\/tokpie.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage"},"image":{"@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage"},"thumbnailUrl":"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp","datePublished":"2026-07-28T14:43:57+00:00","dateModified":"2026-09-10T04:55:31+00:00","description":"Learn how to add a token logo on Robinhood Chain Blockscout, verify ownership, prepare the Icon URL, and submit a clean review package.","breadcrumb":{"@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#primaryimage","url":"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp","contentUrl":"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2026\/07\/add_token_logo_blockscout_guide.webp","width":1200,"height":630,"caption":"Four-step process for adding a token logo to a Blockscout blockchain explorer."},{"@type":"BreadcrumbList","@id":"https:\/\/tokpie.io\/blog\/add-token-logo-robinhood-chain-blockscout\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/tokpie.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Token Listing Guides","item":"https:\/\/tokpie.io\/blog\/category\/token-listing-guides\/"},{"@type":"ListItem","position":3,"name":"How to Add a Logo to Your Token on Robinhood Chain Blockscout"}]},{"@type":"WebSite","@id":"https:\/\/tokpie.io\/blog\/#website","url":"https:\/\/tokpie.io\/blog\/","name":"Tokpie Blog","description":"Tokpie News","publisher":{"@id":"https:\/\/tokpie.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tokpie.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/tokpie.io\/blog\/#organization","name":"Tokpie Exchange","url":"https:\/\/tokpie.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tokpie.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2019\/12\/tokpie_exchange.png","contentUrl":"https:\/\/tokpie.io\/blog\/wp-content\/uploads\/2019\/12\/tokpie_exchange.png","width":537,"height":240,"caption":"Tokpie Exchange"},"image":{"@id":"https:\/\/tokpie.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/tokpie.io","https:\/\/x.com\/TokpieE","https:\/\/www.linkedin.com\/company\/tokpie","https:\/\/www.pinterest.ie\/TokpieExchange\/","https:\/\/en.bitcoinwiki.org\/wiki\/Tokpie"]},{"@type":"Person","@id":"https:\/\/tokpie.io\/blog\/#\/schema\/person\/825d691ed21f457c2fe53e4e39fa0ed1","name":"tokpie","url":"https:\/\/tokpie.io\/blog\/author\/tokpie\/"}]}},"_links":{"self":[{"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/posts\/15158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/comments?post=15158"}],"version-history":[{"count":6,"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/posts\/15158\/revisions"}],"predecessor-version":[{"id":15247,"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/posts\/15158\/revisions\/15247"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/media\/15165"}],"wp:attachment":[{"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/media?parent=15158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/categories?post=15158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tokpie.io\/blog\/wp-json\/wp\/v2\/tags?post=15158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}