In EIP-712, signatures are meant to be generated off-chain for a fixed message, then validated on-chain by regenerating the hash and verifying the signer using ECDSA.recover
.
In this contract, the getMessageHash()
function uses i_snow.balanceOf(receiver)
at the time of signing and again at the time of claiming, expecting them to match exactly.
This coupling of message content with mutable state (token balance) violates the design principle of EIP-712, which assumes immutable message contents.
The contract signs a hash that depends on balanceOf(receiver)
. Since token balances can change, the off-chain signature may no longer match when submitted.
Using balanceOf()
in signed message ties signature to mutable state.
By embedding balanceOf(receiver)
into the signed payload, a user’s off‑chain signature becomes invalid if their token balance changes between signing and claiming.
Likelihood:
Reason 1 // Legitimate users may get their signature rejected if their balance changes.
Reason 2 // Users who move or spend tokens after signing will experience signature mismatches.
Impact:
Impact 1 Legitimate users may encounter signature‑mismatch errors, leading to poor UX and abandoned claims.
Impact 2 Legitimate users will often fail to claim if their balance changes in between signing and submitting the claim.
Claims use snow balance of receiver to compute the merkle leaf, making proofs invalid if the user’s balance changes (e.g., via transfers). Attackers can manipulate balances or frontrun claims to match eligible amounts, disrupting the airdrop.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.