Skip to content

fix: hub compute getter consistency#1199

Open
DhairyaSethi wants to merge 1 commit intodevfrom
chore/hub-getter-consistency
Open

fix: hub compute getter consistency#1199
DhairyaSethi wants to merge 1 commit intodevfrom
chore/hub-getter-consistency

Conversation

@DhairyaSethi
Copy link
Member

@DhairyaSethi DhairyaSethi commented Feb 8, 2026

  • rename getAssetDrawnIndex to computeAssetDrawnIndex
  • add computeAssetDrawnRate

@DhairyaSethi DhairyaSethi mentioned this pull request Feb 8, 2026
@github-actions
Copy link

github-actions bot commented Feb 8, 2026

🌈 Test Results
No files changed, compilation skipped

Ran 14 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_Gas_Tests
[PASS] test_borrow() (gas: 1327200)
[PASS] test_liquidation_full() (gas: 10891725)
[PASS] test_liquidation_partial() (gas: 10891142)
[PASS] test_liquidation_receiveShares_full() (gas: 10874137)
[PASS] test_liquidation_receiveShares_partial() (gas: 10873556)
[PASS] test_liquidation_reportDeficit_full() (gas: 10869710)
[PASS] test_multicall_ops() (gas: 1404927)
[PASS] test_repay() (gas: 869264)
[PASS] test_setUserPositionManagersWithSig() (gas: 307152)
[PASS] test_supply() (gas: 539130)
[PASS] test_updateRiskPremium() (gas: 1317821)
[PASS] test_updateUserDynamicConfig() (gas: 587622)
[PASS] test_usingAsCollateral() (gas: 1472927)
[PASS] test_withdraw() (gas: 1949619)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 130.41ms (43.75ms CPU time)

Ran 14 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_ZeroRiskPremium_Gas_Tests
[PASS] test_borrow() (gas: 1092878)
[PASS] test_liquidation_full() (gas: 10756601)
[PASS] test_liquidation_partial() (gas: 10756018)
[PASS] test_liquidation_receiveShares_full() (gas: 10739013)
[PASS] test_liquidation_receiveShares_partial() (gas: 10738432)
[PASS] test_liquidation_reportDeficit_full() (gas: 10793839)
[PASS] test_multicall_ops() (gas: 1322221)
[PASS] test_repay() (gas: 778216)
[PASS] test_setUserPositionManagersWithSig() (gas: 311606)
[PASS] test_supply() (gas: 541811)
[PASS] test_updateRiskPremium() (gas: 944415)
[PASS] test_updateUserDynamicConfig() (gas: 592076)
[PASS] test_usingAsCollateral() (gas: 1090208)
[PASS] test_withdraw() (gas: 1588867)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 75.80ms (30.86ms CPU time)

Ran 4 tests for tests/unit/Spoke/Spoke.PermitReserve.t.sol:SpokePermitReserveTest
[PASS] test_permitReserve() (gas: 88227)
[PASS] test_permitReserve_forwards_correct_call() (gas: 35554)
[PASS] test_permitReserve_ignores_permit_reverts() (gas: 24390)
[PASS] test_permitReserve_revertsWith_ReserveNotListedIn() (gas: 22949)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 24.64ms (1.09ms CPU time)

Ran 10 tests for tests/unit/Spoke/Spoke.PositionManager.t.sol:SpokePositionManagerTest
[PASS] test_onlyPositionManager_on_borrow() (gas: 539380)
[PASS] test_onlyPositionManager_on_repay() (gas: 566253)
[PASS] test_onlyPositionManager_on_supply() (gas: 291789)
[PASS] test_onlyPositionManager_on_updateUserDynamicConfig() (gas: 1288879)
[PASS] test_onlyPositionManager_on_updateUserRiskPremium() (gas: 1529386)
[PASS] test_onlyPositionManager_on_usingAsCollateral() (gas: 144395)
[PASS] test_onlyPositionManager_on_withdraw() (gas: 320814)
[PASS] test_renouncePositionManagerRole() (gas: 20268)
[PASS] test_renouncePositionManagerRole_noop_from_disabled() (gas: 21904)
[PASS] test_setApprovalForPositionManager(bytes32) (runs: 5000, μ: 18111, ~: 18111)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 447.18ms (423.37ms CPU time)

Ran 20 tests for tests/unit/AaveOracle.t.sol:AaveOracleTest
[PASS] test_DECIMALS() (gas: 8326)
[PASS] test_constructor() (gas: 18428)
[PASS] test_description() (gas: 12039)
[PASS] test_fuzz_constructor(uint8) (runs: 5000, μ: 19887, ~: 20214)
Logs:
  Bound result 1

[PASS] test_getReservePrice() (gas: 48776)
[PASS] test_getReservePrice_revertsWith_InvalidPrice() (gas: 48047)
[PASS] test_getReservePrice_revertsWith_InvalidSource() (gas: 10898)
[PASS] test_getReservePrices() (gas: 80715)
[PASS] test_getReservePrices_revertsWith_InvalidSource() (gas: 50930)
[PASS] test_getReserveSource() (gas: 48946)
[PASS] test_setReserveSource() (gas: 45988)
[PASS] test_setReserveSource_revertsWith_InvalidPrice() (gas: 102779)
[PASS] test_setReserveSource_revertsWith_InvalidSource() (gas: 17228)
[PASS] test_setReserveSource_revertsWith_InvalidSourceDecimals() (gas: 17065)
[PASS] test_setReserveSource_revertsWith_OnlySpoke() (gas: 13021)
[PASS] test_setReserveSource_revertsWith_OracleMismatch() (gas: 5040654)
[PASS] test_setSpoke() (gas: 5068555)
[PASS] test_setSpoke_revertsWith_InvalidAddress() (gas: 10870)
[PASS] test_setSpoke_revertsWith_OnlyDeployer(address) (runs: 5000, μ: 13396, ~: 13397)
[PASS] test_setSpoke_revertsWith_SpokeAlreadySet() (gas: 15080)
Suite result: ok. 20 passed; 0 failed; 0 skipped; finished in 1.60s (1.57s CPU time)

Ran 7 tests for tests/unit/Spoke/Spoke.Repay.EdgeCases.t.sol:SpokeRepayEdgeCaseTest
[PASS] test_fuzz_repay_effect_on_ex_rates(uint256,uint256) (runs: 5000, μ: 704007, ~: 703925)
Logs:
  Bound result 16843
  Bound result 87111679
  Bound result 2456

[PASS] test_repay_less_than_share() (gas: 602184)
[PASS] test_repay_only_base_debt_interest() (gas: 770010)
[PASS] test_repay_only_base_debt_no_premium() (gas: 647220)
[PASS] test_repay_supply_ex_rate_decr() (gas: 1468367)
[PASS] test_repay_supply_ex_rate_decr_skip_time() (gas: 1464983)
[PASS] test_repay_zero_shares_nonzero_premium_debt() (gas: 767845)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 15.11s (15.09s CPU time)

Ran 17 tests for tests/unit/AccessManagerEnumerable.t.sol:AccessManagerEnumerableTest
[PASS] test_getRoleMembers_fuzz(uint256,uint256) (runs: 5000, μ: 1981460, ~: 1980367)
Logs:
  Bound result 9
  Bound result 10

[PASS] test_getRoleTargetSelectors_fuzz(uint256,uint256) (runs: 5000, μ: 1528820, ~: 1527966)
Logs:
  Bound result 9
  Bound result 10

[PASS] test_grantRole() (gas: 315886)
[PASS] test_grantRole_fuzz(uint64,uint256) (runs: 5000, μ: 915911, ~: 919753)
Logs:
  Bound result 8

[PASS] test_revokeRole() (gas: 323138)
[PASS] test_setRoleAdmin_fuzz_trackAdminRoles_multipleRoles_multipleAdmins(uint256) (runs: 5000, μ: 2159903, ~: 2257477)
Logs:
  Bound result 12

[PASS] test_setRoleAdmin_fuzz_trackRolesAndTrackAdminRoles_multipleRoles(uint256) (runs: 5000, μ: 1974319, ~: 2114661)
Logs:
  Bound result 12

[PASS] test_setRoleAdmin_trackAdminOfRoles() (gas: 606131)
[PASS] test_setRoleAdmin_trackAdminOfRoles_changeAdminRole() (gas: 577217)
[PASS] test_setRoleAdmin_trackAdminRoles() (gas: 602311)
[PASS] test_setRoleAdmin_trackRolesAndTrackAdminRoles() (gas: 378311)
[PASS] test_setRoleGuardian_trackRoles() (gas: 263932)
[PASS] test_setTargetFunctionRole() (gas: 414440)
[PASS] test_setTargetFunctionRole_multipleTargets() (gas: 1103911)
[PASS] test_setTargetFunctionRole_removeTarget() (gas: 894967)
[PASS] test_setTargetFunctionRole_skipAddToAdminRole() (gas: 30940)
[PASS] test_setTargetFunctionRole_withReplace() (gas: 549104)
Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 22.09s (22.09s CPU time)

Ran 23 tests for tests/unit/AssetInterestRateStrategy.t.sol:AssetInterestRateStrategyTest
[PASS] test_calculateInterestRate_AtKinkPoint() (gas: 24326)
Logs:
  Bound result 2000
  Bound result 778565440757296803935461404101

[PASS] test_calculateInterestRate_AtMaxUtilization() (gas: 24621)
Logs:
  Bound result 10000
  Bound result 778565440757296803935461404101

[PASS] test_calculateInterestRate_LeftToKinkPoint(uint256) (runs: 5000, μ: 24185, ~: 24330)
Logs:
  Bound result 137
  Bound result 252173843969976304268974536488

[PASS] test_calculateInterestRate_RightToKinkPoint(uint256) (runs: 5000, μ: 25302, ~: 25351)
Logs:
  Bound result 8137
  Bound result 252173843969976304268974536488

[PASS] test_calculateInterestRate_ZeroDebtZeroLiquidity() (gas: 18771)
Logs:
  Bound result 0

[PASS] test_calculateInterestRate_fuzz_ZeroDebt(uint256) (runs: 5000, μ: 19066, ~: 18822)
Logs:
  Bound result 3124043968137

[PASS] test_calculateInterestRate_revertsWith_InterestRateDataNotSet() (gas: 11225)
[PASS] test_deploy_revertsWith_InvalidAddress() (gas: 3746)
[PASS] test_getBaseVariableBorrowRate() (gas: 14812)
[PASS] test_getInterestRateData() (gas: 19290)
[PASS] test_getMaxVariableBorrowRate() (gas: 15258)
[PASS] test_getOptimalUsageRatio() (gas: 14705)
[PASS] test_getVariableRateSlope1() (gas: 14791)
[PASS] test_getVariableRateSlope2() (gas: 14746)
[PASS] test_maxBorrowRate() (gas: 8312)
[PASS] test_maxOptimalRatio() (gas: 8312)
[PASS] test_minOptimalRatio() (gas: 8321)
[PASS] test_setInterestRateData() (gas: 68999)
[PASS] test_setInterestRateData_revertsWith_InvalidMaxRate() (gas: 41819)
[PASS] test_setInterestRateData_revertsWith_InvalidOptimalUsageRatio() (gas: 42380)
[PASS] test_setInterestRateData_revertsWith_InvalidRateData() (gas: 35269)
[PASS] test_setInterestRateData_revertsWith_OnlyHub() (gas: 23502)
[PASS] test_setInterestRateData_revertsWith_Slope2MustBeGteSlope1() (gas: 37658)
Suite result: ok. 23 passed; 0 failed; 0 skipped; finished in 1.16s (1.14s CPU time)

Ran 10 tests for tests/unit/misc/EIP712Hash.t.sol:EIP712HashTest
[PASS] test_constants() (gas: 13531)
[PASS] test_hash_borrow_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6805, ~: 6805)
[PASS] test_hash_positionManagerUpdate_fuzz((address,bool)) (runs: 5000, μ: 6193, ~: 6193)
[PASS] test_hash_repay_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6806, ~: 6806)
[PASS] test_hash_setUserPositionManagers_fuzz((address,(address,bool)[],uint256,uint256)) (runs: 5000, μ: 453554, ~: 449260)
[PASS] test_hash_setUsingAsCollateral_fuzz((address,uint256,bool,address,uint256,uint256)) (runs: 5000, μ: 7305, ~: 7305)
[PASS] test_hash_supply_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6849, ~: 6849)
[PASS] test_hash_updateUserDynamicConfig_fuzz((address,address,uint256,uint256)) (runs: 5000, μ: 6450, ~: 6450)
[PASS] test_hash_updateUserRiskPremium_fuzz((address,address,uint256,uint256)) (runs: 5000, μ: 6471, ~: 6471)
[PASS] test_hash_withdraw_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6805, ~: 6805)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 21.50s (21.50s CPU time)

Ran 9 tests for tests/unit/libraries/KeyValueList.t.sol:KeyValueListTest
[PASS] test_add_unique() (gas: 354262)
[PASS] test_fuzz_add(uint256,uint256) (runs: 5000, μ: 231309, ~: 232296)
[PASS] test_fuzz_add_unique(uint256,uint256) (runs: 5000, μ: 254791, ~: 258916)
Logs:
  Bound result 100

[PASS] test_fuzz_get(uint256[]) (runs: 5000, μ: 408309, ~: 409179)
[PASS] test_fuzz_get_uninitialized(uint256[]) (runs: 5000, μ: 279586, ~: 261724)
[PASS] test_fuzz_get_uninitialized_sorted(uint256[]) (runs: 5000, μ: 186072, ~: 161338)
[PASS] test_fuzz_sortByKey(uint256[]) (runs: 5000, μ: 466097, ~: 460867)
[PASS] test_fuzz_sortByKey_length(uint256) (runs: 5000, μ: 216268, ~: 213217)
Logs:
  Bound result 37

[PASS] test_fuzz_sortByKey_with_collision(uint256[]) (runs: 5000, μ: 545203, ~: 541598)
Suite result: ok. 9 passed; 0 failed; 0 skipped; finished in 70.66s (70.66s CPU time)

Ran 2 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.CollateralToLiquidate.t.sol:LiquidationLogicCollateralToLiquidateTest
[PASS] test_calculateCollateralAmountToLiquidate() (gas: 168205)
[PASS] test_calculateCollateralToLiquidate_fuzz((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 190947, ~: 179991)
Logs:
  Bound result 2
  Bound result 13
  Bound result 10000000000000000
  Bound result 99000000000000000000000000172
  Bound result 10
  Bound result 64
  Bound result 15
  Bound result 64605592699422052204494
  Bound result 13793

Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.66s (2.64s CPU time)

Ran 3 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.DebtToLiquidate.t.sol:LiquidationLogicDebtToLiquidateTest
[PASS] test_calculateDebtToLiquidate_fuzz((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 39315, ~: 39456)
Logs:
  Bound result 1631194238
  Bound result 10585
  Bound result 3436
  Bound result 1187448874948792728
  Bound result 232473893725761368
  Bound result 7575125999959706
  Bound result 15
  Bound result 306286583169637935431906209884
  Bound result 75679658657443156232320694161
  Bound result 101634016077
  Bound result 57926430471

[PASS] test_calculateDebtToLiquidate_fuzz_AmountAdjustedDueToDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 41691, ~: 41909)
Logs:
  Bound result 93579292091157007683231866179993536758897104800
  Bound result 14500
  Bound result 6893
  Bound result 1463399899474967115
  Bound result 1271652003141224367
  Bound result 106485013
  Bound result 10
  Bound result 2
  Bound result 99000123186774180279090739079
  Bound result 50155560136721
  Bound result 1195352612939
  Bound result 106485013
  Bound result 44074032691

[PASS] test_calculateDebtToLiquidate_fuzz_ImpossibleToAdjustForDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 41886, ~: 41876)
Logs:
  Bound result 1631194238
  Bound result 10585
  Bound result 3436
  Bound result 1187448874948792728
  Bound result 232473893725761368
  Bound result 7575125999959706
  Bound result 15
  Bound result 306286583169637935431906209884
  Bound result 75679658657443156232320694161
  Bound result 101634016077
  Bound result 57926430471
  Bound result 5
  Bound result 10000000000000000
  Bound result 101634016077

Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.64s (4.61s CPU time)

Ran 7 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.DebtToTargetHealthFactor.t.sol:LiquidationLogicDebtToTargetHealthFactorTest
[PASS] test_calculateDebtToTargetHealthFactor_HealthFactorEqualsTargetHealthFactor((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 23316, ~: 23367)
Logs:
  Bound result 3116123919
  Bound result 10725
  Bound result 2977
  Bound result 1486249897798496545
  Bound result 555054242782847130
  Bound result 6199474701275945
  Bound result 9

[PASS] test_calculateDebtToTargetHealthFactor_NoPrecisionLoss() (gas: 27855)
[PASS] test_calculateDebtToTargetHealthFactor_PrecisionLoss() (gas: 17346)
[PASS] test_calculateDebtToTargetHealthFactor_UnitPrice() (gas: 27855)
[PASS] test_calculateDebtToTargetHealthFactor_fuzz_NoRevert((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 20522, ~: 20495)
Logs:
  Bound result 3116123919
  Bound result 10725
  Bound result 2977
  Bound result 1486249897798496545
  Bound result 555054242782847130
  Bound result 6199474701275945
  Bound result 9

[PASS] test_calculateDebtToTargetHealthFactor_fuzz_revertsWith_DivisionByZero_ZeroAssetPrice((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 22825, ~: 22876)
Logs:
  Bound result 3116123919
  Bound result 10725
  Bound result 2977
  Bound result 1486249897798496545
  Bound result 555054242782847130
  Bound result 6199474701275945
  Bound result 9

[PASS] test_calculateDebtToTargetHealthFactor_revertsWith_ArithmeticError_TargetHealthFactorLessThanHealthFactor((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 22577, ~: 22628)
Logs:
  Bound result 3116123919
  Bound result 10725
  Bound result 2977
  Bound result 1486249897798496545
  Bound result 555054242782847130
  Bound result 6199474701275945
  Bound result 9

Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 3.01s (2.98s CPU time)

Ran 16 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.EvaluateDeficit.t.sol:LiquidationLogicEvaluateDeficitTest
[PASS] test_evaluateDeficit_CRE_SCCM_DRE_BRCM() (gas: 8928)
[PASS] test_evaluateDeficit_CRE_SCCM_DRE_BRCO() (gas: 8896)
[PASS] test_evaluateDeficit_CRE_SCCM_DRN_BRCM() (gas: 8917)
[PASS] test_evaluateDeficit_CRE_SCCM_DRN_BRCO() (gas: 8884)
[PASS] test_evaluateDeficit_CRE_SCCO_DRE_BRCM() (gas: 8910)
[PASS] test_evaluateDeficit_CRE_SCCO_DRE_BRCO() (gas: 8977)
[PASS] test_evaluateDeficit_CRE_SCCO_DRN_BRCM() (gas: 8942)
[PASS] test_evaluateDeficit_CRE_SCCO_DRN_BRCO() (gas: 8930)
[PASS] test_evaluateDeficit_CRN_SCCM_DRE_BRCM() (gas: 8930)
[PASS] test_evaluateDeficit_CRN_SCCM_DRE_BRCO() (gas: 8919)
[PASS] test_evaluateDeficit_CRN_SCCM_DRN_BRCM() (gas: 8853)
[PASS] test_evaluateDeficit_CRN_SCCM_DRN_BRCO() (gas: 8886)
[PASS] test_evaluateDeficit_CRN_SCCO_DRE_BRCM() (gas: 8863)
[PASS] test_evaluateDeficit_CRN_SCCO_DRE_BRCO() (gas: 8920)
[PASS] test_evaluateDeficit_CRN_SCCO_DRN_BRCM() (gas: 8871)
[PASS] test_evaluateDeficit_CRN_SCCO_DRN_BRCO() (gas: 8949)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 25.75ms (1.35ms CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.ExecuteLiquidation.t.sol:LiquidationLogicExecuteLiquidationTest
[PASS] test_executeLiquidation() (gas: 369032)
[PASS] test_executeLiquidation_revertsWith_InvalidDebtToCover() (gas: 81205)
[PASS] test_executeLiquidation_revertsWith_MustNotLeaveDust_Collateral() (gas: 141529)
[PASS] test_executeLiquidation_revertsWith_MustNotLeaveDust_Debt() (gas: 142059)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 32.86ms (1.67ms CPU time)

Ran 3 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateCollateral.t.sol:LiquidationLogicLiquidateCollateralTest
[PASS] test_liquidateCollateral_fuzz(uint256,uint256,bool) (runs: 5000, μ: 204069, ~: 189036)
Logs:
  Bound result 12400
  Bound result 7240

[PASS] test_liquidateCollateral_revertsWith_ArithmeticUnderflow() (gas: 28059)
[PASS] test_liquidateCollateral_revertsWith_ArithmeticUnderflow_FeeShares() (gas: 124034)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.71s (2.68s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateDebt.t.sol:LiquidationLogicLiquidateDebtTest
[PASS] test_liquidateDebt_fuzz(uint256) (runs: 5000, μ: 229433, ~: 219635)
[PASS] test_liquidateDebt_revertsWith_ArithmeticUnderflow() (gas: 106500)
[PASS] test_liquidateDebt_revertsWith_InsufficientAllowance() (gas: 119005)
[PASS] test_liquidateDebt_revertsWith_InsufficientBalance() (gas: 177468)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.72s (2.69s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateUser.t.sol:LiquidationLogicLiquidateUserTest
[PASS] test_liquidateUser() (gas: 370119)
[PASS] test_liquidateUser_revertsWith_InvalidDebtToCover() (gas: 73984)
[PASS] test_liquidateUser_revertsWith_MustNotLeaveDust_Collateral() (gas: 138326)
[PASS] test_liquidateUser_revertsWith_MustNotLeaveDust_Debt() (gas: 142897)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 34.28ms (1.77ms CPU time)

Ran 3 tests for tests/unit/misc/ExtSload.t.sol:ExtSloadTest
[PASS] test_extSload(bytes32) (runs: 5000, μ: 9767, ~: 9767)
[PASS] test_extSloads(uint256) (runs: 5000, μ: 950498, ~: 926350)
Logs:
  Bound result 812

[PASS] test_extSloads(uint256,bytes) (runs: 5000, μ: 1008159, ~: 970986)
Logs:
  Bound result 362

Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 58.49s (58.49s CPU time)

Ran 8 tests for tests/unit/misc/GatewayBase.t.sol:GatewayBaseTest
[PASS] test_constructor() (gas: 17151)
[PASS] test_registerSpoke_fuzz(address) (runs: 5000, μ: 41629, ~: 41629)
[PASS] test_registerSpoke_revertsWith_InvalidAddress() (gas: 13119)
[PASS] test_registerSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 13791)
[PASS] test_registerSpoke_unregister() (gas: 36076)
[PASS] test_renouncePositionManagerRole() (gas: 65293)
[PASS] test_renouncePositionManagerRole_revertsWith_InvalidAddress() (gas: 74220)
[PASS] test_renouncePositionManagerRole_revertsWith_OwnableUnauthorizedAccount() (gas: 74439)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 379.02ms (355.80ms CPU time)

Ran 5 tests for tests/gas/Gateways.Operations.gas.t.sol:NativeTokenGateway_Gas_Tests
[PASS] test_borrowNative() (gas: 918975)
[PASS] test_repayNative() (gas: 990521)
[PASS] test_supplyAndCollateralNative() (gas: 305221)
[PASS] test_supplyNative() (gas: 286696)
[PASS] test_withdrawNative() (gas: 508824)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 48.45ms (4.33ms CPU time)

Ran 8 tests for tests/gas/Gateways.Operations.gas.t.sol:SignatureGateway_Gas_Tests
[PASS] test_borrowWithSig() (gas: 746237)
[PASS] test_repayWithSig() (gas: 981311)
[PASS] test_setSelfAsUserPositionManagerWithSig() (gas: 209574)
[PASS] test_setUsingAsCollateralWithSig() (gas: 289382)
[PASS] test_supplyWithSig() (gas: 460997)
[PASS] test_updateUserDynamicConfigWithSig() (gas: 145257)
[PASS] test_updateUserRiskPremiumWithSig() (gas: 143188)
[PASS] test_withdrawWithSig() (gas: 409965)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 50.54ms (7.64ms CPU time)

Ran 6 tests for tests/unit/Hub/Hub.Access.t.sol:HubAccessTest
[PASS] test_change_authority() (gas: 206767)
[PASS] test_change_role_responsibility() (gas: 121313)
[PASS] test_hub_access_manager_exposure() (gas: 13439)
[PASS] test_hub_admin_access() (gas: 1350531)
[PASS] test_migrate_role_responsibility() (gas: 709120)
[PASS] test_setInterestRateData_access() (gas: 102744)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 27.62ms (3.76ms CPU time)

Ran 7 tests for tests/unit/Spoke/Spoke.AccrueInterest.t.sol:SpokeAccrueInterestTest
[PASS] test_accrueInterest_NoActionTaken() (gas: 133806)
[PASS] test_accrueInterest_NoInterest_NoDebt(uint40) (runs: 5000, μ: 635358, ~: 635189)
Logs:
  Bound result 9

[PASS] test_accrueInterest_NoInterest_OnlySupply(uint40) (runs: 5000, μ: 250909, ~: 250910)
Logs:
  Bound result 9

[PASS] test_accrueInterest_TenPercentRp(uint256,uint40) (runs: 5000, μ: 580635, ~: 581088)
Logs:
  Bound result 68691281934999
  Bound result 0

[PASS] test_accrueInterest_fuzz_BorrowAmountAndSkipTime(uint256,uint40) (runs: 5000, μ: 539997, ~: 540381)
Logs:
  Bound result 68691281934999
  Bound result 0

[SKIP: pending rft] test_accrueInterest_fuzz_RPBorrowAndSkipTime((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),uint40) (runs: 0, μ: 0, ~: 0)
[PASS] test_accrueInterest_fuzz_RatesRPBorrowAndSkipTime((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint96,uint96,uint96,uint96),uint40) (runs: 5000, μ: 4064638, ~: 4081372)
Logs:
  Bound result 21717
  Bound result 300000000000000000000000000
  Bound result 333
  Bound result 4282083484
  Bound result 10732
  Bound result 1747
  Bound result 13000
  Bound result 2883173673
  Bound result 2941
  Bound result 14518
  Bound result 12788
  Bound result 22121
  Bound result 3862
  Bound result 10732
  Bound result 1747
  Bound result 13000
  Bound result 2883173673

Suite result: ok. 6 passed; 0 failed; 1 skipped; finished in 112.85s (112.82s CPU time)

Ran 8 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidationAmounts.t.sol:LiquidationLogicLiquidationAmountsTest
[PASS] test_calculateLiquidationAmounts_EnoughCollateral() (gas: 169956)
[PASS] test_calculateLiquidationAmounts_InsufficientCollateral() (gas: 170706)
[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_CollateralDust((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 288849, ~: 277846)
Logs:
  Bound result 3
  Bound result 2767
  Bound result 443124196721905572
  Bound result 14843
  Bound result 8
  Bound result 18
  Bound result 13290
  Bound result 5661
  Bound result 1999999999999999997
  Bound result 443124196721905572
  Bound result 9304570613870847
  Bound result 9
  Bound result 999999999999999999999999999997
  Bound result 1000000000000000000000000000
  Bound result 28591
  Bound result 54527
  Bound result 6504484831365108
  Bound result 7
  Bound result 1109
  Bound result 18850239771387979476210927906
  Bound result 0
  Bound result 6504484831365108
  Bound result 26
  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935

[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_NoCollateralDust((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 243677, ~: 232082)
Logs:
  Bound result 3
  Bound result 2767
  Bound result 443124196721905572
  Bound result 14843
  Bound result 8
  Bound result 18
  Bound result 13290
  Bound result 5661
  Bound result 1999999999999999997
  Bound result 443124196721905572
  Bound result 9304570613870847
  Bound result 9
  Bound result 999999999999999999999999999997
  Bound result 1000000000000000000000000000
  Bound result 28591
  Bound result 54527
  Bound result 6504484831365108
  Bound result 7
  Bound result 1109
  Bound result 18850239771387979476210927906
  Bound result 0
  Bound result 18850239771387979476210927906
  Bound result 999999999999999999999999999997

[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_NoDebtLeft((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 262763, ~: 251185)
Logs:
  Bound result 774975171687097701
  Bound result 2537
  Bound result 50000
  Bound result 13461
  Bound result 17
  Bound result 864000000
  Bound result 13461
  Bound result 744
  Bound result 1499999999999999964
  Bound result 50000
  Bound result 6666176345628416
  Bound result 17
  Bound result 22594
  Bound result 99000000000000000000000016083
  Bound result 8807307597410
  Bound result 133
  Bound result 15
  Bound result 6
  Bound result 6
  Bound result 129
  Bound result 0
  Bound result 864000000
  Bound result 13461
  Bound result 744
  Bound result 1499999999999999964
  Bound result 50000
  Bound result 6666176345628416
  Bound result 17
  Bound result 22594
  Bound result 99000000000000000000000016083
  Bound result 8807307597410
  Bound result 133
  Bound result 6666176345628416
  Bound result 3768487189
  Bound result 1000000000000000000000000000130
  Bound result 115792089237316195423570985008687907853269984665640564039457584007241155590200

[PASS] test_calculateLiquidationAmounts_fuzz_InsufficientCollateral((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 248694, ~: 237333)
Logs:
  Bound result 23161
  Bound result 2095
  Bound result 225
  Bound result 10510
  Bound result 15
  Bound result 7900
  Bound result 10510
  Bound result 7346
  Bound result 1000000001728000001
  Bound result 225
  Bound result 10000000000000000
  Bound result 12
  Bound result 1800
  Bound result 99000000000000000000000009996
  Bound result 17999053
  Bound result 51823638
  Bound result 9458
  Bound result 18
  Bound result 7218
  Bound result 11049
  Bound result 2
  Bound result 11049
  Bound result 1800

[PASS] test_calculateLiquidationAmounts_fuzz_revertsWith_MustNotLeaveDust_Collateral((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 271802, ~: 260382)
Logs:
  Bound result 3886412
  Bound result 2
  Bound result 147
  Bound result 12468
  Bound result 6
  Bound result 28951245481117846533722652
  Bound result 12468
  Bound result 3739
  Bound result 1000109044247905327
  Bound result 147
  Bound result 1766670143596910
  Bound result 14
  Bound result 885000589634409638603543244567
  Bound result 45625495039344622427514351693
  Bound result 1
  Bound result 45089934476
  Bound result 9035404749081580
  Bound result 15
  Bound result 274
  Bound result 471071379138868438154450132077
  Bound result 5
  Bound result 9035404749081580
  Bound result 3252684925
  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639935

[PASS] test_calculateLiquidationAmounts_fuzz_revertsWith_MustNotLeaveDust_Debt((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 254609, ~: 242942)
Logs:
  Bound result 774975171687097701
  Bound result 2537
  Bound result 50000
  Bound result 13461
  Bound result 17
  Bound result 864000000
  Bound result 13461
  Bound result 744
  Bound result 1499999999999999964
  Bound result 50000
  Bound result 6666176345628416
  Bound result 17
  Bound result 22594
  Bound result 99000000000000000000000016083
  Bound result 8807307597410
  Bound result 133
  Bound result 15
  Bound result 6
  Bound result 6
  Bound result 129
  Bound result 0
  Bound result 864000000
  Bound result 13461
  Bound result 744
  Bound result 1499999999999999964
  Bound result 50000
  Bound result 6666176345628416
  Bound result 17
  Bound result 22594
  Bound result 99000000000000000000000016083
  Bound result 8807307597410
  Bound result 133
  Bound result 6666176345628416
  Bound result 3768487189

Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 34.62s (34.60s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidationBonus.t.sol:LiquidationLogicLiquidationBonusTest
[PASS] test_calculateLiquidationBonus_MinBonusDueToRounding() (gas: 12488)
[PASS] test_calculateLiquidationBonus_PartialBonus() (gas: 12509)
[PASS] test_calculateLiquidationBonus_fuzz_ConstantBonus(uint256,uint256,uint256,uint256) (runs: 5000, μ: 20339, ~: 20128)
Logs:
  Bound result 7399
  Bound result 4518
  Bound result 0
  Bound result 11208

[PASS] test_calculateLiquidationBonus_fuzz_MaxBonus(uint256,uint256,uint256,uint256) (runs: 5000, μ: 23283, ~: 23072)
Logs:
  Bound result 7399
  Bound result 4518
  Bound result 0
  Bound result 11208
  Bound result 0

Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.17s (1.15s CPU time)

Ran 11 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.ValidateLiquidationCall.t.sol:LiquidationLogicValidateLiquidationCallTest
[PASS] test_validateLiquidationCall() (gas: 26036)
[PASS] test_validateLiquidationCall_revertsWith_CannotReceiveShares() (gas: 259738)
[PASS] test_validateLiquidationCall_revertsWith_HealthFactorNotBelowThreshold() (gas: 31769)
[PASS] test_validateLiquidationCall_revertsWith_InvalidDebtToCover() (gas: 26861)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotBorrowed() (gas: 26980)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotEnabledAsCollateral_NotUsingAsCollateral() (gas: 27033)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotEnabledAsCollateral_ZeroCollateralFactor() (gas: 27018)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotSupplied() (gas: 26947)
[PASS] test_validateLiquidationCall_revertsWith_ReservePaused_CollateralPaused() (gas: 31989)
[PASS] test_validateLiquidationCall_revertsWith_ReservePaused_DebtPaused() (gas: 31989)
[PASS] test_validateLiquidationCall_revertsWith_SelfLiquidation() (gas: 33724)
Suite result: ok. 11 passed; 0 failed; 0 skipped; finished in 25.38ms (1.37ms CPU time)

Ran 28 tests for tests/unit/MathUtils.t.sol:MathUtilsTest
[PASS] test_add_edge_cases() (gas: 4679)
[PASS] test_add_negative_operand(uint256,int256) (runs: 5000, μ: 9073, ~: 8834)
Logs:
  Bound result -57896044618658097711785492504343953926634992332820282013197946218740589849150

[PASS] test_add_positive_operand(uint256,int256) (runs: 5000, μ: 3920, ~: 3916)
[PASS] test_calculateLinearInterest() (gas: 4368)
[PASS] test_calculateLinearInterest_add_edge() (gas: 4890)
[PASS] test_calculateLinearInterest_edge_cases() (gas: 16246)
Logs:
  Bound result 0
  Bound result 1
  Bound result 864000000
  Bound result 864000000

[PASS] test_calculateLinearInterest_reverts_on_past_timestamp(uint40) (runs: 5000, μ: 7543, ~: 7381)
Logs:
  Bound result 9

[PASS] test_constants() (gas: 3110)
[PASS] test_fuzz_calculateLinearInterest(uint96,uint40,uint256) (runs: 5000, μ: 8584, ~: 8824)
Logs:
  Bound result 10765498

[PASS] test_fuzz_divUp(uint256,uint256) (runs: 5000, μ: 3540, ~: 3544)
[PASS] test_fuzz_mulDivDown(uint256,uint256,uint256) (runs: 5000, μ: 3515, ~: 3577)
[PASS] test_fuzz_mulDivUp(uint256,uint256,uint256) (runs: 5000, μ: 3595, ~: 3724)
[PASS] test_min(uint256,uint256) (runs: 5000, μ: 3281, ~: 3282)
[PASS] test_mulDivDown_NoRemainder() (gas: 3223)
[PASS] test_mulDivDown_RevertOnDivByZero() (gas: 3107)
[PASS] test_mulDivDown_RevertOnOverflow() (gas: 3183)
[PASS] test_mulDivDown_WithRemainder() (gas: 3268)
[PASS] test_mulDivDown_ZeroAOrB() (gas: 3721)
[PASS] test_mulDivUp_NoRemainder() (gas: 3249)
[PASS] test_mulDivUp_RevertOnDivByZero() (gas: 3084)
[PASS] test_mulDivUp_RevertOnOverflow() (gas: 3140)
[PASS] test_mulDivUp_WithRemainder() (gas: 3248)
[PASS] test_mulDivUp_ZeroAOrB() (gas: 3792)
[PASS] test_signedSub(uint256,uint256) (runs: 5000, μ: 8597, ~: 8530)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_signedSub_revertsWith_SafeCastOverflowedUintToInt(uint256) (runs: 5000, μ: 7653, ~: 7702)
Logs:
  Bound result 57896044618658097711785492504343953926634992332820282019728792007080608788105

[PASS] test_uncheckedAdd(uint256,uint256) (runs: 5000, μ: 3447, ~: 3438)
[PASS] test_uncheckedExp(uint256,uint256) (runs: 5000, μ: 12524, ~: 9822)
[PASS] test_uncheckedSub(uint256,uint256) (runs: 5000, μ: 3444, ~: 3526)
Suite result: ok. 28 passed; 0 failed; 0 skipped; finished in 2.57s (2.56s CPU time)

Ran 5 tests for tests/unit/Spoke/Spoke.AccrueLiquidityFee.EdgeCases.t.sol:SpokeAccrueLiquidityFeeEdgeCasesTest
[PASS] test_accrueLiquidityFee_fuzz_maxLiquidityFee_with_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 545657, ~: 545713)
Logs:
  Bound result 8605
  Bound result 480000000
  Bound result 2
  Bound result 1620

[PASS] test_accrueLiquidityFee_fuzz_maxLiquidityFee_with_premium_multiple_users(uint256,uint256,uint256,uint256,uint256) (runs: 5000, μ: 804734, ~: 804838)
Logs:
  Bound result 5192
  Bound result 480000000
  Bound result 0
  Bound result 2410897463
  Bound result 2078

[PASS] test_accrueLiquidityFee_maxLiquidityFee_multi_spoke() (gas: 646196266)
[PASS] test_accrueLiquidityFee_maxLiquidityFee_multi_user() (gas: 264093623)
[PASS] test_accrueLiquidityFee_maxLiquidityFee_with_premium() (gas: 545775)
Logs:
  Bound result 5000
  Bound result 34560000
  Bound result 2
  Bound result 500000000000000000000

Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 18.66s (18.63s CPU time)

Ran 19 tests for tests/unit/Hub/Hub.Add.t.sol:HubAddTest
[PASS] test_add_AddCapReachedButNotExceeded_rounding() (gas: 668181)
[PASS] test_add_fuzz_AddCapReachedButNotExceeded(uint40) (runs: 5000, μ: 157968, ~: 157925)
Logs:
  Bound result 9

[PASS] test_add_fuzz_multi_asset_multi_spoke(uint256,uint256,uint256) (runs: 5000, μ: 332902, ~: 333062)
Logs:
  Bound result 3
  Bound result 218470873395738003579119570309
  Bound result 446067553769140138733721804

[PASS] test_add_fuzz_revertsWith_AddCapExceeded(uint40) (runs: 5000, μ: 112502, ~: 112459)
Logs:
  Bound result 9

[PASS] test_add_fuzz_revertsWith_AddCapExceeded_due_to_interest(uint40,uint256,uint256) (runs: 5000, μ: 267241, ~: 267105)
Logs:
  Bound result 1291
  Bound result 1071208440522043736492
  Bound result 173721804

[PASS] test_add_fuzz_revertsWith_InvalidShares_due_to_index(uint256,uint256,uint256) (runs: 5000, μ: 224010, ~: 224207)
Logs:
  Bound result 50307381161209666554742152363
  Bound result 3122064051
  Bound result 4

[PASS] test_add_fuzz_single_asset(uint256,address,uint256) (runs: 5000, μ: 342659, ~: 342679)
Logs:
  Bound result 0
  Bound result 1100000000000000000000000000

[PASS] test_add_fuzz_single_spoke_multi_add(uint256,uint256) (runs: 5000, μ: 807017, ~: 807046)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_add_multi_add_minimal_shares() (gas: 323059)
[PASS] test_add_revertsWith_AmountDowncastOverflow() (gas: 360394)
[PASS] test_add_revertsWith_InsufficientTransferred() (gas: 64526)
[PASS] test_add_revertsWith_InvalidAmount() (gas: 13653)
[PASS] test_add_revertsWith_InvalidShares() (gas: 223546)
[PASS] test_add_revertsWith_SharesDowncastOverflow() (gas: 224393)
[PASS] test_add_revertsWith_SpokeHalted() (gas: 99793)
[PASS] test_add_revertsWith_SpokeNotActive() (gas: 99829)
[PASS] test_add_single_asset() (gas: 330528)
Logs:
  Bound result 2
  Bound result 100000000000000000000

[PASS] test_add_with_increased_index() (gas: 301741)
[PASS] test_add_with_increased_index_with_premium() (gas: 681784)
Suite result: ok. 19 passed; 0 failed; 0 skipped; finished in 43.49s (43.46s CPU time)

Ran 7 tests for tests/unit/Spoke/Spoke.AccrueLiquidityFee.t.sol:SpokeAccrueLiquidityFeeTest
[PASS] test_accrueLiquidityFee() (gas: 863810)
[PASS] test_accrueLiquidityFee_NoActionTaken() (gas: 122780)
[PASS] test_accrueLiquidityFee_NoInterest_OnlySupply(uint40) (runs: 5000, μ: 245889, ~: 245841)
Logs:
  Bound result 9

[PASS] test_accrueLiquidityFee_exact() (gas: 869729)
[PASS] test_accrueLiquidityFee_fuzz_BorrowAmountAndSkipTime(uint256,uint40) (runs: 5000, μ: 941444, ~: 963426)
Logs:
  Bound result 68691281934999
  Bound result 0

[PASS] test_accrueLiquidityFee_maxLiquidityFee() (gas: 546614)
[PASS] test_accrueLiquidityFee_setUsingAsCollateral() (gas: 895826)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 18.84s (18.82s CPU time)

Ran 40 tests for tests/unit/misc/NativeTokenGateway.t.sol:NativeTokenGatewayTest
[PASS] test_borrowNative() (gas: 664849)
Logs:
  Bound result 5000000000000000000

[PASS] test_borrowNative_fuzz(uint256) (runs: 5000, μ: 664251, ~: 665180)
Logs:
  Bound result 3124043968137

[PASS] test_borrowNative_revertsWith_InvalidAmount() (gas: 32382)
[PASS] test_borrowNative_revertsWith_NotNativeWrappedAsset() (gas: 32457)
[PASS] test_borrowNative_revertsWith_ReentrancyGuardReentrantCall_hubDraw() (gas: 283081)
[PASS] test_borrowNative_revertsWith_ReentrancyGuardReentrantCall_spokeBorrow() (gas: 271138)
[PASS] test_borrowNative_revertsWith_SpokeNotRegistered() (gas: 25340)
[PASS] test_constructor() (gas: 12715)
[PASS] test_constructor_revertsWith_InvalidAddress() (gas: 5958)
[PASS] test_fallback_revertsWith_UnsupportedAction() (gas: 17616)
[PASS] test_receive_revertsWith_UnsupportedAction() (gas: 17408)
[PASS] test_repayNative() (gas: 758803)
Logs:
  Bound result 5000000000000000000

[PASS] test_repayNative_excessAmount() (gas: 667334)
[PASS] test_repayNative_fuzz(uint256) (runs: 5000, μ: 754317, ~: 759362)
Logs:
  Bound result 3124043968137

[PASS] test_repayNative_fuzz_withInterest(uint256,uint256) (runs: 5000, μ: 678102, ~: 673413)
Logs:
  Bound result 90000068691281935000
  Bound result 25920101

[PASS] test_repayNative_revertsWith_InvalidAmount() (gas: 32463)
[PASS] test_repayNative_revertsWith_NativeAmountMismatch() (gas: 30030)
[PASS] test_repayNative_revertsWith_NotNativeWrappedAsset() (gas: 39231)
[PASS] test_repayNative_revertsWith_ReentrancyGuardReentrantCall_hubRestore() (gas: 326643)
[PASS] test_repayNative_revertsWith_ReentrancyGuardReentrantCall_spokeRepay() (gas: 303479)
[PASS] test_repayNative_revertsWith_SpokeNotRegistered() (gas: 38728)
[PASS] test_supplyAndCollateralNative() (gas: 333513)
Logs:
  Bound result 100000000000000000000

[PASS] test_supplyAndCollateralNative_fuzz(uint256) (runs: 5000, μ: 333827, ~: 333541)
Logs:
  Bound result 3124043968137

[PASS] test_supplyNative() (gas: 305229)
Logs:
  Bound result 100000000000000000000

[PASS] test_supplyNative_fuzz(uint256) (runs: 5000, μ: 305542, ~: 305256)
Logs:
  Bound result 3124043968137

[PASS] test_supplyNative_revertsWith_InvalidAmount() (gas: 32417)
[PASS] test_supplyNative_revertsWith_NativeAmountMismatch() (gas: 30014)
[PASS] test_supplyNative_revertsWith_NotNativeWrappedAsset() (gas: 39197)
[PASS] test_supplyNative_revertsWith_ReentrancyGuardReentrantCall_hubAdd() (gas: 374220)
[PASS] test_supplyNative_revertsWith_ReentrancyGuardReentrantCall_spokeSupply() (gas: 336133)
[PASS] test_supplyNative_revertsWith_SpokeNotRegistered() (gas: 38740)
[PASS] test_withdrawNative() (gas: 331906)
Logs:
  Bound result 100000000000000000000

[PASS] test_withdrawNative_fuzz(uint256) (runs: 5000, μ: 331509, ~: 331978)
Logs:
  Bound result 3124043968137

[PASS] test_withdrawNative_fuzz_allBalance(uint256) (runs: 5000, μ: 268073, ~: 267872)
Logs:
  Bound result 3124043968137

[PASS] test_withdrawNative_fuzz_allBalanceWithInterest(uint256,uint256) (runs: 5000, μ: 615661, ~: 615596)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_withdrawNative_revertsWith_InvalidAmount() (gas: 32479)
[PASS] test_withdrawNative_revertsWith_NotNativeWrappedAsset() (gas: 32512)
[PASS] test_withdrawNative_revertsWith_ReentrancyGuardReentrantCall_hubRemove() (gas: 300032)
[PASS] test_withdrawNative_revertsWith_ReentrancyGuardReentrantCall_spokeWithdraw() (gas: 271200)
[PASS] test_withdrawNative_revertsWith_SpokeNotRegistered() (gas: 25395)
Suite result: ok. 40 passed; 0 failed; 0 skipped; finished in 63.95s (63.93s CPU time)

Ran 3 tests for tests/unit/NoncesKeyed.t.sol:NoncesKeyedTest
[PASS] test_useCheckedNonce_monotonic(bytes32) (runs: 5000, μ: 12863, ~: 12863)
[PASS] test_useCheckedNonce_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 95268, ~: 94363)
[PASS] test_useNonce_monotonic(bytes32) (runs: 5000, μ: 13531, ~: 13531)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.88s (3.88s CPU time)

Ran 10 tests for tests/unit/PercentageMath.t.sol:PercentageMathTests
[PASS] test_constants() (gas: 8604)
[PASS] test_fromBpsDown() (gas: 9654)
[PASS] test_percentDiv() (gas: 14993)
[PASS] test_percentDivUp_ge_value(uint256,uint256) (runs: 5000, μ: 15133, ~: 15261)
Logs:
  Bound result 100
  Bound result 68691281934999

[PASS] test_percentDivUp_le_value(uint256,uint256) (runs: 5000, μ: 15344, ~: 15347)
Logs:
  Bound result 90101
  Bound result 68691281934999

[PASS] test_percentDiv_fuzz(uint256,uint256) (runs: 5000, μ: 12605, ~: 12760)
[PASS] test_percentMul() (gas: 14932)
[PASS] test_percentMulUp_ge_value(uint256,uint256) (runs: 5000, μ: 15327, ~: 15330)
Logs:
  Bound result 90101
  Bound result 68691281934999

[PASS] test_percentMulUp_le_value(uint256,uint256) (runs: 5000, μ: 15136, ~: 15264)
Logs:
  Bound result 100
  Bound result 68691281934999

[PASS] test_percentMul_fuzz(uint256,uint256) (runs: 5000, μ: 11534, ~: 12063)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 1.47s (1.47s CPU time)

Ran 5 tests for tests/unit/Spoke/Spoke.Borrow.EdgeCases.t.sol:SpokeBorrowEdgeCasesTest
[PASS] test_borrow_fuzz_rounding_effect(uint256,uint256) (runs: 5000, μ: 1044807, ~: 1044911)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_borrow_fuzz_rounding_effect_inflated_ex_rate(uint256,uint256,uint256) (runs: 5000, μ: 1419074, ~: 1419151)
Logs:
  Bound result 27257054966227893237470
  Bound result 597204094553485843412451
  Bound result 31536002

[PASS] test_borrow_fuzz_rounding_effect_shares(uint256,uint256) (runs: 5000, μ: 1087329, ~: 1087078)
Logs:
  Bound result 68691281934999
  Bound result 832464101

[PASS] test_borrow_rounding_effect_multiple_actions() (gas: 1148473)
[PASS] test_borrow_rounding_effect_shares() (gas: 1086340)
Logs:
  Bound result 5000000000000000000
  Bound result 94608000

Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 56.65s (56.62s CPU time)

Ran 38 tests for tests/unit/Hub/Hub.Config.t.sol:HubConfigTest
[PASS] test_addAsset_fuzz(address,uint8,address) (runs: 5000, μ: 390565, ~: 390604)
Logs:
  Bound result 18

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_feeReceiver(address,uint8,address) (runs: 5000, μ: 45311, ~: 45014)
Logs:
  Bound result 1

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_irStrategy(address,uint8,address) (runs: 5000, μ: 45354, ~: 45057)
Logs:
  Bound result 1

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_underlying(uint8,address,address) (runs: 5000, μ: 36741, ~: 36741)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals(address,uint8,address,address) (runs: 5000, μ: 45966, ~: 46008)
Logs:
  Bound result 36

[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals_tooLow(address,uint8,address,address) (runs: 5000, μ: 46042, ~: 46330)
Logs:
  Bound result 0

[PASS] test_addAsset_fuzz_reverts_InvalidIrData(address,uint8,address,address) (runs: 5000, μ: 80332735076, ~: 34985)
Logs:
  Bound result 17

[PASS] test_addAsset_revertsWith_BlockTimestampDowncastOverflow() (gas: 956656)
[PASS] test_addAsset_revertsWith_DrawnRateDowncastOverflow() (gas: 953792)
[PASS] test_addAsset_reverts_UnderlyingAlreadyListed() (gas: 49024)
[PASS] test_addSpoke_fuzz(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 126720, ~: 126770)
Logs:
  Bound result 2

[PASS] test_addSpoke_fuzz_revertsWith_AssetNotListed(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 35268, ~: 35257)
Logs:
  Bound result 13856

[PASS] test_addSpoke_fuzz_revertsWith_InvalidAddress_spoke(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 33951, ~: 34001)
Logs:
  Bound result 2

[PASS] test_addSpoke_revertsWith_SpokeAlreadyListed() (gas: 39795)
[PASS] test_getAssetId() (gas: 73292)
[PASS] test_getAssetId_fuzz_revertsWith_AssetNotListed(address) (runs: 5000, μ: 18583, ~: 18583)
[PASS] test_hub_deploy_reverts_on_InvalidConstructorInput() (gas: 828841)
[PASS] test_hub_max_riskPremium() (gas: 8632)
[PASS] test_isUnderlyingListed() (gas: 1178468)
[PASS] test_updateAssetConfig_NewFeeReceiver_noFees() (gas: 720283)
[PASS] test_updateAssetConfig_NewFeeReceiver_revertsWith_SpokeNotActive_noFees() (gas: 619462)
[PASS] test_updateAssetConfig_UseExistingSpokeAndListedAsFeeReceiver_revertsWith_SpokeAlreadyListed() (gas: 70774)
[PASS] test_updateAssetConfig_fuzz(uint256,(address,uint16,address,address)) (runs: 5000, μ: 269779, ~: 270082)
Logs:
  Bound result 0
  Bound result 674

[PASS] test_updateAssetConfig_fuzz_FromZeroLiquidityFee(uint256,uint16) (runs: 5000, μ: 824062, ~: 823921)
Logs:
  Bound result 3
  Bound result 1
  Bound result 3
  Bound result 0
  Bound result 3
  Bound result 1

[PASS] test_updateAssetConfig_fuzz_LiquidityFee(uint256,uint16) (runs: 5000, μ: 726180, ~: 726039)
Logs:
  Bound result 3
  Bound result 1
  Bound result 3
  Bound result 1

[PASS] test_updateAssetConfig_fuzz_NewFeeReceiver(uint256) (runs: 5000, μ: 825154, ~: 825187)
Logs:
  Bound result 3
  Bound result 3
  Bound result 1000

[PASS] test_updateAssetConfig_fuzz_NewInterestRateStrategy(uint256) (runs: 5000, μ: 699336, ~: 699369)
Logs:
  Bound result 3

[PASS] test_updateAssetConfig_fuzz_ReuseFeeReceiver_revertsWith_SpokeAlreadyListed(uint256) (runs: 5000, μ: 876920, ~: 876953)
Logs:
  Bound result 3
  Bound result 3
  Bound result 3
  Bound result 1000

[PASS] test_updateAssetConfig_fuzz_Scenario(uint256) (runs: 5000, μ: 703457, ~: 703509)
Logs:
  Bound result 3
  Bound result 3
  Bound result 1000
  Bound result 3
  Bound result 1000
  Bound result 3
  Bound result 0
  Bound result 3
  Bound result 0
  Bound result 3
  Bound result 0
  Bound result 3
  Bound result 0

[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidInterestRateStrategy(uint256) (runs: 5000, μ: 61150, ~: 61202)
Logs:
  Bound result 3

[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidLiquidityFee(uint256,(address,uint16,address,address)) (runs: 5000, μ: 40191, ~: 40086)
Logs:
  Bound result 0
  Bound result 674

[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidReinvestmentController() (gas: 485928)
[PASS] test_updateAssetConfig_fuzz_revertsWith_calculateInterestRateReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 198914, ~: 199339)
Logs:
  Bound result 4
  Bound result 15

[PASS] test_updateAssetConfig_fuzz_revertsWith_setInterestRateDataReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 96000, ~: 96359)
Logs:
  Bound result 0
  Bound result 7899

[PASS] test_updateAssetConfig_oldFeeReceiver_flags() (gas: 882928)
Logs:
  Bound result 1
  Bound result 500
  Bound result 3
  Bound result 1000
  Bound result 5
  Bound result 500
  Bound result 3
  Bound result 1000

[PASS] test_updateSpokeConfig_fuzz(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 59291, ~: 59350)
Logs:
  Bound result 0

[PASS] test_updateSpokeConfig_fuzz_revertsWith_SpokeNotListed(uint256,address,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 40569, ~: 40636)
Logs:
  Bound result 3

[PASS] test_updateSpokeConfig_revertsWith_AssetNotListed() (gas: 29683)
Suite result: ok. 38 passed; 0 failed; 0 skipped; finished in 93.60s (93.58s CPU time)

Ran 16 tests for tests/unit/Hub/Hub.Draw.t.sol:HubDrawTest
[PASS] test_draw_DifferentSpokes() (gas: 355839)
[PASS] test_draw_fuzz_IncreasedBorrowRate(uint256,uint256) (runs: 5000, μ: 697967, ~: 698100)
Logs:
  Bound result 3
  Bound result 100

[PASS] test_draw_fuzz_amounts_same_block(uint256,uint256) (runs: 5000, μ: 289874, ~: 289897)
Logs:
  Bound result 3
  Bound result 100

[PASS] test_draw_fuzz_revertsWith_DrawCapExceeded(uint40) (runs: 5000, μ: 82417, ~: 82372)
Logs:
  Bound result 9

[PASS] test_draw_fuzz_revertsWith_DrawCapExceeded_due_to_interest(uint40,uint256,uint256) (runs: 5000, μ: 287274, ~: 287522)
Logs:
  Bound result 1291
  Bound result 70309
  Bound result 173721804

[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity(uint256,uint256) (runs: 5000, μ: 34801, ~: 34578)
Logs:
  Bound result 3
  Bound result 100

[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity_due_to_draw(uint256) (runs: 5000, μ: 172891, ~: 172602)
Logs:
  Bound result 3124043968137

[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity_due_to_remove(uint256) (runs: 5000, μ: 134587, ~: 134384)
Logs:
  Bound result 3124043968137

[PASS] test_draw_fuzz_revertsWith_InvalidAddress(uint256) (runs: 5000, μ: 16160, ~: 16160)
[PASS] test_draw_revertsWith_DrawCapExceeded_due_to_deficit() (gas: 270631)
[PASS] test_draw_revertsWith_InsufficientLiquidity() (gas: 28333)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_draw() (gas: 169213)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_remove() (gas: 131720)
[PASS] test_draw_revertsWith_InvalidAmount() (gas: 16291)
[PASS] test_draw_revertsWith_SpokeHalted() (gas: 61540)
[PASS] test_draw_revertsWith_SpokeNotActive() (gas: 61479)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 22.82s (22.79s CPU time)

Ran 8 tests for tests/unit/Hub/Hub.EliminateDeficit.t.sol:HubEliminateDeficitTest
[PASS] test_eliminateDeficit(uint256) (runs: 5000, μ: 665787, ~: 665787)
[PASS] test_eliminateDeficit_fuzz_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 32580, ~: 32580)
[PASS] test_eliminateDeficit_fuzz_revertsWith_ArithmeticUnderflow_CallerSpokeNoFunds(uint256) (runs: 5000, μ: 352943, ~: 352943)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountNoDeficit() (gas: 36025)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountWithDeficit() (gas: 349118)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_on_UnregisteredCoveredSpoke() (gas: 36412)
[PASS] test_eliminateDeficit_revertsWith_SpokeNotActive_on_UnregisteredAsset() (gas: 384984)
[PASS] test_eliminateDeficit_revertsWith_callerSpokeNotActive() (gas: 159478)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 16.24s (16.21s CPU time)

Ran 6 tests for tests/unit/Hub/Hub.MintFeeShares.t.sol:HubMintFeeSharesTest
[PASS] test_mintFeeShares() (gas: 312577)
[PASS] test_mintFeeShares_noFees() (gas: 368598)
[PASS] test_mintFeeShares_noShares() (gas: 293708)
[PASS] test_mintFeeShares_revertsWith_AccessManagedUnauthorized() (gas: 24161)
[PASS] test_mintFeeShares_revertsWith_AssetNotListed() (gas: 27597)
[PASS] test_mintFeeShares_revertsWith_SpokeNotActive() (gas: 242950)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 27.85ms (3.90ms CPU time)

Ran 9 tests for tests/gas/Hub.Operations.gas.t.sol:HubOperations_Gas_Tests
[PASS] test_add() (gas: 270152)
[PASS] test_deficit() (gas: 1343369)
[PASS] test_draw() (gas: 418619)
[PASS] test_mintFeeShares() (gas: 500011)
[PASS] test_payFee_transferShares() (gas: 969152)
[PASS] test_refreshPremium() (gas: 635566)
[PASS] test_remove() (gas: 310730)
[PASS] test_restore() (gas: 879000)
[PASS] test_restore_with_transfer() (gas: 879665)
Suite result: ok. 9 passed; 0 failed; 0 skipped; finished in 50.21ms (7.05ms CPU time)

Ran 6 tests for tests/unit/Hub/Hub.PayFee.t.sol:HubPayFeeTest
[PASS] test_payFee_fuzz(uint256,uint256) (runs: 5000, μ: 704968, ~: 705130)
Logs:
  Bound result 68691281934999
  Bound result 0
  Bound result 100

[PASS] test_payFee_fuzz_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 705419, ~: 705678)
Logs:
  Bound result 615514462186775432459
  Bound result 10765498
  Bound result 571193127101173104469

[PASS] test_payFee_revertsWith_InvalidShares() (gas: 20378)
[PASS] test_payFee_revertsWith_SpokeNotActive() (gas: 61478)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded() (gas: 138839)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded_with_interest() (gas: 644322)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 24.69s (24.67s CPU time)

Ran 8 tests for tests/unit/Spoke/Spoke.Repay.Scenario.t.sol:SpokeRepayScenarioTest
[PASS] test_fuzz_repay_borrow_twice_repay_twice((uint256,uint256,uint256,uint40),(uint256,uint256,uint256,uint40)) (runs: 5000, μ: 1264136, ~: 1268819)
Logs:
  Bound result 8075
  Bound result 5802
  Bound result 650000000000000000
  Bound result 7355
  Bound result 3207
  Bound result 1359

[PASS] test_fuzz_repay_multiple_users_repay_same_reserve((uint256,uint256,uint256,uint256,uint256,uint256,address),(uint256,uint256,uint256,uint256,uint256,uint256,address),(uint256,uint256,uint256,uint256,uint256,uint256,address),uint256) (runs: 5000, μ: 2030429, ~: 2003175)
Logs:
  Bound result 16647
  Bound result 750000000000000000000
  Bound result 300000000
  Bound result 22163329580580053030292883849319169862539958002407764210677428189014622470144
  Bound result 12
  Bound result 1650000000000000000
  Bound result 10870

[PASS] test_repay_fuzz_multiple_users_multiple_assets(((uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),address),((uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),address),((uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),address),uint40) (runs: 5000, μ: 6078711, ~: 6079049)
Logs:
  Bound result 959
  Bound result 1000000000000000000000000
  Bound result 1922
  Bound result 6694669304376546645
  Bound result 2500000000000000000000000000
  Bound result 216
  Bound result 5880
  Bound result 184
  Bound result 16356
  Bound result 5000000000000000000000
  Bound result 1313373040
  Bound result 7370
  Bound result 7900
  Bound result 9500000000000000000000
  Bound result 115792089237316195423570985008687907853268660629941637658412308731349178515455
  Bound result 3960978175
  Bound result 25
  Bound result 868
  Bound result 15747
  Bound result 20000
  Bound result 31536000
  Bound result 36
  Bound result 15994
  Bound result 14463
  Bound result 9194

[PASS] test_repay_fuzz_two_users_multiple_assets(((uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),address),((uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256,uint256),address),uint40) (runs: 5000, μ: 4304280, ~: 4304538)
Logs:
  Bound result 2737
  Bound result 18797
  Bound result 125000000000000000
  Bound result 2514000704
  Bound result 75000000000000000000000
  Bound result 10600
  Bound result 865400000000000000
  Bound result 6475428764062804054662965942040014206648146154691041327599977797135663890432
  Bound result 13052238805970149254
  Bound result 255
  Bound result 76383244052398080
  Bound result 7233
  Bound result 14339
  Bound result 1500000000000000000000000000
  Bound result 1261
  Bound result 1000000000000
  Bound result 620714319

[PASS] test_repay_partial_then_max() (gas: 694857)
[PASS] test_repay_round_trip_borrow_repay(uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 873092, ~: 876766)
Logs:
  Bound result 1
  Bound result 15825424457171755824
  Bound result 598500474
  Bound result 27788100152337903433

[PASS] test_repay_round_trip_repay_borrow(uint256,uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 955096, ~: 964407)
Logs:
  Bound result 4
  Bound result 498442923041485999192836417641
  Bound result 59930
  Bound result 78068812150638529
  Bound result 222303524690281680401

[PASS] test_repay_two_users_repay_same_reserve((uint256,uint256,uint256,uint256,uint256,uint256,address),(uint256,uint256,uint256,uint256,uint256,uint256,address),uint256) (runs: 5000, μ: 1467541, ~: 1497505)
Logs:
  Bound result 5401549876140600956580819487
  Bound result 65251468040295843421393
  Bound result 11263328023241632836759
  Bound result 7707153379656042561281651440489383780992440
  Bound result 681445185

Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 301.53s (301.51s CPU time)

Ran 2 tests for tests/unit/Spoke/Spoke.Repay.Validation.t.sol:SpokeRepayValidationTest
[PASS] test_repay_revertsWith_ReserveNotListed() (gas: 23228)
[PASS] test_repay_revertsWith_ReservePaused() (gas: 63748)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 23.88ms (370.99µs CPU time)

Ran 11 tests for tests/unit/Hub/Hub.Reclaim.t.sol:HubReclaimTest
[PASS] test_reclaim() (gas: 653091)
Logs:
  Bound result 1000000000000000000000
  Bound result 500000000000000000000
  Bound result 200000000000000000000

[PASS] test_reclaim_fullAmount() (gas: 635471)
[PASS] test_reclaim_fuzz(uint256,uint256,uint256) (runs: 5000, μ: 654786, ~: 654032)
Logs:
  Bound result 615514462186775432459
  Bound result 571193127101173104469
  Bound result 564283877115702805413

[PASS] test_reclaim_multipleSweepsAndReclaims() (gas: 744162)
[PASS] test_reclaim_revertsWith_AssetNotListed() (gas: 13137)
[PASS] test_reclaim_revertsWith_InsufficientTransferred() (gas: 456684)
[PASS] test_reclaim_revertsWith_InsufficientTransferred_noSwept() (gas: 102650)
[PASS] test_reclaim_revertsWith_InvalidAmount_zero() (gas: 92798)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController(address) (runs: 5000, μ: 93681, ~: 93681)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController_init() (gas: 40560)
[PASS] test_reclaim_revertsWith_underflow_exceedsSwept_afterSweep() (gas: 620053)
Suite result: ok. 11 passed; 0 failed; 0 skipped; finished in 14.50s (14.48s CPU time)

Ran 17 tests for tests/unit/Spoke/Spoke.Borrow.HealthFactor.t.sol:SpokeBorrowHealthFactorTest
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_collateral_price_drop(uint256,uint256) (runs: 5000, μ: 911884, ~: 911859)
Logs:
  Bound result 100
  Bound result 68691281934999

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls(uint256,uint256) (runs: 5000, μ: 858286, ~: 858730)
Logs:
  Bound result 8711
  Bound result 19265

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 895104, ~: 895184)
Logs:
  Bound result 11500
  Bound result 10600
  Bound result 8500

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts(uint256,uint256) (runs: 5000, μ: 1100483, ~: 1100715)
Logs:
  Bound result 99999999999068691281935000
  Bound result 99999999999000000000000101

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 1140149, ~: 1140276)
Logs:
  Bound result 9456
  Bound result 200000000000000000
  Bound result 12901

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_with_interest(uint256,uint256) (runs: 5000, μ: 674639, ~: 674814)
Logs:
  Bound result 3064
  Bound result 640000000

[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold() (gas: 641971)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_collateral_price_drop_weth() (gas: 906109)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls() (gas: 852511)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai() (gas: 1126398)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth() (gas: 1126442)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest() (gas: 890171)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts() (gas: 1092955)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest() (gas: 1131941)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_with_interest() (gas: 669520)
[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai(uint256,uint256,uint256) (runs: 5000, μ: 1130556, ~: 1130923)
Logs:
  Bound result 100000000
  Bound result 16810
  Bound result 14076

[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth(uint256,uint256,uint256) (runs: 5000, μ: 1131024, ~: 1130945)
Logs:
  Bound result 100000000
  Bound result 16810
  Bound result 14076

Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 120.07s (120.05s CPU time)

Ran 12 tests for tests/unit/Hub/Hub.RefreshPremium.t.sol:HubRefreshPremiumTest
[PASS] test_refreshPremium_emitsEvent() (gas: 255123)
[PASS] test_refreshPremium_fuzz_positiveDeltas(uint256,int256,int256) (runs: 5000, μ: 489535, ~: 494870)
Logs:
  Bound result 999999999910000000000000000001
  Bound result 1
  Bound result 2569

[PASS] test_refreshPremium_fuzz_withAccrual(uint256,uint256,uint256,uint256) (runs: 5000, μ: 467490, ~: 476687)
Logs:
  Bound result 900
  Bound result 98
  Bound result 7500000000000000000000000000
  Bound result 9072

[PASS] test_refreshPremium_haltedSpokesAllowed() (gas: 121584)
[PASS] test_refreshPremium_maxRiskPremiumThreshold() (gas: 899836)
[PASS] test_refreshPremium_negativeDeltas(uint256) (runs: 5000, μ: 459588, ~: 460134)
Logs:
  Bound result 3124043968137

[PASS] test_refreshPremium_negativeDeltas_withAccrual(uint256) (runs: 5000, μ: 529967, ~: 530187)
Logs:
  Bound result 3124043968137

[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_NonZeroRestoredPremiumRay() (gas: 855134)
[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_RiskPremiumThresholdExceeded_DecreasingPremium() (gas: 876689)
[PASS] test_refreshPremium_revertsWith_SpokeNotActive() (gas: 59009)
[PASS] test_refreshPremium_riskPremiumThreshold() (gas: 922058)
[PASS] test_refreshPremium_spokePremiumUpdateIsContained() (gas: 709226)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 20.05s (20.03s CPU time)

Ran 32 tests for tests/unit/libraries/PositionStatusMap.t.sol:PositionStatusMapTest
[PASS] test_borrowCount() (gas: 108134)
[PASS] test_borrowCount(uint256) (runs: 5000, μ: 1917163, ~: 1758187)
Logs:
  Bound result 812

[PASS] test_borrowCount_ignoresInvalidBits() (gas: 122795)
[PASS] test_bucketId() (gas: 8922)
[PASS] test_collateralCount() (gas: 108082)
[PASS] test_collateralCount(uint256) (runs: 5000, μ: 1932784, ~: 1774211)
Logs:
  Bound result 812

[PASS] test_collateralCount_ignoresInvalidBits() (gas: 122986)
[PASS] test_constants() (gas: 44556)
[PASS] test_fls() (gas: 509035)
[PASS] test_fromBitId(uint256,uint256) (runs: 5000, μ: 14040, ~: 14336)
Logs:
  Bound result 151
  Bound result 100

[PASS] test_fuzz_setBorrowing(uint256,bool) (runs: 5000, μ: 22255, ~: 32137)
[PASS] test_fuzz_setUseAsCollateral(uint256,bool) (runs: 5000, μ: 22307, ~: 32189)
[PASS] test_getBucketWord(uint256) (runs: 5000, μ: 14179, ~: 14179)
[PASS] test_isUsingAsCollateralOrBorrowing_slot0() (gas: 108352)
[PASS] test_isUsingAsCollateralOrBorrowing_slot1() (gas: 43997)
[PASS] test_isolateBorrowing(uint256) (runs: 5000, μ: 153030, ~: 153030)
[PASS] test_isolateBorrowingUntil(uint256,uint256) (runs: 5000, μ: 144707, ~: 144367)
[PASS] test_isolateCollateral(uint256) (runs: 5000, μ: 152949, ~: 152949)
[PASS] test_isolateCollateralUntil(uint256,uint256) (runs: 5000, μ: 144642, ~: 144302)
[PASS] test_isolateUntil(uint256,uint256) (runs: 5000, μ: 134619, ~: 134612)
[PASS] test_next(uint256) (runs: 5000, μ: 20068, ~: 18925)
Logs:
  Bound result 649

[PASS] test_nextBorrowing(uint256) (runs: 5000, μ: 17982, ~: 16874)
Logs:
  Bound result 649

[PASS] test_nextBorrowing_continuous() (gas: 61801685)
[PASS] test_nextCollateral(uint256) (runs: 5000, μ: 18197, ~: 16983)
Logs:
  Bound result 649

[PASS] test_nextCollateral_continuous() (gas: 62157760)
[PASS] test_next_continuous() (gas: 89136467)
[PASS] test_popCount(bytes32) (runs: 5000, μ: 37881, ~: 38011)
[PASS] test_setBorrowing_slot0() (gas: 43906)
[PASS] test_setBorrowing_slot1() (gas: 43942)
[PASS] test_setUseAsCollateral_slot0() (gas: 44158)
[PASS] test_setUseAsCollateral_slot1() (gas: 44140)
[PASS] test_setters_use_correct_slot(uint256) (runs: 5000, μ: 36549, ~: 41309)
Suite result: ok. 32 passed; 0 failed; 0 skipped; finished in 160.39s (160.39s CPU time)

Ran 5 tests for tests/unit/Rescuable.t.sol:RescuableTest
[PASS] test_constructor() (gas: 12531)
[PASS] test_rescueNative_fuzz(uint256) (runs: 5000, μ: 33301, ~: 33478)
Logs:
  Bound result 3124043968137

[PASS] test_rescueNative_revertsWith_OnlyRescueGuardian() (gas: ...*[Comment body truncated]*

@github-actions
Copy link

github-actions bot commented Feb 8, 2026

♻️ Forge Gas Snapshots

Path Value
snapshots/Hub.Operations.json
add ↑0% (+11) 86,714
add: with transfer ↑0% (+11) 108,011
draw ↑0% (+11) 104,170
eliminateDeficit: full ↓0% (-11) 72,567
eliminateDeficit: partial ↓0% (-11) 82,172
mintFeeShares ↑0% (+11) 82,763
payFee ↑0% (+11) 70,827
refreshPremium ↑0% (+11) 70,384
remove: full ↑0% (+11) 75,618
remove: partial ↑0% (+11) 80,756
reportDeficit ↓0% (-11) 111,882
restore: full ↑0% (+11) 76,574
restore: full - with transfer ↑0% (+429) 169,601
restore: partial ↑0% (+11) 85,284
restore: partial - with transfer ↑0% (+11) 143,264
transferShares ↑0% (+11) 69,641
snapshots/NativeTokenGateway.Operations.json
borrowNative ↑0% (+418) 229,074
repayNative ↑0% (+407) 166,878
supplyAsCollateralNative ↑0% (+11) 160,144
supplyNative ↑0% (+9) 135,771
withdrawNative: full ↑0% (+9) 125,566
withdrawNative: partial ↑0% (+11) 136,757
snapshots/SignatureGateway.Operations.json
borrowWithSig ↑0% (+418) 214,307
repayWithSig ↑0% (+407) 187,150
supplyWithSig ↑0% (+9) 152,003
withdrawWithSig ↑0% (+8) 130,820
snapshots/Spoke.Getters.json
getUserAccountData: supplies: 2, borrows: 1 ↑0% (+198) 101,729
getUserAccountData: supplies: 2, borrows: 2 ↑0% (+396) 121,187
snapshots/Spoke.Operations.ZeroRiskPremium.json
borrow: first ↑0% (+209) 190,593
borrow: second action, same reserve ↑0% (+209) 170,459
liquidationCall (receiveShares): full ↑0% (+616) 303,873
liquidationCall (receiveShares): partial ↑0% (+616) 303,291
liquidationCall (reportDeficit): full ↑0% (+638) 368,324
liquidationCall: full ↑0% (+627) 321,520
liquidationCall: partial ↑0% (+627) 320,938
permitReserve + repay (multicall) ↑0% (+209) 164,785
permitReserve + supply (multicall) ↑0% (+11) 146,767
permitReserve + supply + enable collateral (multicall) ↑0% (+11) 161,218
repay: full ↑0% (+209) 124,123
repay: partial ↑0% (+209) 129,081
supply + enable collateral (multicall) ↑0% (+11) 141,420
supply: 0 borrows, collateral disabled ↑0% (+11) 122,857
supply: 0 borrows, collateral enabled ↑0% (+11) 105,828
supply: second action, same reserve ↑0% (+11) 105,757
updateUserRiskPremium: 1 borrow ↑0% (+198) 95,932
updateUserRiskPremium: 2 borrows ↑0% (+396) 105,810
usingAsCollateral: 1 borrow, disable ↑0% (+198) 105,976
usingAsCollateral: 2 borrows, disable ↑0% (+396) 127,723
withdraw: 0 borrows, full ↑0% (+11) 127,966
withdraw: 0 borrows, partial ↑0% (+11) 132,862
withdraw: 1 borrow, partial ↑0% (+209) 160,191
withdraw: 2 borrows, partial ↑0% (+407) 174,947
withdraw: non collateral ↑0% (+11) 105,913
snapshots/Spoke.Operations.json
borrow: first ↑0% (+418) 259,737
borrow: second action, same reserve ↑0% (+418) 202,603
liquidationCall (receiveShares): full ↑0% (+825) 336,126
liquidationCall (receiveShares): partial ↑0% (+825) 335,544
liquidationCall (reportDeficit): full ↑0% (+638) 360,524
liquidationCall: full ↑0% (+836) 353,773
liquidationCall: partial ↑0% (+836) 353,191
permitReserve + repay (multicall) ↑0% (+168) 162,212
permitReserve + supply (multicall) ↑0% (+11) 146,767
permitReserve + supply + enable collateral (multicall) ↑0% (+11) 161,218
repay: full ↑0% (+209) 118,202
repay: partial ↑0% (+209) 137,560
supply + enable collateral (multicall) ↑0% (+11) 141,420
supply: 0 borrows, collateral disabled ↑0% (+11) 122,857
supply: 0 borrows, collateral enabled ↑0% (+11) 105,828
supply: second action, same reserve ↑0% (+11) 105,757
updateUserRiskPremium: 1 borrow ↑0% (+407) 149,500
updateUserRiskPremium: 2 borrows ↑0% (+814) 200,169
usingAsCollateral: 1 borrow, disable ↑0% (+407) 159,541
usingAsCollateral: 2 borrows, disable ↑0% (+814) 230,078
withdraw: 0 borrows, full ↑0% (+11) 127,966
withdraw: 0 borrows, partial ↑0% (+11) 132,862
withdraw: 1 borrow, partial ↑0% (+418) 211,254
withdraw: 2 borrows, partial ↑0% (+825) 257,837
withdraw: non collateral ↑0% (+11) 105,913
🔕 Unchanged
Path Value
snapshots/SignatureGateway.Operations.json
setSelfAsUserPositionManagerWithSig 75,385
setUsingAsCollateralWithSig 85,387
updateUserDynamicConfigWithSig 63,120
updateUserRiskPremiumWithSig 62,090
snapshots/Spoke.Getters.json
getUserAccountData: supplies: 0, borrows: 0 13,014
getUserAccountData: supplies: 1, borrows: 0 49,426
getUserAccountData: supplies: 2, borrows: 0 81,102
snapshots/Spoke.Operations.ZeroRiskPremium.json
setUserPositionManagersWithSig: disable 47,039
setUserPositionManagersWithSig: enable 68,951
updateUserDynamicConfig: 1 collateral 74,545
updateUserDynamicConfig: 2 collaterals 89,413
usingAsCollateral: 0 borrows, enable 59,616
usingAsCollateral: 1 borrow, enable 42,504
usingAsCollateral: 2 borrows, enable 42,516
snapshots/Spoke.Operations.json
setUserPositionManagersWithSig: disable 47,039
setUserPositionManagersWithSig: enable 68,951
updateUserDynamicConfig: 1 collateral 74,545
updateUserDynamicConfig: 2 collaterals 89,413
usingAsCollateral: 0 borrows, enable 59,616
usingAsCollateral: 1 borrow, enable 42,504
usingAsCollateral: 2 borrows, enable 42,516

@github-actions
Copy link

github-actions bot commented Feb 8, 2026

Forge Build Sizes

Contract Runtime Size (B) Initcode Size (B) Runtime Margin (B) Initcode Margin (B)
Hub ↑0% (+33) 23,580 ↑0% (+33) 23,777 ↓3% (-33) 996 ↓0% (-33) 25,375
🔕 Unchanged
Contract Runtime Size (B) Initcode Size (B) Runtime Margin (B) Initcode Margin (B)
AaveOracle 2,834 3,488 21,742 45,664
AccessManager 12,985 14,210 11,591 34,942
AccessManagerEnumerable 16,881 18,699 7,695 30,453
Address 44 94 24,532 49,058
Arrays 44 94 24,532 49,058
Arrays.hub 16 44 24,560 49,108
Arrays.spoke 16 44 24,560 49,108
AssetInterestRateStrategy 2,704 2,889 21,872 46,263
AssetLogic 44 94 24,532 49,058
AssetLogic.hub 16 44 24,560 49,108
AuthorityUtils 44 94 24,532 49,058
AuthorityUtils.hub 16 44 24,560 49,108
AuthorityUtils.spoke 16 44 24,560 49,108
Bytes 44 94 24,532 49,058
Bytes.spoke 16 44 24,560 49,108
Comparators 44 94 24,532 49,058
Comparators.hub 16 44 24,560 49,108
Comparators.spoke 16 44 24,560 49,108
Constants 499 551 24,077 48,601
Create2Utils 134 184 24,442 48,968
DeployUtils 44 94 24,532 49,058
DeployWrapper 3,330 3,358 21,246 45,794
ECDSA 44 94 24,532 49,058
ECDSA.spoke 16 44 24,560 49,108
EIP712Hash (src/position-manager/libraries/EIP712Hash.sol) 441 493 24,135 48,659
EIP712Hash (src/spoke/libraries/EIP712Hash.sol) 171 221 24,405 48,931
EIP712Hash.spoke 166 194 24,410 48,958
EIP712Types 44 94 24,532 49,058
ERC1967Proxy 135 891 24,441 48,261
ERC1967Utils 44 94 24,532 49,058
EnumerableSet 44 94 24,532 49,058
EnumerableSet.hub 16 44 24,560 49,108
Errors 44 94 24,532 49,058
ExtSloadWrapper 394 422 24,182 48,730
GatewayBaseWrapper 2,400 2,675 22,176 46,477
Hashes 44 94 24,532 49,058
HubConfigurator 13,833 14,029 10,743 35,123
JsonBindings 12,853 12,905 11,723 36,247
KeyValueList 44 94 24,532 49,058
KeyValueList.spoke 16 44 24,560 49,108
KeyValueListWrapper 957 985 23,619 48,167
LibBit 44 94 24,532 49,058
LibBit.spoke 16 44 24,560 49,108
LiquidationLogic 12,440 12,492 12,136 36,660
LiquidationLogic.spoke 9,829 9,861 14,747 39,291
LiquidationLogicWrapper 18,567 18,741 6,009 30,411
LowLevelCall 44 94 24,532 49,058
Math 44 94 24,532 49,058
Math.hub 16 44 24,560 49,108
Math.spoke 16 44 24,560 49,108
MathUtils 44 94 24,532 49,058
MathUtils.hub 16 44 24,560 49,108
MathUtils.spoke 16 44 24,560 49,108
MockERC1271Wallet 828 962 23,748 48,190
MockERC20 2,540 3,006 22,036 46,146
MockNoncesKeyed 858 886 23,718 48,266
MockPriceFeed 737 1,395 23,839 47,757
MockReentrantCaller 882 1,083 23,694 48,069
MockSkimSpoke 1,116 1,275 23,460 47,877
NativeTokenGateway 6,187 6,604 18,389 42,548
NoncesKeyed 644 672 23,932 48,480
NoncesKeyed.spoke 387 413 24,189 48,739
Panic 44 94 24,532 49,058
Panic.hub 16 44 24,560 49,108
Panic.spoke 16 44 24,560 49,108
PercentageMath 44 94 24,532 49,058
PercentageMath.hub 16 44 24,560 49,108
PercentageMath.spoke 16 44 24,560 49,108
PercentageMathWrapper 632 660 23,944 48,492
PositionStatusMap 44 94 24,532 49,058
PositionStatusMap.spoke 16 44 24,560 49,108
PositionStatusMapWrapper 3,341 3,369 21,235 45,783
Premium 44 94 24,532 49,058
Premium.hub 16 44 24,560 49,108
Premium.spoke 16 44 24,560 49,108
ProxyAdmin 1,320 1,556 23,256 47,596
RescuableWrapper 908 1,042 23,668 48,110
ReserveFlagsMap 44 94 24,532 49,058
ReserveFlagsMap.spoke 16 44 24,560 49,108
ReserveFlagsMapWrapper 928 956 23,648 48,196
Roles 218 269 24,358 48,883
SafeCast 44 94 24,532 49,058
SafeCast.hub 16 44 24,560 49,108
SafeCast.spoke 16 44 24,560 49,108
SafeERC20 44 94 24,532 49,058
SafeERC20.hub 16 44 24,560 49,108
SafeERC20.spoke 16 44 24,560 49,108
SharesMath 44 94 24,532 49,058
SharesMath.hub 16 44 24,560 49,108
SignatureChecker 44 94 24,532 49,058
SignatureChecker.spoke 16 44 24,560 49,108
SignatureGateway 11,485 12,024 13,091 37,128
SlotDerivation 44 94 24,532 49,058
SlotDerivation.hub 16 44 24,560 49,108
SlotDerivation.spoke 16 44 24,560 49,108
SpokeConfigurator 12,328 12,524 12,248 36,628
SpokeInstance 24,342 25,149 234 24,003
SpokeUtils 96 146 24,480 49,006
SpokeUtils.spoke 71 99 24,505 49,053
SpokeUtilsWrapper 1,827 1,855 22,749 47,297
StorageSlot 44 94 24,532 49,058
StorageSlot.hub 16 44 24,560 49,108
StorageSlot.spoke 16 44 24,560 49,108
TestnetERC20 3,649 4,525 20,927 44,627
Time 44 94 24,532 49,058
TransientSlot 44 94 24,532 49,058
TransientSlot.spoke 16 44 24,560 49,108
TransparentUpgradeableProxy 1,419 4,078 23,157 45,074
TreasurySpoke 3,599 4,014 20,977 45,138
UnitPriceFeed 777 1,771 23,799 47,381
UserPositionUtils (src/spoke/libraries/UserPositionDebt.sol) 44 94 24,532 49,058
UserPositionUtils (src/spoke/libraries/UserPositionUtils.sol) 44 94 24,532 49,058
UserPositionUtils.spoke 16 44 24,560 49,108
UserPositionUtilsWrapper (tests/mocks/UserPositionDebtWrapper.sol) 3,263 3,291 21,313 45,861
UserPositionUtilsWrapper (tests/mocks/UserPositionUtilsWrapper.sol) 3,263 3,291 21,313 45,861
Utils 44 94 24,532 49,058
WETH9 2,148 2,614 22,428 46,538
WadRayMath 44 94 24,532 49,058
WadRayMath.hub 16 44 24,560 49,108
WadRayMath.spoke 16 44 24,560 49,108
WadRayMathWrapper 1,514 1,542 23,062 47,610

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.

1 participant