--- taskmaster_id: "8" status: "done" priority: "high" depends_on: [] parent_id: "" source: "taskmaster" generated_at: "2026-05-28T11:49:27.076Z" --- # 8 - Multichain RN proxy registry + USDC/USDT support - [x] 8 - Multichain RN proxy registry + USDC/USDT support #taskmaster #priority/high #status/done โซ ๐Ÿ†” tm-8 ## Metadata | Field | Value | | --- | --- | | Taskmaster ID | 8 | | Status | done | | Priority | high | | Dependencies | None | | Parent | None | ## Description Probe and persist RN ERC20FeeProxy addresses on BSC/Arb/ETH/Polygon/Base, add USDC + USDT token entries with correct decimals per chain, and surface an admin networks page. Include the USDT-mainnet approve(0) reset quirk in the frontend approve step. ## Details See PRD - Wallet, Multichain, Confirmations, AML, Trezor.md ยง2. Tasks: new backend/scripts/probe-rn-chains.ts that walks each chain in supported-chains.json and verifies the canonical 0x0DfbEe143b42B41eFC5A6F87bFD1fFC78c2f0aC9 proxy is the real RN proxy via a known view fn (CREATE2 is deterministic, but verify); promote backend/src/services/payment/requestNetwork/tokens.ts to load from JSON + admin override; add USDT entries on all 5 chains (BSC USDT 18-dec quirk, mainnet/Arb/Polygon/Base USDT 6-dec); buildInHouseCheckoutBlock returns reason='unsupported_chain:' for unknowns; new admin route GET /api/admin/rn/networks + frontend page /dashboard/admin/networks rendering the registry with per-row 'probe again'. Frontend approve flow: if buyer is on Ethereum mainnet AND token is USDT AND current allowance > 0, do approve(spender, 0) first then approve(spender, amount). Acceptance: probe succeeds on at least BSC/Arb/Polygon/ETH/Base; one paid probe on BSC USDT end-to-end; mainnet USDT approve(0) reset works; admin page reflects registry. Dependencies: none โ€” runs in parallel with #9. This is task #8 in the PRD. ## Completed work - `backend/src/services/payment/requestNetwork/supportedChains.json` โ€” 5-chain registry with RPC URLs, explorers, proxy addresses, native currency, confirmation thresholds. - `backend/src/services/payment/requestNetwork/tokens.json` โ€” 10 token entries: USDC + USDT on BSC (18-dec), Ethereum (6-dec), Arbitrum (6-dec), Polygon (6-dec), Base (6-dec). - `backend/src/services/payment/requestNetwork/tokens.ts` โ€” promoted to load from JSON with `reloadTokenRegistry()`, `overrideToken()`, `removeTokenOverride()`. - `backend/src/services/payment/requestNetwork/proxyAddresses.ts` โ€” promoted to load from JSON with `reloadChainRegistry()`, `getChainMetadata()`, `listSupportedChains()`. - `backend/src/services/payment/requestNetwork/inHouseCheckout.ts` โ€” returns `unsupported_chain:` for unknown chains (was `no_proxy_for_chain_`). - `backend/src/services/payment/requestNetwork/networkRegistryRoutes.ts` โ€” new admin routes `GET /api/admin/rn/networks` and `POST /api/admin/rn/networks/reload`. - `backend/scripts/probe-rn-chains.ts` โ€” standalone probe script verifying RPC reachability, contract code presence, and known function selectors. - `backend/src/app.ts` โ€” mounted `/api/admin/rn/networks`. - `frontend/src/web3/config.ts` โ€” added `arbitrum` and `base` chains with Alchemy/public RPC transports. - `frontend/src/sections/payment/checkout/rn-in-house-checkout-view.tsx` โ€” per-chain explorer URLs, USDT-mainnet `approve(0)` reset logic with UI state. - `frontend/src/sections/admin/networks/` โ€” new admin networks list view. - `frontend/src/app/dashboard/admin/networks/page.tsx` โ€” Next.js page for `/dashboard/admin/networks`. - `frontend/src/actions/network-registry.ts` โ€” API client for admin network registry endpoints. - `frontend/src/routes/paths.ts` + `nav-config-dashboard.tsx` โ€” added navigation entry. - Versions bumped: backend 2.6.45 โ†’ 2.6.46, frontend 2.6.44 โ†’ 2.6.46. ## Verification - All 58 relevant backend tests green (`rn-in-house-checkout`, `derived-destinations`, `sweep-service`, `request-template-orphan-cleanup`). - Frontend `tsc --noEmit` clean. - Pending: live paid probe on BSC USDT end-to-end; probe script execution on dev; mainnet USDT `approve(0)` reset manual verification.