58333 sc low incorrect onlyadmin modifier in acceptadminownership

Submitted on Nov 1st 2025 at 10:40:22 UTC by @silverologist for Audit Comp | Alchemix V3arrow-up-right

  • Report ID: #58333

  • Report Type: Smart Contract

  • Report severity: Low

  • Target: https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/AlchemistCurator.sol

  • Impacts:

Description

Brief/Intro

The admin ownership transfer logic in the AlchemistCurator contract is implemented incorrectly. Instead of using a proper two step handover process where the new admin confirms ownership, the contract requires two separate actions from the current admin, effectively making it a single party transfer.

Vulnerability Details

The intended admin transfer process should occur in two distinct steps:

Step 1: The current admin initiates the transfer by designating a new pending admin. This part is implemented correctly in transferAdminOwnerShip:

    function transferAdminOwnerShip(address _newAdmin) external onlyAdmin {
        pendingAdmin = _newAdmin;
    }

Step 2: The pending admin should then confirm and accept ownership. However, this step is incorrectly implemented in acceptAdminOwnership:

The issue lies in the use of the onlyAdmin modifier, which restricts this function to the current admin instead of allowing the pending admin to call it.

Expected flow:

  • The current admin initiates the transfer to a new pending admin.

  • The pending admin accepts and becomes the new admin.

Actual flow:

  • The current admin initiates the transfer to a new pending admin.

  • The current admin must also execute the acceptance step to finalize the transfer.

Proof of Concept

Proof of Concept

Add the following test to ./src/test/AlchemistCurator.t.sol:

Was this helpful?