Q2 2026 Security & Compliance Report67 incidents, $764M in losses, 88% from operational failures.
Get the report →

Audit name:

[SCA] Alberich Token | GovernanceController | Sep2026

Date:

Sep 28, 2026

Table of Content

→Introduction
→Audit Summary
→System Overview
→Potential Risks
→Findings
→Appendix 1. Definitions
→Appendix 2. Scope
→Appendix 3. Additional Valuables
→Disclaimer

Want a comprehensive audit report like this?

Introduction

We express our gratitude to the Alberichtoken team for the collaborative engagement that enabled the execution of this Smart Contract Security Assessment.

AlberichGovernanceController is a non-upgradeable governance controller, bound immutably to the deployed AlberichToken (ALBRH). A one-time Foundation handoff is completed through acceptFoundationRole, after which retained token administration (allocation transfer, vesting configuration, burns, snapshots, staking settings, ETH withdrawal, and ERC-20 rescue) is invoked exclusively by the immutable GOVERNANCE address.

Document

NameSmart Contract Code Review and Security Analysis Report for Alberichtoken
Audited ByKhrystyna Tkachuk
Approved ByOlesia Bilenka
Website-
Changelog21/09/2026 - Preliminary Report
28/09/2026 - Final Report
PlatformEVM
LanguageSolidity
TagsDeFi; ERC20; Centralization
Methodologyhttps://docs.hacken.io/methodologies/smart-contracts→
  • Document

    Name
    Smart Contract Code Review and Security Analysis Report for Alberichtoken
    Audited By
    Khrystyna Tkachuk
    Approved By
    Olesia Bilenka
    Website
    -
    Changelog
    21/09/2026 - Preliminary Report
    28/09/2026 - Final Report
    Platform
    EVM
    Language
    Solidity
    Tags
    DeFi; ERC20; Centralization

Review Scope

Initial FileAlberichGovernanceController_DRAFT.sol
Initial Commit54db8e4162403f6b6d525dd87cf3e19fe0343a0148f2eb525b8a6b01dd622838
Remediation FileAlberichGovernanceControllerREMEDIATEDFINAL.sol
Remediation Commitc8cd10bbf63139dac1e28852adbec894540a07da7fff9dd1fe83315091a03ca5
  • Review Scope

    Initial File
    AlberichGovernanceController_DRAFT.sol
    Initial Commit
    54db8e4162403f6b6d525dd87cf3e19fe0343a0148f2eb525b8a6b01dd622838
    Remediation File
    AlberichGovernanceControllerREMEDIATEDFINAL.sol
    Remediation Commit
    c8cd10bbf63139dac1e28852adbec894540a07da7fff9dd1fe83315091a03ca5

Audit Summary

3Total Findings
3Resolved
0Accepted
0Mitigated

The system users should acknowledge all the risks summed up in the risks section of the report

Documentation quality

  • Functional requirements are partially missed.

  • Technical description are partially missed.

  • NatSpec is sufficient.

Code quality

  • The codebase is well-structured and uses established patterns.

  • The development environment is not configured.

Test coverage

Code coverage of the project is 0%.

  • Test cases are not provided.

System Overview

AlberichGovernanceController is a standalone, not upgradeable contract. Two immutable addresses are set in the constructor: ALBRH, the existing AlberichToken, and GOVERNANCE, described as a governance Safe (per spec) and required in code to be a non-zero contract, as is ALBRH. Authorization is enforced only by the custom onlyGovernance modifier. Selected Foundation calls are forwarded to out-of-scope AlberichToken.

The Foundation role is accepted via acceptFoundationRole. The call is restricted by onlyGovernance, reverts if foundationAccepted is already true, and reverts if ALBRH.paused returns true. ALBRH.acceptFoundationRole is then invoked, and ALBRH.foundation is required to equal the controller address before foundationAccepted is set. Wrappers are not provided for pause, unpause, or initiateFoundationTransfer. No execute, delegatecall, receive, or fallback function is present, so direct ETH transfers to the controller revert.

After handoff, onlyGovernance wrappers forward transferAllocation, setVesting, ringForgedBurn, snapshot, setStakingContract, toggleStakingBonusRequirement, withdrawETH, and rescueERC20 to AlberichToken. Those calls move unlocked ALBRH inventory, configure beneficiary vesting on the token, burn unlocked inventory, create ERC-20 snapshots, set the staking contract address and bonus-requirement flag, withdraw ETH held by the token, and rescue foreign ERC-20 balances from the token. IAlberichTokenControllerTarget is defined in the same source file and exposes only foundation, paused, acceptFoundationRole, and the retained operational functions.

Files in Scope

  • AlberichGovernanceController_DRAFT.sol — Contains AlberichGovernanceController, which stores immutable ALBRH and GOVERNANCE addresses, completes a one-time Foundation handoff via acceptFoundationRole, and forwards transferAllocation, setVesting, ringForgedBurn, snapshot, setStakingContract, toggleStakingBonusRequirement, withdrawETH, and rescueERC20 under onlyGovernance. The same file defines IAlberichTokenControllerTarget, a non-deployable minimal interface to the deployed AlberichToken.

Privileged roles

AlberichGovernanceController_DRAFT.sol

  • governance: Address set at construction and authorized as the sole caller of every operational wrapper on AlberichGovernanceController. It can be replaced through two-step transferGovernance and acceptGovernance. The constructor requires this address to be a contract distinct from guardian. Safe behavior is not enforced by this contract.

    • Can call acceptFoundationRole to complete Foundation handoff by calling acceptFoundationRole on the token, recording foundationAccepted, and verifying that this controller is the token foundation and holds FOUNDATION_ROLE. The call reverts if the token is paused, the sale is active, parameters are unfrozen without nativeIdoAbandoned, the outgoing foundation still holds DEFAULT_ADMIN_ROLE, or the handoff was already accepted.

    • Can call abandonNativeIdo to record one-way native IDO abandonment when the sale is inactive.

    • Can call transferGovernance to nominate a replacement governance contract. The nominee calls acceptGovernance to take the seat.

    • Can call transferAllocation to transfer a token allocation to a chosen address.

    • Can call setVesting to configure vesting for a beneficiary with total amount, start, and duration on the token.

    • Can call ringForgedBurn to burn a specified token amount through the token Ring Forged burn path.

    • Can call snapshot to create a token snapshot and obtain the snapshot id.

    • Can call setStakingContract to set the staking contract address on the token.

    • Can call toggleStakingBonusRequirement to enable or disable the staking bonus requirement on the token.

    • Can call withdrawETH to withdraw a specified ETH amount from the token to a payable recipient.

    • Can call rescueERC20 to transfer a specified ERC20 amount from the token to a recipient.

  • guardian: Address set at construction. It cannot invoke ALBRH operational wrappers. It can be replaced through two-step transferGuardian and acceptGuardian. The constructor requires this address to be a contract distinct from governance. Safe behavior is not enforced by this contract.

    • Can call transferGovernance to nominate a replacement governance contract.

    • Can call transferGuardian to nominate a replacement guardian. The nominee calls acceptGuardian to take the seat.

Potential Risks

Audit Scope Excludes AlberichToken: The in-scope set is limited to AlberichGovernanceController, while AlberichToken remain outside this audit. Wrappers on AlberichGovernanceController assume the Foundation ABI of AlberichToken through IAlberichTokenControllerTarget, covering acceptFoundationRole, withdrawETH, rescueERC20, ringForgedBurn, setStakingContract, toggleStakingBonusRequirement, setVesting, snapshot, and transferAllocation. Behavior of those out-of-scope token functions determines the real effect of every in-scope call.

Operational Dependence on ALBRH: Core controller functions keep no independent balances, vesting records, or treasury accounting. transferAllocation, setVesting, ringForgedBurn, snapshot, setStakingContract, toggleStakingBonusRequirement, withdrawETH, and rescueERC20 only invoke ALBRH, and acceptFoundationRole also reads paused and foundation on ALBRH. If ALBRH reverts or is not a compatible AlberichToken, those Foundation operations cannot be completed through AlberichGovernanceController.

Single Governance Role for All Wrappers: onlyGovernance on AlberichGovernanceController gates acceptFoundationRole, transferAllocation, setVesting, ringForgedBurn, snapshot, setStakingContract, toggleStakingBonusRequirement, withdrawETH, and rescueERC20. No separate roles split allocation, vesting, burns, snapshots, staking configuration, or treasury movement. Control of the single governance address is sufficient to exercise every retained Foundation power exposed by this contract. guardian can nominate a replacement governance and cannot call these wrappers.

No Timelock on Controller Wrappers: None of the onlyGovernance functions on AlberichGovernanceController queue, delay, or allow cancellation of a submitted action. Constructor commentary describes governance_ as a Governance Safe, but this contract does not implement a timelock. withdrawETH, rescueERC20, ringForgedBurn, setVesting, transferAllocation, setStakingContract, toggleStakingBonusRequirement, and snapshot take effect as soon as governance lands a successful transaction. transferGovernance, acceptGovernance, transferGuardian, and acceptGuardian likewise apply as soon as the accepting transaction succeeds.

Multi-Signature Is Not Enforced On-Chain: The constructor of AlberichGovernanceController rejects a zero token_, governance_, or guardian_, requires each to be a contract, and reverts SameAddress when governance_ equals guardian_, so neither seat can be an EOA at construction. NatSpec labels the parameters Governance and recovery Safes, but the bytecode does not check Safe deployment, owner count, or signing threshold. Any contract, including a single-signer wallet, can be stored as governance or guardian. acceptGovernance and acceptGuardian do not reject a nominee that already occupies the other seat, so both roles can later be the same address and then call every onlyGovernance wrapper and both rotation paths.

Allocation and Vesting Without Beneficiary Action: governance supplies the to and beneficiary arguments to transferAllocation and setVesting on AlberichGovernanceController without a transaction from those addresses. The wrappers immediately call AlberichToken, which transfers unlocked ALBRH from the token contract to to or writes a new vesting record and increases reservedForVesting for beneficiary. Named recipients have no in-scope function on AlberichGovernanceController to approve or reject those Foundation actions.

Forwarded ETH Withdrawal and ERC-20 Rescue: withdrawETH and rescueERC20 on AlberichGovernanceController pass caller-chosen destinations and amounts to AlberichToken. On the token, withdrawETH sends native ETH from the token contract’s balance to to, and rescueERC20 transfers a selected ERC-20 other than ALBRH to to. Once this controller is Foundation, GOVERNANCE directs extraction of ETH and foreign ERC-20s held by AlberichToken.

Governance as the Single Privileged Caller: After deployment, only the governance address can invoke AlberichGovernanceController operational wrappers. governance and guardian can be replaced through two-step transfer and accept, and guardian can nominate a new governance without calling the wrappers. After a successful acceptFoundationRole, AlberichToken foundation is this controller, and the controller exposes no pause, unpause, or initiateFoundationTransfer path. Capture of governance is a single control failure for all retained operations, while pause and further Foundation transfer are unreachable through this contract. The signing and key-management model of the governance and guardian contract wallets is off-chain and cannot be verified from this bytecode.

No Token-Holder Governance: AlberichGovernanceController implements no proposal, vote, quorum, or DAO execution module. governance and guardian rotate only through two-step nomination by the current seat, or by guardian for governance. Staking configuration, vesting, allocation, ringForgedBurn, snapshot, withdrawETH, and rescueERC20 on AlberichToken that remain reachable through this controller are decided solely by the current governance address. Token holders have no in-scope path to authorize or override those calls.

Foundation Acceptance Cannot Be Reversed Here: acceptFoundationRole on AlberichGovernanceController sets foundationAccepted and later calls revert AlreadyAccepted. IAlberichTokenControllerTarget omits initiateFoundationTransfer, so this controller cannot start a further Foundation change on AlberichToken. After handoff, ALBRH.foundation is expected to remain this immutable contract for the lifetime of the token, and the current Foundation on AlberichToken must have already called initiateFoundationTransfer with this controller before governance can complete acceptance.

Pause and Unpause Are Omitted from the Foundation Path: IAlberichTokenControllerTarget and AlberichGovernanceController provide no wrappers for AlberichToken pause or unpause, which remain onlyFoundation on the token. After acceptFoundationRole, the Foundation address is this controller, which cannot issue those calls. An emergency pause of AlberichToken transfers cannot be performed through AlberichGovernanceController even if governance later requires that control.

Findings

F-2026-1942 Immutable GOVERNANCE Assignment in constructor Causes Irrecoverable Loss of Token Foundation Control
Status
fixed
Severity

Medium
F-2026-1943Missing IDO End-State Check in acceptFoundationRole Permanently Disables Native Sale Operations
Status
fixed
Severity

Low
F-2026-1942Incomplete Privilege Transfer in acceptFoundationRole Allows Leftover Admin to Permanently Disable Every Wrapper
Status
fixed
Severity

Low
Code
―
Title
Status
Severity
F-2026-1942 Immutable GOVERNANCE Assignment in constructor Causes Irrecoverable Loss of Token Foundation Control
fixed

Medium
F-2026-1943Missing IDO End-State Check in acceptFoundationRole Permanently Disables Native Sale Operations
fixed

Low
F-2026-1942Incomplete Privilege Transfer in acceptFoundationRole Allows Leftover Admin to Permanently Disable Every Wrapper
fixed

Low
1-3 of 3 findings

Identify vulnerabilities in your smart contracts.

Appendix 1. Definitions

Severities

When auditing smart contracts, Hacken is using a risk-based approach that considers Likelihood, Impact, Exploitability and Complexity metrics to evaluate findings and score severities.

Reference on how risk scoring is done is available through the repository in our Github organization:

Severity

Description

Critical
Critical vulnerabilities are usually straightforward to exploit and can lead to the loss of user funds or contract state manipulation.

High
High vulnerabilities are usually harder to exploit, requiring specific conditions, or have a more limited scope, but can still lead to the loss of user funds or contract state manipulation.

Medium
Medium vulnerabilities are usually limited to state manipulations and, in most cases, cannot lead to asset loss. Contradictions and requirements violations. Major deviations from best practices are also in this category.

Low
Major deviations from best practices or major Gas inefficiency. These issues will not have a significant impact on code execution.
  • Severity

    Critical

    Description

    Critical vulnerabilities are usually straightforward to exploit and can lead to the loss of user funds or contract state manipulation.

    Severity

    High

    Description

    High vulnerabilities are usually harder to exploit, requiring specific conditions, or have a more limited scope, but can still lead to the loss of user funds or contract state manipulation.

    Severity

    Medium

    Description

    Medium vulnerabilities are usually limited to state manipulations and, in most cases, cannot lead to asset loss. Contradictions and requirements violations. Major deviations from best practices are also in this category.

    Severity

    Low

    Description

    Major deviations from best practices or major Gas inefficiency. These issues will not have a significant impact on code execution.

Potential Risks

The "Potential Risks" section identifies issues that are not direct security vulnerabilities but could still affect the project’s performance, reliability, or user trust. These risks arise from design choices, architectural decisions, or operational practices that, while not immediately exploitable, may lead to problems under certain conditions. Additionally, potential risks can impact the quality of the audit itself, as they may involve external factors or components beyond the scope of the audit, leading to incomplete assessments or oversight of key areas. This section aims to provide a broader perspective on factors that could affect the project's long-term security, functionality, and the comprehensiveness of the audit findings.

Appendix 2. Scope

The scope of the project includes the following smart contracts from the provided repository:

Scope Details

Initial FileAlberichGovernanceController_DRAFT.sol
Initial Commit54db8e4162403f6b6d525dd87cf3e19fe0343a0148f2eb525b8a6b01dd622838
Remediation FileAlberichGovernanceControllerREMEDIATEDFINAL.sol
Remediation Commitc8cd10bbf63139dac1e28852adbec894540a07da7fff9dd1fe83315091a03ca5
Whitepaper-
RequirementsNatSpec
Technical RequirementsNatSpec
  • Scope Details

    Initial File
    AlberichGovernanceController_DRAFT.sol
    Initial Commit
    54db8e4162403f6b6d525dd87cf3e19fe0343a0148f2eb525b8a6b01dd622838
    Remediation File
    AlberichGovernanceControllerREMEDIATEDFINAL.sol
    Remediation Commit
    c8cd10bbf63139dac1e28852adbec894540a07da7fff9dd1fe83315091a03ca5
    Whitepaper
    -
    Requirements
    NatSpec
    Technical Requirements
    NatSpec

Assets in Scope

AlberichGovernanceController_DRAFT.sol - AlberichGovernanceController_DRAFT.sol

Appendix 3. Additional Valuables

Additional Recommendations

The smart contracts in the scope of this audit could benefit from the introduction of automatic emergency actions for critical activities, such as unauthorized operations like ownership changes or proxy upgrades, as well as unexpected fund manipulations, including large withdrawals or minting events. Adding such mechanisms would enable the protocol to react automatically to unusual activity, ensuring that the contract remains secure and functions as intended.

To improve functionality, these emergency actions could be designed to trigger under specific conditions, such as:

  • Detecting changes to ownership or critical permissions.

  • Monitoring large or unexpected transactions and minting events.

  • Pausing operations when irregularities are identified.

These enhancements would provide an added layer of security, making the contract more robust and better equipped to handle unexpected situations while maintaining smooth operations.

Frameworks and Methodologies

This security assessment was conducted in alignment with recognised penetration testing standards, methodologies and guidelines, including the NIST SP 800-115 – Technical Guide to Information Security Testing and Assessment →, and the Penetration Testing Execution Standard (PTES) →, These assets provide a structured foundation for planning, executing, and documenting technical evaluations such as vulnerability assessments, exploitation activities, and security code reviews. Hacken’s internal penetration testing methodology extends these principles to Web2 and Web3 environments to ensure consistency, repeatability, and verifiable outcomes.

Disclaimer