1type ContractEntry struct {
2 Address address
3 Owner address // current manager (accepted)
4 PendingOwner address // nominated, not yet accepted; empty if none
5 Name string
6 Deprecated bool
7 Successor address // address of the upgraded contract, empty if current
8}
ContractEntry represents a registered contract and its upgrade status.
An entry's Address is ALWAYS the address that called Register — a contract can only register itself. That call is the proof of control: nobody can claim an address they don't command, so a Deprecate redirect on an entry always originates from whoever genuinely controlled the contract. Entries are permanent by design: migration history is what consumers rely on, so it must not be erasable (and a delete would reopen re-registration squatting).
Ownership is two-step (re-audit 2026-09-02): Register/Transfer only NOMINATE an owner; the nominee must AcceptOwnership. Until then the entry is owned by the contract itself, so nobody's address can be attached as "owner" without their consent.