The Fund struct stores deadline as u64. All three instructions compare it against Clock::get().unwrap().unix_timestamp.try_into().unwrap(), converting i64 to u64. For timestamps above i64::MAX this panics. More critically, if a client passes a negative i64 value (e.g. from a timestamp handling bug), the u64 interpretation via two's complement becomes u64::MAX, making the deadline appear billions of seconds in the future and permanently blocking refunds. Additionally, every .unwrap() on Clock::get() panics the transaction rather than returning a clean program error.
Likelihood:
Any client that uses Solana's native i64 timestamp type and passes it without explicit casting to u64 produces a two's-complement large value for negative inputs, making the deadline check always false
The .unwrap() on Clock::get() in every deadline-touching instruction panics instead of propagating a program error, producing opaque transaction failures
Impact:
A deadline stored as a large u64 due to sign-extension never expires, permanently preventing refunds from ever being claimed
Panics from .unwrap() on syscalls halt entire instructions with no meaningful on-chain error code
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.