Skip to content

Audit Fixes Comparison#127

Draft
auroter wants to merge 67 commits intoauditfrom
main
Draft

Audit Fixes Comparison#127
auroter wants to merge 67 commits intoauditfrom
main

Conversation

@auroter
Copy link
Copy Markdown
Contributor

@auroter auroter commented Mar 21, 2025

No description provided.

auroter and others added 30 commits February 14, 2025 14:59
…urves, force e18 granularity for currentSharePrice
…because this affects requirements for getAtomCost and getTripleCost -- these must be adjusted to be inclusive of fees and indirect deposits
…subsidiary atom deposits on triple deposit and triple creation
Comment thread src/BaseCurve.sol

/// @notice The maximum number of shares that this curve can handle without overflowing.
/// @dev Checked by the EthMultiVault before transacting
function maxShares() public view virtual returns (uint256);
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/BaseCurve.sol

/// @notice The maximum number of assets that this curve can handle without overflowing.
/// @dev Checked by the EthMultiVault before transacting
function maxAssets() public view virtual returns (uint256);
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/BaseCurve.sol
/// @param totalShares Total quantity of shares already awarded by the curve
/// @return shares The number of shares that would be minted
function previewDeposit(uint256 assets, uint256 totalAssets, uint256 totalShares)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/BaseCurve.sol
/// @param totalAssets Total quantity of assets already staked into the curve
/// @return assets The number of assets that would be returned
function previewRedeem(uint256 shares, uint256 totalShares, uint256 totalAssets)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/BaseCurve.sol
/// @param totalShares Total quantity of shares already awarded by the curve
/// @return shares The number of shares that would need to be redeemed
function previewWithdraw(uint256 assets, uint256 totalAssets, uint256 totalShares)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/BaseCurve.sol
/// @param totalAssets Total quantity of assets already staked into the curve
/// @return assets The number of assets that would be required to mint the shares
function previewMint(uint256 shares, uint256 totalShares, uint256 totalAssets)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/BaseCurve.sol
/// @param totalShares Total quantity of shares already awarded by the curve
/// @return shares The number of shares equivalent to the given assets
function convertToShares(uint256 assets, uint256 totalAssets, uint256 totalShares)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/BaseCurve.sol
/// @param totalAssets Total quantity of assets already staked into the curve
/// @return assets The number of assets equivalent to the given shares
function convertToAssets(uint256 shares, uint256 totalShares, uint256 totalAssets)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made this external

Comment thread src/LinearCurve.sol

/// @inheritdoc BaseCurve
/// @notice Computes the 1:1 relationship between assets <--> shares.
function previewDeposit(uint256 assets, uint256 totalAssets, uint256 totalShares)
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made all of these external

/// @dev or to say that another way:
/// $$\text{shares} = \sqrt{(s + o)^2 + \frac{2a}{m}} - (s + o)$$
function previewDeposit(uint256 assets, uint256, /*totalAssets*/ uint256 totalShares)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made all of these external

Comment thread src/ProgressiveCurve.sol
/// @dev or to say that another way:
/// $$\text{shares} = \sqrt{s^2 + \frac{2a}{m}} - s$$
function previewDeposit(uint256 assets, uint256, /*totalAssets*/ uint256 totalShares)
public
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.20 - Functions in Curve Contracts Could Be external Instead of public

Made all of these external

Comment thread src/LinearCurve.sol
shares = assets; // 1:1 relationship

return shares;
return assets; // 1:1 relationship
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.21 - Preview Functions in LinearCurve Could Be Simplified

Simplified what was here.

Comment thread src/LinearCurve.sol
assets = shares; // 1:1 relationship

return assets;
return shares; // 1:1 relationship
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.21 - Preview Functions in LinearCurve Could Be Simplified

Simplified what was here.

Comment thread src/LinearCurve.sol
assets = shares; // 1:1 relationship

return assets;
return assets; // 1:1 relationship
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.21 - Preview Functions in LinearCurve Could Be Simplified

Simplified what was here.

Comment thread src/LinearCurve.sol
shares = assets; // 1:1 relationship

return shares;
return shares; // 1:1 relationship
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.21 - Preview Functions in LinearCurve Could Be Simplified

Simplified what was here.

Comment thread src/BaseCurve.sol
/// @notice Construct the curve with a unique name
///
/// @param _name Unique name for the curve
constructor(string memory _name) {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.22 - Unconventional Function Order in BaseCurve and Derived Contractsz

Constructor is first now.

@0xIntuition 0xIntuition deleted a comment from github-actions Bot Mar 25, 2025
@0xIntuition 0xIntuition deleted a comment from github-actions Bot Mar 25, 2025
@github-actions
Copy link
Copy Markdown

Summary of Test Results if Merged To Main:

  • Full logs & artifacts are available in the Actions tab
  • This comment will update automatically with new CI runs

✅ All 134 tests passed! (0 skipped, Total: 134)

Test Results for Merge

Test Suite Status Coverage Time
test/unit/EthMultiVault/AdminMultiVault.t.sol 100% (16/16) 0.004s
test/unit/EthMultiVault/CreateAtom.t.sol 100% (6/6) 0.003s
test/unit/EthMultiVault/Approvals.t.sol 100% (2/2) 0.002s
test/unit/EthMultiVault/BatchCreateAtom.t.sol 100% (2/2) 0.006s
test/BaseTest.sol 100% (2/2) 0.004s
test/unit/EthMultiVault/CreateTriple.t.sol 100% (6/6) 0.007s
test/unit/EthMultiVault/RedeemAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/EmergencyRedeemTriple.t.sol 100% (5/5) 0.017s
test/unit/EthMultiVault/RedeemAtomCurve.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/CurveComparison.t.sol 100% (6/6) 0.009s
test/unit/EthMultiVault/DepositAtom.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/BatchCreateTriple.t.sol 100% (4/4) 0.017s
test/unit/EthMultiVault/DepositAtomCurve.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/EmergencyReedemAtom.t.sol 100% (4/4) 0.012s
test/unit/EthMultiVault/RedeemTriple.t.sol 100% (5/5) 0.012s
test/unit/EthMultiVault/DepositTriple.t.sol 100% (4/4) 0.006s
test/unit/EthMultiVault/RedeemTripleCurve.t.sol 100% (5/5) 0.009s
test/unit/UD60x18.t.sol 100% (6/6) 0.003s
test/unit/EthMultiVault/DepositTripleCurve.t.sol 100% (4/4) 0.010s
test/unit/EthMultiVault/BatchDeposit.t.sol 100% (6/6) 0.027s
test/unit/EthMultiVault/BatchRedeem.t.sol 100% (8/8) 0.012s
test/unit/EthMultiVault/Helpers.t.sol 100% (4/4) 0.006s
test/unit/EthMultiVault/Profit.t.sol 100% (11/11) 0.028s
test/unit/EthMultiVault/Fees.t.sol 100% (2/2) 0.293s
test/unit/EthMultiVault/UseCases.t.sol 100% (6/6) 11.040s

🔒 Security Analysis

⚠️ Found 3 High and 1 Medium severity issues

High Severity Issues

arbitrary-send-eth

Impact: AtomWallet._call(address,uint256,bytes) (src/AtomWallet.sol#214-221) sends eth to arbitrary user Dangerous calls: - (success,result) = target.call{value: value}(data) (src/AtomWallet.sol#215)

Affected Files:

  • src/AtomWallet.sol
View Detailed Findings
  • src/AtomWallet.sol:214 in _call
reentrancy-eth

Impact: Reentrancy in EthMultiVault.batchDeposit(address,uint256[],uint256[]) (src/EthMultiVault.sol#1219-1252): External calls: - _transferFeesToProtocolMultisig(protocolFee) (src/EthMultiVault.sol#1248) - (success,None) = address(generalConfig.protocolMultisig).call{value: value}() (src/EthMultiVault.sol#1418) State variables written after the call(s): - shares[i] = _deposit(receiver,termIds[i],userDepositAfterprotocolFee) (src/EthMultiVault.sol#1247) - vaults[id].balanceOf[to] += amount (src/EthMultiVault.sol#1714) - vaults[id].totalAssets = totalAssets (src/EthMultiVault.sol#1759) - vaults[id].totalShares = totalShares (src/EthMultiVault.sol#1760) EthMultiVault.vaults (src/EthMultiVault.sol#97) can be used in cross function reentrancies: - EthMultiVault.convertToAssets(uint256,uint256) (src/EthMultiVault.sol#2166-2170) - EthMultiVault.convertToShares(uint256,uint256) (src/EthMultiVault.sol#2131-2135) - EthMultiVault.currentSharePrice(uint256) (src/EthMultiVault.sol#2067-2073) - EthMultiVault.getDepositSharesAndFees(uint256,uint256) (src/EthMultiVault.sol#1859-1886) - EthMultiVault.getRedeemAssetsAndFees(uint256,uint256) (src/EthMultiVault.sol#1926-1960) - EthMultiVault.getVaultStateForUser(uint256,address) (src/EthMultiVault.sol#2303-2307) - EthMultiVault.maxRedeem(address,uint256) (src/EthMultiVault.sol#2105-2108) - EthMultiVault.vaults (src/EthMultiVault.sol#97)

Affected Files:

  • src/EthMultiVault.sol
View Detailed Findings
  • src/EthMultiVault.sol:1219 in batchDeposit
  • src/EthMultiVault.sol:1269 in batchDepositCurve

Medium Severity Issues

View Medium Severity Issues ##### incorrect-equality **Impact**: EthMultiVault._validateTimelock(bytes32) (src/EthMultiVault.sol#2400-2412) uses a dangerous strict equality: - timelock.readyTime == 0 (src/EthMultiVault.sol#2403)

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:2400 in _validateTimelock

Recommended Actions

  1. Review and fix all high severity issues before deployment
  2. Implement thorough testing for affected components
  3. Consider additional security measures:
    • Access controls
    • Input validation
    • Invariant checks

⛽ Gas Analysis

📊 First gas snapshot created

@github-actions
Copy link
Copy Markdown

Summary of Test Results if Merged To Main:

  • Full logs & artifacts are available in the Actions tab
  • This comment will update automatically with new CI runs

✅ All 134 tests passed! (0 skipped, Total: 134)

Test Results for Merge

Test Suite Status Coverage Time
test/unit/EthMultiVault/CreateAtom.t.sol 100% (6/6) 0.003s
test/unit/EthMultiVault/BatchCreateAtom.t.sol 100% (2/2) 0.006s
test/unit/EthMultiVault/EmergencyRedeemTriple.t.sol 100% (5/5) 0.009s
test/unit/EthMultiVault/CreateTriple.t.sol 100% (6/6) 0.007s
test/unit/EthMultiVault/AdminMultiVault.t.sol 100% (16/16) 0.012s
test/unit/EthMultiVault/EmergencyReedemAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/Approvals.t.sol 100% (2/2) 0.006s
test/unit/EthMultiVault/CurveComparison.t.sol 100% (6/6) 0.013s
test/unit/EthMultiVault/DepositAtom.t.sol 100% (4/4) 0.004s
test/BaseTest.sol 100% (2/2) 0.009s
test/unit/EthMultiVault/BatchCreateTriple.t.sol 100% (4/4) 0.021s
test/unit/EthMultiVault/DepositAtomCurve.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/BatchRedeem.t.sol 100% (8/8) 0.017s
test/unit/EthMultiVault/DepositTriple.t.sol 100% (4/4) 0.020s
test/unit/EthMultiVault/RedeemAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/BatchDeposit.t.sol 100% (6/6) 0.025s
test/unit/EthMultiVault/RedeemAtomCurve.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/DepositTripleCurve.t.sol 100% (4/4) 0.013s
test/unit/EthMultiVault/RedeemTriple.t.sol 100% (5/5) 0.010s
test/unit/EthMultiVault/RedeemTripleCurve.t.sol 100% (5/5) 0.009s
test/unit/EthMultiVault/Helpers.t.sol 100% (4/4) 0.005s
test/unit/EthMultiVault/Profit.t.sol 100% (11/11) 0.024s
test/unit/EthMultiVault/Fees.t.sol 100% (2/2) 0.248s
test/unit/EthMultiVault/UseCases.t.sol 100% (6/6) 0.294s

🔒 Security Analysis

⚠️ Found 3 High and 1 Medium severity issues

High Severity Issues

arbitrary-send-eth

Impact: AtomWallet._call(address,uint256,bytes) (src/AtomWallet.sol#214-221) sends eth to arbitrary user Dangerous calls: - (success,result) = target.call{value: value}(data) (src/AtomWallet.sol#215)

Affected Files:

  • src/AtomWallet.sol
View Detailed Findings
  • src/AtomWallet.sol:214 in _call
reentrancy-eth

Impact: Reentrancy in EthMultiVault.batchDeposit(address,uint256[],uint256[]) (src/EthMultiVault.sol#1219-1252): External calls: - _transferFeesToProtocolMultisig(protocolFee) (src/EthMultiVault.sol#1248) - (success,None) = address(generalConfig.protocolMultisig).call{value: value}() (src/EthMultiVault.sol#1418) State variables written after the call(s): - shares[i] = _deposit(receiver,termIds[i],userDepositAfterprotocolFee) (src/EthMultiVault.sol#1247) - vaults[id].totalAssets = totalAssets (src/EthMultiVault.sol#1759) - vaults[id].balanceOf[to] += amount (src/EthMultiVault.sol#1714) - vaults[id].totalShares = totalShares (src/EthMultiVault.sol#1760) EthMultiVault.vaults (src/EthMultiVault.sol#97) can be used in cross function reentrancies: - EthMultiVault.convertToAssets(uint256,uint256) (src/EthMultiVault.sol#2166-2170) - EthMultiVault.convertToShares(uint256,uint256) (src/EthMultiVault.sol#2131-2135) - EthMultiVault.currentSharePrice(uint256) (src/EthMultiVault.sol#2067-2073) - EthMultiVault.getDepositSharesAndFees(uint256,uint256) (src/EthMultiVault.sol#1859-1886) - EthMultiVault.getRedeemAssetsAndFees(uint256,uint256) (src/EthMultiVault.sol#1926-1960) - EthMultiVault.getVaultStateForUser(uint256,address) (src/EthMultiVault.sol#2303-2307) - EthMultiVault.maxRedeem(address,uint256) (src/EthMultiVault.sol#2105-2108) - EthMultiVault.vaults (src/EthMultiVault.sol#97)

Affected Files:

  • src/EthMultiVault.sol
View Detailed Findings
  • src/EthMultiVault.sol:1219 in batchDeposit
  • src/EthMultiVault.sol:1269 in batchDepositCurve

Medium Severity Issues

View Medium Severity Issues ##### incorrect-equality **Impact**: EthMultiVault._validateTimelock(bytes32) (src/EthMultiVault.sol#2400-2412) uses a dangerous strict equality: - timelock.readyTime == 0 (src/EthMultiVault.sol#2403)

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:2400 in _validateTimelock

Recommended Actions

  1. Review and fix all high severity issues before deployment
  2. Implement thorough testing for affected components
  3. Consider additional security measures:
    • Access controls
    • Input validation
    • Invariant checks

⛽ Gas Analysis

📊 First gas snapshot created

* deploy better curve

* update progressive curve args to 2,5e35

* add reinit to add bonding curve config when upgrading ethmultivault.  Add mutator for bonding curve config to ethmultivault if admin wants to change it like any other config.  add upgrade test to verify we can upgrade from 1.0 to 1.5.  fix warnings.

* address feedback

---------

Co-authored-by: Mihailo Maksa <mihajlomaksa9+@gmail.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 9, 2025

Summary of Test Results if Merged To Main:

  • Full logs & artifacts are available in the Actions tab
  • This comment will update automatically with new CI runs

✅ All 148 tests passed! (2 skipped, Total: 150)

Test Results for Merge

Test Suite Status Coverage Time
test/unit/EthMultiVault/CreateAtom.t.sol 100% (6/6) 0.004s
test/unit/EthMultiVault/AdminMultiVault.t.sol 100% (16/16) 0.007s
test/unit/EthMultiVault/BatchCreateAtom.t.sol 100% (2/2) 0.008s
test/unit/EthMultiVault/EmergencyRedeemTriple.t.sol 100% (5/5) 0.009s
test/unit/EthMultiVault/CreateTriple.t.sol 100% (6/6) 0.007s
test/unit/EthMultiVault/Approvals.t.sol 100% (2/2) 0.005s
test/unit/EthMultiVault/EmergencyReedemAtom.t.sol 100% (4/4) 0.003s
test/BaseTest.sol 100% (2/2) 0.006s
test/unit/EthMultiVault/CurveComparison.t.sol 100% (6/6) 0.010s
test/unit/EthMultiVault/BatchCreateTriple.t.sol 100% (4/4) 0.017s
test/unit/EthMultiVault/RedeemAtomCurve.t.sol 100% (4/4) 0.015s
test/unit/EthMultiVault/DepositAtom.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/DepositAtomCurve.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/DepositTriple.t.sol 100% (4/4) 0.007s
test/unit/EthMultiVault/BatchDeposit.t.sol 100% (6/6) 0.027s
test/unit/EthMultiVault/DepositTripleCurve.t.sol 100% (4/4) 0.008s
test/unit/EthMultiVault/RedeemTriple.t.sol 100% (5/5) 0.028s
test/unit/EthMultiVault/BatchRedeem.t.sol 100% (8/8) 0.022s
test/unit/EthMultiVault/RedeemTripleCurve.t.sol 100% (5/5) 0.011s
test/unit/EthMultiVault/Profit.t.sol 100% (11/11) 0.021s
test/unit/EthMultiVault/RedeemAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/Helpers.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/Fees.t.sol 100% (2/2) 0.306s
test/unit/EthMultiVault/UseCases.t.sol 100% (6/6) 0.031s
test/UpgradeTest.t.sol ⚠️ 86% (13/15) 16.440s

🔒 Security Analysis

⚠️ Found 3 High and 1 Medium severity issues

High Severity Issues

arbitrary-send-eth

Impact: AtomWallet._call(address,uint256,bytes) (src/AtomWallet.sol#214-221) sends eth to arbitrary user Dangerous calls: - (success,result) = target.call{value: value}(data) (src/AtomWallet.sol#215)

Affected Files:

  • src/AtomWallet.sol
View Detailed Findings
  • src/AtomWallet.sol:214 in _call
reentrancy-eth

Impact: Reentrancy in EthMultiVault.batchDeposit(address,uint256[],uint256[]) (src/EthMultiVault.sol#1244-1277): External calls: - _transferFeesToProtocolMultisig(protocolFee) (src/EthMultiVault.sol#1273) - (success,None) = address(generalConfig.protocolMultisig).call{value: value}() (src/EthMultiVault.sol#1443) State variables written after the call(s): - shares[i] = _deposit(receiver,termIds[i],userDepositAfterprotocolFee) (src/EthMultiVault.sol#1272) - vaults[id].totalAssets = totalAssets (src/EthMultiVault.sol#1784) - vaults[id].balanceOf[to] += amount (src/EthMultiVault.sol#1739) - vaults[id].totalShares = totalShares (src/EthMultiVault.sol#1785) EthMultiVault.vaults (src/EthMultiVault.sol#97) can be used in cross function reentrancies: - EthMultiVault.convertToAssets(uint256,uint256) (src/EthMultiVault.sol#2191-2195) - EthMultiVault.convertToShares(uint256,uint256) (src/EthMultiVault.sol#2156-2160) - EthMultiVault.currentSharePrice(uint256) (src/EthMultiVault.sol#2092-2098) - EthMultiVault.getDepositSharesAndFees(uint256,uint256) (src/EthMultiVault.sol#1884-1911) - EthMultiVault.getRedeemAssetsAndFees(uint256,uint256) (src/EthMultiVault.sol#1951-1985) - EthMultiVault.getVaultStateForUser(uint256,address) (src/EthMultiVault.sol#2328-2332) - EthMultiVault.maxRedeem(address,uint256) (src/EthMultiVault.sol#2130-2133) - EthMultiVault.vaults (src/EthMultiVault.sol#97)

Affected Files:

  • src/EthMultiVault.sol
View Detailed Findings
  • src/EthMultiVault.sol:1244 in batchDeposit
  • src/EthMultiVault.sol:1294 in batchDepositCurve

Medium Severity Issues

View Medium Severity Issues ##### incorrect-equality **Impact**: EthMultiVault._validateTimelock(bytes32) (src/EthMultiVault.sol#2425-2437) uses a dangerous strict equality: - timelock.readyTime == 0 (src/EthMultiVault.sol#2428)

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:2425 in _validateTimelock

Recommended Actions

  1. Review and fix all high severity issues before deployment
  2. Implement thorough testing for affected components
  3. Consider additional security measures:
    • Access controls
    • Input validation
    • Invariant checks

⛽ Gas Analysis

📊 First gas snapshot created

@github-actions
Copy link
Copy Markdown

Summary of Test Results if Merged To Main:

  • Full logs & artifacts are available in the Actions tab
  • This comment will update automatically with new CI runs

⚠️ Could not parse test results

🔒 Security Analysis

⚠️ Found 3 High and 3 Medium severity issues

High Severity Issues

arbitrary-send-eth

Impact: AtomWallet._call(address,uint256,bytes) (src/AtomWallet.sol#214-221) sends eth to arbitrary user Dangerous calls: - (success,result) = target.call{value: value}(data) (src/AtomWallet.sol#215)

Affected Files:

  • src/AtomWallet.sol
View Detailed Findings
  • src/AtomWallet.sol:214 in _call
reentrancy-eth

Impact: Reentrancy in EthMultiVault.batchDeposit(address,uint256[],uint256[]) (src/EthMultiVault.sol#1244-1277): External calls: - _transferFeesToProtocolMultisig(protocolFee) (src/EthMultiVault.sol#1273) - (success,None) = address(generalConfig.protocolMultisig).call{value: value}() (src/EthMultiVault.sol#1443) State variables written after the call(s): - shares[i] = _deposit(receiver,termIds[i],userDepositAfterprotocolFee) (src/EthMultiVault.sol#1272) - vaults[id].totalAssets = totalAssets (src/EthMultiVault.sol#1784) - vaults[id].balanceOf[to] += amount (src/EthMultiVault.sol#1739) - vaults[id].totalShares = totalShares (src/EthMultiVault.sol#1785) EthMultiVault.vaults (src/EthMultiVault.sol#97) can be used in cross function reentrancies: - EthMultiVault.convertToAssets(uint256,uint256) (src/EthMultiVault.sol#2191-2195) - EthMultiVault.convertToShares(uint256,uint256) (src/EthMultiVault.sol#2156-2160) - EthMultiVault.currentSharePrice(uint256) (src/EthMultiVault.sol#2092-2098) - EthMultiVault.getDepositSharesAndFees(uint256,uint256) (src/EthMultiVault.sol#1884-1911) - EthMultiVault.getRedeemAssetsAndFees(uint256,uint256) (src/EthMultiVault.sol#1951-1985) - EthMultiVault.getVaultStateForUser(uint256,address) (src/EthMultiVault.sol#2328-2332) - EthMultiVault.maxRedeem(address,uint256) (src/EthMultiVault.sol#2130-2133) - EthMultiVault.vaults (src/EthMultiVault.sol#97)

Affected Files:

  • src/EthMultiVault.sol
View Detailed Findings
  • src/EthMultiVault.sol:1244 in batchDeposit
  • src/EthMultiVault.sol:1294 in batchDepositCurve

Medium Severity Issues

View Medium Severity Issues ##### incorrect-equality **Impact**: EthMultiVault._validateTimelock(bytes32) (src/EthMultiVault.sol#2425-2437) uses a dangerous strict equality: - timelock.readyTime == 0 (src/EthMultiVault.sol#2428)

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:2425 in _validateTimelock

uninitialized-local

Impact: EthMultiVault.batchCreateAtom(bytes[]).protocolDepositFeeTotal (src/EthMultiVault.sol#628) is a local variable never initialized

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:628 in protocolDepositFeeTotal

  • src/EthMultiVault.sol:761 in protocolDepositFeeTotal

Recommended Actions

  1. Review and fix all high severity issues before deployment
  2. Implement thorough testing for affected components
  3. Consider additional security measures:
    • Access controls
    • Input validation
    • Invariant checks

⛽ Gas Analysis

⚠️ No gas snapshot generated

@github-actions
Copy link
Copy Markdown

Summary of Test Results if Merged To Main:

  • Full logs & artifacts are available in the Actions tab
  • This comment will update automatically with new CI runs

✅ All 148 tests passed! (2 skipped, Total: 150)

Test Results for Merge

Test Suite Status Coverage Time
test/unit/EthMultiVault/AdminMultiVault.t.sol 100% (16/16) 0.004s
test/unit/EthMultiVault/CreateAtom.t.sol 100% (6/6) 0.003s
test/unit/EthMultiVault/Approvals.t.sol 100% (2/2) 0.001s
test/unit/EthMultiVault/RedeemAtomCurve.t.sol 100% (4/4) 0.004s
test/BaseTest.sol 100% (2/2) 0.004s
test/unit/EthMultiVault/CreateTriple.t.sol 100% (6/6) 0.006s
test/unit/EthMultiVault/BatchCreateAtom.t.sol 100% (2/2) 0.002s
test/unit/EthMultiVault/EmergencyRedeemTriple.t.sol 100% (5/5) 0.020s
test/unit/EthMultiVault/CurveComparison.t.sol 100% (6/6) 0.009s
test/unit/EthMultiVault/RedeemTriple.t.sol 100% (5/5) 0.017s
test/unit/EthMultiVault/EmergencyReedemAtom.t.sol 100% (4/4) 0.005s
test/unit/EthMultiVault/BatchCreateTriple.t.sol 100% (4/4) 0.012s
test/unit/EthMultiVault/BatchDeposit.t.sol 100% (6/6) 0.007s
test/unit/EthMultiVault/DepositAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/DepositAtomCurve.t.sol 100% (4/4) 0.005s
test/unit/EthMultiVault/RedeemTripleCurve.t.sol 100% (5/5) 0.018s
test/unit/EthMultiVault/BatchRedeem.t.sol 100% (8/8) 0.011s
test/unit/EthMultiVault/DepositTriple.t.sol 100% (4/4) 0.006s
test/unit/EthMultiVault/DepositTripleCurve.t.sol 100% (4/4) 0.010s
test/unit/EthMultiVault/Fees.t.sol 100% (2/2) 0.446s
test/unit/EthMultiVault/Helpers.t.sol 100% (4/4) 0.005s
test/unit/EthMultiVault/Profit.t.sol 100% (11/11) 0.024s
test/unit/EthMultiVault/RedeemAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/UseCases.t.sol 100% (6/6) 0.041s
test/UpgradeTest.t.sol ⚠️ 86% (13/15) 15.030s

🔒 Security Analysis

⚠️ Found 3 High and 3 Medium severity issues

High Severity Issues

arbitrary-send-eth

Impact: AtomWallet._call(address,uint256,bytes) (src/AtomWallet.sol#214-221) sends eth to arbitrary user Dangerous calls: - (success,result) = target.call{value: value}(data) (src/AtomWallet.sol#215)

Affected Files:

  • src/AtomWallet.sol
View Detailed Findings
  • src/AtomWallet.sol:214 in _call
reentrancy-eth

Impact: Reentrancy in EthMultiVault.batchDeposit(address,uint256[],uint256[]) (src/EthMultiVault.sol#1244-1277): External calls: - _transferFeesToProtocolMultisig(protocolFee) (src/EthMultiVault.sol#1273) - (success,None) = address(generalConfig.protocolMultisig).call{value: value}() (src/EthMultiVault.sol#1443) State variables written after the call(s): - shares[i] = _deposit(receiver,termIds[i],userDepositAfterprotocolFee) (src/EthMultiVault.sol#1272) - vaults[id].totalAssets = totalAssets (src/EthMultiVault.sol#1784) - vaults[id].balanceOf[to] += amount (src/EthMultiVault.sol#1739) - vaults[id].totalShares = totalShares (src/EthMultiVault.sol#1785) EthMultiVault.vaults (src/EthMultiVault.sol#97) can be used in cross function reentrancies: - EthMultiVault.convertToAssets(uint256,uint256) (src/EthMultiVault.sol#2191-2195) - EthMultiVault.convertToShares(uint256,uint256) (src/EthMultiVault.sol#2156-2160) - EthMultiVault.currentSharePrice(uint256) (src/EthMultiVault.sol#2092-2098) - EthMultiVault.getDepositSharesAndFees(uint256,uint256) (src/EthMultiVault.sol#1884-1911) - EthMultiVault.getRedeemAssetsAndFees(uint256,uint256) (src/EthMultiVault.sol#1951-1985) - EthMultiVault.getVaultStateForUser(uint256,address) (src/EthMultiVault.sol#2328-2332) - EthMultiVault.maxRedeem(address,uint256) (src/EthMultiVault.sol#2130-2133) - EthMultiVault.vaults (src/EthMultiVault.sol#97)

Affected Files:

  • src/EthMultiVault.sol
View Detailed Findings
  • src/EthMultiVault.sol:1244 in batchDeposit
  • src/EthMultiVault.sol:1294 in batchDepositCurve

Medium Severity Issues

View Medium Severity Issues ##### incorrect-equality **Impact**: EthMultiVault._validateTimelock(bytes32) (src/EthMultiVault.sol#2425-2437) uses a dangerous strict equality: - timelock.readyTime == 0 (src/EthMultiVault.sol#2428)

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:2425 in _validateTimelock

uninitialized-local

Impact: EthMultiVault.batchCreateAtom(bytes[]).protocolDepositFeeTotal (src/EthMultiVault.sol#628) is a local variable never initialized

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:628 in protocolDepositFeeTotal

  • src/EthMultiVault.sol:761 in protocolDepositFeeTotal

Recommended Actions

  1. Review and fix all high severity issues before deployment
  2. Implement thorough testing for affected components
  3. Consider additional security measures:
    • Access controls
    • Input validation
    • Invariant checks

⛽ Gas Analysis

📊 First gas snapshot created

* v1.5 upgrade prep script

* run forge fmt

* add deployment addresses to readme

* space out addresses in readme

* add more spacing to readme deployment notes
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 4, 2025

Summary of Test Results if Merged To Main:

  • Full logs & artifacts are available in the Actions tab
  • This comment will update automatically with new CI runs

✅ All 148 tests passed! (2 skipped, Total: 150)

Test Results for Merge

Test Suite Status Coverage Time
test/unit/EthMultiVault/RedeemAtomCurve.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/CreateAtom.t.sol 100% (6/6) 0.006s
test/unit/EthMultiVault/EmergencyRedeemTriple.t.sol 100% (5/5) 0.008s
test/unit/EthMultiVault/AdminMultiVault.t.sol 100% (16/16) 0.006s
test/unit/EthMultiVault/EmergencyReedemAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/RedeemTriple.t.sol 100% (5/5) 0.007s
test/unit/EthMultiVault/Approvals.t.sol 100% (2/2) 0.005s
test/BaseTest.sol 100% (2/2) 0.006s
test/unit/EthMultiVault/CreateTriple.t.sol 100% (6/6) 0.016s
test/unit/EthMultiVault/RedeemTripleCurve.t.sol 100% (5/5) 0.015s
test/unit/EthMultiVault/BatchCreateAtom.t.sol 100% (2/2) 0.009s
test/unit/EthMultiVault/CurveComparison.t.sol 100% (6/6) 0.018s
test/unit/EthMultiVault/BatchCreateTriple.t.sol 100% (4/4) 0.022s
test/unit/EthMultiVault/DepositAtom.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/DepositAtomCurve.t.sol 100% (4/4) 0.004s
test/unit/EthMultiVault/BatchDeposit.t.sol 100% (6/6) 0.011s
test/unit/EthMultiVault/DepositTriple.t.sol 100% (4/4) 0.007s
test/unit/EthMultiVault/DepositTripleCurve.t.sol 100% (4/4) 0.007s
test/unit/EthMultiVault/BatchRedeem.t.sol 100% (8/8) 0.019s
test/unit/EthMultiVault/Fees.t.sol 100% (2/2) 0.263s
test/unit/EthMultiVault/Helpers.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/Profit.t.sol 100% (11/11) 0.018s
test/unit/EthMultiVault/RedeemAtom.t.sol 100% (4/4) 0.003s
test/unit/EthMultiVault/UseCases.t.sol 100% (6/6) 13.900s
test/UpgradeTest.t.sol ⚠️ 86% (13/15) 15.510s

🔒 Security Analysis

⚠️ Found 3 High and 3 Medium severity issues

High Severity Issues

arbitrary-send-eth

Impact: AtomWallet._call(address,uint256,bytes) (src/AtomWallet.sol#214-221) sends eth to arbitrary user Dangerous calls: - (success,result) = target.call{value: value}(data) (src/AtomWallet.sol#215)

Affected Files:

  • src/AtomWallet.sol
View Detailed Findings
  • src/AtomWallet.sol:214 in _call
reentrancy-eth

Impact: Reentrancy in EthMultiVault.batchDepositCurve(address,uint256[],uint256[],uint256[]) (src/EthMultiVault.sol#1291-1326): External calls: - _transferFeesToProtocolMultisig(protocolFee) (src/EthMultiVault.sol#1322) - (success,None) = address(generalConfig.protocolMultisig).call{value: value}() (src/EthMultiVault.sol#1440) State variables written after the call(s): - shares[i] = _depositCurve(receiver,termIds[i],curveIds[i],userDepositAfterprotocolFee) (src/EthMultiVault.sol#1320) - bondingCurveVaults[id][curveId].totalAssets += assetsDelta (src/EthMultiVault.sol#1798) - bondingCurveVaults[id][curveId].balanceOf[to] += amount (src/EthMultiVault.sol#1740) - bondingCurveVaults[id][curveId].totalShares += sharesDelta (src/EthMultiVault.sol#1799) EthMultiVault.bondingCurveVaults (src/EthMultiVault.sol#132) can be used in cross function reentrancies: - EthMultiVault.bondingCurveVaults (src/EthMultiVault.sol#132) - EthMultiVault.convertToAssetsCurve(uint256,uint256,uint256) (src/EthMultiVault.sol#2216-2221) - EthMultiVault.convertToSharesCurve(uint256,uint256,uint256) (src/EthMultiVault.sol#2181-2187) - EthMultiVault.currentSharePriceCurve(uint256,uint256) (src/EthMultiVault.sol#2113-2117) - EthMultiVault.getCurveVaultState(uint256,uint256) (src/EthMultiVault.sol#2353-2355) - EthMultiVault.getDepositSharesAndFeesCurve(uint256,uint256,uint256) (src/EthMultiVault.sol#1922-1949) - EthMultiVault.getRedeemAssetsAndFeesCurve(uint256,uint256,uint256) (src/EthMultiVault.sol#1996-2030) - EthMultiVault.getVaultStateForUserCurve(uint256,uint256,address) (src/EthMultiVault.sol#2343-2351) - EthMultiVault.maxRedeemCurve(address,uint256,uint256) (src/EthMultiVault.sol#2149-2152) - shares[i] = _depositCurve(receiver,termIds[i],curveIds[i],userDepositAfterprotocolFee) (src/EthMultiVault.sol#1320) - vaults[id].totalAssets = totalAssets (src/EthMultiVault.sol#1781) - vaults[id].totalShares = totalShares (src/EthMultiVault.sol#1782) EthMultiVault.vaults (src/EthMultiVault.sol#97) can be used in cross function reentrancies: - EthMultiVault.convertToAssets(uint256,uint256) (src/EthMultiVault.sol#2200-2204) - EthMultiVault.convertToShares(uint256,uint256) (src/EthMultiVault.sol#2165-2169) - EthMultiVault.currentSharePrice(uint256) (src/EthMultiVault.sol#2101-2107) - EthMultiVault.getDepositSharesAndFees(uint256,uint256) (src/EthMultiVault.sol#1893-1920) - EthMultiVault.getRedeemAssetsAndFees(uint256,uint256) (src/EthMultiVault.sol#1960-1994) - EthMultiVault.getVaultStateForUser(uint256,address) (src/EthMultiVault.sol#2337-2341) - EthMultiVault.maxRedeem(address,uint256) (src/EthMultiVault.sol#2139-2142) - EthMultiVault.vaults (src/EthMultiVault.sol#97)

Affected Files:

  • src/EthMultiVault.sol
View Detailed Findings
  • src/EthMultiVault.sol:1291 in batchDepositCurve
  • src/EthMultiVault.sol:1241 in batchDeposit

Medium Severity Issues

View Medium Severity Issues ##### incorrect-equality **Impact**: EthMultiVault._validateTimelock(bytes32) (src/EthMultiVault.sol#2434-2446) uses a dangerous strict equality: - timelock.readyTime == 0 (src/EthMultiVault.sol#2437)

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:2434 in _validateTimelock

uninitialized-local

Impact: EthMultiVault.batchCreateAtom(bytes[]).protocolDepositFeeTotal (src/EthMultiVault.sol#625) is a local variable never initialized

Affected Files:

  • src/EthMultiVault.sol

  • src/EthMultiVault.sol:625 in protocolDepositFeeTotal

  • src/EthMultiVault.sol:758 in protocolDepositFeeTotal

Recommended Actions

  1. Review and fix all high severity issues before deployment
  2. Implement thorough testing for affected components
  3. Consider additional security measures:
    • Access controls
    • Input validation
    • Invariant checks

⛽ Gas Analysis

📊 First gas snapshot created

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants