Expected: Any “logical” ownership change (registry/table) must only occur after verifying the NFT is actually in protocol custody and that from == current owner
in the registry.
Issue: transfer_record_only(token_id, from, to)
updates the registry without an explicit check that the object is truly custodied by the protocol (and without an assertion that the registry and custody are in sync). If other flows later rely only on the registry (e.g., during unstake
), an attacker can create desync that enables theft when custody later becomes available.
Likelihood:
Every path that calls transfer_record_only(..., @battle_addr, X)
without first proving custody risks registry/custody divergence.
Any follow-up function that trusts the registry to decide “who can pull the object out” becomes an escalation vector.
Impact:
Theft post-facto when custody becomes available.
Long-lived state corruption (phantom ownership) that breaks invariants and can brick withdrawal flows.
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.