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 | |
|---|---|
| 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 |
| Methodology | https://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 File | AlberichGovernanceController_DRAFT.sol |
| Initial Commit | 54db8e4162403f6b6d525dd87cf3e19fe0343a0148f2eb525b8a6b01dd622838 |
| Remediation File | AlberichGovernanceControllerREMEDIATEDFINAL.sol |
| Remediation Commit | c8cd10bbf63139dac1e28852adbec894540a07da7fff9dd1fe83315091a03ca5 |
Review Scope
- Initial File
- AlberichGovernanceController_DRAFT.sol
- Initial Commit
- 54db8e4162403f6b6d525dd87cf3e19fe0343a0148f2eb525b8a6b01dd622838
- Remediation File
- AlberichGovernanceControllerREMEDIATEDFINAL.sol
- Remediation Commit
- c8cd10bbf63139dac1e28852adbec894540a07da7fff9dd1fe83315091a03ca5
Audit Summary
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
ALBRHandGOVERNANCEaddresses, completes a one-time Foundation handoff viaacceptFoundationRole, and forwardstransferAllocation,setVesting,ringForgedBurn,snapshot,setStakingContract,toggleStakingBonusRequirement,withdrawETH, andrescueERC20underonlyGovernance. The same file definesIAlberichTokenControllerTarget, 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
transferGovernanceandacceptGovernance. The constructor requires this address to be a contract distinct fromguardian. Safe behavior is not enforced by this contract.Can call
acceptFoundationRoleto complete Foundation handoff by callingacceptFoundationRoleon the token, recordingfoundationAccepted, and verifying that this controller is the token foundation and holdsFOUNDATION_ROLE. The call reverts if the token is paused, the sale is active, parameters are unfrozen withoutnativeIdoAbandoned, the outgoing foundation still holdsDEFAULT_ADMIN_ROLE, or the handoff was already accepted.Can call
abandonNativeIdoto record one-way native IDO abandonment when the sale is inactive.Can call
transferGovernanceto nominate a replacement governance contract. The nominee callsacceptGovernanceto take the seat.Can call
transferAllocationto transfer a token allocation to a chosen address.Can call
setVestingto configure vesting for a beneficiary with total amount, start, and duration on the token.Can call
ringForgedBurnto burn a specified token amount through the token Ring Forged burn path.Can call
snapshotto create a token snapshot and obtain the snapshot id.Can call
setStakingContractto set the staking contract address on the token.Can call
toggleStakingBonusRequirementto enable or disable the staking bonus requirement on the token.Can call
withdrawETHto withdraw a specified ETH amount from the token to a payable recipient.Can call
rescueERC20to 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
transferGuardianandacceptGuardian. The constructor requires this address to be a contract distinct fromgovernance. Safe behavior is not enforced by this contract.Can call
transferGovernanceto nominate a replacement governance contract.Can call
transferGuardianto nominate a replacement guardian. The nominee callsacceptGuardianto 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
Code ― | Title | Status | Severity | |
|---|---|---|---|---|
| F-2026-1942 | Immutable GOVERNANCE Assignment in constructor Causes Irrecoverable Loss of Token Foundation Control | fixed | Medium | |
| F-2026-1943 | Missing IDO End-State Check in acceptFoundationRole Permanently Disables Native Sale Operations | fixed | Low | |
| F-2026-1942 | Incomplete Privilege Transfer in acceptFoundationRole Allows Leftover Admin to Permanently Disable Every Wrapper | fixed | Low |
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 File | AlberichGovernanceController_DRAFT.sol |
| Initial Commit | 54db8e4162403f6b6d525dd87cf3e19fe0343a0148f2eb525b8a6b01dd622838 |
| Remediation File | AlberichGovernanceControllerREMEDIATEDFINAL.sol |
| Remediation Commit | c8cd10bbf63139dac1e28852adbec894540a07da7fff9dd1fe83315091a03ca5 |
| Whitepaper | - |
| Requirements | NatSpec |
| Technical Requirements | NatSpec |
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
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.