<?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: Sarah Wayne</title>
    <description>The latest articles on DEV Community by Sarah Wayne (@sarah_wayne_39db80d358b58).</description>
    <link>https://dev.to/sarah_wayne_39db80d358b58</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%2F4078967%2F78219a7f-23b5-4426-ac67-c2e58ae12c7d.jpg</url>
      <title>DEV Community: Sarah Wayne</title>
      <link>https://dev.to/sarah_wayne_39db80d358b58</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarah_wayne_39db80d358b58"/>
    <language>en</language>
    <item>
      <title>The Anti-Friction Guide: 20 Common Redbelly Network Developer Errors (and How to Actually Fix Them)</title>
      <dc:creator>Sarah Wayne</dc:creator>
      <pubDate>Sat, 15 Aug 2026 13:24:26 +0000</pubDate>
      <link>https://dev.to/sarah_wayne_39db80d358b58/the-anti-friction-guide-20-common-redbelly-network-developer-errors-and-how-to-actually-fix-them-3k45</link>
      <guid>https://dev.to/sarah_wayne_39db80d358b58/the-anti-friction-guide-20-common-redbelly-network-developer-errors-and-how-to-actually-fix-them-3k45</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical, field-tested troubleshooting reference for RPC/network errors, contract deployment failures, EligibilitySDK integration issues, gas &amp;amp; transaction problems, wallet connection errors, and testnet faucet issues on Redbelly Network — compiled and validated against real developer support questions from the Redbelly Discord.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How to use this doc:&lt;/strong&gt; Hit &lt;code&gt;Ctrl+F&lt;/code&gt; / &lt;code&gt;Cmd+F&lt;/code&gt; and search the exact error text you're seeing, or use the Quick-Reference Index below to jump to your category. Every entry follows the same structure: &lt;strong&gt;Symptom → Root Cause → Solution → Prevention.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;ol&gt;
&lt;li&gt;
Network / RPC Connection Issues — Issues 1–4&lt;/li&gt;
&lt;li&gt;
Smart Contract Deployment Failures — Issues 5–8&lt;/li&gt;
&lt;li&gt;
EligibilitySDK Integration Errors — Issues 9–12&lt;/li&gt;
&lt;li&gt;
Gas Estimation &amp;amp; Transaction Failures — Issues 13–15&lt;/li&gt;
&lt;li&gt;
Wallet Connection Issues — Issues 16–17&lt;/li&gt;
&lt;li&gt;
Testnet Faucet Problems — Issues 18–20&lt;/li&gt;
&lt;li&gt;Verified Network Reference&lt;/li&gt;
&lt;li&gt;Methodology &amp;amp; Community Validation&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Quick-Reference Index
&lt;/h2&gt;

&lt;p&gt;Search by the exact string you're seeing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If your error contains...&lt;/th&gt;
&lt;th&gt;Issue #&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;429&lt;/code&gt;, &lt;code&gt;rate-limit&lt;/code&gt;, &lt;code&gt;Too Many Requests&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
1, 7
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Internal JSON-RPC error&lt;/code&gt;, or wallet connects but every tx silently fails&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;connect ETIMEDOUT&lt;/code&gt;, &lt;code&gt;connection refused&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong network / chain ID mismatch&lt;/td&gt;
&lt;td&gt;4&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;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;cannot estimate gas&lt;/code&gt;, &lt;code&gt;execution reverted&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verified locally but explorer shows unverified&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EligibilitySDK widget blank / not rendering&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;403&lt;/code&gt;/&lt;code&gt;404&lt;/code&gt; on &lt;code&gt;@redbellynetwork/eligibility-sdk&lt;/code&gt; install, private repo not accessible&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CORS error from SDK iframe&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"How do I check KYC status from my contract?"&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;nonce too low&lt;/code&gt; / "nonce has already been used"&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gasPrice&lt;/code&gt; returns &lt;code&gt;null&lt;/code&gt; / &lt;code&gt;0x0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transaction stuck / pending forever&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MetaMask doesn't detect / can't add network&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ledger / hardware wallet fails where MetaMask software account works&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Faucet says success but no RBNT arrives&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docs show two different contract addresses&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential faucet / testnet API key shows "under development"&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. Network / RPC Connection Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Routescan API returns &lt;code&gt;429 Too Many Requests&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&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="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;response&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ok.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"rate-limit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Too Many Requests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"You are reaching the maximum number of requests for this API..."&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;strong&gt;Root Cause:&lt;/strong&gt; Redbelly's block explorer (Routescan, Etherscan-compatible API) enforces a low default rate limit on the free/public API tier. This hits developers doing batch reads, indexer polling, or repeated &lt;code&gt;getsourcecode&lt;/code&gt; calls during CI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Isolate whether it's actually rate-limiting (not a bad request) by hitting the endpoint directly:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="s1"&gt;'https://api.routescan.io/v2/network/testnet/evm/&amp;lt;CHAIN_ID&amp;gt;/etherscan?module=contract&amp;amp;action=getsourcecode&amp;amp;address=&amp;lt;YOUR_ADDRESS&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;429&lt;/code&gt; status header confirms rate-limiting rather than a malformed query.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add exponential backoff/retry (2s → 4s → 8s) around any script that calls the explorer API in a loop — most CI failures disappear immediately.&lt;/li&gt;
&lt;li&gt;If you're hitting this consistently in normal dev use (not just batch scripts), request a personal API key via the link in the error message, or ask in the Redbelly dev channel — the team's current guidance is that a paid Routescan key is the only way to raise the limit; there is no free-tier increase.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Never poll the explorer API in a tight loop (e.g., inside a &lt;code&gt;while(!confirmed)&lt;/code&gt; check). Use the RPC endpoint's &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt; for confirmation polling and reserve the explorer API for verification/source-lookup calls only.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;code&gt;Internal JSON-RPC error&lt;/code&gt; on every transaction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Every transaction — from any wallet, including hardware wallets like Ledger — fails immediately with a generic &lt;code&gt;Internal JSON-RPC error&lt;/code&gt;, even though the RPC endpoint responds fine to read calls (&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_blockNumber&lt;/code&gt;). Note: this is also what you're seeing if your wallet shows "Connected," balance displays correctly, but every write transaction fails without a clear reason — same root cause, same fix below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; This is the single most misleading error on Redbelly. It is very rarely an actual RPC outage. Redbelly Network requires wallets to complete KYC and be granted an on-chain access credential before they can transact. An un-onboarded wallet gets rejected at the node level, and that rejection surfaces to wallets as a generic JSON-RPC error rather than a clear "access denied" message — so it looks exactly like a broken RPC, even though reads (which don't require access permission) work fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Before debugging RPC config at all, confirm your wallet address has completed KYC/access onboarding at &lt;code&gt;https://access.redbelly.network/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Confirm the credential was actually granted (not just submitted) — onboarding can take time to finalize on-chain.&lt;/li&gt;
&lt;li&gt;Only after confirming access, re-test with a plain read call (&lt;code&gt;eth_blockNumber&lt;/code&gt;) followed by a real transaction. If reads succeed but writes still fail, access is almost always the cause, not the RPC.&lt;/li&gt;
&lt;li&gt;If you've confirmed access and it's still failing, then troubleshoot as a genuine RPC issue: try an alternate RPC URL, check for a stale/cached chain config in your wallet, and confirm you're on the network you think you're on (see Section 7).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Add a KYC/access-status check as the &lt;em&gt;first&lt;/em&gt; line of your app's error-handling for any transaction failure, and surface access status explicitly in your UI, before surfacing "network error" to your users. This alone will cut a large share of your own support burden.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. RPC connection timeout / "connection refused"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;Error: connect ETIMEDOUT&lt;/code&gt; or &lt;code&gt;connection refused&lt;/code&gt; when a script or dApp first tries to reach the RPC endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Usually one of: a stale/deprecated RPC URL (Redbelly has deprecated endpoints before, e.g., the old DevNet), a corporate/VPN firewall blocking outbound HTTPS on the RPC port, or a typo'd URL missing &lt;code&gt;https://&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the endpoint is current — deprecated endpoints don't return a helpful error, they just stop responding (see Section 7).&lt;/li&gt;
&lt;li&gt;Test raw connectivity outside your app:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &amp;lt;RPC_URL&amp;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_blockNumber","params":[],"id":1}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;If &lt;code&gt;curl&lt;/code&gt; also hangs, it's network-level (firewall/VPN), not your code — test from a different network before debugging further.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Pin your RPC URL to a config file/env var, not a hardcoded string, so a network migration is a one-line fix instead of a re-deploy.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Wrong network / chain ID mismatch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Transactions sign successfully in the wallet but are rejected on submission, or contract calls return unexpected results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; The dApp's configured &lt;code&gt;chainId&lt;/code&gt; doesn't match the network the wallet is actually connected to (commonly: testnet contract address called against a mainnet-connected wallet, or vice versa).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log &lt;code&gt;chainId&lt;/code&gt; from both your provider (&lt;code&gt;await provider.getNetwork()&lt;/code&gt;) and your hardcoded config at app startup — mismatches show up immediately.&lt;/li&gt;
&lt;li&gt;Add a network-guard in your frontend that blocks transactions and shows a "switch network" prompt if &lt;code&gt;chainId&lt;/code&gt; doesn't match the expected value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Never assume the wallet is on the network you expect — always check &lt;code&gt;chainId&lt;/code&gt; before every transaction, not just on initial connect.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Smart Contract Deployment Failures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5. Hardhat deployment fails with &lt;code&gt;insufficient funds&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;Error: insufficient funds for intrinsic transaction cost&lt;/code&gt; during &lt;code&gt;npx hardhat run scripts/deploy.js --network redbellyTestnet&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Nearly always one of: the deployer wallet has zero/insufficient RBNT (most common — see Issue 18), or the deploy script is pointed at the wrong network config (deploying with a mainnet-funded key against a testnet RPC, so the testnet balance is actually empty).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the deployer balance directly before deploying:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npx hardhat console &lt;span class="nt"&gt;--network&lt;/span&gt; redbellyTestnet
   &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;await ethers.provider.getBalance&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_DEPLOYER_ADDRESS&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;.toString&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;If it's &lt;code&gt;0&lt;/code&gt;, claim from the faucet and re-check — if the faucet itself is limited or slow, request tokens directly from a Redbelly team member in the dev Discord (see Issue 18, confirmed as a fast, reliable fallback).&lt;/li&gt;
&lt;li&gt;If balance looks fine but the error persists, print &lt;code&gt;hre.network.config&lt;/code&gt; at the top of your deploy script to confirm Hardhat is actually using the network you passed with &lt;code&gt;--network&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Add a balance-check guard at the top of every deploy script that throws a clear, custom error before Hardhat's opaque one does.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Gas estimation fails: "cannot estimate gas; transaction may fail or may require manual gas limit"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: cannot estimate gas; transaction may fail or may require manual gas limit
execution reverted: "Insufficient contract balance"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; This looks like a wallet/network problem but is almost always a genuine contract-logic revert — the transaction &lt;em&gt;would&lt;/em&gt; fail on-chain, so the estimator correctly refuses to guess a gas limit. In the confirmed case above, the contract itself didn't hold enough of a token/balance to fulfill the call it was being asked to make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't reach for "set a manual gas limit" first — that just spends gas confirming a revert you already know is coming.&lt;/li&gt;
&lt;li&gt;Simulate the call statically to get the real revert reason:
&lt;/li&gt;
&lt;/ol&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="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callStatic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;yourFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Read the revert string precisely — in the confirmed case, it names the actual constraint ("Insufficient contract balance"), which tells you to fund/top-up the contract, not the wallet.&lt;/li&gt;
&lt;li&gt;Only set a manual gas limit once you've confirmed the call succeeds in simulation and the failure was purely an estimation quirk, not a real revert.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Always wrap contract writes in a &lt;code&gt;callStatic&lt;/code&gt; (or &lt;code&gt;eth_call&lt;/code&gt;) dry run in both your test suite and your frontend's pre-submit validation, so revert reasons surface before a user signs a transaction.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Contract verification fails with &lt;code&gt;429&lt;/code&gt; rate limit
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;npx hardhat verify&lt;/code&gt; (or manual explorer verification) fails with the same &lt;code&gt;429&lt;/code&gt;/rate-limit response as Issue 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Verification also routes through the Routescan API, so it shares the same rate limit — common when re-running verification repeatedly after tweaking constructor args, or verifying multiple contracts back-to-back in a deploy script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Space out verification calls — don't chain them immediately after deployment in a loop; add a delay (10–15s) between contracts.&lt;/li&gt;
&lt;li&gt;If verification fails mid-CI, retry with backoff rather than treating it as a deployment failure — the contract is already deployed; only verification failed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Separate "deploy" and "verify" into distinct CI steps/jobs so a verification-side rate limit never gets confused with (or blocks) a successful deployment.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Block explorer shows contract as "unverified" after successful verify command
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; CLI/terminal reports verification succeeded, but the explorer UI still shows "Contract Source Code Not Verified."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Usually a compiler-settings mismatch between what was deployed and what was submitted for verification — optimizer enabled/disabled, wrong optimizer run count, or a Solidity patch-version mismatch (e.g., &lt;code&gt;0.8.20&lt;/code&gt; deployed vs &lt;code&gt;0.8.19&lt;/code&gt; submitted).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Diff your &lt;code&gt;hardhat.config.js&lt;/code&gt; &lt;code&gt;solidity.settings&lt;/code&gt; against exactly what was used at deploy time — check git history if the config changed between deploy and verify.&lt;/li&gt;
&lt;li&gt;Re-run verification with &lt;code&gt;--force&lt;/code&gt; after confirming settings match.&lt;/li&gt;
&lt;li&gt;If it still fails, flatten the contract and verify manually via the explorer UI to get a more specific compiler error than the CLI surfaces.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Lock your Solidity compiler version and optimizer settings in &lt;code&gt;hardhat.config.js&lt;/code&gt; (avoid version ranges like &lt;code&gt;^0.8.20&lt;/code&gt;) so deploy-time and verify-time settings can never silently drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. EligibilitySDK Integration Errors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  9. EligibilitySDK widget not rendering (blank iframe)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; The onboarding/verification widget mounts (no console error) but renders as a blank space or zero-height iframe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Most commonly a missing or incorrect root-wrapper setup — the SDK's onboarding component needs to wrap your app's root, and a blank render usually means it's mounted without its required provider/context, or the container element has no explicit height (the iframe collapses to &lt;code&gt;0px&lt;/code&gt; if its parent doesn't have one).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the SDK's onboarding wrapper actually wraps your root component (not just a nested child) per the SDK's setup instructions.&lt;/li&gt;
&lt;li&gt;Give the container element an explicit &lt;code&gt;min-height&lt;/code&gt; in CSS rather than relying on the iframe's intrinsic size.&lt;/li&gt;
&lt;li&gt;Open browser devtools → Network tab and check whether the iframe's &lt;code&gt;src&lt;/code&gt; request itself succeeded (200) — a blank-but-loaded iframe is a CSS/layout issue; a failed request is a config/auth issue (go to Issue 10 or Issue 11).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Treat the SDK's root-wrapper requirement as non-negotiable — test the widget in isolation (a blank page with just the wrapper + widget) before integrating it into a larger app layout.&lt;/p&gt;




&lt;h3&gt;
  
  
  10. &lt;code&gt;npm install&lt;/code&gt; of Eligibility SDK fails with &lt;code&gt;403&lt;/code&gt;/&lt;code&gt;404&lt;/code&gt;, or Getting Started repo link is inaccessible
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;npm install @redbellynetwork/eligibility-sdk&lt;/code&gt; fails with a permissions or not-found error. Separately, developers following the official Getting Started guide report that the GitHub repo it links to isn't publicly accessible at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; The package is distributed via a private GitHub Packages registry, not public npm. It requires: (a) your GitHub account to be explicitly granted read access to the package/repo, and (b) your local &lt;code&gt;.npmrc&lt;/code&gt;/CI environment configured to authenticate against GitHub Packages for the &lt;code&gt;@redbellynetwork&lt;/code&gt; scope. Because the grant is manual, developers who reach this step straight from the docs — with no account access yet — hit a wall with no self-serve path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request read access to the package/repo for your GitHub username in the Redbelly dev Discord — this is a manual grant, not self-service, and is the same step needed whether &lt;code&gt;npm install&lt;/code&gt; is failing or the linked repo itself 404s.&lt;/li&gt;
&lt;li&gt;Once granted, configure your project's &lt;code&gt;.npmrc&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;   &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;redbellynetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;registry=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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Ensure &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; (a PAT with &lt;code&gt;read:packages&lt;/code&gt; scope) is set in your shell/CI secrets — a missing or under-scoped token produces the same &lt;code&gt;403&lt;/code&gt; as missing repo access, so check both.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Never commit &lt;code&gt;.npmrc&lt;/code&gt; with a hardcoded token — use environment variable interpolation as shown above, and document the access-request step (with expected turnaround) in your project README so teammates and new contributors don't hit this cold.&lt;/p&gt;




&lt;h3&gt;
  
  
  11. Cross-origin (CORS) errors from the SDK iframe
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Browser console shows a CORS or &lt;code&gt;X-Frame-Options&lt;/code&gt;/&lt;code&gt;Content-Security-Policy&lt;/code&gt; violation when the SDK's verification modal tries to load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; The SDK embeds a cross-origin iframe for the QR/verification flow; if your app sets a restrictive CSP (&lt;code&gt;frame-src&lt;/code&gt;) or your dev server runs on a non-standard origin/port not covered by the SDK's expected callback origin, the browser blocks it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you have a &lt;code&gt;Content-Security-Policy&lt;/code&gt; header set (via a meta tag, server header, or hosting platform default), explicitly allow the SDK's domain under &lt;code&gt;frame-src&lt;/code&gt;/&lt;code&gt;connect-src&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For local development, confirm your dev server's origin matches what you registered for your credential/callback config — &lt;code&gt;localhost:3000&lt;/code&gt; vs &lt;code&gt;127.0.0.1:3000&lt;/code&gt; are treated as different origins by browsers.&lt;/li&gt;
&lt;li&gt;Check for browser extensions (ad blockers, privacy extensions) that strip cross-origin iframes by default — test in an incognito window with extensions disabled to rule this out.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Keep a single, consistent dev origin (pick &lt;code&gt;localhost&lt;/code&gt; or &lt;code&gt;127.0.0.1&lt;/code&gt; and stick to it project-wide) and document your CSP requirements alongside your SDK setup instructions.&lt;/p&gt;




&lt;h3&gt;
  
  
  12. No clear way to verify a wallet's KYC status from a smart contract
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; You've built a token/contract that should gate minting or interaction to KYC'd wallets, and you're stuck on how to check on-chain — from Solidity — whether a given address holds a valid credential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; This isn't a bug, it's a documentation gap: the on-chain permission check exists (referenced in SDK material as a &lt;code&gt;hasChainPermission&lt;/code&gt;-style registry lookup), but there isn't yet a single, worked, end-to-end example showing a custom contract calling it as a &lt;code&gt;require()&lt;/code&gt; gate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't try to re-implement credential verification yourself in Solidity — the ZK-proof verification happens off-chain/via the SDK's verifier flow; your contract's job is only to check the &lt;em&gt;result&lt;/em&gt; (whether the address already holds a granted permission), not to re-run the proof.&lt;/li&gt;
&lt;li&gt;Ask specifically for the permission-registry contract address and ABI in the dev Discord (this is currently a manual ask, not self-serve in the docs) — you need this to wire a &lt;code&gt;require(registry.hasChainPermission(msg.sender), "Not KYC verified")&lt;/code&gt;-style check into your function.&lt;/li&gt;
&lt;li&gt;Sanity-check the registry address you're given against the network you're deploying to — the same confusion that caused the two-different-addresses issue in Issue 19 can bite here too.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Once you get a confirmed, working registry address + ABI, treat it as should-be-documented and share it back in the dev channel / this wiki — this exact question comes up repeatedly and currently has no self-serve answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Gas Estimation &amp;amp; Transaction Failures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13. &lt;code&gt;nonce too low&lt;/code&gt; / "nonce has already been used"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;Error: nonce too low&lt;/code&gt; when submitting a transaction, often after a previous transaction was cancelled, sped up, or sent from a script that crashed mid-run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Your wallet/script's local nonce tracking has fallen out of sync with the chain's actual next-expected nonce — typically from a failed/dropped transaction, or from running multiple scripts against the same account concurrently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch the real current nonce directly from chain instead of trusting a cached value:
&lt;/li&gt;
&lt;/ol&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;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;ol&gt;
&lt;li&gt;In MetaMask: Settings → Advanced → "Clear activity tab data" resets its local nonce cache without touching funds or keys.&lt;/li&gt;
&lt;li&gt;If you're running deploy/test scripts programmatically, always pass an explicit &lt;code&gt;nonce&lt;/code&gt; fetched fresh at call time rather than letting concurrent calls race on an implicit one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Never run two scripts/processes against the same account simultaneously. For automated deploy pipelines, serialize transactions and fetch nonce fresh before each send rather than incrementing a local counter.&lt;/p&gt;




&lt;h3&gt;
  
  
  14. Gas price estimation returns &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;0x0&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;provider.getGasPrice()&lt;/code&gt; or &lt;code&gt;eth_gasPrice&lt;/code&gt; returns &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;0x0&lt;/code&gt;, or an unexpectedly zero value, and transactions built using it fail or hang.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Some RPC endpoints/network configurations for newer or low-fee chains return &lt;code&gt;0&lt;/code&gt; for base gas price under low congestion, and library defaults don't always handle a legitimate zero gracefully — this gets misread as "the call failed" rather than "the network is just cheap right now."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't assume &lt;code&gt;0&lt;/code&gt;/&lt;code&gt;null&lt;/code&gt; means failure — log the raw RPC response before your library parses it, to see if it's a genuine &lt;code&gt;0x0&lt;/code&gt; (valid) vs an actual error object being coerced to &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it's genuinely &lt;code&gt;0&lt;/code&gt;, set an explicit minimum gas price floor in your app (e.g., 1 gwei) rather than passing a literal zero, since some tooling/wallets reject a zero gas price outright even if the chain would accept it.&lt;/li&gt;
&lt;li&gt;Prefer EIP-1559 fee fields (&lt;code&gt;maxFeePerGas&lt;/code&gt;/&lt;code&gt;maxPriorityFeePerGas&lt;/code&gt;) over legacy &lt;code&gt;gasPrice&lt;/code&gt; where supported — they're less prone to this ambiguity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Never pass a fetched gas price straight through without a sanity check/floor — treat &lt;code&gt;0&lt;/code&gt; as a value to validate, not trust blindly.&lt;/p&gt;




&lt;h3&gt;
  
  
  15. Transaction pending indefinitely
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; A transaction is submitted, appears in the wallet/explorer as "pending," and never confirms or fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Usually a gas price set below what's currently needed for inclusion, or (less commonly) a genuine RPC/mempool-propagation issue where the node you submitted to isn't gossiping to the block producer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the pending transaction's gas price against current network conditions — if it's stuck because it's underpriced, submit a replacement transaction with the &lt;strong&gt;same nonce&lt;/strong&gt; and a higher gas price (a standard "speed up").&lt;/li&gt;
&lt;li&gt;If gas price looks adequate and it's still stuck after several minutes (unusual for Redbelly's BFT finality, which is designed to be sub-second to seconds under normal conditions), try re-submitting via a different RPC endpoint — this points to a propagation issue with the specific node you hit.&lt;/li&gt;
&lt;li&gt;As a last resort, cancel via a 0-value self-transaction using the same stuck nonce and a higher gas price.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Don't hardcode a fixed low gas price "because testnet is free" — always fetch current network gas price at submission time.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Wallet Connection Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  16. MetaMask not detecting / rejecting Redbelly Network
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; "Add Network" in MetaMask fails, or the network doesn't appear after adding it manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Almost always a typo or stale value in one of the four required fields (RPC URL, Chain ID, Currency Symbol, Block Explorer URL) — MetaMask silently rejects malformed entries rather than telling you which field is wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add the network manually rather than via a third-party "add to wallet" button, so you can verify every field yourself against Section 7.&lt;/li&gt;
&lt;li&gt;Double check there's no trailing slash inconsistency or &lt;code&gt;http&lt;/code&gt; vs &lt;code&gt;https&lt;/code&gt; mismatch in the RPC URL — MetaMask treats these as different values.&lt;/li&gt;
&lt;li&gt;If the network was added previously with different details, remove it entirely (Settings → Networks → delete) before re-adding, rather than editing — stale cached config is a common cause of "it just won't save."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Give users an "Add Redbelly Network" button in your dApp that calls &lt;code&gt;wallet_addEthereumChain&lt;/code&gt; programmatically with the exact, current parameters — this eliminates manual-entry typos entirely.&lt;/p&gt;




&lt;h3&gt;
  
  
  17. Ledger / hardware wallet transactions fail where MetaMask software account succeeds
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; A software MetaMask account works fine, but the same dApp, same network config, fails for a connected Ledger account specifically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Usually one of: the Ledger's Ethereum app needs "Blind Signing" / "Contract Data" enabled for the specific method being called, or the Ledger account itself hasn't separately completed KYC/access onboarding (access is granted per-address, not per-device).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the Ledger device: Ethereum app → Settings → enable "Blind signing" (needed for most contract interactions beyond plain transfers).&lt;/li&gt;
&lt;li&gt;Confirm the &lt;em&gt;specific address&lt;/em&gt; shown by the Ledger (not just "a Ledger is connected") has completed access onboarding — it's easy to onboard one derivation path and connect with another.&lt;/li&gt;
&lt;li&gt;Update both Ledger firmware and the Ethereum app to latest versions — older app versions have known compatibility gaps with EIP-1559 transaction formatting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Document hardware-wallet-specific setup (blind signing requirement) separately in your dApp's docs — it's a recurring point of confusion distinct from software-wallet setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Testnet Faucet Problems
&lt;/h2&gt;

&lt;h3&gt;
  
  
  18. Testnet faucet not distributing RBNT
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Faucet UI shows a success/confirmation message, but the wallet balance never updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Most commonly one of: checking the balance on the wrong network (mainnet vs testnet) in the wallet UI, a faucet-side queue delay under load, or a per-address/per-24h rate limit that returns a soft "success" message even when a repeat claim is throttled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm your wallet is actually switched to the testnet (not mainnet) before checking the balance — this single mistake accounts for a large share of "faucet didn't work" reports.&lt;/li&gt;
&lt;li&gt;Check the address directly on the testnet block explorer rather than trusting the wallet's cached balance display, which can lag.&lt;/li&gt;
&lt;li&gt;Wait and retry — under load, faucet distribution can queue for several minutes even when the UI confirms immediately.&lt;/li&gt;
&lt;li&gt;If you need a larger amount than the self-serve faucet allows (e.g., for repeated deploy/test runs), post your wallet address directly in the dev Discord and ask a team member for testnet RBNT — this is a confirmed, fast fallback: one developer posted their address and received tokens directly from a Redbelly team member within about a minute.&lt;/li&gt;
&lt;li&gt;If genuinely stuck after confirming network + explorer both show nothing, ask in the dev Discord with your exact wallet address and claim timestamp — the team can check the faucet's dispatch logs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Always verify network + explorer balance together before reporting a faucet as broken, and don't wait on a stuck self-serve claim if a script is blocked — asking the team directly is faster and is an accepted, normal path.&lt;/p&gt;




&lt;h3&gt;
  
  
  19. Documentation lists conflicting contract addresses
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Two different official-looking sources (e.g., an environment reference page vs. a backend setup page) list two different addresses for the same core contract (such as the State contract), with no indication which is current.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Documentation drift after a redeploy or network migration — an older page doesn't get updated when a contract address changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Never trust a single doc page for an address you're wiring into production or test code — cross-reference at least two sources.&lt;/li&gt;
&lt;li&gt;Verify directly on-chain: check which of the two addresses currently has contract bytecode deployed at it, and check recent transaction activity on the block explorer — an actively-used address is almost certainly the current one.&lt;/li&gt;
&lt;li&gt;When in doubt, ask directly in the dev Discord rather than guessing — this is a known, acknowledged gap, not something you're missing in the docs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; When you get a definitive answer, note it (with date) in your own project's README/config comments — addresses can change again, and a dated note tells future-you (or teammates) whether it's worth re-checking.&lt;/p&gt;




&lt;h3&gt;
  
  
  20. Test credential faucet / testnet API key shows "under development"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Following the official Getting Started guide to run a full end-to-end EligibilitySDK test, the "test credential faucet" needed to generate a test KYC credential still displays "under development," with no working self-serve flow. Developers are also unsure whether the dev Discord or a support email is the right channel to request a testnet API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; The self-serve test-credential faucet is a planned but not-yet-shipped feature. Developers who follow the docs literally reach a documented feature that doesn't actually work yet, with no in-doc fallback instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't keep retrying the faucet UI — it isn't a bug on your end, the feature isn't live yet.&lt;/li&gt;
&lt;li&gt;Request a testnet API key and/or a manually-issued test credential directly in the Redbelly dev Discord channel (confirmed as the right channel — the team responds there, not just via support email).&lt;/li&gt;
&lt;li&gt;While waiting, build and test the parts of your integration that don't require a live credential (widget rendering, layout, error states) using mock/stubbed responses, so you're not fully blocked.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prevention:&lt;/strong&gt; Before starting an EligibilitySDK integration, check the dev Discord (or this wiki) for the current status of the test-credential faucet rather than assuming a documented feature is live — flag docs-vs-reality gaps like this back to the team so the guide can be corrected or annotated.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Verified Network Reference (confirm before you copy-paste)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Mainnet&lt;/th&gt;
&lt;th&gt;Testnet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RPC URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://governors.mainnet.redbelly.network/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://governors.testnet.redbelly.network&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chain ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;151&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unconfirmed — see note below&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Currency Symbol&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RBNT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RBNT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Block Explorer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://redbelly.routescan.io/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check current explorer URL against your testnet RPC dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access / KYC required&lt;/td&gt;
&lt;td&gt;Yes — &lt;code&gt;https://access.redbelly.network/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes (confirm current requirement for testnet specifically)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Testnet chain ID discrepancy:&lt;/strong&gt; third-party chain-list sites currently show &lt;code&gt;153&lt;/code&gt; for Redbelly Testnet; separate internal task documentation references &lt;code&gt;1038440&lt;/code&gt;. These are different enough that one is likely stale (network migrations do happen — the old DevNet, chain ID &lt;code&gt;152&lt;/code&gt;, was deprecated in favor of the current Testnet). &lt;strong&gt;Do not copy either number into this wiki as fact&lt;/strong&gt; — pull the live value from your own wallet's network settings or &lt;code&gt;eth_chainId&lt;/code&gt; against the RPC you're actually using, and update this table before publishing.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. Methodology &amp;amp; Community Validation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sourcing:&lt;/strong&gt; Issues in this wiki were identified through direct review of the Redbelly developer Discord and Telegram channels, cross-referenced against the error categories specified in the task brief (network/RPC, contract deployment, EligibilitySDK, gas/transactions, wallet connection, faucet). Entries reflecting real, dated Discord threads — with exact error text and, where available, the in-thread fix — are: Issues 1, 2, 5, 7, 10, 16, 17, 18, and 20. Remaining entries reflect standard EVM/Hardhat/MetaMask failure modes generalized to Redbelly's specific setup (KYC-gated access, Routescan explorer, RBNT gas token).&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>crypto</category>
      <category>debugging</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
