Prepared by:
HALBORN
Last Updated 06/19/2025
Date of Engagement: June 12th, 2025 - June 13th, 2025
100% of all REPORTED Findings have been addressed
All findings
14
Critical
0
High
0
Medium
0
Low
6
Informational
8
Rezerve Money engaged Halborn to conduct a security assessment of their AppTreasury contract beginning on June 11th, 2025 and ending on June 12th, 2025. The security assessment was scoped to the smart contract provided in the GitHub repository. Commit hash and further details can be found in the Scope section of this report.
AppTreasury is a fork of OlympusDAO’s treasury with improved logic and monetary policies. The contact was upgraded to a recent solidity version and modified to be used using proxies. Credit and debit functionalities were added to allow for features such as PSM and staking rewards to later on come into the picture.
Halborn was provided 2 days for the engagement and assigned one full-time security engineer to review the security of the smart contract in scope. The engineer is blockchain and smart contract security expert with advanced penetration testing and smart contract hacking skills, and deep knowledge of multiple blockchain protocols.
The purpose of the assessment is to:
Identify potential security issues within the smart contract.
Ensure that smart contract functionality operates as intended.
In summary, Halborn identified some improvements to reduce the likelihood and impact of risks, which were partially addressed by the Rezerve Money team. The main ones were the following:
In the disable() function, consider removing the _toDisable address from the tokens array to be consistent with the enabledTokens mapping.
Make sure all inherited upgradable contracts are initialized.
Either add support to fee-on-transfer tokens or document that fee-on-transfer tokens are not supported.
Implement proper input validation in all functions.
Consider adding a constructor and calling the _disableinitializers() method inside.
Use the initializer modifier for the initial setup instead of reinitializer.
Halborn performed a combination of manual and automated security testing to balance efficiency, timeliness, practicality, and accuracy in regard to the scope of this assessment. While manual testing is recommended to uncover flaws in logic, process, and implementation; automated testing techniques help enhance coverage of the code and can quickly identify items that do not follow the security best practices. The following phases and associated tools were used during the assessment:
Research into architecture and purpose.
Smart contract manual code review and walkthrough.
Graphing out functionality and contract logic/connectivity/functions (solgraph).
Manual assessment of use and safety for the critical Solidity variables and functions in scope to identify any arithmetic related vulnerability classes.
Manual testing by custom scripts.
Static Analysis of security for scoped contract, and imported functions (slither).
| EXPLOITABILITY METRIC () | METRIC VALUE | NUMERICAL VALUE |
|---|---|---|
| Attack Origin (AO) | Arbitrary (AO:A) Specific (AO:S) | 1 0.2 |
| Attack Cost (AC) | Low (AC:L) Medium (AC:M) High (AC:H) | 1 0.67 0.33 |
| Attack Complexity (AX) | Low (AX:L) Medium (AX:M) High (AX:H) | 1 0.67 0.33 |
| IMPACT METRIC () | METRIC VALUE | NUMERICAL VALUE |
|---|---|---|
| Confidentiality (C) | None (C:N) Low (C:L) Medium (C:M) High (C:H) Critical (C:C) | 0 0.25 0.5 0.75 1 |
| Integrity (I) | None (I:N) Low (I:L) Medium (I:M) High (I:H) Critical (I:C) | 0 0.25 0.5 0.75 1 |
| Availability (A) | None (A:N) Low (A:L) Medium (A:M) High (A:H) Critical (A:C) | 0 0.25 0.5 0.75 1 |
| Deposit (D) | None (D:N) Low (D:L) Medium (D:M) High (D:H) Critical (D:C) | 0 0.25 0.5 0.75 1 |
| Yield (Y) | None (Y:N) Low (Y:L) Medium (Y:M) High (Y:H) Critical (Y:C) | 0 0.25 0.5 0.75 1 |
| SEVERITY COEFFICIENT () | COEFFICIENT VALUE | NUMERICAL VALUE |
|---|---|---|
| Reversibility () | None (R:N) Partial (R:P) Full (R:F) | 1 0.5 0.25 |
| Scope () | Changed (S:C) Unchanged (S:U) | 1.25 1 |
| Severity | Score Value Range |
|---|---|
| Critical | 9 - 10 |
| High | 7 - 8.9 |
| Medium | 4.5 - 6.9 |
| Low | 2 - 4.4 |
| Informational | 0 - 1.9 |
Critical
0
High
0
Medium
0
Low
6
Informational
8
| Security analysis | Risk level | Remediation Date |
|---|---|---|
| Incomplete disable() Function | Low | Solved - 06/12/2025 |
| Missing Initialization of Inherited Upgradable Contracts | Low | Solved - 06/15/2025 |
| Potential Incompatibilities With fee-on-transfer Tokens | Low | Risk Accepted - 06/18/2025 |
| Missing Input Validation | Low | Risk Accepted - 06/18/2025 |
| Missing _disableInitializers() Call in the Constructor | Low | Risk Accepted - 06/18/2025 |
| Misuse of reinitializer and Missing onlyInitializing on Subinitializer | Low | Risk Accepted - 06/18/2025 |
| Inefficient Enabled Tokens Logic | Informational | Acknowledged - 06/18/2025 |
| Unlocked Pragma Compiler | Informational | Solved - 06/14/2025 |
| Use of Revert Strings Instead of Custom Errors | Informational | Acknowledged - 06/18/2025 |
| Style Guide Optimizations | Informational | Acknowledged - 06/18/2025 |
| Consider Using Named Mappings | Informational | Solved - 06/12/2025 |
| Unsafe ERC20 Operation in Use | Informational | Solved - 06/15/2025 |
| Cache Array Length Outside of Loop | Informational | Acknowledged - 06/18/2025 |
| Inconsistent Error Messages | Informational | Acknowledged - 06/18/2025 |
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Halborn strongly recommends conducting a follow-up assessment of the project either within six months or immediately following any material changes to the codebase, whichever comes first. This approach is crucial for maintaining the project’s integrity and addressing potential vulnerabilities introduced by code modifications.
// Download the full report
AppTreasury Contract
* Use Google Chrome for best results
** Check "Background Graphics" in the print settings if needed