Bug Description
When a user picks the stablecoin option (SOD, MOD, ECSD) to pay, the widget doesn't check if they actually have enough of that token before letting them proceed. WalletContext.jsx only fetches native balance using publicClient.getBalance() theres no balanceOf() call on the stablecoin contract anywhere. so TransactionReview.jsx builds the ERC-20 transfer() and shows "✅ Transaction ready!" even with 0 stablecoin balance. on send it just reverts with a confusing metamask error and no feedback from the widget.
This would affect anyone picking direct transfer without enough stablecoins, could be a new user who chose the wrong option or someone who just doesn't have enough balance.
Suggested approach: call balanceOf(account) on the stablecoin contract after wallet connection using existing publicClient, expose it in wallet context, and check it against the required amount in TransactionReview.jsx before enabling "Prepare Transaction". affected files: WalletContext.jsx, TransactionReview.jsx
Steps to Reproduce
- Open the stablepay widget or merchant demo site
- Select any network (e.g. sepolia)
- Select "SOD (Direct Transfer)" as payment token
- Connect a wallet that has 0 SOD
- Click "Prepare Transaction" — shows "✅ Transaction ready!"
- Click "Send Transaction" — tx reverts, no useful error from widget
Environment Details
OS: macOS
Browser: any (tested on chrome)
Network: sepolia (reproducible on all supported networks)
Wallet: metamask
Impact
Medium - Feature works but has issues
Code of Conduct
Bug Description
When a user picks the stablecoin option (SOD, MOD, ECSD) to pay, the widget doesn't check if they actually have enough of that token before letting them proceed.
WalletContext.jsxonly fetches native balance usingpublicClient.getBalance()theres nobalanceOf()call on the stablecoin contract anywhere. soTransactionReview.jsxbuilds the ERC-20transfer()and shows "✅ Transaction ready!" even with 0 stablecoin balance. on send it just reverts with a confusing metamask error and no feedback from the widget.This would affect anyone picking direct transfer without enough stablecoins, could be a new user who chose the wrong option or someone who just doesn't have enough balance.
Suggested approach: call
balanceOf(account)on the stablecoin contract after wallet connection using existingpublicClient, expose it in wallet context, and check it against the required amount inTransactionReview.jsxbefore enabling "Prepare Transaction". affected files:WalletContext.jsx,TransactionReview.jsxSteps to Reproduce
Environment Details
OS: macOS
Browser: any (tested on chrome)
Network: sepolia (reproducible on all supported networks)
Wallet: metamask
Impact
Medium - Feature works but has issues
Code of Conduct