Summary
100% of all REPORTED Findings have been addressed
- 5Acknowledged
- 4Risk Accepted
- 5Solved
- 14All Findings
- Critical0
- High0
- Medium0
- Low6
- 2Solved
- 4Risk A.
- Informational8
- 5Ack.
- 3Solved
Summary#
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.
Assessment Summary#
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.
Test Approach and Methodology#
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).
Risk Methodology#
4.1 EXPLOITABILITY
Attack Origin (AO):
Attack Cost (AC):
Attack Complexity (AX):
Metrics:
| EXPLOITABILITY METRIC () | METRIC VALUE | NUMERICAL VALUE |
|---|---|---|
| Attack Origin (AO) | Arbitrary (AO:A) | 1 |
| Specific (AO:S) | 0.2 | |
| Attack Cost (AC) | Low (AC:L) | 1 |
| Medium (AC:M) | 0.67 | |
| High (AC:H) | 0.33 | |
| Attack Complexity (AX) | Low (AX:L) | 1 |
| Medium (AX:M) | 0.67 | |
| High (AX:H) | 0.33 |
4.2 IMPACT
Confidentiality (C):
Integrity (I):
Availability (A):
Deposit (D):
Yield (Y):
Metrics:
| IMPACT METRIC () | METRIC VALUE | NUMERICAL VALUE |
|---|---|---|
| Confidentiality (C) | None (C:N) | 0 |
| Low (C:L) | 0.25 | |
| Medium (C:M) | 0.5 | |
| High (C:H) | 0.75 | |
| Critical (C:C) | 1 | |
| Integrity (I) | None (I:N) | 0 |
| Low (I:L) | 0.25 | |
| Medium (I:M) | 0.5 | |
| High (I:H) | 0.75 | |
| Critical (I:C) | 1 | |
| Availability (A) | None (A:N) | 0 |
| Low (A:L) | 0.25 | |
| Medium (A:M) | 0.5 | |
| High (A:H) | 0.75 | |
| Critical (A:C) | 1 | |
| Deposit (D) | None (D:N) | 0 |
| Low (D:L) | 0.25 | |
| Medium (D:M) | 0.5 | |
| High (D:H) | 0.75 | |
| Critical (D:C) | 1 | |
| Yield (Y) | None (Y:N) | 0 |
| Low (Y:L) | 0.25 | |
| Medium (Y:M) | 0.5 | |
| High (Y:H) | 0.75 | |
| Critical (Y:C) | 1 |
4.3 SEVERITY COEFFICIENT
Reversibility (R):
Scope (S):
Metrics:
| SEVERITY COEFFICIENT () | COEFFICIENT VALUE | NUMERICAL VALUE |
|---|---|---|
| Reversibility () | None (R:N) | 1 |
| Partial (R:P) | 0.5 | |
| Full (R:F) | 0.25 | |
| Scope () | Changed (S:C) | 1.25 |
| Unchanged (S:U) | 1 |
| Critical | High | Medium | Low | Informational |
| 9 - 10 | 7 - 8.9 | 4.5 - 6.9 | 2 - 4.4 | 0 - 1.9 |
Scope#
Assessment Summary & Findings Overview#
# | Title | Severity | Score | Status |
|---|---|---|---|---|
| Incomplete disable() Function | Low | 3.1 | Solved06/12/2025 | |
| Missing Initialization of Inherited Upgradable Contracts | Low | 2.5 | Solved06/15/2025 | |
| Potential Incompatibilities With fee-on-transfer Tokens | Low | 2.5 | Risk Accepted06/18/2025 | |
| Missing Input Validation | Low | 2.5 | Risk Accepted06/18/2025 | |
| Missing _disableInitializers() Call in the Constructor | Low | 2.5 | Risk Accepted06/18/2025 | |
| Misuse of reinitializer and Missing onlyInitializing on Subinitializer | Low | 2.5 | Risk Accepted06/18/2025 | |
| Inefficient Enabled Tokens Logic | Informational | 1.1 | Acknowledged06/18/2025 | |
| Unlocked Pragma Compiler | Informational | 0.0 | Solved06/14/2025 | |
| Use of Revert Strings Instead of Custom Errors | Informational | 0.0 | Acknowledged06/18/2025 | |
| Style Guide Optimizations | Informational | 0.0 | Acknowledged06/18/2025 | |
| Consider Using Named Mappings | Informational | 0.0 | Solved06/12/2025 | |
| Unsafe ERC20 Operation in Use | Informational | 0.0 | Solved06/15/2025 | |
| Cache Array Length Outside of Loop | Informational | 0.0 | Acknowledged06/18/2025 | |
| Inconsistent Error Messages | Informational | 0.0 | Acknowledged06/18/2025 |
Findings & Tech Details#
Description
Recommendation
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
8. Automated Testing#
Disclaimer#
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.
