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.