Normal behavior:
When a token is created or transferred, the ownership should be updated on the actual ledger/object layer. Any statistics stored in the RapperStats
resource (such as stats
and owner_counts
) should always reflect the real ownership of tokens on-chain.
Issue:
The transfer_record_only(token_id, from, to)
function modifies only the internal ownership records in RapperStats
(i.e. updates s.owner
and owner_counts
) without verifying or enforcing that the actual token transfer has occurred at the Aptos object/ledger level. This can lead to inconsistent states where the RapperStats
module reports different ownership or balances from the real on-chain state.
Likelihood:
This issue will occur whenever a friend
module calls transfer_record_only
without actually transferring the token at the ledger level — the function itself does not enforce the transfer.
Because owner_counts
duplicates data from stats
, any missed update or unsynchronized call will directly cause inconsistent state.
Impact:
Inconsistent or incorrect balances (balance_of
) may be reported and used for rewards, rankings, or permissions based on ownership, resulting in unauthorized benefits.
An attacker with access to a friend
module could deliberately alter RapperStats
to fake token ownership or inflate their balances without performing real transfers on-chain.
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.
The contest is complete and the rewards are being distributed.