The two-step admin transfer (propose+accept_admin, referenced by DataKey::PendingAdmin) is a good pattern for avoiding typo-lockout, but it's worth confirming whether a pending proposal ever expires. If an admin proposes a transfer to some address, that transfer is never accepted (the intended recipient never gets around to it, or circumstances change and the transfer is no longer wanted, but nobody explicitly cancels it — is there even a cancel_admin_transfer entrypoint?), and years later the original proposing admin's own key becomes compromised or the address it was meant for changes hands/gets compromised in the interim, an attacker who gains control of that stale pending-admin address could call accept_admin and take over the contract at a time completely disconnected from when the transfer was actually intended.
Task: Confirm whether a pending admin proposal has any expiry, and whether a cancel_admin_transfer-style entrypoint exists for the current admin to explicitly retract a proposal they no longer want pending. If neither exists, add both — this is the same class of "unbounded-lifetime pending state" risk the upgrade timelock and payout-address-change delay both explicitly account for elsewhere in this same contract, so admin transfer shouldn't be the one exception.
The two-step admin transfer (
propose+accept_admin, referenced byDataKey::PendingAdmin) is a good pattern for avoiding typo-lockout, but it's worth confirming whether a pending proposal ever expires. If an admin proposes a transfer to some address, that transfer is never accepted (the intended recipient never gets around to it, or circumstances change and the transfer is no longer wanted, but nobody explicitly cancels it — is there even acancel_admin_transferentrypoint?), and years later the original proposing admin's own key becomes compromised or the address it was meant for changes hands/gets compromised in the interim, an attacker who gains control of that stale pending-admin address could callaccept_adminand take over the contract at a time completely disconnected from when the transfer was actually intended.Task: Confirm whether a pending admin proposal has any expiry, and whether a
cancel_admin_transfer-style entrypoint exists for the current admin to explicitly retract a proposal they no longer want pending. If neither exists, add both — this is the same class of "unbounded-lifetime pending state" risk the upgrade timelock and payout-address-change delay both explicitly account for elsewhere in this same contract, so admin transfer shouldn't be the one exception.