Instead of checking `sender == admin_address`, Move uses unforgeable Capability objects (`AdminCap`). Holding and passing the capability object into an entry function proves authorization.
move
public struct AdminCap has key, store { id: UID }
public fun mint_special(_: &AdminCap, ctx: &mut TxContext) {
// Authorized action
}