Contract: contracts/payment/src/lib.rs, contracts/escrow/src/lib.rs, contracts/refund/src/lib.rs
Description
Each contract stores a single DataKey::Admin → Address with no rotation mechanism and no multisig support. If the admin private key is compromised, an attacker gains permanent control over all contracts with no on-chain remedy.
Fix
Implement a two-step admin rotation: propose_admin(new_admin) (current admin only) sets DataKey::PendingAdmin, then accept_admin() (new admin only) finalizes the transition. Optionally add an admin_multisig_threshold for M-of-N admin keys.
Contract:
contracts/payment/src/lib.rs,contracts/escrow/src/lib.rs,contracts/refund/src/lib.rsDescription
Each contract stores a single
DataKey::Admin → Addresswith no rotation mechanism and no multisig support. If the admin private key is compromised, an attacker gains permanent control over all contracts with no on-chain remedy.Fix
Implement a two-step admin rotation:
propose_admin(new_admin)(current admin only) setsDataKey::PendingAdmin, thenaccept_admin()(new admin only) finalizes the transition. Optionally add anadmin_multisig_thresholdfor M-of-N admin keys.