Normal behavior: When a user calls trigger_demand() with more ETH than required for their requested items, the contract should refund the excess ETH to msg.sender safely and reliably.
Problem: The refund logic uses Vyper’s send() function, which only forwards 2300 gas and does not revert on failure. If the receiver is a contract that requires more than 2300 gas in its fallback function, the refund silently fails and the excess ETH becomes permanently trapped inside the contract.
Likelihood:
The failure occurs when msg.sender is a contract wallet or proxy that executes code in its fallback/receive function, consuming more than 2300 gas.
Many modern smart contract wallets (e.g., Gnosis Safe, Argent, or multi-sig wallets) have non-trivial receive hooks, which frequently exceed 2300 gas.
Impact:
The excess ETH is never returned to the user and becomes irrecoverable without an owner-implemented rescue function.
Users lose funds whenever a refund attempt silently fails, leading to permanent loss of ETH for certain wallet types.
Explanation:
In this scenario, the receiving contract’s fallback consumes more than 2300 gas. Because send() does not revert on failure, the refund fails but execution continues successfully, leaving the excess ETH stuck.
Use raw_call with explicit error handling instead of send(). This allows safe gas forwarding and reverts on failed transfers.
This ensures that the refund either succeeds or the transaction reverts, preventing silent ETH loss and making the transfer behavior deterministic.
Vyper’s send() reverts on failure, so refund attempts to contract wallets with complex fallback logic can halt trigger_demand() entirely. This causes a denial-of-service for affected users but does not result in fund loss.
Vyper’s send() reverts on failure, so refund attempts to contract wallets with complex fallback logic can halt trigger_demand() entirely. This causes a denial-of-service for affected users but does not result in fund loss.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.