Normal behavior: Players stake a rapper NFT and CRED to go on stage. The contract updates the RapperStats
metadata to mark the NFT as on stage and transfers the NFT to the arena.
Issue: The function calls one_shot::transfer_record_only(token_id, player_addr, @battle_addr)
before transferring the NFT:
If the player
does not actually own rapper_token
, transfer_record_only
still executes.
Mitigating factor: object::transfer
reverts if the signer does not own the NFT, rolling back the transaction and preventing persistent corruption.
Likelihood:
Low, because normal users can only pass NFTs they control.
Could occur if a malicious module attempts to call the function with an NFT the signer does not own.
Impact:
Minimal in production, as the transaction reverts and no permanent corruption occurs.
Metadata could be temporarily inconsistent during transaction execution, but the abort restores state.
Explanation:
Check ownership explicitly before modifying metadata.
Transfer NFT first, then update RapperStats
only if the transfer succeeds.
Reduces reliance on transaction rollback for safety and improves clarity.
Summary:
Low-risk issue in practice, but adding an ownership check makes the contract safer and prevents temporary metadata inconsistencies during transaction execution.
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.