When a contract call reverts, ALWAYS check for ABI mismatches before investigating runtime state. This is the single most important debugging step.
-
Verify the on-chain ABI matches what the frontend sends. Different deployments of the "same" contract can have different function signatures. Do NOT assume a local ABI file is correct for all contracts — check the block explorer (Etherscan/Worldscan "Read/Write as Proxy" tab) for the specific contract address.
-
Compare function selectors. If a function with the same name exists but different parameters, the 4-byte selector will be completely different and the call will revert with no useful error. Compute the selector from the ABI you're sending and verify it exists on-chain.