Skip to content

feat: coverage and comment on ci#887

Merged
DhairyaSethi merged 12 commits intomainfrom
fix/ci-comment-cov
Oct 10, 2025
Merged

feat: coverage and comment on ci#887
DhairyaSethi merged 12 commits intomainfrom
fix/ci-comment-cov

Conversation

@DhairyaSethi
Copy link
Member

@DhairyaSethi DhairyaSethi commented Oct 9, 2025

Add code coverage, gas snapshot, and code size reports to CI, which comment directly on each PR

@codecov
Copy link

codecov bot commented Oct 9, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (main@14a824b). Learn more about missing BASE report.

Additional details and impacted files
@@           Coverage Diff            @@
##             main      #887   +/-   ##
========================================
  Coverage        ?   100.00%           
========================================
  Files           ?        20           
  Lines           ?      1486           
  Branches        ?         0           
========================================
  Hits            ?      1486           
  Misses          ?         0           
  Partials        ?         0           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
@DhairyaSethi DhairyaSethi merged commit a737c24 into main Oct 10, 2025
10 checks passed
@DhairyaSethi DhairyaSethi deleted the fix/ci-comment-cov branch October 10, 2025 08:31
@github-actions
Copy link

Forge Build Sizes

🔕 Unchanged
Contract Runtime Size (B) Initcode Size (B) Runtime Margin (B) Initcode Margin (B)
AaveOracle 1,842 2,580 22,734 46,572
AccessManager 10,198 11,423 14,378 37,729
Address 44 94 24,532 49,058
Arrays 44 94 24,532 49,058
AssetInterestRateStrategy 2,349 2,534 22,227 46,618
AssetLogic 44 94 24,532 49,058
AuthorityUtils 44 94 24,532 49,058
Bytes 44 94 24,532 49,058
Comparators 44 94 24,532 49,058
Constants 378 430 24,198 48,722
ECDSA 44 94 24,532 49,058
EIP712Types 44 94 24,532 49,058
ERC1967Proxy 122 934 24,454 48,218
ERC1967Utils 44 94 24,532 49,058
EnumerableSet 44 94 24,532 49,058
Errors 44 94 24,532 49,058
Hub 19,846 20,080 4,730 29,072
HubConfigurator 7,761 8,034 16,815 41,118
JsonBindings 9,244 9,296 15,332 39,856
KeyValueList 44 94 24,532 49,058
LibBit 44 94 24,532 49,058
LiquidationLogic 4,980 5,032 19,596 44,120
LiquidationLogicWrapper 8,354 8,382 16,222 40,770
Math 44 94 24,532 49,058
MathUtils 44 94 24,532 49,058
MockERC1271Wallet 599 733 23,977 48,419
MockERC20 1,913 2,379 22,663 46,773
MockPriceFeed 642 1,300 23,934 47,852
MockSpokeInstance 23,954 24,762 622 24,390
NativeTokenGateway 4,791 5,320 19,785 43,832
NoncesKeyed 425 453 24,151 48,699
NoncesKeyedMock 601 629 23,975 48,523
Panic 44 94 24,532 49,058
PercentageMath 44 94 24,532 49,058
PercentageMathWrapper 592 620 23,984 48,532
PositionStatusMap 44 94 24,532 49,058
PositionStatusMapWrapper 2,407 2,435 22,169 46,717
ProxyAdmin 977 1,213 23,599 47,939
RescuableWrapper 770 904 23,806 48,248
Roles 153 203 24,423 48,949
SafeCast 44 94 24,532 49,058
SafeERC20 44 94 24,532 49,058
SharesMath 44 94 24,532 49,058
SignatureChecker 44 94 24,532 49,058
SignatureGateway 9,648 10,384 14,928 38,768
SlotDerivation 44 94 24,532 49,058
SpokeConfigurator 7,254 7,527 17,322 41,625
SpokeInstance 23,892 24,628 684 24,524
StorageSlot 44 94 24,532 49,058
TestnetERC20 2,810 3,686 21,766 45,466
Time 44 94 24,532 49,058
TransientSlot 44 94 24,532 49,058
TransparentUpgradeableProxy 1,073 3,445 23,503 45,707
TreasurySpoke 2,288 2,689 22,288 46,463
UnitPriceFeed 662 1,596 23,914 47,556
Utils 44 94 24,532 49,058
WETH9 1,864 2,330 22,712 46,822
WadRayMath 44 94 24,532 49,058
WadRayMathWrapper 1,252 1,280 23,324 47,872
@github-actions
Copy link

♻️ Forge Gas Snapshots

🔕 Unchanged
Path Value
snapshots/Hub.Operations.json
add 113,864
draw 122,124
eliminateDeficit: full 57,950
eliminateDeficit: partial 67,526
payFee 73,573
refreshPremium 99,799
remove: full 75,130
remove: partial 80,377
reportDeficit 121,879
restore: full 100,595
restore: partial 114,025
transferShares 79,102
snapshots/Spoke.Getters.json
getUserAccountData: supplies: 0, borrows: 0 12,164
getUserAccountData: supplies: 1, borrows: 0 47,282
getUserAccountData: supplies: 2, borrows: 0 77,515
getUserAccountData: supplies: 2, borrows: 1 98,212
getUserAccountData: supplies: 2, borrows: 2 117,563
snapshots/Spoke.Operations.ZeroRiskPremium.json
borrow: first 199,063
borrow: second action, same reserve 179,584
liquidationCall: full 294,018
liquidationCall: partial 318,112
permitReserve + repay (multicall) 238,577
permitReserve + supply (multicall) 140,898
permitReserve + supply + enable collateral (multicall) 176,195
repay: full 154,685
repay: partial 179,104
setUserPositionManagerWithSig: disable 44,851
setUserPositionManagerWithSig: enable 68,880
supply + enable collateral (multicall) 154,137
supply: 0 borrows, collateral disabled 115,732
supply: 0 borrows, collateral enabled 120,129
supply: 1 borrow 120,121
supply: second action, same reserve 103,029
updateUserDynamicConfig: 1 collateral 73,827
updateUserDynamicConfig: 2 collaterals 88,687
updateUserRiskPremium: 1 borrow 95,238
updateUserRiskPremium: 2 borrows 111,286
usingAsCollateral: 0 borrows, enable 59,042
usingAsCollateral: 1 borrow, disable 105,573
usingAsCollateral: 1 borrow, enable 32,364
usingAsCollateral: 2 borrows, disable 127,994
usingAsCollateral: 2 borrows, enable 41,942
withdraw: 0 borrows, full 127,773
withdraw: 0 borrows, partial 132,842
withdraw: 1 borrow, partial 161,780
withdraw: 2 borrows, partial 184,189
withdraw: non collateral 126,882
snapshots/Spoke.Operations.json
borrow: first 272,186
borrow: second action, same reserve 215,707
liquidationCall: full 330,358
liquidationCall: partial 354,452
permitReserve + repay (multicall) 274,910
permitReserve + supply (multicall) 140,898
permitReserve + supply + enable collateral (multicall) 176,195
repay: full 149,326
repay: partial 215,437
setUserPositionManagerWithSig: disable 44,851
setUserPositionManagerWithSig: enable 68,880
supply + enable collateral (multicall) 154,137
supply: 0 borrows, collateral disabled 115,732
supply: 0 borrows, collateral enabled 120,129
supply: 1 borrow 120,121
supply: second action, same reserve 103,029
updateUserDynamicConfig: 1 collateral 73,827
updateUserDynamicConfig: 2 collaterals 88,687
updateUserRiskPremium: 1 borrow 180,279
updateUserRiskPremium: 2 borrows 268,554
usingAsCollateral: 0 borrows, enable 59,042
usingAsCollateral: 1 borrow, disable 190,614
usingAsCollateral: 1 borrow, enable 32,364
usingAsCollateral: 2 borrows, disable 293,261
usingAsCollateral: 2 borrows, enable 41,942
withdraw: 0 borrows, full 127,773
withdraw: 0 borrows, partial 132,842
withdraw: 1 borrow, partial 244,321
withdraw: 2 borrows, partial 346,957
withdraw: non collateral 126,882
@github-actions
Copy link

🌈 Test Results
No files changed, compilation skipped

Ran 17 tests for tests/unit/AaveOracle.t.sol:AaveOracleTest
[PASS] test_constructor() (gas: 440456)
[PASS] test_decimals() (gas: 8387)
[PASS] test_deploy_revertsWith_InvalidAddress() (gas: 38089)
[PASS] test_description() (gas: 12094)
[PASS] test_fuzz_constructor(uint8) (runs: 5000, μ: 444398, ~: 444703)
[PASS] test_getReservePrice() (gas: 47409)
[PASS] test_getReservePrice_revertsWith_InvalidPrice() (gas: 46669)
[PASS] test_getReservePrice_revertsWith_InvalidSource() (gas: 10976)
[PASS] test_getReservePrices() (gas: 79551)
[PASS] test_getReservePrices_revertsWith_InvalidSource() (gas: 49352)
[PASS] test_getReserveSource() (gas: 47584)
[PASS] test_setReserveSource() (gas: 44466)
[PASS] test_setReserveSource_revertsWith_InvalidPrice() (gas: 97683)
[PASS] test_setReserveSource_revertsWith_InvalidSource() (gas: 15327)
[PASS] test_setReserveSource_revertsWith_InvalidSourceDecimals() (gas: 15149)
[PASS] test_setReserveSource_revertsWith_OnlySpoke() (gas: 11049)
[PASS] test_spoke() (gas: 10614)
Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 500.55ms (493.81ms CPU time)

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

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

[PASS] test_calculateInterestRate_LeftToKinkPoint(uint256) (runs: 5000, μ: 24529, ~: 24690)
[PASS] test_calculateInterestRate_RightToKinkPoint(uint256) (runs: 5000, μ: 25648, ~: 25690)
[PASS] test_calculateInterestRate_ZeroDebtZeroLiquidity() (gas: 18944)
Logs:
  Bound result 0

[PASS] test_calculateInterestRate_fuzz_ZeroDebt(uint256) (runs: 5000, μ: 19157, ~: 18950)
[PASS] test_calculateInterestRate_revertsWith_InterestRateDataNotSet() (gas: 11361)
[PASS] test_deploy_revertsWith_InvalidAddress() (gas: 36318)
[PASS] test_getBaseVariableBorrowRate() (gas: 14864)
[PASS] test_getInterestRateData() (gas: 19653)
[PASS] test_getMaxVariableBorrowRate() (gas: 15312)
[PASS] test_getOptimalUsageRatio() (gas: 14735)
[PASS] test_getVariableRateSlope1() (gas: 14810)
[PASS] test_getVariableRateSlope2() (gas: 14877)
[PASS] test_maxBorrowRate() (gas: 8431)
[PASS] test_maxOptimalRatio() (gas: 8431)
[PASS] test_minOptimalRatio() (gas: 8440)
[PASS] test_setInterestRateData() (gas: 69812)
[PASS] test_setInterestRateData_revertsWith_InvalidMaxRate() (gas: 42072)
[PASS] test_setInterestRateData_revertsWith_InvalidOptimalUsageRatio() (gas: 43120)
[PASS] test_setInterestRateData_revertsWith_InvalidRateData() (gas: 35395)
[PASS] test_setInterestRateData_revertsWith_OnlyHub() (gas: 23786)
[PASS] test_setInterestRateData_revertsWith_Slope2MustBeGteSlope1() (gas: 37980)
Suite result: ok. 23 passed; 0 failed; 0 skipped; finished in 1.08s (1.07s CPU time)

Ran 6 tests for tests/unit/Hub/Hub.Access.t.sol:HubAccessTest
[PASS] test_change_authority() (gas: 2313734)
[PASS] test_change_role_responsibility() (gas: 101302)
[PASS] test_hub_access_manager_exposure() (gas: 12728)
[PASS] test_hub_admin_access() (gas: 1132477)
[PASS] test_migrate_role_responsibility() (gas: 397008)
[PASS] test_setInterestRateData_access() (gas: 101112)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 21.22ms (3.94ms CPU time)

Ran 20 tests for tests/unit/Hub/Hub.Add.t.sol:HubAddTest
[PASS] test_add_AddCapReachedButNotExceeded_rounding() (gas: 650304)
[PASS] test_add_fuzz_AddCapReachedButNotExceeded(uint56) (runs: 5000, μ: 156102, ~: 155950)
[PASS] test_add_fuzz_multi_asset_multi_spoke(uint256,uint256,uint256) (runs: 5000, μ: 310287, ~: 310442)
[PASS] test_add_fuzz_revertsWith_AddCapExceeded(uint56) (runs: 5000, μ: 77812, ~: 77660)
[PASS] test_add_fuzz_revertsWith_AddCapExceeded_due_to_interest(uint56,uint256,uint256) (runs: 5000, μ: 282422, ~: 284987)
[PASS] test_add_fuzz_revertsWith_ERC20InsufficientAllowance(uint256) (runs: 5000, μ: 78921, ~: 78654)
[PASS] test_add_fuzz_revertsWith_InvalidShares_due_to_index(uint256,uint256,uint256) (runs: 5000, μ: 217053, ~: 217233)
[PASS] test_add_fuzz_single_asset(uint256,address,uint256) (runs: 5000, μ: 337190, ~: 337112)
[PASS] test_add_fuzz_single_spoke_multi_add(uint256,uint256) (runs: 5000, μ: 821888, ~: 823975)
[PASS] test_add_multi_add_minimal_shares() (gas: 345410)
[PASS] test_add_revertsWith_AmountDowncastOverflow() (gas: 206591)
[PASS] test_add_revertsWith_ERC20InsufficientAllowance() (gas: 75191)
[PASS] test_add_revertsWith_InvalidAddress() (gas: 15791)
[PASS] test_add_revertsWith_InvalidAmount() (gas: 15858)
[PASS] test_add_revertsWith_InvalidShares() (gas: 220924)
[PASS] test_add_revertsWith_SharesDowncastOverflow() (gas: 36639)
[PASS] test_add_revertsWith_SpokeNotActive() (gas: 56417)
[PASS] test_add_single_asset() (gas: 325116)
Logs:
  Bound result 2
  Bound result 100000000000000000000

[PASS] test_add_with_increased_index() (gas: 324610)
[PASS] test_add_with_increased_index_with_premium() (gas: 674295)
Suite result: ok. 20 passed; 0 failed; 0 skipped; finished in 45.13s (45.11s 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, μ: 1063084, ~: 1063218)
[PASS] test_borrow_fuzz_rounding_effect_inflated_ex_rate(uint256,uint256,uint256) (runs: 5000, μ: 1451017, ~: 1451141)
[PASS] test_borrow_fuzz_rounding_effect_shares(uint256,uint256) (runs: 5000, μ: 1118010, ~: 1117772)
[PASS] test_borrow_rounding_effect_multiple_actions() (gas: 1173030)
[PASS] test_borrow_rounding_effect_shares() (gas: 1116987)
Logs:
  Bound result 5000000000000000000
  Bound result 94608000

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

Ran 31 tests for tests/unit/Hub/Hub.Config.t.sol:HubConfigTest
[PASS] test_addAsset_fuzz(address,uint8,address) (runs: 5000, μ: 840069, ~: 840100)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_feeReceiver(address,uint8,address) (runs: 5000, μ: 46645, ~: 46948)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_irStrategy(address,uint8,address) (runs: 5000, μ: 46654, ~: 46957)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_underlying(uint8,address,address) (runs: 5000, μ: 37645, ~: 37645)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals(address,uint8,address,address) (runs: 5000, μ: 47231, ~: 47048)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals_tooLow(address,uint8,address,address) (runs: 5000, μ: 47484, ~: 47703)
[PASS] test_addAsset_fuzz_reverts_InvalidIrData(address,uint8,address,address) (runs: 5000, μ: 40499, ~: 43623)
[PASS] test_addAsset_revertsWith_BlockTimestampDowncastOverflow() (gas: 81114)
[PASS] test_addAsset_revertsWith_DrawnRateDowncastOverflow() (gas: 78065)
[PASS] test_addSpoke_fuzz(uint256,(bool,uint56,uint56)) (runs: 5000, μ: 121632, ~: 121700)
[PASS] test_addSpoke_fuzz_revertsWith_AssetNotListed(uint256,(bool,uint56,uint56)) (runs: 5000, μ: 34523, ~: 34512)
[PASS] test_addSpoke_fuzz_revertsWith_InvalidAddress_spoke(uint256,(bool,uint56,uint56)) (runs: 5000, μ: 33114, ~: 33170)
[PASS] test_addSpoke_revertsWith_SpokeAlreadyListed() (gas: 38416)
[PASS] test_hub_deploy_revertsWith_InvalidAddress() (gas: 46975)
[PASS] test_updateAssetConfig_UseExistingSpokeAndListedAsFeeReceiver_revertsWith_SpokeAlreadyListed() (gas: 59738)
[PASS] test_updateAssetConfig_fuzz(uint256,(address,uint16,address,address)) (runs: 5000, μ: 241382, ~: 241274)
[PASS] test_updateAssetConfig_fuzz_FromZeroLiquidityFee(uint256,uint16) (runs: 5000, μ: 759233, ~: 759155)
[PASS] test_updateAssetConfig_fuzz_LiquidityFee(uint256,uint16) (runs: 5000, μ: 658130, ~: 658052)
[PASS] test_updateAssetConfig_fuzz_NewFeeReceiver(uint256) (runs: 5000, μ: 727198, ~: 727260)
[PASS] test_updateAssetConfig_fuzz_NewInterestRateStrategy(uint256) (runs: 5000, μ: 1132664, ~: 1132774)
[PASS] test_updateAssetConfig_fuzz_ReuseFeeReceiver_revertsWith_SpokeAlreadyListed(uint256) (runs: 5000, μ: 766559, ~: 766621)
[PASS] test_updateAssetConfig_fuzz_Scenario(uint256) (runs: 5000, μ: 603584, ~: 603640)
[PASS] test_updateAssetConfig_fuzz_UseExistingSpokeAsFeeReceiver_revertsWith_SpokeAlreadyListed(uint256) (runs: 5000, μ: 59410, ~: 59410)
[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidInterestRateStrategy(uint256) (runs: 5000, μ: 57888, ~: 57944)
[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidLiquidityFee(uint256,(address,uint16,address,address)) (runs: 5000, μ: 41101, ~: 40957)
[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidReinvestmentController() (gas: 494867)
[PASS] test_updateAssetConfig_fuzz_revertsWith_calculateInterestRateReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 190724, ~: 190581)
[PASS] test_updateAssetConfig_fuzz_revertsWith_setInterestRateDataReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 65214, ~: 65071)
[PASS] test_updateSpokeConfig_fuzz(uint256,(bool,uint56,uint56)) (runs: 5000, μ: 54358, ~: 54428)
[PASS] test_updateSpokeConfig_fuzz_revertsWith_SpokeNotListed(uint256,address,(bool,uint56,uint56)) (runs: 5000, μ: 40216, ~: 40285)
[PASS] test_updateSpokeConfig_revertsWith_AssetNotListed() (gas: 29201)
Suite result: ok. 31 passed; 0 failed; 0 skipped; finished in 84.98s (84.95s CPU time)

Ran 15 tests for tests/unit/Hub/Hub.Draw.t.sol:HubDrawTest
[PASS] test_draw_DifferentSpokes() (gas: 362570)
[PASS] test_draw_fuzz_IncreasedBorrowRate(uint256,uint256) (runs: 5000, μ: 685268, ~: 685353)
[PASS] test_draw_fuzz_amounts_same_block(uint256,uint256) (runs: 5000, μ: 286042, ~: 285884)
[PASS] test_draw_fuzz_revertsWith_DrawCapExceeded(uint56) (runs: 5000, μ: 78076, ~: 77927)
[PASS] test_draw_fuzz_revertsWith_DrawCapExceeded_due_to_interest(uint56,uint256,uint256) (runs: 5000, μ: 300262, ~: 300563)
[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity(uint256,uint256) (runs: 5000, μ: 33939, ~: 33732)
[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity_due_to_draw(uint256) (runs: 5000, μ: 183108, ~: 182844)
[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity_due_to_remove(uint256) (runs: 5000, μ: 129596, ~: 129408)
[PASS] test_draw_fuzz_revertsWith_InvalidAddress(uint256) (runs: 5000, μ: 15763, ~: 15763)
[PASS] test_draw_revertsWith_DrawCapExceeded_due_to_deficit() (gas: 255508)
[PASS] test_draw_revertsWith_InsufficientLiquidity() (gas: 28010)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_draw() (gas: 179419)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_remove() (gas: 126717)
[PASS] test_draw_revertsWith_InvalidAmount() (gas: 15816)
[PASS] test_draw_revertsWith_SpokeNotActive() (gas: 56274)
Suite result: ok. 15 passed; 0 failed; 0 skipped; finished in 24.41s (24.39s CPU time)

Ran 5 tests for tests/unit/Hub/Hub.EliminateDeficit.t.sol:HubEliminateDeficitTest
[PASS] test_eliminateDeficit(uint256) (runs: 5000, μ: 508128, ~: 508128)
[PASS] test_eliminateDeficit_fuzz_revertsWith_InvalidAmount_Excess(uint256) (runs: 5000, μ: 254095, ~: 254095)
[PASS] test_eliminateDeficit_fuzz_revertsWith_callerSpokeNotActive(address) (runs: 5000, μ: 28682, ~: 28682)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountNoDeficit() (gas: 19956)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountWithDeficit() (gas: 255217)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 10.80s (10.78s CPU time)

Ran 7 tests for tests/gas/Hub.Operations.gas.t.sol:HubOperations_Gas_Tests
[PASS] test_add() (gas: 128904)
[PASS] test_deficit() (gas: 1052979)
[PASS] test_draw() (gas: 372273)
[PASS] test_payFee_transferShares() (gas: 925615)
[PASS] test_refreshPremium() (gas: 127868)
[PASS] test_remove() (gas: 278229)
[PASS] test_restore() (gas: 734275)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 27.75ms (5.14ms CPU time)

Ran 6 tests for tests/unit/Hub/Hub.PayFee.t.sol:HubPayFeeTest
[PASS] test_payFee_fuzz(uint256,uint256) (runs: 5000, μ: 668977, ~: 668951)
[PASS] test_payFee_fuzz_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 669232, ~: 669380)
[PASS] test_payFee_revertsWith_AddedSharesExceeded() (gas: 132668)
[PASS] test_payFee_revertsWith_AddedSharesExceeded_with_interest() (gas: 635404)
[PASS] test_payFee_revertsWith_InvalidShares() (gas: 19997)
[PASS] test_payFee_revertsWith_SpokeNotActive() (gas: 56255)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 18.96s (18.94s CPU time)

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

[PASS] test_reclaim_fullAmount() (gas: 659113)
[PASS] test_reclaim_fuzz(uint256,uint256,uint256) (runs: 5000, μ: 679899, ~: 679364)
[PASS] test_reclaim_multipleSweepsAndReclaims() (gas: 787127)
[PASS] test_reclaim_revertsWith_AssetNotListed() (gas: 12513)
[PASS] test_reclaim_revertsWith_InvalidAmount_exceedsSwept() (gas: 92282)
[PASS] test_reclaim_revertsWith_InvalidAmount_exceedsSwept_afterSweep() (gas: 465881)
[PASS] test_reclaim_revertsWith_InvalidAmount_zero() (gas: 90614)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController(address) (runs: 5000, μ: 91592, ~: 91592)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController_init() (gas: 38048)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 12.38s (12.36s 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, μ: 898846, ~: 898907)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls(uint256,uint256) (runs: 5000, μ: 859088, ~: 860002)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 905265, ~: 902605)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts(uint256,uint256) (runs: 5000, μ: 1123269, ~: 1123389)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 1186073, ~: 1187657)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_with_interest(uint256,uint256) (runs: 5000, μ: 694036, ~: 694588)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold() (gas: 649964)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_collateral_price_drop_weth() (gas: 892990)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls() (gas: 853602)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai() (gas: 1107409)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth() (gas: 1107453)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest() (gas: 905963)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts() (gas: 1116447)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest() (gas: 1180455)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_with_interest() (gas: 689860)
[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai(uint256,uint256,uint256) (runs: 5000, μ: 1111104, ~: 1112209)
[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth(uint256,uint256,uint256) (runs: 5000, μ: 1111740, ~: 1112231)
Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 139.92s (139.90s CPU time)

Ran 7 tests for tests/unit/Hub/Hub.RefreshPremium.t.sol:HubRefreshPremiumTest
[PASS] test_refreshPremium_emitsEvent() (gas: 172658)
[PASS] test_refreshPremium_fuzz_positiveDeltas(int256,int256,int256) (runs: 5000, μ: 145737, ~: 146476)
[PASS] test_refreshPremium_fuzz_withAccrual(uint256,uint256,uint256,uint256) (runs: 5000, μ: 570333, ~: 570898)
[PASS] test_refreshPremium_negativeDeltas(int256,int256) (runs: 5000, μ: 478666, ~: 479187)
[PASS] test_refreshPremium_negativeDeltas_withAccrual(uint256,uint256) (runs: 5000, μ: 552296, ~: 561323)
[PASS] test_refreshPremium_revertsWith_SpokeNotActive() (gas: 54141)
[PASS] test_refreshPremium_spokePremiumUpdateIsContained() (gas: 746227)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 21.91s (21.89s CPU time)

Ran 12 tests for tests/unit/Hub/Hub.Remove.t.sol:HubRemoveTest
[PASS] test_remove() (gas: 199960)
Logs:
  Bound result 2
  Bound result 100000000000000000000

[PASS] test_remove_all_with_interest() (gas: 402060)
[PASS] test_remove_fuzz(uint256,uint256) (runs: 5000, μ: 198489, ~: 198284)
[PASS] test_remove_fuzz_all_liquidity_with_interest(uint256,uint256) (runs: 5000, μ: 439923, ~: 442365)
[PASS] test_remove_fuzz_multi_spoke(uint256,uint256) (runs: 5000, μ: 280207, ~: 280346)
[PASS] test_remove_fuzz_multi_spoke_with_interest(uint256,uint256,uint256,uint256) (runs: 5000, μ: 453640, ~: 456754)
[PASS] test_remove_revertsWith_AddedAmountExceeded() (gas: 142150)
[PASS] test_remove_revertsWith_AddedAmountExceeded_zero_added() (gas: 29951)
[PASS] test_remove_revertsWith_InsufficientLiquidity() (gas: 171653)
[PASS] test_remove_revertsWith_InvalidAddress() (gas: 15746)
[PASS] test_remove_revertsWith_InvalidAmount() (gas: 17803)
[PASS] test_remove_revertsWith_SpokeNotActive() (gas: 56308)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 30.40s (30.38s CPU time)

Ran 5 tests for tests/unit/Hub/Hub.ReportDeficit.t.sol:HubReportDeficitTest
[PASS] test_reportDeficit_fuzz_revertsWith_SurplusDeficitReported(uint256,uint256,uint256,uint256) (runs: 5000, μ: 160682, ~: 160695)
[PASS] test_reportDeficit_fuzz_with_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 341877, ~: 343828)
[PASS] test_reportDeficit_revertsWith_InvalidAmount() (gas: 18021)
[PASS] test_reportDeficit_revertsWith_SpokeNotActive(address) (runs: 5000, μ: 26179, ~: 26179)
[PASS] test_reportDeficit_with_premium() (gas: 342295)
Logs:
  Bound result 10000000000
  Bound result 31536000
  Bound result 5000000000
  Bound result 0

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

Ran 19 tests for tests/unit/Hub/Hub.Restore.t.sol:HubRestoreTest
[PASS] test_restore_full_amount_with_interest() (gas: 359948)
Logs:
  Bound result 1000000000000000000000
  Bound result 500000000000000000000
  Bound result 31536000

[PASS] test_restore_full_amount_with_interest_and_premium() (gas: 668432)
Logs:
  Bound result 100000000000000000000
  Bound result 50000000000000000000
  Bound result 31536000
  Bound result 1

[PASS] test_restore_fuzz_full_amount_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 358538, ~: 360877)
[PASS] test_restore_fuzz_full_amount_with_interest_and_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 651886, ~: 669858)
[PASS] test_restore_fuzz_revertsWith_SurplusAmountRestored_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 249110, ~: 252828)
[PASS] test_restore_fuzz_revertsWith_SurplusAmountRestored_with_interest_and_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 633629, ~: 637296)
[PASS] test_restore_partial_drawn() (gas: 335524)
[PASS] test_restore_partial_same_block() (gas: 314013)
[PASS] test_restore_premiumDeltas_twoWeiIncrease_realizedDelta() (gas: 254858)
[PASS] test_restore_revertsWith_InvalidAmount_zero() (gas: 44823)
[PASS] test_restore_revertsWith_InvalidPremiumChange_premiumIncrease() (gas: 238860)
[PASS] test_restore_revertsWith_InvalidPremiumChange_premiumSharesIncrease() (gas: 238880)
[PASS] test_restore_revertsWith_SpokeNotActive_whenPaused() (gas: 151755)
[PASS] test_restore_revertsWith_SurplusAmountRestored() (gas: 339224)
[PASS] test_restore_revertsWith_SurplusAmountRestored_with_interest() (gas: 252070)
Logs:
  Bound result 100000000000000000000
  Bound result 50000000000000000000
  Bound result 15768000

[PASS] test_restore_revertsWith_SurplusAmountRestored_with_interest_and_premium() (gas: 635956)
Logs:
  Bound result 100000000000000000000
  Bound result 50000000000000000000
  Bound result 31536000
  Bound result 1

[PASS] test_restore_revertsWith_underflow_offsetIncrease() (gas: 238687)
[PASS] test_restore_two_wei_shares_delta_increase() (gas: 249527)
[PASS] test_restore_when_asset_frozen() (gas: 413158)
Suite result: ok. 19 passed; 0 failed; 0 skipped; finished in 20.14s (20.12s CPU time)

Ran 1 test for tests/unit/Hub/Hub.Rounding.t.sol:HubRoundingTest
[PASS] test_sharePriceWithMultipleDonations() (gas: 700580873)
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.81s (3.79s CPU time)

Ran 8 tests for tests/unit/Hub/Hub.Sweep.t.sol:HubSweepTest
[PASS] test_sweep() (gas: 484180)
Logs:
  Bound result 1000000000000000000000
  Bound result 1000000000000000000000

[PASS] test_sweep_does_not_impact_utilization(uint256,uint256) (runs: 5000, μ: 647029, ~: 648272)
[PASS] test_sweep_fuzz(uint256,uint256) (runs: 5000, μ: 484695, ~: 484702)
[PASS] test_sweep_revertsWith_AssetNotListed() (gas: 12362)
[PASS] test_sweep_revertsWith_InsufficientLiquidity() (gas: 234819)
[PASS] test_sweep_revertsWith_InvalidAmount() (gas: 101518)
[PASS] test_sweep_revertsWith_OnlyReinvestmentController(address) (runs: 5000, μ: 92052, ~: 92052)
[PASS] test_sweep_revertsWith_OnlyReinvestmentController_init() (gas: 37943)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 15.48s (15.46s CPU time)

Ran 6 tests for tests/unit/Hub/Hub.TransferShares.t.sol:HubTransferSharesTest
[PASS] test_transferShares() (gas: 170580)
Logs:
  Bound result 1000000000000000000000
  Bound result 1000000000000000000000

[PASS] test_transferShares_fuzz(uint256,uint256) (runs: 5000, μ: 174023, ~: 174165)
[PASS] test_transferShares_fuzz_revertsWith_AddedSharesExceeded(uint256) (runs: 5000, μ: 140481, ~: 140219)
[PASS] test_transferShares_revertsWith_AddCapExceeded() (gas: 183071)
[PASS] test_transferShares_revertsWith_InactiveSpoke() (gas: 163958)
[PASS] test_transferShares_zeroShares_revertsWith_InvalidShares() (gas: 22183)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.87s (3.85s CPU time)

Ran 6 tests for tests/unit/Hub/HubAccrueInterest.t.sol:HubAccrueInterestTest
[PASS] test_accrueInterest_NoActionTaken() (gas: 41386)
[PASS] test_accrueInterest_NoInterest_NoDebt(uint32) (runs: 5000, μ: 333782, ~: 333707)
[PASS] test_accrueInterest_NoInterest_OnlyAdd(uint32) (runs: 5000, μ: 187471, ~: 187396)
[PASS] test_accrueInterest_fuzz_BorrowAmountAndElapsed(uint256,uint32) (runs: 5000, μ: 263043, ~: 265319)
[PASS] test_accrueInterest_fuzz_BorrowAmountRateAndElapsed(uint256,uint256,uint32) (runs: 5000, μ: 363300, ~: 366991)
[PASS] test_accrueInterest_fuzz_BorrowAndWait(uint32) (runs: 5000, μ: 264350, ~: 264275)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 22.32s (22.30s CPU time)

Ran 51 tests for tests/unit/HubConfigurator.t.sol:HubConfiguratorTest
[PASS] test_addAsset_fuzz(bool,address,uint8,address,uint16,uint32,uint32,uint32) (runs: 5000, μ: 850764, ~: 851122)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals(bool,address,uint8,address,address) (runs: 5000, μ: 56317, ~: 56745)
[PASS] test_addAsset_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 34820, ~: 34820)
[PASS] test_addAsset_revertsWith_InvalidAddress_irStrategy() (gas: 50467)
[PASS] test_addAsset_revertsWith_InvalidAddress_underlying() (gas: 50388)
[PASS] test_addAsset_reverts_invalidIrData() (gas: 44306)
[PASS] test_addSpoke() (gas: 122976)
[PASS] test_addSpokeToAssets() (gas: 216144)
[PASS] test_addSpokeToAssets_revertsWith_MismatchedConfigs() (gas: 24368)
[PASS] test_addSpokeToAssets_revertsWith_OwnableUnauthorizedAccount() (gas: 17149)
[PASS] test_addSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 16730)
[PASS] test_freezeAsset() (gas: 152694)
[PASS] test_freezeAsset_revertsWith_OwnableUnauthorizedAccount() (gas: 18029)
[PASS] test_freezeSpoke() (gas: 149872)
[PASS] test_freezeSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 17994)
[PASS] test_pauseAsset() (gas: 149920)
[PASS] test_pauseAsset_revertsWith_OwnableUnauthorizedAccount() (gas: 17876)
[PASS] test_pauseSpoke() (gas: 147175)
[PASS] test_pauseSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 18058)
[PASS] test_updateFeeConfig_Scenario() (gas: 320937)
Logs:
  Bound result 0
  Bound result 1800
  Bound result 0
  Bound result 400
  Bound result 0
  Bound result 0

[PASS] test_updateFeeConfig_fuzz(uint256,uint16,address) (runs: 5000, μ: 173558, ~: 173449)
[PASS] test_updateFeeConfig_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 17639, ~: 17639)
[PASS] test_updateFeeConfig_revertsWith_InvalidAddress_spoke() (gas: 48037)
[PASS] test_updateFeeConfig_revertsWith_InvalidLiquidityFee() (gas: 50070)
[PASS] test_updateFeeReceiver_Scenario() (gas: 203866)
[PASS] test_updateFeeReceiver_WithdrawFromOldSpoke() (gas: 959009)
[PASS] test_updateFeeReceiver_correctAccruals() (gas: 986508)
[PASS] test_updateFeeReceiver_fuzz(address) (runs: 5000, μ: 170001, ~: 170001)
[PASS] test_updateFeeReceiver_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 17247, ~: 17247)
[PASS] test_updateFeeReceiver_revertsWith_InvalidAddress_spoke() (gas: 52706)
[PASS] test_updateFeeReceiver_revertsWith_SpokeAlreadyListed() (gas: 73873)
[PASS] test_updateInterestRateData() (gas: 71508)
[PASS] test_updateInterestRateData_revertsWith_OwnableUnauthorizedAccount() (gas: 19193)
[PASS] test_updateInterestRateStrategy() (gas: 91086)
[PASS] test_updateInterestRateStrategy_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 28636, ~: 28636)
[PASS] test_updateInterestRateStrategy_revertsWith_InterestRateStrategyReverts() (gas: 74583)
[PASS] test_updateInterestRateStrategy_revertsWith_InvalidAddress_irStrategy() (gas: 64264)
[PASS] test_updateInterestRateStrategy_revertsWith_InvalidInterestRateStrategy() (gas: 64780)
[PASS] test_updateLiquidityFee_fuzz(uint256,uint16) (runs: 5000, μ: 84254, ~: 84112)
[PASS] test_updateLiquidityFee_revertsWith_InvalidLiquidityFee() (gas: 52632)
[PASS] test_updateLiquidityFee_revertsWith_OwnableUnauthorizedAccount() (gas: 16589)
[PASS] test_updateReinvestmentController() (gas: 98982)
[PASS] test_updateReinvestmentController_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 17249, ~: 17249)
[PASS] test_updateSpokeActive() (gas: 76881)
[PASS] test_updateSpokeActive_revertsWith_OwnableUnauthorizedAccount() (gas: 20213)
[PASS] test_updateSpokeCaps() (gas: 60604)
[PASS] test_updateSpokeCaps_revertsWith_OwnableUnauthorizedAccount() (gas: 20194)
[PASS] test_updateSpokeDrawCap() (gas: 60467)
[PASS] test_updateSpokeDrawCap_revertsWith_OwnableUnauthorizedAccount() (gas: 20267)
[PASS] test_updateSpokeSupplyCap() (gas: 60329)
[PASS] test_updateSpokeSupplyCap_revertsWith_OwnableUnauthorizedAccount() (gas: 20126)
Suite result: ok. 51 passed; 0 failed; 0 skipped; finished in 9.65s (9.64s CPU time)

Ran 2 tests for tests/invariant/HubInvariant.t.sol:HubInvariant
[SKIP] invariant_exchangeRateMonotonicallyIncreasing() (runs: 1, calls: 1, reverts: 1)
[SKIP] invariant_reserveTotalAssets() (runs: 1, calls: 1, reverts: 1)
Suite result: ok. 0 passed; 0 failed; 2 skipped; finished in 5.22ms (609.07µs CPU time)

Ran 6 tests for tests/unit/Spoke/Spoke.Borrow.Scenario.t.sol:SpokeBorrowScenarioTest
[PASS] test_borrow_fuzz_multi_spoke_multi_reserves(uint256,uint256,uint256,uint256,uint256) (runs: 5000, μ: 2214715, ~: 2225441)
[PASS] test_borrow_fuzz_single_spoke_multi_reserves(uint256,uint256,uint256,uint256) (runs: 5000, μ: 2362602, ~: 2372039)
[PASS] test_borrow_fuzz_single_spoke_multi_reserves_multi_user(uint256,uint256,uint256,uint256) (runs: 5000, μ: 2766822, ~: 2776034)
[PASS] test_borrow_fuzz_skip_borrow(uint256,uint256,uint256) (runs: 5000, μ: 1084896, ~: 1087347)
[PASS] test_borrow_skip_borrow() (gas: 1086532)
Logs:
  Bound result 10000000000000000000
  Bound result 20000000000000000000
  Bound result 31536000

[PASS] test_userAccountData_does_not_include_zero_cf_collateral() (gas: 1161311)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 190.64s (190.62s CPU time)

Ran 6 tests for tests/unit/KeyValueList.t.sol:KeyValueListTest
[PASS] test_fuzz_get(uint256[]) (runs: 5000, μ: 420051, ~: 421661)
[PASS] test_fuzz_get_uninitialized(uint256[]) (runs: 5000, μ: 265792, ~: 253588)
[PASS] test_fuzz_get_uninitialized_sorted(uint256[]) (runs: 5000, μ: 207499, ~: 189065)
[PASS] test_fuzz_sortByKey(uint256[]) (runs: 5000, μ: 472409, ~: 468157)
[PASS] test_fuzz_sortByKey_length(uint256) (runs: 5000, μ: 201626, ~: 204412)
[PASS] test_fuzz_sortByKey_with_collision(uint256[]) (runs: 5000, μ: 557706, ~: 555919)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 74.15s (74.15s 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)) (runs: 5000, μ: 30548, ~: 30489)
[PASS] test_calculateDebtToLiquidate_fuzz_AmountAdjustedDueToDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 32284, ~: 32369)
[PASS] test_calculateDebtToLiquidate_fuzz_ImpossibleToAdjustForDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 34441, ~: 34418)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.59s (3.57s 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, μ: 22988, ~: 23049)
[PASS] test_calculateDebtToTargetHealthFactor_NoPrecisionLoss() (gas: 25367)
[PASS] test_calculateDebtToTargetHealthFactor_PrecisionLoss() (gas: 15341)
[PASS] test_calculateDebtToTargetHealthFactor_UnitPrice() (gas: 25300)
[PASS] test_calculateDebtToTargetHealthFactor_fuzz_NoRevert((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 20046, ~: 20107)
[PASS] test_calculateDebtToTargetHealthFactor_fuzz_revertsWith_DivisionByZero_ZeroAssetPrice((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 22745, ~: 22806)
[PASS] test_calculateDebtToTargetHealthFactor_revertsWith_ArithmeticError_TargetHealthFactorLessThanHealthFactor((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 22828, ~: 22889)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.96s (2.94s CPU time)

Ran 16 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.EvaluateDeficit.t.sol:LiquidationLogicEvaluateDeficitTest
[PASS] test_evaluateDeficit_CRE_SCCM_DRE_BRCM() (gas: 9003)
[PASS] test_evaluateDeficit_CRE_SCCM_DRE_BRCO() (gas: 8971)
[PASS] test_evaluateDeficit_CRE_SCCM_DRN_BRCM() (gas: 8992)
[PASS] test_evaluateDeficit_CRE_SCCM_DRN_BRCO() (gas: 8959)
[PASS] test_evaluateDeficit_CRE_SCCO_DRE_BRCM() (gas: 8985)
[PASS] test_evaluateDeficit_CRE_SCCO_DRE_BRCO() (gas: 9052)
[PASS] test_evaluateDeficit_CRE_SCCO_DRN_BRCM() (gas: 9017)
[PASS] test_evaluateDeficit_CRE_SCCO_DRN_BRCO() (gas: 9005)
[PASS] test_evaluateDeficit_CRN_SCCM_DRE_BRCM() (gas: 9005)
[PASS] test_evaluateDeficit_CRN_SCCM_DRE_BRCO() (gas: 8994)
[PASS] test_evaluateDeficit_CRN_SCCM_DRN_BRCM() (gas: 8928)
[PASS] test_evaluateDeficit_CRN_SCCM_DRN_BRCO() (gas: 8961)
[PASS] test_evaluateDeficit_CRN_SCCO_DRE_BRCM() (gas: 8938)
[PASS] test_evaluateDeficit_CRN_SCCO_DRE_BRCO() (gas: 8995)
[PASS] test_evaluateDeficit_CRN_SCCO_DRN_BRCM() (gas: 8946)
[PASS] test_evaluateDeficit_CRN_SCCO_DRN_BRCO() (gas: 9024)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 18.46ms (948.05µs CPU time)

Ran 14 tests for tests/unit/Spoke/Spoke.Borrow.Validation.t.sol:SpokeBorrowValidationTest
[PASS] test_borrow_fuzz_revertsWith_DrawCapExceeded(uint256,uint56) (runs: 5000, μ: 104282, ~: 104184)
[PASS] test_borrow_fuzz_revertsWith_DrawCapExceeded_due_to_interest(uint256) (runs: 5000, μ: 698178, ~: 698471)
[PASS] test_borrow_fuzz_revertsWith_InsufficientLiquidity(uint256,uint256,uint256) (runs: 5000, μ: 280620, ~: 280440)
[PASS] test_borrow_fuzz_revertsWith_InvalidAmount(uint256) (runs: 5000, μ: 32624, ~: 32684)
[PASS] test_borrow_fuzz_revertsWith_ReserveFrozen(uint256,uint256) (runs: 5000, μ: 69356, ~: 69141)
[PASS] test_borrow_fuzz_revertsWith_ReserveNotBorrowable(uint256,uint256) (runs: 5000, μ: 69591, ~: 69376)
[PASS] test_borrow_fuzz_revertsWith_ReserveNotListed(uint256,uint256) (runs: 5000, μ: 26058, ~: 25790)
[PASS] test_borrow_fuzz_revertsWith_ReservePaused(uint256,uint256) (runs: 5000, μ: 69213, ~: 68998)
[PASS] test_borrow_revertsWith_InsufficientLiquidity() (gas: 280354)
Logs:
  Bound result 10000000000000000000

[PASS] test_borrow_revertsWith_InvalidAmount() (gas: 34295)
Logs:
  Bound result 2

[PASS] test_borrow_revertsWith_ReserveFrozen() (gas: 70747)
Logs:
  Bound result 2
  Bound result 1

[PASS] test_borrow_revertsWith_ReserveNotBorrowable() (gas: 70936)
Logs:
  Bound result 2
  Bound result 1

[PASS] test_borrow_revertsWith_ReserveNotListed() (gas: 27052)
Logs:
  Bound result 1

[PASS] test_borrow_revertsWith_ReservePaused() (gas: 70624)
Logs:
  Bound result 2
  Bound result 1

Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 15.47s (15.45s CPU time)

Ran 3 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateCollateral.t.sol:LiquidationLogicLiquidateCollateralTest
[PASS] test_liquidateCollateral_fuzz(uint256,uint256) (runs: 5000, μ: 238463, ~: 238875)
[PASS] test_liquidateCollateral_fuzz_revertsWith_ArithmeticUnderflow(uint256,uint256) (runs: 5000, μ: 92477, ~: 92273)
[PASS] test_liquidateCollateral_fuzz_revertsWith_InvalidAmount(uint256) (runs: 5000, μ: 74762, ~: 74742)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.15s (4.13s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateDebt.t.sol:LiquidationLogicLiquidateDebtTest
[PASS] test_liquidateDebt_fuzz(uint256) (runs: 5000, μ: 181043, ~: 181043)
[PASS] test_liquidateDebt_revertsWith_ArithmeticUnderflow() (gas: 146039)
[PASS] test_liquidateDebt_revertsWith_InsufficientAllowance() (gas: 149953)
[PASS] test_liquidateDebt_revertsWith_InsufficientBalance() (gas: 198106)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.44s (2.42s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateUser.t.sol:LiquidationLogicLiquidateUserTest
[PASS] test_liquidateUser() (gas: 353283)
[PASS] test_liquidateUser_revertsWith_InvalidDebtToCover() (gas: 69106)
[PASS] test_liquidateUser_revertsWith_MustNotLeaveDust_Collateral() (gas: 100637)
[PASS] test_liquidateUser_revertsWith_MustNotLeaveDust_Debt() (gas: 109615)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 24.61ms (1.60ms CPU time)

Ran 8 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidationAmounts.t.sol:LiquidationLogicLiquidationAmountsTest
[PASS] test_calculateLiquidationAmounts_EnoughCollateral() (gas: 15155)
[PASS] test_calculateLiquidationAmounts_InsufficientCollateral() (gas: 15402)
[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_CollateralDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 53776, ~: 53734)
[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_NoCollateralDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 52901, ~: 52850)
[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_NoDebtLeft((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 69553, ~: 69463)
[PASS] test_calculateLiquidationAmounts_fuzz_InsufficientCollateral((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 56957, ~: 56827)
[PASS] test_calculateLiquidationAmounts_fuzz_revertsWith_MustNotLeaveDust_Collateral((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 52752, ~: 52629)
[PASS] test_calculateLiquidationAmounts_fuzz_revertsWith_MustNotLeaveDust_Debt((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 65000, ~: 65008)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 19.07s (19.06s CPU time)

Ran 2 tests for tests/unit/Spoke/Spoke.Borrow.t.sol:SpokeBorrowTest
[PASS] test_borrow() (gas: 1077047)
[PASS] test_borrow_fuzz_amounts(uint256,uint256) (runs: 5000, μ: 1069119, ~: 1069164)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 24.79s (24.77s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidationBonus.t.sol:LiquidationLogicLiquidationBonusTest
[PASS] test_calculateLiquidationBonus_MinBonusDueToRounding() (gas: 9360)
[PASS] test_calculateLiquidationBonus_PartialBonus() (gas: 9381)
[PASS] test_calculateLiquidationBonus_fuzz_ConstantBonus(uint256,uint256,uint256,uint256) (runs: 5000, μ: 17229, ~: 17178)
[PASS] test_calculateLiquidationBonus_fuzz_MaxBonus(uint256,uint256,uint256,uint256) (runs: 5000, μ: 19567, ~: 19506)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.02s (1.00s CPU time)

Ran 12 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.ValidateLiquidationCall.t.sol:LiquidationLogicValidateLiquidationCallTest
[PASS] test_validateLiquidationCall() (gas: 28553)
[PASS] test_validateLiquidationCall_revertsWith_CollateralCannotBeLiquidated_NotUsingAsCollateral() (gas: 29608)
[PASS] test_validateLiquidationCall_revertsWith_CollateralCannotBeLiquidated_ZeroCollateralFactor() (gas: 29657)
[PASS] test_validateLiquidationCall_revertsWith_HealthFactorNotBelowThreshold() (gas: 34372)
[PASS] test_validateLiquidationCall_revertsWith_InvalidDebtToCover() (gas: 29343)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotBorrowed() (gas: 29742)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotListed_ZeroCollateralHub() (gas: 29440)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotListed_ZeroDebtHub() (gas: 29497)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotSupplied() (gas: 29644)
[PASS] test_validateLiquidationCall_revertsWith_ReservePaused_CollateralPaused() (gas: 34376)
[PASS] test_validateLiquidationCall_revertsWith_ReservePaused_DebtPaused() (gas: 34392)
[PASS] test_validateLiquidationCall_revertsWith_SelfLiquidation() (gas: 36299)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 19.08ms (967.37µs CPU time)

Ran 26 tests for tests/unit/MathUtils.t.sol:MathUtilsTest
[PASS] test_add_edge_cases() (gas: 4788)
[PASS] test_add_negative_operand(uint256,int256) (runs: 5000, μ: 9327, ~: 9561)
[PASS] test_add_positive_operand(uint256,int256) (runs: 5000, μ: 4013, ~: 4010)
[PASS] test_calculateLinearInterest() (gas: 4511)
[PASS] test_calculateLinearInterest_add_edge() (gas: 5087)
[PASS] test_calculateLinearInterest_edge_cases() (gas: 16870)
Logs:
  Bound result 0
  Bound result 1
  Bound result 864000000
  Bound result 864000000

[PASS] test_calculateLinearInterest_reverts_on_past_timestamp(uint32) (runs: 5000, μ: 7588, ~: 7508)
[PASS] test_constants() (gas: 3211)
[PASS] test_fuzz_calculateLinearInterest(uint96,uint32,uint256) (runs: 5000, μ: 8687, ~: 8997)
[PASS] test_fuzz_mulDivDown(uint256,uint256,uint256) (runs: 5000, μ: 3491, ~: 3545)
[PASS] test_fuzz_mulDivUp(uint256,uint256,uint256) (runs: 5000, μ: 3665, ~: 3781)
[PASS] test_min(uint256,uint256) (runs: 5000, μ: 3338, ~: 3339)
[PASS] test_mulDivDown_NoRemainder() (gas: 3324)
[PASS] test_mulDivDown_RevertOnDivByZero() (gas: 3191)
[PASS] test_mulDivDown_RevertOnOverflow() (gas: 3203)
[PASS] test_mulDivDown_WithRemainder() (gas: 3236)
[PASS] test_mulDivDown_ZeroAOrB() (gas: 3768)
[PASS] test_mulDivUp_NoRemainder() (gas: 3350)
[PASS] test_mulDivUp_RevertOnDivByZero() (gas: 3146)
[PASS] test_mulDivUp_RevertOnOverflow() (gas: 3204)
[PASS] test_mulDivUp_WithRemainder() (gas: 3349)
[PASS] test_mulDivUp_ZeroAOrB() (gas: 3818)
[PASS] test_signedSub(uint256,uint256) (runs: 5000, μ: 8639, ~: 8594)
[PASS] test_uncheckedAdd(uint256,uint256) (runs: 5000, μ: 3461, ~: 3452)
[PASS] test_uncheckedExp(uint256,uint256) (runs: 5000, μ: 11547, ~: 7728)
[PASS] test_uncheckedSub(uint256,uint256) (runs: 5000, μ: 3457, ~: 3540)
Suite result: ok. 26 passed; 0 failed; 0 skipped; finished in 1.65s (1.65s CPU time)

Ran 24 tests for tests/unit/Spoke/Spoke.Config.t.sol:SpokeConfigTest
[PASS] test_addReserve() (gas: 390259)
[PASS] test_addReserve_fuzz_revertsWith_AssetNotListed() (gas: 245721)
[PASS] test_addReserve_revertsWith_InvalidAddress_hub() (gas: 5924045)
[PASS] test_addReserve_revertsWith_InvalidAddress_oracle() (gas: 5961170)
[PASS] test_addReserve_revertsWith_InvalidAssetId() (gas: 33171)
[PASS] test_addReserve_revertsWith_ReserveExists() (gas: 374812)
[PASS] test_spoke_deploy() (gas: 4858230)
[PASS] test_spoke_deploy_revertsWith_InvalidOracleDecimals() (gas: 46309)
[PASS] test_spoke_deploy_reverts_on_InvalidConstructorInput() (gas: 43704)
[PASS] test_updateLiquidationConfig_fuzz_liqBonusConfig((uint128,uint64,uint16)) (runs: 5000, μ: 52149, ~: 52143)
[PASS] test_updateLiquidationConfig_fuzz_revertsWith_InvalidLiquidationConfig_healthFactorForMaxBonus((uint128,uint64,uint16)) (runs: 5000, μ: 37806, ~: 37949)
[PASS] test_updateLiquidationConfig_fuzz_revertsWith_InvalidLiquidationConfig_liquidationBonusFactor((uint128,uint64,uint16)) (runs: 5000, μ: 37380, ~: 37159)
[PASS] test_updateLiquidationConfig_fuzz_targetHealthFactor(uint128) (runs: 5000, μ: 46855, ~: 47159)
[PASS] test_updateLiquidationConfig_liqBonusConfig() (gas: 51102)
Logs:
  Bound result 900000000000000000
  Bound result 1000
  Bound result 1000000000000000000

[PASS] test_updateLiquidationConfig_revertsWith_InvalidLiquidationConfig_healthFactorForMaxBonus() (gas: 36462)
Logs:
  Bound result 1000000000000000000
  Bound result 1000
  Bound result 1000000000000000000

[PASS] test_updateLiquidationConfig_revertsWith_InvalidLiquidationConfig_liquidationBonusFactor() (gas: 36256)
Logs:
  Bound result 900000000000000000
  Bound result 10001
  Bound result 1000000000000000000

[PASS] test_updateLiquidationConfig_targetHealthFactor() (gas: 46442)
Logs:
  Bound result 1000000000000000001

[PASS] test_updateReserveConfig() (gas: 53839)
[PASS] test_updateReserveConfig_fuzz((bool,bool,bool,uint24)) (runs: 5000, μ: 55249, ~: 55084)
[PASS] test_updateReserveConfig_revertsWith_InvalidCollateralRisk() (gas: 39560)
[PASS] test_updateReserveConfig_revertsWith_ReserveNotListed() (gas: 36209)
[PASS] test_updateReservePriceSource() (gas: 240158)
[PASS] test_updateReservePriceSource_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 31123, ~: 31125)
[PASS] test_updateReservePriceSource_revertsWith_ReserveNotListed() (gas: 34299)
Suite result: ok. 24 passed; 0 failed; 0 skipped; finished in 4.10s (4.08s CPU time)

Ran 10 tests for tests/unit/Spoke/Spoke.DynamicConfig.Triggers.t.sol:SpokeDynamicConfigTriggersTest
[PASS] test_borrow_triggers_dynamicConfigUpdate() (gas: 1334044)
[PASS] test_liquidate_does_not_trigger_dynamicConfigUpdate() (gas: 1633579)
[PASS] test_repay_does_not_trigger_dynamicConfigUpdate() (gas: 916956)
[PASS] test_supply_does_not_trigger_dynamicConfigUpdate() (gas: 1073387)
[PASS] test_updateUserDynamicConfig_doesHFCheck() (gas: 804744)
[PASS] test_updateUserDynamicConfig_reverts_when_not_authorized(address) (runs: 5000, μ: 1197667, ~: 1197667)
[PASS] test_updateUserDynamicConfig_triggers_dynamicConfigUpdate() (gas: 677920)
[PASS] test_updateUserDynamicConfig_updatesRP() (gas: 1304419)
[PASS] test_usingAsCollateral_triggers_dynamicConfigUpdate() (gas: 1350611)
[PASS] test_withdraw_triggers_dynamicConfigUpdate() (gas: 1370994)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 28.54s (28.52s CPU time)

Ran 20 tests for tests/unit/Spoke/Spoke.DynamicConfig.t.sol:SpokeDynamicConfigTest
[PASS] test_addDynamicReserveConfig() (gas: 84967)
[PASS] test_addDynamicReserveConfig_fuzz_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_incompatible(uint16,uint32) (runs: 5000, μ: 47681, ~: 47852)
[PASS] test_addDynamicReserveConfig_once() (gas: 541437)
[PASS] test_addDynamicReserveConfig_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 52361, ~: 52361)
[PASS] test_addDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_collateralFactor() (gas: 59362)
[PASS] test_addDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_liquidationBonus() (gas: 41797)
[PASS] test_addDynamicReserveConfig_revertsWith_InvalidLiquidationFee() (gas: 42271)
[PASS] test_addDynamicReserveConfig_revertsWith_ReserveNotListed() (gas: 34262)
[PASS] test_fuzz_addDynamicReserveConfig_spaced_dup_updates(bytes32) (runs: 5000, μ: 154015, ~: 154015)
[PASS] test_fuzz_addDynamicReserveConfig_trailing_order(bytes32) (runs: 5000, μ: 150702, ~: 150702)
[PASS] test_offboardReserve_existing_borrows_remain_unaffected() (gas: 1161401)
[PASS] test_updateDynamicReserveConfig() (gas: 1715608)
[PASS] test_updateDynamicReserveConfig_fuzz_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus(uint16,uint32) (runs: 5000, μ: 63274, ~: 63445)
[PASS] test_updateDynamicReserveConfig_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 52340, ~: 52340)
[PASS] test_updateDynamicReserveConfig_revertsWith_ConfigKeyUninitialized() (gas: 54199)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidCollateralFactor() (gas: 56389)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_collateralFactor() (gas: 57175)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_liquidationBonus() (gas: 57323)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidLiquidationFee() (gas: 57861)
[PASS] test_updateDynamicReserveConfig_revertsWith_ReserveNotListed() (gas: 34592)
Suite result: ok. 20 passed; 0 failed; 0 skipped; finished in 10.37s (10.35s CPU time)

Ran 5 tests for tests/gas/Spoke.Getters.gas.t.sol:SpokeGetters_Gas_Tests
[PASS] test_getUserAccountData() (gas: 22798)
[PASS] test_getUserAccountData_oneSupplies() (gas: 274217)
[PASS] test_getUserAccountData_twoSupplies() (gas: 500001)
[PASS] test_getUserAccountData_twoSupplies_oneBorrows() (gas: 1032536)
[PASS] test_getUserAccountData_twoSupplies_twoBorrows() (gas: 1604477)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 29.07ms (4.71ms CPU time)

Ran 5 tests for tests/unit/Spoke/Spoke.Getters.t.sol:SpokeGettersTest
[PASS] test_getLiquidationBonus_configured() (gas: 89481)
Logs:
  Bound result 2
  Bound result 1000000000000000000
  Bound result 4000
  Bound result 900000000000000000

[PASS] test_getLiquidationBonus_fuzz_configured(uint256,uint256,uint16,uint64) (runs: 5000, μ: 88133, ~: 88592)
[PASS] test_getLiquidationBonus_fuzz_notConfigured(uint256,uint256) (runs: 5000, μ: 65830, ~: 65578)
[PASS] test_getLiquidationBonus_notConfigured() (gas: 67085)
Logs:
  Bound result 2
  Bound result 1000000000000000000

[PASS] test_protocol_getters() (gas: 279121)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.98s (1.97s CPU time)

Ran 4 tests for tests/unit/Spoke/Liquidations/Spoke.LiquidationCall.Dust.t.sol:SpokeLiquidationCallDustTest
[PASS] test_collateralDust_min_debtToTarget() (gas: 7374895)
[PASS] test_debtToCover_exceeds_collateralValue() (gas: 7368216)
[PASS] test_dustColl_allowed() (gas: 7213133)
[PASS] test_dustDebt_allowed() (gas: 7363192)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 48.31ms (23.32ms CPU time)

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

[PASS] test_borrowNative_fuzz(uint256) (runs: 5000, μ: 625508, ~: 625280)
[PASS] test_borrowNative_fuzz_otherReceiver(uint256) (runs: 5000, μ: 651465, ~: 651237)
[PASS] test_borrowNative_otherReceiver() (gas: 651102)
Logs:
  Bound result 5000000000000000000

[PASS] test_borrowNative_revertsWith_InvalidAddress() (gas: 30629)
[PASS] test_borrowNative_revertsWith_InvalidAmount() (gas: 30671)
[PASS] test_borrowNative_revertsWith_NotNativeWrappedAsset() (gas: 30754)
[PASS] test_constructor() (gas: 1035094)
[PASS] test_constructor_revertsWith_InvalidAddress() (gas: 129984)
[PASS] test_fallback_revertsWith_UnsupportedAction() (gas: 17453)
[PASS] test_receive_revertsWith_UnsupportedAction() (gas: 17216)
[PASS] test_renouncePositionManagerRole() (gas: 44795)
[PASS] test_renouncePositionManagerRole_revertsWith_OwnableUnauthorizedAccount() (gas: 50939)
[PASS] test_repayNative() (gas: 755999)
Logs:
  Bound result 5000000000000000000

[PASS] test_repayNative_excessAmount() (gas: 643732)
[PASS] test_repayNative_fuzz(uint256) (runs: 5000, μ: 755785, ~: 756656)
[PASS] test_repayNative_fuzz_withInterest(uint256,uint256) (runs: 5000, μ: 654404, ~: 648415)
[PASS] test_repayNative_revertsWith_InvalidAmount() (gas: 30645)
[PASS] test_repayNative_revertsWith_NativeAmountMismatch() (gas: 54864)
[PASS] test_repayNative_revertsWith_NotNativeWrappedAsset() (gas: 37450)
[PASS] test_supplyNative() (gas: 234441)
Logs:
  Bound result 100000000000000000000

[PASS] test_supplyNative_fuzz(uint256) (runs: 5000, μ: 234777, ~: 234513)
[PASS] test_supplyNative_revertsWith_InvalidAmount() (gas: 30647)
[PASS] test_supplyNative_revertsWith_NativeAmountMismatch() (gas: 54697)
[PASS] test_supplyNative_revertsWith_NotNativeWrappedAsset() (gas: 37363)
[PASS] test_withdrawNative() (gas: 280658)
Logs:
  Bound result 100000000000000000000

[PASS] test_withdrawNative_fuzz(uint256) (runs: 5000, μ: 280694, ~: 280708)
[PASS] test_withdrawNative_fuzz_allBalance(uint256) (runs: 5000, μ: 234771, ~: 234582)
[PASS] test_withdrawNative_fuzz_allBalanceWithInterest(uint256,uint256) (runs: 5000, μ: 619722, ~: 620896)
[PASS] test_withdrawNative_fuzz_otherReceiver(uint256) (runs: 5000, μ: 264407, ~: 264219)
[PASS] test_withdrawNative_otherReceiver() (gas: 264226)
Logs:
  Bound result 100000000000000000000

[PASS] test_withdrawNative_revertsWith_InvalidAddress() (gas: 30540)
[PASS] test_withdrawNative_revertsWith_InvalidAmount() (gas: 30591)
[PASS] test_withdrawNative_revertsWith_NotNativeWrappedAsset() (gas: 30623)
Suite result: ok. 34 passed; 0 failed; 0 skipped; finished in 48.54s (48.52s CPU time)

Ran 3 tests for tests/unit/NoncesKeyed.t.sol:NoncesKeyedTest
[PASS] test_useCheckedNonce_monotonic(bytes32) (runs: 5000, μ: 16119, ~: 16119)
[PASS] test_useCheckedNonce_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 105201, ~: 105201)
[PASS] test_useNonce_monotonic(bytes32) (runs: 5000, μ: 16881, ~: 16881)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.50s (4.49s CPU time)

Ran 10 tests for tests/unit/PercentageMath.t.sol:PercentageMathTests
[PASS] test_constants() (gas: 8664)
[PASS] test_fromBpsDown() (gas: 9678)
[PASS] test_percentDiv() (gas: 15222)
[PASS] test_percentDivUp_ge_value(uint256,uint256) (runs: 5000, μ: 15284, ~: 15509)
[PASS] test_percentDivUp_le_value(uint256,uint256) (runs: 5000, μ: 15669, ~: 15662)
[PASS] test_percentDiv_fuzz(uint256,uint256) (runs: 5000, μ: 12880, ~: 13012)
[PASS] test_percentMul() (gas: 15116)
[PASS] test_percentMulUp_ge_value(uint256,uint256) (runs: 5000, μ: 15652, ~: 15645)
[PASS] test_percentMulUp_le_value(uint256,uint256) (runs: 5000, μ: 15287, ~: 15512)
[PASS] test_percentMul_fuzz(uint256,uint256) (runs: 5000, μ: 11734, ~: 12247)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 1.52s (1.52s CPU time)

Ran 29 tests for tests/unit/libraries/PositionStatusMap.t.sol:PositionStatusMapTest
[PASS] test_bucketId() (gas: 8971)
[PASS] test_collateralCount() (gas: 110158)
[PASS] test_collateralCount(uint256) (runs: 5000, μ: 2046387, ~: 1846191)
[PASS] test_collateralCount_ignoresInvalidBits() (gas: 124482)
[PASS] test_constants() (gas: 44966)
[PASS] test_fls() (gas: 545261)
[PASS] test_fromBitId(uint256,uint256) (runs: 5000, μ: 14114, ~: 14336)
[PASS] test_fuzz_setBorrowing(uint256,bool) (runs: 5000, μ: 22182, ~: 12233)
[PASS] test_fuzz_setUseAsCollateral(uint256,bool) (runs: 5000, μ: 22278, ~: 12329)
[PASS] test_getBucketWord(uint256) (runs: 5000, μ: 14489, ~: 14489)
[PASS] test_isUsingAsCollateralOrBorrowing_slot0() (gas: 108801)
[PASS] test_isUsingAsCollateralOrBorrowing_slot1() (gas: 44065)
[PASS] test_isolateBorrowing(uint256) (runs: 5000, μ: 162282, ~: 162282)
[PASS] test_isolateBorrowingUntil(uint256,uint256) (runs: 5000, μ: 154738, ~: 154662)
[PASS] test_isolateCollateral(uint256) (runs: 5000, μ: 162044, ~: 162044)
[PASS] test_isolateCollateralUntil(uint256,uint256) (runs: 5000, μ: 154717, ~: 154641)
[PASS] test_isolateUntil(uint256,uint256) (runs: 5000, μ: 143620, ~: 143619)
[PASS] test_next(uint256) (runs: 5000, μ: 20436, ~: 20328)
[PASS] test_nextBorrowing(uint256) (runs: 5000, μ: 18201, ~: 18289)
[PASS] test_nextBorrowing_continuous() (gas: 63845326)
[PASS] test_nextCollateral(uint256) (runs: 5000, μ: 18132, ~: 17716)
[PASS] test_nextCollateral_continuous() (gas: 64381718)
[PASS] test_next_continuous() (gas: 91795620)
[PASS] test_popCount(bytes32) (runs: 5000, μ: 38133, ~: 38133)
[PASS] test_setBorrowing_slot0() (gas: 44129)
[PASS] test_setBorrowing_slot1() (gas: 44166)
[PASS] test_setUseAsCollateral_slot0() (gas: 44203)
[PASS] test_setUseAsCollateral_slot1() (gas: 44185)
[PASS] test_setters_use_correct_slot(uint256) (runs: 5000, μ: 22195, ~: 22195)
Suite result: ok. 29 passed; 0 failed; 0 skipped; finished in 107.32s (107.32s CPU time)

Ran 5 tests for tests/unit/Rescuable.t.sol:RescuableTest
[PASS] test_constructor() (gas: 12654)
[PASS] test_rescueNative_fuzz(uint256) (runs: 5000, μ: 33686, ~: 33370)
[PASS] test_rescueNative_revertsWith_OnlyRescueGuardian() (gas: 11400)
[PASS] test_rescueToken_fuzz(uint256) (runs: 5000, μ: 209614, ~: 209387)
[PASS] test_rescueToken_revertsWith_OnlyRescueGuardian() (gas: 183212)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 3.65s (3.63s CPU time)

Ran 10 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Constants.t.sol:SignatureGatewayConstantsTest
[PASS] test_DOMAIN_SEPARATOR() (gas: 2001314)
[PASS] test_borrow_typeHash() (gas: 9858)
[PASS] test_constructor() (gas: 2148562)
[PASS] test_eip712Domain() (gas: 2006941)
[PASS] test_repay_typeHash() (gas: 9915)
[PASS] test_setUsingAsCollateral_typeHash() (gas: 10015)
[PASS] test_supply_typeHash() (gas: 9907)
[PASS] test_updateUserDynamicConfig_typeHash() (gas: 9941)
[PASS] test_updateUserRiskPremium_typeHash() (gas: 9860)
[PASS] test_withdraw_typeHash() (gas: 10037)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 19.98ms (2.04ms CPU time)

Ran 4 tests for tests/unit/misc/SignatureGateway/SignatureGateway.PermitReserve.t.sol:SignatureGatewayPermitReserveTest
[PASS] test_permitReserve() (gas: 102469)
[PASS] test_permitReserve_forwards_correct_call() (gas: 49572)
[PASS] test_permitReserve_ignores_permit_reverts() (gas: 38467)
[PASS] test_permitReserve_revertsWith_ReserveNotListed() (gas: 28403)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 20.01ms (1.80ms CPU time)

Ran 2 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Reverts.InsufficientAllowance.t.sol:SignatureGateway_InsufficientAllowance_Test
[PASS] test_repayWithSig_revertsWith_ERC20InsufficientAllowance() (gas: 469979)
[PASS] test_supplyWithSig_revertsWith_ERC20InsufficientAllowance() (gas: 84088)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 20.40ms (2.63ms CPU time)

Ran 21 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Reverts.InvalidSignature.t.sol:SignatureGatewayInvalidSignatureTest
[PASS] test_borrowWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 186428, ~: 186428)
[PASS] test_borrowWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 36089)
[PASS] test_borrowWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 34531)
[PASS] test_repayWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 186362, ~: 186362)
[PASS] test_repayWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 36000)
[PASS] test_repayWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 34575)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 229846, ~: 229846)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 36013)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 34609)
[PASS] test_supplyWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 186403, ~: 186403)
[PASS] test_supplyWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 36023)
[PASS] test_supplyWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 34518)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 64432, ~: 64432)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_InvalidSignatureDueTo_InvalidSigner() (gas: 23177)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 24609)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 64398, ~: 64398)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_InvalidSignatureDueTo_InvalidSigner() (gas: 23116)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 24631)
[PASS] test_withdrawWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 186359, ~: 186359)
[PASS] test_withdrawWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 36087)
[PASS] test_withdrawWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 34573)
Suite result: ok. 21 passed; 0 failed; 0 skipped; finished in 44.42s (44.41s CPU time)

Ran 7 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Reverts.Unauthorized.t.sol:SignatureGateway_Unauthorized_PositionManagerActive_Test
[PASS] test_borrowWithSig_revertsWith_Unauthorized() (gas: 77394)
[PASS] test_repayWithSig_revertsWith_Unauthorized() (gas: 113815)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_Unauthorized() (gas: 69485)
[PASS] test_supplyWithSig_revertsWith_Unauthorized() (gas: 138267)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_Unauthorized() (gas: 79130)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_Unauthorized() (gas: 78917)
[PASS] test_withdrawWithSig_revertsWith_Unauthorized() (gas: 99059)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 27.75ms (4.31ms CPU time)

Ran 7 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Reverts.Unauthorized.t.sol:SignatureGateway_Unauthorized_PositionManagerNotActive_Test
[PASS] test_borrowWithSig_revertsWith_Unauthorized() (gas: 75193)
[PASS] test_repayWithSig_revertsWith_Unauthorized() (gas: 111614)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_Unauthorized() (gas: 67284)
[PASS] test_supplyWithSig_revertsWith_Unauthorized() (gas: 136066)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_Unauthorized() (gas: 76929)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_Unauthorized() (gas: 76716)
[PASS] test_withdrawWithSig_revertsWith_Unauthorized() (gas: 96858)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 22.29ms (4.32ms CPU time)

Ran 11 tests for tests/unit/misc/SignatureGateway/SignatureGateway.t.sol:SignatureGatewayTest
[PASS] test_borrowWithSig() (gas: 818139)
[PASS] test_renouncePositionManagerRole() (gas: 26594)
[PASS] test_renouncePositionManagerRole_revertsWith_OnlyOwner() (gas: 16151)
[PASS] test_repayWithSig() (gas: 799384)
[PASS] test_setSelfAsUserPositionManagerWithSig() (gas: 308315)
[PASS] test_setUsingAsCollateralWithSig() (gas: 618102)
[PASS] test_supplyWithSig() (gas: 591044)
[PASS] test_updateUserDynamicConfigWithSig() (gas: 320537)
[PASS] test_updateUserRiskPremiumWithSig() (gas: 913385)
[PASS] test_useNonce_monotonic(bytes32) (runs: 5000, μ: 16724, ~: 16724)
[PASS] test_withdrawWithSig() (gas: 599870)
Suite result: ok. 11 passed; 0 failed; 0 skipped; finished in 446.03ms (428.22ms CPU time)

Ran 3 tests for tests/unit/Spoke/Spoke.Access.t.sol:SpokeAccessTest
[PASS] testAccess_change_authority() (gas: 2612789)
[PASS] testAccess_hub_functions_callable_by_spokes() (gas: 608142)
[PASS] testAccess_spoke_admin_config_access() (gas: 490341)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 21.02ms (3.32ms CPU time)

Ran 1 test for tests/unit/Spoke/Spoke.AccrueInterest.Scenario.t.sol:SpokeAccrueInterestScenarioTest
[SKIP: pending rft] test_accrueInterest_fuzz_RPBorrowAndSkipTime_twoActions((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),uint32) (runs: 0, μ: 0, ~: 0)
Suite result: ok. 0 passed; 0 failed; 1 skipped; finished in 22.45ms (4.17ms CPU time)

Ran 7 tests for tests/unit/Spoke/Spoke.AccrueInterest.t.sol:SpokeAccrueInterestTest
[PASS] test_accrueInterest_NoActionTaken() (gas: 139082)
[PASS] test_accrueInterest_NoInterest_NoDebt(uint32) (runs: 5001, μ: 670219, ~: 670136)
[PASS] test_accrueInterest_NoInterest_OnlySupply(uint32) (runs: 5001, μ: 258888, ~: 259209)
[PASS] test_accrueInterest_TenPercentRp(uint256,uint32) (runs: 5001, μ: 599993, ~: 600985)
[PASS] test_accrueInterest_fuzz_BorrowAmountAndSkipTime(uint256,uint32) (runs: 5001, μ: 560358, ~: 560918)
[PASS] test_accrueInterest_fuzz_RPBorrowAndSkipTime((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),uint32) (runs: 5001, μ: 3978803, ~: 3991064)
[PASS] test_accrueInterest_fuzz_RatesRPBorrowAndSkipTime((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint96,uint96,uint96,uint96),uint32) (runs: 5001, μ: 4034059, ~: 4049547)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 225.58s (225.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: 5001, μ: 562004, ~: 562170)
[PASS] test_accrueLiquidityFee_fuzz_maxLiquidityFee_with_premium_multiple_users(uint256,uint256,uint256,uint256,uint256) (runs: 5001, μ: 807876, ~: 807877)
[PASS] test_accrueLiquidityFee_maxLiquidityFee_multi_spoke() (gas: 591295420)
[PASS] test_accrueLiquidityFee_maxLiquidityFee_multi_user() (gas: 253104830)
[PASS] test_accrueLiquidityFee_maxLiquidityFee_with_premium() (gas: 562489)
Logs:
  Bound result 500000000000000000000
  Bound result 5000
  Bound result 34560000
  Bound result 2

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

Ran 7 tests for tests/unit/Spoke/Spoke.AccrueLiquidityFee.t.sol:SpokeAccrueLiquidityFeeTest
[PASS] test_accrueLiquidityFee() (gas: 856528)
[PASS] test_accrueLiquidityFee_NoActionTaken() (gas: 98524)
[PASS] test_accrueLiquidityFee_NoInterest_OnlySupply(uint32) (runs: 5001, μ: 236567, ~: 236730)
[PASS] test_accrueLiquidityFee_exact() (gas: 845422)
[PASS] test_accrueLiquidityFee_fuzz_BorrowAmountAndSkipTime(uint256,uint32) (runs: 5001, μ: 840692, ~: 869537)
[PASS] test_accrueLiquidityFee_maxLiquidityFee() (gas: 557331)
[PASS] test_accrueLiquidityFee_setUsingAsCollateral() (gas: 890473)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 20.37s (20.35s CPU time)

Ran 10 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_Gas_Tests
[PASS] test_borrow() (gas: 1175220)
[PASS] test_liquidation() (gas: 8307641)
[PASS] test_multicall_ops() (gas: 1609544)
[PASS] test_repay() (gas: 971772)
[PASS] test_setUserPositionManagerWithSig() (gas: 293603)
[PASS] test_supply() (gas: 951367)
[PASS] test_updateRiskPremium() (gas: 1450011)
[PASS] test_updateUserDynamicConfig() (gas: 513768)
[PASS] test_usingAsCollateral() (gas: 1631179)
[PASS] test_withdraw() (gas: 2118350)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 47.81ms (24.53ms CPU time)

Ran 10 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_ZeroRiskPremium_Gas_Tests
[PASS] test_borrow() (gas: 961177)
[PASS] test_liquidation() (gas: 8128176)
[PASS] test_multicall_ops() (gas: 1474940)
[PASS] test_repay() (gas: 853201)
[PASS] test_setUserPositionManagerWithSig() (gas: 298129)
[PASS] test_supply() (gas: 847096)
[PASS] test_updateRiskPremium() (gas: 964732)
[PASS] test_updateUserDynamicConfig() (gas: 518294)
[PASS] test_usingAsCollateral() (gas: 1138689)
[PASS] test_withdraw() (gas: 1648219)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 45.48ms (19.95ms CPU time)

Ran 4 tests for tests/unit/Spoke/Spoke.PermitReserve.t.sol:SpokePermitReserveTest
[PASS] test_permitReserve() (gas: 95231)
[PASS] test_permitReserve_forwards_correct_call() (gas: 42510)
[PASS] test_permitReserve_ignores_permit_reverts() (gas: 27222)
[PASS] test_permitReserve_revertsWith_ReserveNotListedIn() (gas: 23119)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 19.83ms (1.20ms CPU time)

Ran 12 ...*[Comment body truncated]*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants