tokens.ts pins USDC_ADDRESS to the Ethereum mainnet contract, but the app lets the wallet connect to any chain. On Sepolia or an L2 the balance read and the transfer simulate both point at an address that is not USDC there, so the simulate fails and the form never enables. Replace the single constant with a map keyed by chain id, resolve the address from useAccount().chain, and disable the form with a clear message on unsupported chains.
tokens.ts pins USDC_ADDRESS to the Ethereum mainnet contract, but the app lets the wallet connect to any chain. On Sepolia or an L2 the balance read and the transfer simulate both point at an address that is not USDC there, so the simulate fails and the form never enables. Replace the single constant with a map keyed by chain id, resolve the address from useAccount().chain, and disable the form with a clear message on unsupported chains.