<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LivingHope</title>
    <description>The latest articles on DEV Community by LivingHope (@livinghope4life).</description>
    <link>https://dev.to/livinghope4life</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4078051%2F34811a14-9776-4893-b2b4-57f7e4602039.jpg</url>
      <title>DEV Community: LivingHope</title>
      <link>https://dev.to/livinghope4life</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/livinghope4life"/>
    <language>en</language>
    <item>
      <title>Redbelly Developer Troubleshooting Wiki</title>
      <dc:creator>LivingHope</dc:creator>
      <pubDate>Fri, 14 Aug 2026 18:10:36 +0000</pubDate>
      <link>https://dev.to/livinghope4life/redbelly-developer-troubleshooting-wiki-3pci</link>
      <guid>https://dev.to/livinghope4life/redbelly-developer-troubleshooting-wiki-3pci</guid>
      <description>&lt;p&gt;&lt;strong&gt;SEO Title:&lt;/strong&gt; Redbelly Network Developer Troubleshooting: Fix Common RPC, Wallet, Gas, Deployment &amp;amp; EligibilitySDK Errors&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A practical troubleshooting guide for Redbelly developers covering recurring RPC, MetaMask, transaction, gas, deployment, contract verification, testnet funding, and EligibilitySDK integration problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network:&lt;/strong&gt; Redbelly Testnet&lt;br&gt;
&lt;strong&gt;Testnet RPC:&lt;/strong&gt; &lt;code&gt;https://governors.testnet.redbelly.network&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Testnet Chain ID:&lt;/strong&gt; &lt;code&gt;153&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Currency:&lt;/strong&gt; &lt;code&gt;RBNT&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Testnet Explorer:&lt;/strong&gt; &lt;code&gt;https://redbelly.testnet.routescan.io/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Redbelly's current developer environment identifies Testnet as chain ID &lt;code&gt;153&lt;/code&gt; with the canonical RPC endpoint above.&lt;/p&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Quick Reference Index&lt;/li&gt;
&lt;li&gt;Before Troubleshooting&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Network and RPC&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Routescan API Returns 429 Too Many Requests&lt;/li&gt;
&lt;li&gt;2. RPC Endpoint Times Out or Does Not Respond&lt;/li&gt;
&lt;li&gt;3. Wrong or Outdated Redbelly RPC Endpoint&lt;/li&gt;
&lt;li&gt;4. Chain ID Mismatch&lt;/li&gt;
&lt;li&gt;5. JSON-RPC Error Before Wallet Activation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wallet and MetaMask&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6. MetaMask Does Not Detect Redbelly&lt;/li&gt;
&lt;li&gt;7. RBNT Appears on Explorer but Not in MetaMask&lt;/li&gt;
&lt;li&gt;8. Ledger + MetaMask Returns Internal JSON-RPC Error&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transactions and Gas&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;9. Insufficient RBNT for Deployment&lt;/li&gt;
&lt;li&gt;10. Cannot Estimate Gas&lt;/li&gt;
&lt;li&gt;11. Insufficient Contract Balance&lt;/li&gt;
&lt;li&gt;12. Nonce Too Low&lt;/li&gt;
&lt;li&gt;13. Transaction Remains Pending&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Smart Contract Deployment and Verification&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;14. Hardhat Deployment Uses the Wrong Network&lt;/li&gt;
&lt;li&gt;15. Contract Verification Fails&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EligibilitySDK&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;16. EligibilitySDK Package Cannot Be Installed&lt;/li&gt;
&lt;li&gt;17. Missing REDBELLY_API_KEY&lt;/li&gt;
&lt;li&gt;18. EligibilitySDK Test Credential Faucet Is Unavailable&lt;/li&gt;
&lt;li&gt;19. Local EligibilitySDK Callback Does Not Work&lt;/li&gt;
&lt;li&gt;20. Developer Cannot Determine a Wallet's On-Chain Eligibility&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verification Matrix&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Community Validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sources and References&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  Quick Reference Index
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error / Keyword&lt;/th&gt;
&lt;th&gt;Likely Cause&lt;/th&gt;
&lt;th&gt;Jump To&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;429 Too Many Requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Routescan API rate limit&lt;/td&gt;
&lt;td&gt;#1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;timeout&lt;/code&gt; / &lt;code&gt;RPC not responding&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Endpoint, network or service issue&lt;/td&gt;
&lt;td&gt;#2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rpc-testnet.redbelly.network&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Outdated endpoint&lt;/td&gt;
&lt;td&gt;#3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;chain ID&lt;/code&gt; / &lt;code&gt;153&lt;/code&gt; / &lt;code&gt;151&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Network mismatch&lt;/td&gt;
&lt;td&gt;#4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Internal JSON-RPC error&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Account/network/transaction configuration&lt;/td&gt;
&lt;td&gt;#5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MetaMask cannot find Redbelly&lt;/td&gt;
&lt;td&gt;Network not configured&lt;/td&gt;
&lt;td&gt;#6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RBNT not visible in wallet&lt;/td&gt;
&lt;td&gt;Token/network configuration&lt;/td&gt;
&lt;td&gt;#7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ledger + MetaMask&lt;/td&gt;
&lt;td&gt;Hardware-wallet/RPC/network issue&lt;/td&gt;
&lt;td&gt;#8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insufficient funds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wallet lacks RBNT for gas&lt;/td&gt;
&lt;td&gt;#9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cannot estimate gas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transaction would revert or required state is invalid&lt;/td&gt;
&lt;td&gt;#10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Insufficient contract balance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contract lacks required RBNT/value&lt;/td&gt;
&lt;td&gt;#11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nonce too low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stale or reused transaction nonce&lt;/td&gt;
&lt;td&gt;#12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pending&lt;/code&gt; / stuck transaction&lt;/td&gt;
&lt;td&gt;RPC, nonce or replacement issue&lt;/td&gt;
&lt;td&gt;#13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardhat deployment failure&lt;/td&gt;
&lt;td&gt;Wrong network/configuration&lt;/td&gt;
&lt;td&gt;#14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract verification failure&lt;/td&gt;
&lt;td&gt;Wrong chain, compiler or constructor settings&lt;/td&gt;
&lt;td&gt;#15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm install&lt;/code&gt; / &lt;code&gt;403&lt;/code&gt; / package unavailable&lt;/td&gt;
&lt;td&gt;GitHub Packages authentication&lt;/td&gt;
&lt;td&gt;#16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REDBELLY_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Missing verifier API credential&lt;/td&gt;
&lt;td&gt;#17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test credential faucet&lt;/td&gt;
&lt;td&gt;Demo credential faucet unavailable&lt;/td&gt;
&lt;td&gt;#18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;localhost&lt;/code&gt; / callback failure&lt;/td&gt;
&lt;td&gt;Mobile wallet cannot reach local server&lt;/td&gt;
&lt;td&gt;#19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;hasChainPermission&lt;/code&gt; / KYC&lt;/td&gt;
&lt;td&gt;Eligibility integration uncertainty&lt;/td&gt;
&lt;td&gt;#20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  Before Troubleshooting
&lt;/h1&gt;

&lt;p&gt;Always confirm the environment first.&lt;/p&gt;
&lt;h3&gt;
  
  
  Redbelly Testnet
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Network:   Redbelly Testnet
RPC:       https://governors.testnet.redbelly.network
Chain ID:  153
Currency:  RBNT
Explorer:  https://redbelly.testnet.routescan.io/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check the RPC directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://governors.testnet.redbelly.network &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"0x99"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;0x99&lt;/code&gt; is hexadecimal for chain ID &lt;code&gt;153&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Network and RPC
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Routescan API Returns 429 Too Many Requests
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The explorer API returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP 429
Too Many Requests
rate-limit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Discord developer reported:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The HTTP server response is not ok. Status code: 429
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another developer independently reported that Routescan was repeatedly rate-limiting API requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Routescan applies request-per-second and daily call limits. A &lt;code&gt;429&lt;/code&gt; means the API limit has been exceeded.&lt;/p&gt;

&lt;p&gt;Routescan currently documents a keyless free tier of 2 requests/second and 10,000 calls/day. A registered free API key increases this to 5 requests/second and 100,000 calls/day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Reduce request frequency and implement retry backoff.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchWithBackoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Routescan API rate limit exceeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For applications making frequent API calls, use a registered Routescan API key and send it in the &lt;code&gt;apikey&lt;/code&gt; header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"apikey: YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.routescan.io/v2/network/testnet/evm/153/etherscan/api?module=account&amp;amp;action=balance&amp;amp;address=YOUR_ADDRESS"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Routescan recommends backoff/retry or a higher-limit plan when the limit is exceeded.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cache explorer/API responses.&lt;/li&gt;
&lt;li&gt;Do not poll continuously when event subscriptions or longer intervals are sufficient.&lt;/li&gt;
&lt;li&gt;Implement exponential backoff.&lt;/li&gt;
&lt;li&gt;Use a registered API key for applications with sustained API usage.&lt;/li&gt;
&lt;li&gt;Never expose an API key in frontend code.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. RPC Endpoint Times Out or Does Not Respond
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Typical symptoms include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RPC timeout
connection timed out
Internal JSON-RPC error
Failed to fetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or a request simply hangs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Possible causes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Incorrect RPC URL.&lt;/li&gt;
&lt;li&gt;Temporary network/service interruption.&lt;/li&gt;
&lt;li&gt;Local proxy/VPN problems.&lt;/li&gt;
&lt;li&gt;Application configured for an obsolete endpoint.&lt;/li&gt;
&lt;li&gt;Incorrect environment configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;First test the RPC outside your application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://governors.testnet.redbelly.network &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the result is &lt;code&gt;0x99&lt;/code&gt;, the endpoint is responding correctly.&lt;/p&gt;

&lt;p&gt;If it fails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the URL.&lt;/li&gt;
&lt;li&gt;Try another network connection.&lt;/li&gt;
&lt;li&gt;Temporarily disable a VPN/proxy.&lt;/li&gt;
&lt;li&gt;Check Redbelly announcements for service interruptions.&lt;/li&gt;
&lt;li&gt;Retry with the canonical endpoint.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Keep the RPC URL in one environment variable rather than hardcoding different URLs throughout the project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REDBELLY_TESTNET_RPC=https://governors.testnet.redbelly.network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Wrong or Outdated Redbelly RPC Endpoint
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;A tutorial or existing project uses an endpoint that no longer responds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Developer documentation and older projects can contain legacy network configuration.&lt;/p&gt;

&lt;p&gt;The current Redbelly Developer Portal identifies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Testnet:
https://governors.testnet.redbelly.network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with chain ID &lt;code&gt;153&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Update the RPC everywhere it is configured:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;redbellyTestnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://governors.testnet.redbelly.network&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;153&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also update:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardhat&lt;/li&gt;
&lt;li&gt;Foundry&lt;/li&gt;
&lt;li&gt;wagmi/viem&lt;/li&gt;
&lt;li&gt;MetaMask&lt;/li&gt;
&lt;li&gt;deployment scripts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; files&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Before using an older tutorial, verify the network parameters against the current Redbelly Developer Portal.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Chain ID Mismatch
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Errors may include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chain ID mismatch
network changed
wrong network
Unrecognized chain ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Redbelly Mainnet and Testnet use different chain IDs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mainnet: 151
Testnet: 153
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using Mainnet configuration with Testnet RPC, or vice versa, causes network mismatches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Check the actual RPC chain ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://governors.testnet.redbelly.network &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Testnet, configure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;153&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In MetaMask, switch to the same network.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Define network configuration once and reuse it across the application, deployment scripts and wallet configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. JSON-RPC Error Before Wallet Activation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;A developer connects to Redbelly but receives a JSON-RPC error when attempting network operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Community support reports have identified incomplete KYC/account activation as a cause of transaction-related RPC errors for accounts that have not been enabled for Redbelly access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Complete the required Redbelly access/KYC process.&lt;/li&gt;
&lt;li&gt;Connect the same wallet used by the dApp.&lt;/li&gt;
&lt;li&gt;Confirm the wallet is enabled.&lt;/li&gt;
&lt;li&gt;Switch back to Redbelly Testnet/Mainnet.&lt;/li&gt;
&lt;li&gt;Retry the transaction.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not assume every &lt;code&gt;Internal JSON-RPC error&lt;/code&gt; is caused by KYC. First verify the RPC endpoint and chain ID, then verify wallet/account activation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Add an account-activation check to developer onboarding before debugging application code.&lt;/p&gt;




&lt;h1&gt;
  
  
  Wallet and MetaMask
&lt;/h1&gt;

&lt;h2&gt;
  
  
  6. MetaMask Does Not Detect Redbelly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Redbelly does not appear as the active network, or the dApp cannot switch the wallet to Redbelly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The wallet is not configured with the correct Redbelly network parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;For Testnet use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Network Name: Redbelly Testnet
RPC URL: https://governors.testnet.redbelly.network
Chain ID: 153
Currency Symbol: RBNT
Explorer: https://redbelly.testnet.routescan.io/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A dApp can request a network switch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ethereum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wallet_switchEthereumChain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x99&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the network does not exist in the wallet, add it first through the wallet's network configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Use wallet network switching rather than asking users to manually edit configuration whenever possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. RBNT Appears on Explorer but Not in MetaMask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The developer can see RBNT associated with the address on the Redbelly explorer, but the wallet balance appears empty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The wallet may be connected to a different network or using incorrect network configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Confirm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Network: Redbelly Network Mainnet or Redbelly Testnet
Chain ID: correct for the environment
RPC: correct for the environment
Currency: RBNT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Testnet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RPC: https://governors.testnet.redbelly.network
Chain ID: 153
Symbol: RBNT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then restart/reconnect MetaMask and verify the same address is selected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Always display the connected chain ID and wallet address in the dApp during development.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Ledger + MetaMask Returns Internal JSON-RPC Error
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;A Ledger user connected through MetaMask cannot submit transactions and receives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internal JSON-RPC error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or the transaction does not respond.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The error is not specific enough to identify a single cause. It can result from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wrong network configuration;&lt;/li&gt;
&lt;li&gt;account not enabled;&lt;/li&gt;
&lt;li&gt;RPC problems;&lt;/li&gt;
&lt;li&gt;hardware-wallet signing configuration;&lt;/li&gt;
&lt;li&gt;transaction parameters rejected by the wallet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Troubleshoot in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify the Redbelly RPC responds with the expected chain ID.&lt;/li&gt;
&lt;li&gt;Confirm MetaMask is on the correct Redbelly network.&lt;/li&gt;
&lt;li&gt;Confirm the Ledger account is the account selected in MetaMask.&lt;/li&gt;
&lt;li&gt;Confirm the account has sufficient RBNT.&lt;/li&gt;
&lt;li&gt;Confirm the account is enabled for Redbelly transactions.&lt;/li&gt;
&lt;li&gt;Retry a simple transaction before testing a complex contract call.&lt;/li&gt;
&lt;li&gt;If the same account works with another supported wallet while Ledger does not, isolate the issue to the Ledger/MetaMask path.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Test the complete wallet stack with a simple transaction before integrating contract deployment or application-specific transaction flows.&lt;/p&gt;




&lt;h1&gt;
  
  
  Transactions and Gas
&lt;/h1&gt;

&lt;h2&gt;
  
  
  9. Insufficient RBNT for Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Deployment fails with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;insufficient funds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or the developer cannot pay transaction gas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The deploying account does not hold enough RBNT to cover the transaction.&lt;/p&gt;

&lt;p&gt;A Discord developer reported being blocked from running deployment scripts because their Redbelly Testnet RBNT balance was insufficient.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Check the wallet balance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Testnet, obtain RBNT through the current official testnet funding mechanism.&lt;/p&gt;

&lt;p&gt;Do not use Mainnet RBNT for Testnet gas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Check the deployer balance before deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deployer has no RBNT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For repeated automated deployments, budget testnet RBNT before running deployment scripts.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Cannot Estimate Gas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The wallet or SDK reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cannot estimate gas
transaction may fail or may require manual gas limit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Gas estimation executes the transaction simulation before sending it. If the simulated call would revert, the estimator can fail.&lt;/p&gt;

&lt;p&gt;Common causes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contract state does not satisfy the function requirements;&lt;/li&gt;
&lt;li&gt;contract lacks required balance;&lt;/li&gt;
&lt;li&gt;wrong parameters;&lt;/li&gt;
&lt;li&gt;caller lacks permission;&lt;/li&gt;
&lt;li&gt;wrong network;&lt;/li&gt;
&lt;li&gt;contract address is incorrect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;First inspect the complete revert message.&lt;/p&gt;

&lt;p&gt;Then simulate the call directly with the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sender;&lt;/li&gt;
&lt;li&gt;recipient;&lt;/li&gt;
&lt;li&gt;calldata;&lt;/li&gt;
&lt;li&gt;value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not immediately solve the error by arbitrarily increasing the gas limit.&lt;/p&gt;

&lt;p&gt;If the revert indicates insufficient contract balance, fix the contract balance first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Test contract preconditions before sending transactions and surface readable revert messages in the frontend.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Insufficient Contract Balance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Browser console or wallet output contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;execution reverted: Insufficient contract balance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and may also contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cannot estimate gas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The contract does not have enough RBNT/value to satisfy the operation being requested.&lt;/p&gt;

&lt;p&gt;Gas estimation fails because the simulated transaction would revert.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Check the contract balance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contractAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the contract is expected to hold RBNT, fund it with the required amount.&lt;/p&gt;

&lt;p&gt;Then retry gas estimation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Before calling a payout, withdrawal or value-dependent contract function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contractAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;requiredAmount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Contract balance is insufficient&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  12. Nonce Too Low
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The transaction fails with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nonce too low
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or another transaction using the same nonce is already pending/mined.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The application submitted a transaction with a nonce lower than the account's current pending nonce.&lt;/p&gt;

&lt;p&gt;This commonly happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transactions are submitted rapidly;&lt;/li&gt;
&lt;li&gt;a stale nonce is cached;&lt;/li&gt;
&lt;li&gt;multiple scripts use the same account;&lt;/li&gt;
&lt;li&gt;a previous transaction is still pending.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Read the pending nonce rather than a stale confirmed nonce:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTransactionCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When using ethers, prefer the library's nonce management where possible instead of manually incrementing nonces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Avoid hardcoding nonces and do not let multiple independent processes submit sequential transactions from the same account without nonce coordination.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Transaction Remains Pending
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;A transaction stays pending for an unusually long time and never receives a receipt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Possible causes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stale RPC connection;&lt;/li&gt;
&lt;li&gt;incorrect nonce;&lt;/li&gt;
&lt;li&gt;competing pending transactions;&lt;/li&gt;
&lt;li&gt;transaction replacement;&lt;/li&gt;
&lt;li&gt;application waiting on the wrong provider/network.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Check the transaction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txHash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the receipt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTransactionReceipt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txHash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wallet address
chain ID
RPC endpoint
nonce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not blindly submit the same transaction repeatedly. Repeated submissions can create additional nonce conflicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Use a single transaction queue for automated workloads and monitor both transaction hash and receipt status.&lt;/p&gt;




&lt;h1&gt;
  
  
  Smart Contract Deployment and Verification
&lt;/h1&gt;

&lt;h2&gt;
  
  
  14. Hardhat Deployment Uses the Wrong Network
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Deployment fails because Hardhat connects to the wrong chain or cannot reach the expected Redbelly environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The network configuration does not match the Redbelly environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Configure Testnet explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;redbellyTestnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://governors.testnet.redbelly.network&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;153&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PRIVATE_KEY&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PRIVATE_KEY&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy using the exact configuration key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx hardhat run scripts/deploy.js &lt;span class="nt"&gt;--network&lt;/span&gt; redbellyTestnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before deployment, confirm the RPC chain ID.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Keep the network URL and chain ID in one configuration source and validate environment variables before deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Contract Verification Fails
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The contract is deployed successfully but source-code verification fails on the block explorer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;Verification requires the explorer to reproduce the deployed bytecode. Common causes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wrong compiler version;&lt;/li&gt;
&lt;li&gt;wrong optimization settings;&lt;/li&gt;
&lt;li&gt;incorrect constructor arguments;&lt;/li&gt;
&lt;li&gt;wrong contract path/name;&lt;/li&gt;
&lt;li&gt;wrong network;&lt;/li&gt;
&lt;li&gt;incorrect explorer API configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;First confirm the deployed contract is on Redbelly Testnet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Chain ID: 153
Explorer: https://redbelly.testnet.routescan.io/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reproduce the exact deployment settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Solidity compiler version
Optimizer enabled/disabled
Optimizer runs
Contract path
Contract name
Constructor arguments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not change compiler settings after deployment and expect the bytecode to remain identical.&lt;/p&gt;

&lt;p&gt;For Routescan API access, remember that API requests use the current Routescan API format and a &lt;code&gt;429&lt;/code&gt; indicates rate limiting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Save deployment configuration and constructor arguments alongside every deployment.&lt;/p&gt;




&lt;h1&gt;
  
  
  EligibilitySDK
&lt;/h1&gt;

&lt;h2&gt;
  
  
  16. EligibilitySDK Package Cannot Be Installed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;Installation fails with errors such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;403 Forbidden
401 Unauthorized
package not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or npm cannot resolve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@redbellynetwork/eligibility-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The SDK is distributed through GitHub Packages and requires authentication with a GitHub Personal Access Token that has &lt;code&gt;read:packages&lt;/code&gt; permission.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.npmrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;@redbellynetwork:&lt;/span&gt;&lt;span class="py"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://npm.pkg.github.com&lt;/span&gt;
&lt;span class="err"&gt;//npm.pkg.github.com/:&lt;/span&gt;&lt;span class="py"&gt;_authToken&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;${GITHUB_TOKEN}&lt;/span&gt;
&lt;span class="py"&gt;always-auth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_GITHUB_TOKEN"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @redbellynetwork/eligibility-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The current official Quickstart also requires a GitHub account with a Personal Access Token having &lt;code&gt;read:packages&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Never commit &lt;code&gt;.npmrc&lt;/code&gt; containing a literal secret.&lt;/p&gt;

&lt;p&gt;Use environment variables or your CI/CD secret manager.&lt;/p&gt;




&lt;h2&gt;
  
  
  17. Missing REDBELLY_API_KEY
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The SDK Quickstart cannot complete the verifier flow because:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REDBELLY_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is missing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The verifier service requires an API key.&lt;/p&gt;

&lt;p&gt;The current Redbelly Quickstart explicitly instructs developers to configure &lt;code&gt;REDBELLY_API_KEY&lt;/code&gt; and says to contact support if they do not have one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.env.local&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REDBELLY_API_KEY="your_api_key_goes_here"
ALLOWED_ISSUER_DID="did:receptor:redbelly:testnet:31K82iKCtE6ciDc7oAr3T5EpjZb4S1EFM7c4xJaWkM2"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never put the secret API key in frontend code.&lt;/p&gt;

&lt;p&gt;If no API key has been issued to your project, follow the current support/onboarding process rather than inventing a key.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Validate required environment variables when the backend starts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REDBELLY_API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Missing REDBELLY_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  18. EligibilitySDK Test Credential Faucet Is Unavailable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The EligibilitySDK Quickstart instructs developers to obtain a test KYC credential from a demo credential faucet, but the faucet is shown as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;under development
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The current Quickstart itself documents the demo credential faucet as under development.&lt;/p&gt;

&lt;p&gt;This was also raised directly by a developer in the Redbelly Discord.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Do not build a production integration around an unavailable demo service.&lt;/p&gt;

&lt;p&gt;For development:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm whether Redbelly has provided an alternative test-credential issuance path.&lt;/li&gt;
&lt;li&gt;Obtain the required test credential through the currently supported Redbelly developer process.&lt;/li&gt;
&lt;li&gt;Do not substitute a production credential or issuer without updating the configured issuer DID.&lt;/li&gt;
&lt;li&gt;Confirm the credential issuer matches the configured &lt;code&gt;ALLOWED_ISSUER_DID&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Before starting an end-to-end SDK integration, verify that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API key
SDK package access
test credential
issuer DID
backend callback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are all available.&lt;/p&gt;




&lt;h2&gt;
  
  
  19. Local EligibilitySDK Callback Does Not Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;The SDK starts locally but the wallet cannot complete the verification callback.&lt;/p&gt;

&lt;p&gt;Typical setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;works in the browser, but the mobile identity wallet cannot reach the callback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;The mobile wallet cannot directly reach a developer's local machine through &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The current Redbelly Quickstart explicitly instructs developers to expose the local application through an ngrok tunnel for the callback flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;Start the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then expose port 3000:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the generated public HTTPS URL as the callback/base URL.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://randomstring.ngrok.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Use a reachable HTTPS endpoint for wallet callbacks during development.&lt;/p&gt;

&lt;p&gt;For production, deploy the verifier backend to a stable HTTPS domain rather than relying on a temporary tunnel.&lt;/p&gt;




&lt;h2&gt;
  
  
  20. Developer Cannot Determine a Wallet's On-Chain Eligibility
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Symptom
&lt;/h3&gt;

&lt;p&gt;A developer wants to enforce KYC/eligibility before allowing a wallet to interact with a smart contract, but does not know whether to query an API, registry or contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  Root Cause
&lt;/h3&gt;

&lt;p&gt;There are two separate concerns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Eligibility proof/verification flow&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-chain chain-permission lookup&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They should not be treated as the same operation.&lt;/p&gt;

&lt;p&gt;The current EligibilitySDK documentation exposes &lt;code&gt;useHasChainPermission(address)&lt;/code&gt; for checking chain permission from the client integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;For a React application, configure the EligibilitySDK provider and use the documented hook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;EligibilityWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useHasChainPermission&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@redbellynetwork/eligibility-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then query the connected address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hasPermission&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nf"&gt;useHasChainPermission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the result as the application's eligibility signal according to the current SDK documentation.&lt;/p&gt;

&lt;p&gt;For actual transaction enforcement, do not rely only on frontend logic. The contract/backend architecture must enforce the required permission independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prevention
&lt;/h3&gt;

&lt;p&gt;Document clearly whether each application check is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend eligibility UX
Backend proof verification
On-chain permission enforcement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not assume that hiding a button in the frontend provides smart-contract security.&lt;/p&gt;




&lt;h1&gt;
  
  
  Verification Matrix
&lt;/h1&gt;

&lt;p&gt;The following verification matrix should be completed before claiming the wiki has passed the technical-accuracy benchmark.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Verification Method&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RPC chain ID&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;curl&lt;/code&gt; → &lt;code&gt;eth_chainId&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routescan 429&lt;/td&gt;
&lt;td&gt;Controlled request-rate test&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong chain ID&lt;/td&gt;
&lt;td&gt;Testnet RPC + Hardhat config&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MetaMask network&lt;/td&gt;
&lt;td&gt;Manual wallet configuration&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insufficient RBNT&lt;/td&gt;
&lt;td&gt;Test deployment with unfunded account&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gas estimation&lt;/td&gt;
&lt;td&gt;Reproduce failing contract state&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contract balance&lt;/td&gt;
&lt;td&gt;Reproduce insufficient-balance revert&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardhat deployment&lt;/td&gt;
&lt;td&gt;Test deployment to Testnet&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routescan verification&lt;/td&gt;
&lt;td&gt;Verify a test contract&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDK package installation&lt;/td&gt;
&lt;td&gt;Fresh project + GitHub token&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API key configuration&lt;/td&gt;
&lt;td&gt;Fresh &lt;code&gt;.env.local&lt;/code&gt; setup&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDK callback&lt;/td&gt;
&lt;td&gt;Local app + ngrok + wallet&lt;/td&gt;
&lt;td&gt;Verify&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Do not mark an item as "tested" until the result has actually been reproduced.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Community Validation
&lt;/h1&gt;

&lt;p&gt;The issue inventory was built from recurring developer questions observed in Redbelly community channels, including reports concerning Routescan rate limits, EligibilitySDK credentials and package access, test credential availability, KYC/eligibility integration, wallet/RPC failures, MetaMask configuration, gas estimation, contract balance and Testnet RBNT availability.&lt;/p&gt;

&lt;p&gt;Before final submission, the draft must be posted in the Redbelly developer Discord and reviewed by at least three active developers.&lt;/p&gt;

&lt;p&gt;Record their feedback using this format:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reviewer&lt;/th&gt;
&lt;th&gt;Role / Community Activity&lt;/th&gt;
&lt;th&gt;Feedback&lt;/th&gt;
&lt;th&gt;Change Made&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Developer 1&lt;/td&gt;
&lt;td&gt;Redbelly developer/community contributor&lt;/td&gt;
&lt;td&gt;[Insert feedback]&lt;/td&gt;
&lt;td&gt;[Insert change]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer 2&lt;/td&gt;
&lt;td&gt;Redbelly developer/community contributor&lt;/td&gt;
&lt;td&gt;[Insert feedback]&lt;/td&gt;
&lt;td&gt;[Insert change]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer 3&lt;/td&gt;
&lt;td&gt;Redbelly developer/community contributor&lt;/td&gt;
&lt;td&gt;[Insert feedback]&lt;/td&gt;
&lt;td&gt;[Insert change]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Validation rule
&lt;/h3&gt;

&lt;p&gt;Do not claim community validation is complete until the draft has actually been shared and three active developers have provided feedback.&lt;/p&gt;




&lt;h1&gt;
  
  
  Sources and References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Redbelly Network environment configuration: current Mainnet/Testnet RPCs and chain IDs.&lt;/li&gt;
&lt;li&gt;Redbelly EligibilitySDK Installation: GitHub Packages authentication and SDK installation.&lt;/li&gt;
&lt;li&gt;Redbelly EligibilitySDK Getting Started: API key, test credentials, ngrok callback and end-to-end flow.&lt;/li&gt;
&lt;li&gt;Redbelly EligibilitySDK Backend Setup: required verifier endpoints and Testnet configuration.&lt;/li&gt;
&lt;li&gt;Redbelly EligibilitySDK React integration and &lt;code&gt;useHasChainPermission&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Routescan API rate limits and API-key documentation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Maintenance
&lt;/h2&gt;

&lt;p&gt;This wiki should be treated as a living developer resource.&lt;/p&gt;

&lt;p&gt;When Redbelly changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RPC endpoints&lt;/li&gt;
&lt;li&gt;chain IDs&lt;/li&gt;
&lt;li&gt;Testnet faucet procedures&lt;/li&gt;
&lt;li&gt;EligibilitySDK package access&lt;/li&gt;
&lt;li&gt;API-key requirements&lt;/li&gt;
&lt;li&gt;contract addresses&lt;/li&gt;
&lt;li&gt;explorer APIs&lt;/li&gt;
&lt;li&gt;wallet requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the corresponding troubleshooting entry should be reviewed and updated before developers rely on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Last reviewed:&lt;/strong&gt; August 2026&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>software</category>
      <category>softwaredevelopment</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
