Skip to content

Conversation

@CheyenneAtapour
Copy link
Contributor

No description provided.

@CheyenneAtapour CheyenneAtapour marked this pull request as ready for review January 20, 2026 22:26
@github-actions
Copy link

github-actions bot commented Jan 21, 2026

Forge Build Sizes

🔕 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,709 2,894 21,867 46,258
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 427 479 24,149 48,673
Create2Utils 134 184 24,442 48,968
DeployUtils 44 94 24,532 49,058
DeployWrapper 3,048 3,076 21,528 46,076
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
Hub 24,489 24,686 87 24,466
HubConfigurator 13,133 13,406 11,443 35,746
JsonBindings 12,835 12,887 11,741 36,265
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 7,942 7,994 16,634 41,158
LiquidationLogic.spoke 5,603 5,635 18,973 43,517
LiquidationLogicWrapper 13,706 13,880 10,870 35,272
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,168 6,585 18,408 42,567
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,102 3,130 21,474 46,022
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 1,075 1,103 23,501 48,049
Roles 184 234 24,392 48,918
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,466 12,005 13,110 37,147
SlotDerivation 44 94 24,532 49,058
SlotDerivation.hub 16 44 24,560 49,108
SlotDerivation.spoke 16 44 24,560 49,108
SpokeConfigurator 11,354 11,627 13,222 37,525
SpokeInstance 24,366 25,098 210 24,054
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
UserPositionDebt 44 94 24,532 49,058
UserPositionDebt.spoke 16 44 24,560 49,108
UserPositionDebtWrapper 3,259 3,287 21,317 45,865
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,394 1,422 23,182 47,730

@github-actions
Copy link

github-actions bot commented Jan 21, 2026

🌈 Test Results
No files changed, compilation skipped

Ran 13 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_Gas_Tests
[PASS] test_borrow() (gas: 1320948)
[PASS] test_liquidation_full() (gas: 1901915)
[PASS] test_liquidation_partial() (gas: 1901632)
[PASS] test_liquidation_receiveShares_full() (gas: 1892689)
[PASS] test_liquidation_receiveShares_partial() (gas: 1892408)
[PASS] test_multicall_ops() (gas: 1402595)
[PASS] test_repay() (gas: 866740)
[PASS] test_setUserPositionManagersWithSig() (gas: 307172)
[PASS] test_supply() (gas: 538732)
[PASS] test_updateRiskPremium() (gas: 1309799)
[PASS] test_updateUserDynamicConfig() (gas: 583043)
[PASS] test_usingAsCollateral() (gas: 1465184)
[PASS] test_withdraw() (gas: 1939961)
Suite result: ok. 13 passed; 0 failed; 0 skipped; finished in 81.70ms (30.47ms CPU time)

Ran 13 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_ZeroRiskPremium_Gas_Tests
[PASS] test_borrow() (gas: 1087594)
[PASS] test_liquidation_full() (gas: 1767256)
[PASS] test_liquidation_partial() (gas: 1766973)
[PASS] test_liquidation_receiveShares_full() (gas: 1758030)
[PASS] test_liquidation_receiveShares_partial() (gas: 1757749)
[PASS] test_multicall_ops() (gas: 1319985)
[PASS] test_repay() (gas: 775934)
[PASS] test_setUserPositionManagersWithSig() (gas: 311626)
[PASS] test_supply() (gas: 541413)
[PASS] test_updateRiskPremium() (gas: 937804)
[PASS] test_updateUserDynamicConfig() (gas: 587497)
[PASS] test_usingAsCollateral() (gas: 1083870)
[PASS] test_withdraw() (gas: 1580616)
Suite result: ok. 13 passed; 0 failed; 0 skipped; finished in 80.20ms (39.96ms CPU time)

Ran 4 tests for tests/unit/Spoke/Spoke.PermitReserve.t.sol:SpokePermitReserveTest
[PASS] test_permitReserve() (gas: 88249)
[PASS] test_permitReserve_forwards_correct_call() (gas: 35576)
[PASS] test_permitReserve_ignores_permit_reverts() (gas: 24412)
[PASS] test_permitReserve_revertsWith_ReserveNotListedIn() (gas: 22971)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 34.28ms (1.06ms CPU time)

Ran 20 tests for tests/unit/AaveOracle.t.sol:AaveOracleTest
[PASS] test_DECIMALS() (gas: 8326)
[PASS] test_constructor() (gas: 18424)
[PASS] test_description() (gas: 12039)
[PASS] test_fuzz_constructor(uint8) (runs: 5000, μ: 19884, ~: 20210)
[PASS] test_getReservePrice() (gas: 48776)
[PASS] test_getReservePrice_revertsWith_InvalidPrice() (gas: 48043)
[PASS] test_getReservePrice_revertsWith_InvalidSource() (gas: 10894)
[PASS] test_getReservePrices() (gas: 80715)
[PASS] test_getReservePrices_revertsWith_InvalidSource() (gas: 50926)
[PASS] test_getReserveSource() (gas: 48946)
[PASS] test_setReserveSource() (gas: 45988)
[PASS] test_setReserveSource_revertsWith_InvalidPrice() (gas: 102767)
[PASS] test_setReserveSource_revertsWith_InvalidSource() (gas: 17224)
[PASS] test_setReserveSource_revertsWith_InvalidSourceDecimals() (gas: 17061)
[PASS] test_setReserveSource_revertsWith_OnlySpoke() (gas: 13021)
[PASS] test_setReserveSource_revertsWith_OracleMismatch() (gas: 5044893)
[PASS] test_setSpoke() (gas: 5072799)
[PASS] test_setSpoke_revertsWith_InvalidAddress() (gas: 10870)
[PASS] test_setSpoke_revertsWith_OnlyDeployer(address) (runs: 5000, μ: 13397, ~: 13397)
[PASS] test_setSpoke_revertsWith_SpokeAlreadySet() (gas: 15080)
Suite result: ok. 20 passed; 0 failed; 0 skipped; finished in 994.04ms (1.13s CPU time)

Ran 7 tests for tests/unit/Spoke/Spoke.AccrueLiquidityFee.t.sol:SpokeAccrueLiquidityFeeTest
[PASS] test_accrueLiquidityFee() (gas: 857832)
[PASS] test_accrueLiquidityFee_NoActionTaken() (gas: 121608)
[PASS] test_accrueLiquidityFee_NoInterest_OnlySupply(uint40) (runs: 5000, μ: 244593, ~: 244552)
[PASS] test_accrueLiquidityFee_exact() (gas: 863611)
[PASS] test_accrueLiquidityFee_fuzz_BorrowAmountAndSkipTime(uint256,uint40) (runs: 5000, μ: 933627, ~: 954857)
[PASS] test_accrueLiquidityFee_maxLiquidityFee() (gas: 542538)
[PASS] test_accrueLiquidityFee_setUsingAsCollateral() (gas: 889975)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 20.26s (20.23s CPU time)

Ran 17 tests for tests/unit/AccessManagerEnumerable.t.sol:AccessManagerEnumerableTest
[PASS] test_getRoleMembers_fuzz(uint256,uint256) (runs: 5000, μ: 1981351, ~: 1980216)
[PASS] test_getRoleTargetSelectors_fuzz(uint256,uint256) (runs: 5000, μ: 1528820, ~: 1527966)
[PASS] test_grantRole() (gas: 315886)
[PASS] test_grantRole_fuzz(uint64,uint256) (runs: 5000, μ: 926207, ~: 919753)
[PASS] test_revokeRole() (gas: 323138)
[PASS] test_setRoleAdmin_fuzz_trackAdminRoles_multipleRoles_multipleAdmins(uint256) (runs: 5000, μ: 2157472, ~: 2257477)
[PASS] test_setRoleAdmin_fuzz_trackRolesAndTrackAdminRoles_multipleRoles(uint256) (runs: 5000, μ: 1966408, ~: 2113979)
[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 23.05s (36.93s 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, μ: 441099, ~: 428036)
[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.54s (21.54s 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, μ: 1039119, ~: 1039241)
[PASS] test_borrow_fuzz_rounding_effect_inflated_ex_rate(uint256,uint256,uint256) (runs: 5000, μ: 1409827, ~: 1409908)
[PASS] test_borrow_fuzz_rounding_effect_shares(uint256,uint256) (runs: 5000, μ: 1081962, ~: 1081706)
[PASS] test_borrow_rounding_effect_multiple_actions() (gas: 1140798)
[PASS] test_borrow_rounding_effect_shares() (gas: 1080968)
Logs:
  Bound result 5000000000000000000
  Bound result 94608000

Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 57.82s (57.80s 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, μ: 231376, ~: 232296)
[PASS] test_fuzz_add_unique(uint256,uint256) (runs: 5000, μ: 250608, ~: 254508)
[PASS] test_fuzz_get(uint256[]) (runs: 5000, μ: 398399, ~: 390465)
[PASS] test_fuzz_get_uninitialized(uint256[]) (runs: 5000, μ: 280956, ~: 260402)
[PASS] test_fuzz_get_uninitialized_sorted(uint256[]) (runs: 5000, μ: 182468, ~: 158368)
[PASS] test_fuzz_sortByKey(uint256[]) (runs: 5000, μ: 461712, ~: 453679)
[PASS] test_fuzz_sortByKey_length(uint256) (runs: 5000, μ: 217738, ~: 214566)
[PASS] test_fuzz_sortByKey_with_collision(uint256[]) (runs: 5000, μ: 543884, ~: 546891)
Suite result: ok. 9 passed; 0 failed; 0 skipped; finished in 70.68s (70.67s 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, μ: 30179, ~: 30262)
[PASS] test_calculateDebtToLiquidate_fuzz_AmountAdjustedDueToDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 31902, ~: 32003)
[PASS] test_calculateDebtToLiquidate_fuzz_ImpossibleToAdjustForDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 33987, ~: 33948)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.35s (3.32s CPU time)

Ran 60 tests for tests/unit/HubConfigurator.t.sol:HubConfiguratorTest
[PASS] test_addAsset_fuzz(bool,address,uint8,address,uint256,uint16,uint32,uint32,uint32) (runs: 5000, μ: 464345, ~: 465046)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals(bool,address,uint8,address,uint256,address) (runs: 5000, μ: 56234, ~: 56194)
[PASS] test_addAsset_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 31022, ~: 30615)
[PASS] test_addAsset_revertsWith_InvalidAddress_irStrategy() (gas: 49370)
[PASS] test_addAsset_revertsWith_InvalidAddress_underlying() (gas: 49266)
[PASS] test_addAsset_revertsWith_InvalidLiquidityFee() (gas: 366576)
[PASS] test_addAsset_reverts_invalidIrData() (gas: 92850)
[PASS] test_addSpoke() (gas: 126499)
[PASS] test_addSpokeToAssets() (gas: 223580)
[PASS] test_addSpokeToAssets_revertsWith_MismatchedConfigs() (gas: 24589)
[PASS] test_addSpokeToAssets_revertsWith_OwnableUnauthorizedAccount() (gas: 16866)
[PASS] test_addSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 16620)
[PASS] test_deactivateAsset() (gas: 166916)
[PASS] test_deactivateAsset_revertsWith_OwnableUnauthorizedAccount() (gas: 17760)
[PASS] test_deactivateSpoke() (gas: 165682)
[PASS] test_deactivateSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 17807)
[PASS] test_freezeAsset() (gas: 241109)
[PASS] test_freezeAsset_revertsWith_OwnableUnauthorizedAccount() (gas: 17781)
[PASS] test_freezeSpoke() (gas: 258638)
[PASS] test_freezeSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 17807)
[PASS] test_haltAsset() (gas: 166861)
[PASS] test_haltAsset_revertsWith_OwnableUnauthorizedAccount() (gas: 17716)
[PASS] test_haltSpoke() (gas: 165627)
[PASS] test_haltSpoke_revertsWith_OwnableUnauthorizedAccount() (gas: 17759)
[PASS] test_updateFeeConfig_Scenario() (gas: 337011)
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, μ: 185816, ~: 186099)
[PASS] test_updateFeeConfig_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 17277, ~: 17277)
[PASS] test_updateFeeConfig_revertsWith_InvalidAddress_spoke() (gas: 50474)
[PASS] test_updateFeeConfig_revertsWith_InvalidLiquidityFee() (gas: 53594)
[PASS] test_updateFeeReceiver_Scenario() (gas: 214826)
[PASS] test_updateFeeReceiver_WithdrawFromOldSpoke() (gas: 419033)
[PASS] test_updateFeeReceiver_correctAccruals() (gas: 455526)
[PASS] test_updateFeeReceiver_fuzz(address) (runs: 5000, μ: 179339, ~: 179339)
[PASS] test_updateFeeReceiver_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 16918, ~: 16918)
[PASS] test_updateFeeReceiver_revertsWith_InvalidAddress_spoke() (gas: 52286)
[PASS] test_updateFeeReceiver_revertsWith_SpokeAlreadyListed() (gas: 80185)
[PASS] test_updateInterestRateData() (gas: 73061)
[PASS] test_updateInterestRateData_revertsWith_OwnableUnauthorizedAccount() (gas: 18943)
[PASS] test_updateInterestRateStrategy() (gas: 93496)
[PASS] test_updateInterestRateStrategy_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 28358, ~: 28359)
[PASS] test_updateInterestRateStrategy_revertsWith_InterestRateStrategyReverts() (gas: 76899)
[PASS] test_updateInterestRateStrategy_revertsWith_InvalidAddress_irStrategy() (gas: 61822)
[PASS] test_updateInterestRateStrategy_revertsWith_InvalidInterestRateStrategy() (gas: 67126)
[PASS] test_updateLiquidityFee_fuzz(uint256,uint16) (runs: 5000, μ: 91132, ~: 92800)
[PASS] test_updateLiquidityFee_revertsWith_InvalidLiquidityFee() (gas: 55338)
[PASS] test_updateLiquidityFee_revertsWith_OwnableUnauthorizedAccount() (gas: 16383)
[PASS] test_updateReinvestmentController() (gas: 101673)
[PASS] test_updateReinvestmentController_fuzz_revertsWith_OwnableUnauthorizedAccount(address) (runs: 5000, μ: 16895, ~: 16895)
[PASS] test_updateSpokeActive() (gas: 87294)
[PASS] test_updateSpokeActive_revertsWith_OwnableUnauthorizedAccount() (gas: 20084)
[PASS] test_updateSpokeCaps() (gas: 66421)
[PASS] test_updateSpokeCaps_revertsWith_OwnableUnauthorizedAccount() (gas: 19998)
[PASS] test_updateSpokeDrawCap() (gas: 66246)
[PASS] test_updateSpokeDrawCap_revertsWith_OwnableUnauthorizedAccount() (gas: 20073)
[PASS] test_updateSpokeHalted() (gas: 90007)
[PASS] test_updateSpokeHalted_revertsWith_OwnableUnauthorizedAccount() (gas: 19985)
[PASS] test_updateSpokeRiskPremiumThreshold() (gas: 66247)
[PASS] test_updateSpokeRiskPremiumThreshold_revertsWith_OwnableUnauthorizedAccount() (gas: 19984)
[PASS] test_updateSpokeSupplyCap() (gas: 66264)
[PASS] test_updateSpokeSupplyCap_revertsWith_OwnableUnauthorizedAccount() (gas: 20017)
Suite result: ok. 60 passed; 0 failed; 0 skipped; finished in 85.18s (90.50s 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, μ: 22788, ~: 22724)
[PASS] test_calculateDebtToTargetHealthFactor_NoPrecisionLoss() (gas: 24870)
[PASS] test_calculateDebtToTargetHealthFactor_PrecisionLoss() (gas: 14911)
[PASS] test_calculateDebtToTargetHealthFactor_UnitPrice() (gas: 24870)
[PASS] test_calculateDebtToTargetHealthFactor_fuzz_NoRevert((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 19904, ~: 19850)
[PASS] test_calculateDebtToTargetHealthFactor_fuzz_revertsWith_DivisionByZero_ZeroAssetPrice((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 22554, ~: 22482)
[PASS] test_calculateDebtToTargetHealthFactor_revertsWith_ArithmeticError_TargetHealthFactorLessThanHealthFactor((uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 22523, ~: 22465)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.83s (4.91s 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 22.61ms (980.03µs CPU time)

Ran 5 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateCollateral.t.sol:LiquidationLogicLiquidateCollateralTest
[PASS] test_liquidateCollateral_fuzz(uint256,uint256) (runs: 5000, μ: 266833, ~: 267672)
[PASS] test_liquidateCollateral_fuzz_CollateralToLiquidatorIsZero(uint256) (runs: 5000, μ: 109886, ~: 110732)
[PASS] test_liquidateCollateral_fuzz_receiveShares_sharesToLiquidator(uint256,uint256) (runs: 5000, μ: 752919, ~: 754293)
[PASS] test_liquidateCollateral_fuzz_revertsWith_ArithmeticUnderflow(uint256,uint256) (runs: 5000, μ: 100551, ~: 100347)
[PASS] test_liquidateCollateral_receiveShares_sharesToLiquidatorIsZero() (gas: 737259)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 12.77s (14.09s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateUser.t.sol:LiquidationLogicLiquidateUserTest
[PASS] test_liquidateUser() (gas: 363003)
[PASS] test_liquidateUser_revertsWith_InvalidDebtToCover() (gas: 76375)
[PASS] test_liquidateUser_revertsWith_MustNotLeaveDust_Collateral() (gas: 109856)
[PASS] test_liquidateUser_revertsWith_MustNotLeaveDust_Debt() (gas: 118992)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 37.44ms (1.36ms 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, μ: 961831, ~: 941172)
[PASS] test_extSloads(uint256,bytes) (runs: 5000, μ: 1010169, ~: 951933)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 58.75s (58.75s 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 348.36ms (326.97ms CPU time)

Ran 5 tests for tests/gas/Gateways.Operations.gas.t.sol:NativeTokenGateway_Gas_Tests
[PASS] test_borrowNative() (gas: 915852)
[PASS] test_repayNative() (gas: 987725)
[PASS] test_supplyAndCollateralNative() (gas: 305003)
[PASS] test_supplyNative() (gas: 286552)
[PASS] test_withdrawNative() (gas: 507928)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 40.49ms (3.99ms CPU time)

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

[PASS] test_calculateInterestRate_AtMaxUtilization() (gas: 24681)
Logs:
  Bound result 10000
  Bound result 563291217706774819589711002872

[PASS] test_calculateInterestRate_LeftToKinkPoint(uint256) (runs: 5000, μ: 24222, ~: 24372)
[PASS] test_calculateInterestRate_RightToKinkPoint(uint256) (runs: 5000, μ: 25363, ~: 25411)
[PASS] test_calculateInterestRate_ZeroDebtZeroLiquidity() (gas: 18783)
Logs:
  Bound result 0

[PASS] test_calculateInterestRate_fuzz_ZeroDebt(uint256) (runs: 5000, μ: 19067, ~: 18834)
[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 81.67s (81.86s CPU time)

Ran 8 tests for tests/gas/Gateways.Operations.gas.t.sol:SignatureGateway_Gas_Tests
[PASS] test_borrowWithSig() (gas: 743118)
[PASS] test_repayWithSig() (gas: 978191)
[PASS] test_setSelfAsUserPositionManagerWithSig() (gas: 209608)
[PASS] test_setUsingAsCollateralWithSig() (gas: 289254)
[PASS] test_supplyWithSig() (gas: 460713)
[PASS] test_updateUserDynamicConfigWithSig() (gas: 145189)
[PASS] test_updateUserRiskPremiumWithSig() (gas: 143132)
[PASS] test_withdrawWithSig() (gas: 409379)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 44.54ms (7.67ms CPU time)

Ran 6 tests for tests/unit/Hub/Hub.Access.t.sol:HubAccessTest
[PASS] test_change_authority() (gas: 206288)
[PASS] test_change_role_responsibility() (gas: 121132)
[PASS] test_hub_access_manager_exposure() (gas: 13427)
[PASS] test_hub_admin_access() (gas: 1374988)
[PASS] test_migrate_role_responsibility() (gas: 657040)
[PASS] test_setInterestRateData_access() (gas: 102489)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 24.78ms (3.88ms CPU time)

Ran 8 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidationAmounts.t.sol:LiquidationLogicLiquidationAmountsTest
[PASS] test_calculateLiquidationAmounts_EnoughCollateral() (gas: 15199)
[PASS] test_calculateLiquidationAmounts_InsufficientCollateral() (gas: 15451)
[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_CollateralDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 55944, ~: 55807)
[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_NoCollateralDust((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 54940, ~: 54975)
[PASS] test_calculateLiquidationAmounts_fuzz_EnoughCollateral_NoDebtLeft((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 71260, ~: 71213)
[PASS] test_calculateLiquidationAmounts_fuzz_InsufficientCollateral((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 58456, ~: 58316)
[PASS] test_calculateLiquidationAmounts_fuzz_revertsWith_MustNotLeaveDust_Collateral((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 55379, ~: 55190)
[PASS] test_calculateLiquidationAmounts_fuzz_revertsWith_MustNotLeaveDust_Debt((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 67970, ~: 67973)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 17.69s (17.67s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidationBonus.t.sol:LiquidationLogicLiquidationBonusTest
[PASS] test_calculateLiquidationBonus_MinBonusDueToRounding() (gas: 9265)
[PASS] test_calculateLiquidationBonus_PartialBonus() (gas: 9286)
[PASS] test_calculateLiquidationBonus_fuzz_ConstantBonus(uint256,uint256,uint256,uint256) (runs: 5000, μ: 17115, ~: 16909)
[PASS] test_calculateLiquidationBonus_fuzz_MaxBonus(uint256,uint256,uint256,uint256) (runs: 5000, μ: 19346, ~: 19134)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 975.75ms (954.54ms CPU time)

Ran 12 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.ValidateLiquidationCall.t.sol:LiquidationLogicValidateLiquidationCallTest
[PASS] test_validateLiquidationCall() (gas: 26045)
[PASS] test_validateLiquidationCall_revertsWith_CannotReceiveShares() (gas: 259541)
[PASS] test_validateLiquidationCall_revertsWith_CollateralCannotBeLiquidated() (gas: 45213)
[PASS] test_validateLiquidationCall_revertsWith_HealthFactorNotBelowThreshold() (gas: 31843)
[PASS] test_validateLiquidationCall_revertsWith_InvalidDebtToCover() (gas: 26816)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotBorrowed() (gas: 26935)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotEnabledAsCollateral_NotUsingAsCollateral() (gas: 27042)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotEnabledAsCollateral_ZeroCollateralFactor() (gas: 27072)
[PASS] test_validateLiquidationCall_revertsWith_ReserveNotSupplied() (gas: 26902)
[PASS] test_validateLiquidationCall_revertsWith_ReservePaused_CollateralPaused() (gas: 31944)
[PASS] test_validateLiquidationCall_revertsWith_ReservePaused_DebtPaused() (gas: 31944)
[PASS] test_validateLiquidationCall_revertsWith_SelfLiquidation() (gas: 33701)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 22.83ms (1.46ms CPU time)

Ran 27 tests for tests/unit/MathUtils.t.sol:MathUtilsTest
[PASS] test_add_edge_cases() (gas: 4679)
[PASS] test_add_negative_operand(uint256,int256) (runs: 5000, μ: 9087, ~: 8834)
[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, μ: 7533, ~: 7381)
[PASS] test_constants() (gas: 3110)
[PASS] test_fuzz_calculateLinearInterest(uint96,uint40,uint256) (runs: 5000, μ: 8581, ~: 8824)
[PASS] test_fuzz_mulDivDown(uint256,uint256,uint256) (runs: 5000, μ: 3514, ~: 3577)
[PASS] test_fuzz_mulDivUp(uint256,uint256,uint256) (runs: 5000, μ: 3593, ~: 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: 3161)
[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, μ: 8583, ~: 8530)
[PASS] test_signedSub_revertsWith_SafeCastOverflowedUintToInt(uint256) (runs: 5000, μ: 7654, ~: 7702)
[PASS] test_uncheckedAdd(uint256,uint256) (runs: 5000, μ: 3446, ~: 3438)
[PASS] test_uncheckedExp(uint256,uint256) (runs: 5000, μ: 12329, ~: 9654)
[PASS] test_uncheckedSub(uint256,uint256) (runs: 5000, μ: 3421, ~: 3340)
Suite result: ok. 27 passed; 0 failed; 0 skipped; finished in 1.82s (1.81s CPU time)

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

[PASS] test_borrowNative_fuzz(uint256) (runs: 5000, μ: 662194, ~: 663078)
[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: 751768)
Logs:
  Bound result 5000000000000000000

[PASS] test_repayNative_excessAmount() (gas: 660287)
[PASS] test_repayNative_fuzz(uint256) (runs: 5000, μ: 747762, ~: 752132)
[PASS] test_repayNative_fuzz_withInterest(uint256,uint256) (runs: 5000, μ: 671204, ~: 666366)
[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: 325951)
[PASS] test_repayNative_revertsWith_ReentrancyGuardReentrantCall_spokeRepay() (gas: 303133)
[PASS] test_repayNative_revertsWith_SpokeNotRegistered() (gas: 38728)
[PASS] test_supplyAndCollateralNative() (gas: 333101)
Logs:
  Bound result 100000000000000000000

[PASS] test_supplyAndCollateralNative_fuzz(uint256) (runs: 5000, μ: 333407, ~: 333129)
[PASS] test_supplyNative() (gas: 304855)
Logs:
  Bound result 100000000000000000000

[PASS] test_supplyNative_fuzz(uint256) (runs: 5000, μ: 305159, ~: 304882)
[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: 330881)
Logs:
  Bound result 100000000000000000000

[PASS] test_withdrawNative_fuzz(uint256) (runs: 5000, μ: 330568, ~: 330953)
[PASS] test_withdrawNative_fuzz_allBalance(uint256) (runs: 5000, μ: 267651, ~: 267453)
[PASS] test_withdrawNative_fuzz_allBalanceWithInterest(uint256,uint256) (runs: 5000, μ: 613440, ~: 613427)
[PASS] test_withdrawNative_revertsWith_InvalidAmount() (gas: 32479)
[PASS] test_withdrawNative_revertsWith_NotNativeWrappedAsset() (gas: 32512)
[PASS] test_withdrawNative_revertsWith_ReentrancyGuardReentrantCall_hubRemove() (gas: 299983)
[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 62.56s (62.54s 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, μ: 96576, ~: 95958)
[PASS] test_useNonce_monotonic(bytes32) (runs: 5000, μ: 13531, ~: 13531)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.97s (3.97s CPU time)

Ran 4 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.LiquidateDebt.t.sol:LiquidationLogicLiquidateDebtTest
[PASS] test_liquidateDebt_fuzz(uint256) (runs: 5000, μ: 229907, ~: 229907)
[PASS] test_liquidateDebt_revertsWith_ArithmeticUnderflow() (gas: 97257)
[PASS] test_liquidateDebt_revertsWith_InsufficientAllowance() (gas: 124250)
[PASS] test_liquidateDebt_revertsWith_InsufficientBalance() (gas: 181665)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 90.08s (90.06s 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, μ: 905396, ~: 905387)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls(uint256,uint256) (runs: 5000, μ: 850750, ~: 851379)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 886197, ~: 886520)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts(uint256,uint256) (runs: 5000, μ: 1086851, ~: 1087067)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 1124719, ~: 1124574)
[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_with_interest(uint256,uint256) (runs: 5000, μ: 668017, ~: 668298)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold() (gas: 636576)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_collateral_price_drop_weth() (gas: 899637)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls() (gas: 845142)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai() (gas: 1117800)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth() (gas: 1117844)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest() (gas: 881529)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts() (gas: 1080390)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest() (gas: 1117553)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_with_interest() (gas: 663004)
[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai(uint256,uint256,uint256) (runs: 5000, μ: 1121772, ~: 1122347)
[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth(uint256,uint256,uint256) (runs: 5000, μ: 1122237, ~: 1122369)
Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 120.54s (120.52s CPU time)

Ran 35 tests for tests/unit/Hub/Hub.Config.t.sol:HubConfigTest
[PASS] test_addAsset_fuzz(address,uint8,address) (runs: 5000, μ: 412293, ~: 412332)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_feeReceiver(address,uint8,address) (runs: 5000, μ: 45234, ~: 44933)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_irStrategy(address,uint8,address) (runs: 5000, μ: 45256, ~: 44942)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_underlying(uint8,address,address) (runs: 5000, μ: 36628, ~: 36628)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals(address,uint8,address,address) (runs: 5000, μ: 45847, ~: 45893)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals_tooLow(address,uint8,address,address) (runs: 5000, μ: 45936, ~: 46215)
[PASS] test_addAsset_fuzz_reverts_InvalidIrData(address,uint8,address,address) (runs: 5000, μ: 88216854131, ~: 34870)
[PASS] test_addAsset_revertsWith_BlockTimestampDowncastOverflow() (gas: 981867)
[PASS] test_addAsset_revertsWith_DrawnRateDowncastOverflow() (gas: 978975)
[PASS] test_addAsset_reverts_UnderlyingAlreadyListed() (gas: 46470)
[PASS] test_addSpoke_fuzz(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 126555, ~: 126608)
[PASS] test_addSpoke_fuzz_revertsWith_AssetNotListed(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 35211, ~: 35199)
[PASS] test_addSpoke_fuzz_revertsWith_InvalidAddress_spoke(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 33878, ~: 33931)
[PASS] test_addSpoke_revertsWith_SpokeAlreadyListed() (gas: 39667)
[PASS] test_hub_deploy_reverts_on_InvalidConstructorInput() (gas: 776973)
[PASS] test_hub_max_riskPremium() (gas: 8588)
[PASS] test_updateAssetConfig_NewFeeReceiver_noFees() (gas: 718030)
[PASS] test_updateAssetConfig_NewFeeReceiver_revertsWith_SpokeNotActive_noFees() (gas: 617825)
[PASS] test_updateAssetConfig_UseExistingSpokeAndListedAsFeeReceiver_revertsWith_SpokeAlreadyListed() (gas: 70382)
[PASS] test_updateAssetConfig_fuzz(uint256,(address,uint16,address,address)) (runs: 5000, μ: 268210, ~: 268578)
[PASS] test_updateAssetConfig_fuzz_FromZeroLiquidityFee(uint256,uint16) (runs: 5000, μ: 819631, ~: 819493)
[PASS] test_updateAssetConfig_fuzz_LiquidityFee(uint256,uint16) (runs: 5000, μ: 722168, ~: 722029)
[PASS] test_updateAssetConfig_fuzz_NewFeeReceiver(uint256) (runs: 5000, μ: 821181, ~: 821219)
[PASS] test_updateAssetConfig_fuzz_NewInterestRateStrategy(uint256) (runs: 5000, μ: 696252, ~: 696287)
[PASS] test_updateAssetConfig_fuzz_ReuseFeeReceiver_revertsWith_SpokeAlreadyListed(uint256) (runs: 5000, μ: 872145, ~: 872180)
[PASS] test_updateAssetConfig_fuzz_Scenario(uint256) (runs: 5000, μ: 695374, ~: 695427)
[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidInterestRateStrategy(uint256) (runs: 5000, μ: 60848, ~: 60898)
[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidLiquidityFee(uint256,(address,uint16,address,address)) (runs: 5000, μ: 40122, ~: 40018)
[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidReinvestmentController() (gas: 484410)
[PASS] test_updateAssetConfig_fuzz_revertsWith_calculateInterestRateReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 198387, ~: 198871)
[PASS] test_updateAssetConfig_fuzz_revertsWith_setInterestRateDataReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 95580, ~: 96007)
[PASS] test_updateAssetConfig_oldFeeReceiver_flags() (gas: 748042)
Logs:
  Bound result 0
  Bound result 1000
  Bound result 2
  Bound result 500
  Bound result 0
  Bound result 1000
  Bound result 2
  Bound result 500

[PASS] test_updateSpokeConfig_fuzz(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 59114, ~: 59178)
[PASS] test_updateSpokeConfig_fuzz_revertsWith_SpokeNotListed(uint256,address,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 40477, ~: 40544)
[PASS] test_updateSpokeConfig_revertsWith_AssetNotListed() (gas: 29603)
Suite result: ok. 35 passed; 0 failed; 0 skipped; finished in 94.35s (94.33s CPU time)

Ran 16 tests for tests/unit/Hub/Hub.Draw.t.sol:HubDrawTest
[PASS] test_draw_DifferentSpokes() (gas: 354768)
[PASS] test_draw_fuzz_IncreasedBorrowRate(uint256,uint256) (runs: 5000, μ: 695291, ~: 695440)
[PASS] test_draw_fuzz_amounts_same_block(uint256,uint256) (runs: 5000, μ: 287748, ~: 287776)
[PASS] test_draw_fuzz_revertsWith_DrawCapExceeded(uint40) (runs: 5000, μ: 82139, ~: 82096)
[PASS] test_draw_fuzz_revertsWith_DrawCapExceeded_due_to_interest(uint40,uint256,uint256) (runs: 5000, μ: 286454, ~: 286702)
[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity(uint256,uint256) (runs: 5000, μ: 34682, ~: 34464)
[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity_due_to_draw(uint256) (runs: 5000, μ: 172363, ~: 172081)
[PASS] test_draw_fuzz_revertsWith_InsufficientLiquidity_due_to_remove(uint256) (runs: 5000, μ: 134004, ~: 133805)
[PASS] test_draw_fuzz_revertsWith_InvalidAddress(uint256) (runs: 5000, μ: 16102, ~: 16102)
[PASS] test_draw_revertsWith_DrawCapExceeded_due_to_deficit() (gas: 269919)
[PASS] test_draw_revertsWith_InsufficientLiquidity() (gas: 28241)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_draw() (gas: 168692)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_remove() (gas: 131141)
[PASS] test_draw_revertsWith_InvalidAmount() (gas: 16233)
[PASS] test_draw_revertsWith_SpokeHalted() (gas: 61264)
[PASS] test_draw_revertsWith_SpokeNotActive() (gas: 61203)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 22.92s (22.89s CPU time)

Ran 8 tests for tests/unit/Hub/Hub.EliminateDeficit.t.sol:HubEliminateDeficitTest
[PASS] test_eliminateDeficit(uint256) (runs: 5000, μ: 661045, ~: 661045)
[PASS] test_eliminateDeficit_fuzz_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 32532, ~: 32532)
[PASS] test_eliminateDeficit_fuzz_revertsWith_ArithmeticUnderflow_CallerSpokeNoFunds(uint256) (runs: 5000, μ: 351255, ~: 351255)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountNoDeficit() (gas: 35965)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountWithDeficit() (gas: 347592)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_on_UnregisteredCoveredSpoke() (gas: 36352)
[PASS] test_eliminateDeficit_revertsWith_SpokeNotActive_on_UnregisteredAsset() (gas: 383390)
[PASS] test_eliminateDeficit_revertsWith_callerSpokeNotActive() (gas: 159188)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 16.19s (16.16s CPU time)

Ran 6 tests for tests/unit/Hub/Hub.MintFeeShares.t.sol:HubMintFeeSharesTest
[PASS] test_mintFeeShares() (gas: 310124)
[PASS] test_mintFeeShares_noFees() (gas: 365611)
[PASS] test_mintFeeShares_noShares() (gas: 291681)
[PASS] test_mintFeeShares_revertsWith_AccessManagedUnauthorized() (gas: 24115)
[PASS] test_mintFeeShares_revertsWith_AssetNotListed() (gas: 27529)
[PASS] test_mintFeeShares_revertsWith_SpokeNotActive() (gas: 242098)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 25.86ms (3.89ms CPU time)

Ran 19 tests for tests/unit/Hub/Hub.Add.t.sol:HubAddTest
[PASS] test_add_AddCapReachedButNotExceeded_rounding() (gas: 664082)
[PASS] test_add_fuzz_AddCapReachedButNotExceeded(uint40) (runs: 5000, μ: 157468, ~: 157428)
[PASS] test_add_fuzz_multi_asset_multi_spoke(uint256,uint256,uint256) (runs: 5000, μ: 331180, ~: 331313)
[PASS] test_add_fuzz_revertsWith_AddCapExceeded(uint40) (runs: 5000, μ: 112154, ~: 112113)
[PASS] test_add_fuzz_revertsWith_AddCapExceeded_due_to_interest(uint40,uint256,uint256) (runs: 5000, μ: 266079, ~: 265929)
[PASS] test_add_fuzz_revertsWith_InvalidShares_due_to_index(uint256,uint256,uint256) (runs: 5000, μ: 223421, ~: 223634)
[PASS] test_add_fuzz_single_asset(uint256,address,uint256) (runs: 5000, μ: 341722, ~: 341741)
[PASS] test_add_fuzz_single_spoke_multi_add(uint256,uint256) (runs: 5000, μ: 798889, ~: 798932)
[PASS] test_add_multi_add_minimal_shares() (gas: 320018)
[PASS] test_add_revertsWith_AmountDowncastOverflow() (gas: 359828)
[PASS] test_add_revertsWith_InsufficientTransferred() (gas: 64480)
[PASS] test_add_revertsWith_InvalidAmount() (gas: 13619)
[PASS] test_add_revertsWith_InvalidShares() (gas: 222924)
[PASS] test_add_revertsWith_SharesDowncastOverflow() (gas: 224170)
[PASS] test_add_revertsWith_SpokeHalted() (gas: 99541)
[PASS] test_add_revertsWith_SpokeNotActive() (gas: 99577)
[PASS] test_add_single_asset() (gas: 329590)
Logs:
  Bound result 2
  Bound result 100000000000000000000

[PASS] test_add_with_increased_index() (gas: 300271)
[PASS] test_add_with_increased_index_with_premium() (gas: 678419)
Suite result: ok. 19 passed; 0 failed; 0 skipped; finished in 177.50s (214.69s CPU time)

Ran 9 tests for tests/gas/Hub.Operations.gas.t.sol:HubOperations_Gas_Tests
[PASS] test_add() (gas: 269972)
[PASS] test_deficit() (gas: 1325968)
[PASS] test_draw() (gas: 418374)
[PASS] test_mintFeeShares() (gas: 499664)
[PASS] test_payFee_transferShares() (gas: 967016)
[PASS] test_refreshPremium() (gas: 633268)
[PASS] test_remove() (gas: 310118)
[PASS] test_restore() (gas: 877564)
[PASS] test_restore_with_transfer() (gas: 878229)
Suite result: ok. 9 passed; 0 failed; 0 skipped; finished in 42.67ms (6.82ms CPU time)

Ran 29 tests for tests/unit/libraries/PositionStatusMap.t.sol:PositionStatusMapTest
[PASS] test_bucketId() (gas: 8878)
[PASS] test_collateralCount() (gas: 107741)
[PASS] test_collateralCount(uint256) (runs: 5000, μ: 1914579, ~: 1738087)
[PASS] test_collateralCount_ignoresInvalidBits() (gas: 122622)
[PASS] test_constants() (gas: 44556)
[PASS] test_fls() (gas: 509035)
[PASS] test_fromBitId(uint256,uint256) (runs: 5000, μ: 14048, ~: 14336)
[PASS] test_fuzz_setBorrowing(uint256,bool) (runs: 5000, μ: 21904, ~: 12186)
[PASS] test_fuzz_setUseAsCollateral(uint256,bool) (runs: 5000, μ: 22454, ~: 32189)
[PASS] test_getBucketWord(uint256) (runs: 5000, μ: 14179, ~: 14179)
[PASS] test_isUsingAsCollateralOrBorrowing_slot0() (gas: 108334)
[PASS] test_isUsingAsCollateralOrBorrowing_slot1() (gas: 43997)
[PASS] test_isolateBorrowing(uint256) (runs: 5000, μ: 153030, ~: 153030)
[PASS] test_isolateBorrowingUntil(uint256,uint256) (runs: 5000, μ: 144445, ~: 143960)
[PASS] test_isolateCollateral(uint256) (runs: 5000, μ: 152949, ~: 152949)
[PASS] test_isolateCollateralUntil(uint256,uint256) (runs: 5000, μ: 144374, ~: 144121)
[PASS] test_isolateUntil(uint256,uint256) (runs: 5000, μ: 134613, ~: 134600)
[PASS] test_next(uint256) (runs: 5000, μ: 20075, ~: 18925)
[PASS] test_nextBorrowing(uint256) (runs: 5000, μ: 18043, ~: 16896)
[PASS] test_nextBorrowing_continuous() (gas: 61721461)
[PASS] test_nextCollateral(uint256) (runs: 5000, μ: 18194, ~: 16939)
[PASS] test_nextCollateral_continuous() (gas: 61978304)
[PASS] test_next_continuous() (gas: 89386228)
[PASS] test_popCount(bytes32) (runs: 5000, μ: 37900, ~: 38033)
[PASS] test_setBorrowing_slot0() (gas: 43924)
[PASS] test_setBorrowing_slot1() (gas: 43924)
[PASS] test_setUseAsCollateral_slot0() (gas: 44105)
[PASS] test_setUseAsCollateral_slot1() (gas: 44088)
[PASS] test_setters_use_correct_slot(uint256) (runs: 5000, μ: 36437, ~: 41309)
Suite result: ok. 29 passed; 0 failed; 0 skipped; finished in 92.36s (92.36s CPU time)

Ran 5 tests for tests/unit/Rescuable.t.sol:RescuableTest
[PASS] test_constructor() (gas: 12531)
[PASS] test_rescueNative_fuzz(uint256) (runs: 5000, μ: 33298, ~: 33478)
[PASS] test_rescueNative_revertsWith_OnlyRescueGuardian() (gas: 11089)
[PASS] test_rescueToken_fuzz(uint256) (runs: 5000, μ: 206631, ~: 206759)
[PASS] test_rescueToken_revertsWith_OnlyRescueGuardian() (gas: 180556)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 3.27s (3.24s 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, μ: 15118, ~: 15261)
[PASS] test_percentDivUp_le_value(uint256,uint256) (runs: 5000, μ: 15351, ~: 15347)
[PASS] test_percentDiv_fuzz(uint256,uint256) (runs: 5000, μ: 12606, ~: 12760)
[PASS] test_percentMul() (gas: 14932)
[PASS] test_percentMulUp_ge_value(uint256,uint256) (runs: 5000, μ: 15337, ~: 15330)
[PASS] test_percentMulUp_le_value(uint256,uint256) (runs: 5000, μ: 15129, ~: 15264)
[PASS] test_percentMul_fuzz(uint256,uint256) (runs: 5000, μ: 11525, ~: 12063)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 97.09s (98.04s CPU time)

Ran 5 tests for tests/unit/misc/SignatureGateway/SignatureGateway.PermitReserve.t.sol:SignatureGatewayPermitReserveTest
[PASS] test_permitReserve() (gas: 101562)
[PASS] test_permitReserve_forwards_correct_call() (gas: 51057)
[PASS] test_permitReserve_ignores_permit_reverts() (gas: 40082)
[PASS] test_permitReserve_revertsWith_ReserveNotListed() (gas: 30997)
[PASS] test_permitReserve_revertsWith_SpokeNotRegistered() (gas: 29372)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 23.81ms (1.52ms CPU time)

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

Ran 8 tests for tests/unit/ReserveFlags.t.sol:ReserveFlagsTests
[PASS] test_constants() (gas: 13493)
[PASS] test_create_fuzz(bool,bool,bool,bool,bool) (runs: 5000, μ: 16325, ~: 16332)
[PASS] test_setBorrowable_fuzz(uint8) (runs: 5000, μ: 13338, ~: 13338)
[PASS] test_setFrozen_fuzz(uint8) (runs: 5000, μ: 13301, ~: 13301)
[PASS] test_setLiquidatable_fuzz(uint8) (runs: 5000, μ: 13346, ~: 13346)
[PASS] test_setPaused_fuzz(uint8) (runs: 5000, μ: 13221, ~: 13221)
[PASS] test_setReceiveSharesEnabled_fuzz(uint8) (runs: 5000, μ: 13284, ~: 13284)
[PASS] test_set_flags() (gas: 94213)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 1.67s (2.19s CPU time)

Ran 10 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Constants.t.sol:SignatureGatewayConstantsTest
[PASS] test_DOMAIN_SEPARATOR() (gas: 5650)
[PASS] test_borrow_typeHash() (gas: 9867)
[PASS] test_constructor() (gas: 3749)
[PASS] test_eip712Domain() (gas: 10940)
[PASS] test_repay_typeHash() (gas: 9813)
[PASS] test_setUsingAsCollateral_typeHash() (gas: 9802)
[PASS] test_supply_typeHash() (gas: 9826)
[PASS] test_updateUserDynamicConfig_typeHash() (gas: 9910)
[PASS] test_updateUserRiskPremium_typeHash() (gas: 9867)
[PASS] test_withdraw_typeHash() (gas: 9912)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 23.88ms (1.94ms 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, μ: 1203378, ~: 1207983)
[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, μ: 1999620, ~: 1974324)
[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, μ: 5901277, ~: 5901547)
[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, μ: 4183335, ~: 4183637)
[PASS] test_repay_partial_then_max() (gas: 681222)
[PASS] test_repay_round_trip_borrow_repay(uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 858871, ~: 861641)
[PASS] test_repay_round_trip_repay_borrow(uint256,uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 939210, ~: 948324)
[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, μ: 1447962, ~: 1477078)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 300.38s (300.36s 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: 64686)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 22.31ms (390.11µs CPU time)

Ran 10 tests for tests/unit/Spoke/Spoke.PositionManager.t.sol:SpokePositionManagerTest
[PASS] test_onlyPositionManager_on_borrow() (gas: 536767)
[PASS] test_onlyPositionManager_on_repay() (gas: 558265)
[PASS] test_onlyPositionManager_on_supply() (gas: 291330)
[PASS] test_onlyPositionManager_on_updateUserDynamicConfig() (gas: 1279818)
[PASS] test_onlyPositionManager_on_updateUserRiskPremium() (gas: 1408792)
[PASS] test_onlyPositionManager_on_usingAsCollateral() (gas: 144335)
[PASS] test_onlyPositionManager_on_withdraw() (gas: 319888)
[PASS] test_renouncePositionManagerRole() (gas: 20268)
[PASS] test_renouncePositionManagerRole_noop_from_disabled() (gas: 21882)
[PASS] test_setApprovalForPositionManager(bytes32) (runs: 5000, μ: 18111, ~: 18111)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 300.76s (300.74s CPU time)

Ran 6 tests for tests/unit/Hub/Hub.PayFee.t.sol:HubPayFeeTest
[PASS] test_payFee_fuzz(uint256,uint256) (runs: 5000, μ: 702290, ~: 702439)
[PASS] test_payFee_fuzz_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 702706, ~: 702987)
[PASS] test_payFee_revertsWith_InvalidShares() (gas: 20320)
[PASS] test_payFee_revertsWith_SpokeNotActive() (gas: 61202)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded() (gas: 138343)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded_with_interest() (gas: 642318)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 24.67s (37.01s CPU time)

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

[PASS] test_reclaim_fullAmount() (gas: 634379)
[PASS] test_reclaim_fuzz(uint256,uint256,uint256) (runs: 5000, μ: 653578, ~: 652780)
[PASS] test_reclaim_multipleSweepsAndReclaims() (gas: 742924)
[PASS] test_reclaim_revertsWith_AssetNotListed() (gas: 13093)
[PASS] test_reclaim_revertsWith_InsufficientTransferred() (gas: 455770)
[PASS] test_reclaim_revertsWith_InsufficientTransferred_noSwept() (gas: 102165)
[PASS] test_reclaim_revertsWith_InvalidAmount_zero() (gas: 92347)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController(address) (runs: 5000, μ: 93230, ~: 93230)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController_init() (gas: 40386)
[PASS] test_reclaim_revertsWith_underflow_exceedsSwept_afterSweep() (gas: 619122)
Suite result: ok. 11 passed; 0 failed; 0 skipped; finished in 14.64s (16.21s CPU time)

Ran 21 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Reverts.InvalidSignature.t.sol:SignatureGatewayInvalidSignatureTest
[PASS] test_borrowWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 157730, ~: 157028)
[PASS] test_borrowWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 39091)
[PASS] test_borrowWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 37280)
[PASS] test_repayWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 159111, ~: 160377)
[PASS] test_repayWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 39024)
[PASS] test_repayWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 37324)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 157207, ~: 157055)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 39052)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 37350)
[PASS] test_supplyWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 156566, ~: 155329)
[PASS] test_supplyWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 39069)
[PASS] test_supplyWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 37312)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 146037, ~: 146727)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_InvalidSignatureDueTo_InvalidSigner() (gas: 25338)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 27068)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 145530, ~: 145068)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_InvalidSignatureDueTo_InvalidSigner() (gas: 25360)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 27105)
[PASS] test_withdrawWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 158507, ~: 158723)
[PASS] test_withdrawWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 39111)
[PASS] test_withdrawWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 37322)
Suite result: ok. 21 passed; 0 failed; 0 skipped; finished in 42.29s (66.42s CPU time)

Ran 12 tests for tests/unit/Hub/Hub.RefreshPremium.t.sol:HubRefreshPremiumTest
[PASS] test_refreshPremium_emitsEvent() (gas: 254285)
[PASS] test_refreshPremium_fuzz_positiveDeltas(uint256,int256,int256) (runs: 5000, μ: 485164, ~: 491895)
[PASS] test_refreshPremium_fuzz_withAccrual(uint256,uint256,uint256,uint256) (runs: 5000, μ: 464009, ~: 473364)
[PASS] test_refreshPremium_haltedSpokesAllowed() (gas: 121119)
[PASS] test_refreshPremium_maxRiskPremiumThreshold() (gas: 884782)
[PASS] test_refreshPremium_negativeDeltas(uint256) (runs: 5000, μ: 456968, ~: 456886)
[PASS] test_refreshPremium_negativeDeltas_withAccrual(uint256) (runs: 5000, μ: 525823, ~: 526047)
[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_NonZeroRestoredPremiumRay() (gas: 841485)
[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_RiskPremiumThresholdExceeded_DecreasingPremium() (gas: 862635)
[PASS] test_refreshPremium_revertsWith_SpokeNotActive() (gas: 58757)
[PASS] test_refreshPremium_riskPremiumThreshold() (gas: 906888)
[PASS] test_refreshPremium_spokePremiumUpdateIsContained() (gas: 705013)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 20.15s (30.55s CPU time)

Ran 7 tests for tests/unit/misc/SignatureGateway/SignatureGateway.Reverts.SpokeNotRegistered.t.sol:SignatureGateway_SpokeNotRegistered_Test
[PASS] test_borrowWithSig_revertsWith_SpokeNotRegistered((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 13428, ~: 13428)
[PASS] test_repayWithSig_revertsWith_SpokeNotRegistered((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 13428, ~: 13428)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_SpokeNotRegistered((address,uint256,bool,address,uint256,uint256)) (runs: 5000, μ: 13397, ~: 13397)
[PASS] test_supplyWithSig_revertsWith_SpokeNotRegistered((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 13471, ~: 13471)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_SpokeNotRegistered((address,address,uint256,uint256)) (runs: 5000, μ: 13682, ~: 13682)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_SpokeNotRegistered((address,address,uint256,uint256)) (runs: 5000, μ: 13749, ~: 13749)
[PASS] test_withdrawWithSig_revertsWith_SpokeNotRegistered((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 13493, ~: 13493)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 12.10s (18.26s 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: 80421)
[PASS] test_repayWithSig_revertsWith_Unauthorized() (gas: 113255)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_Unauthorized() (gas: 72970)
[PASS] test_supplyWithSig_revertsWith_Unauthorized() (gas: 139917)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_Unauthorized() (gas: 81365)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_Unauthorized() (gas: 81542)
[PASS] test_withdrawWithSig_revertsWith_Unauthorized() (gas: 79432)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 27.19ms (4.07ms 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: 78213)
[PASS] test_repayWithSig_revertsWith_Unauthorized() (gas: 111047)
[PASS] test_setUsingAsCollateralWithSig_revertsWith_Unauthorized() (gas: 70762)
[PASS] test_supplyWithSig_revertsWith_Unauthorized() (gas: 137842)
[PASS] test_updateUserDynamicConfigWithSig_revertsWith_Unauthorized() (gas: 79157)
[PASS] test_updateUserRiskPremiumWithSig_revertsWith_Unauthorized() (gas: 79334)
[PASS] test_withdrawWithSig_revertsWith_Unauthorized() (gas: 77224)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 25.41ms (4.00ms CPU time)

Ran 4 tests for tests/unit/misc/SignatureGateway/SignatureGateway.SetSelfAsUserPositionManagerWithSig.t.sol:SignatureGatewaySetSelfAsUserPositionManagerTest
[PASS] test_setSelfAsUserPositionManagerWithSig() (gas: 140506)
[PASS] test_setSelfAsUserPositionManagerWithSig_forwards_correct_call() (gas: 32923)
[PASS] test_setSelfAsUserPositionManagerWithSig_ignores_underlying_spoke_reverts() (gas: 29675)
[PASS] test_setSelfAsUserPositionManagerWithSig_revertsWith_SpokeNotRegistered() (gas: 16476)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 22.05ms (1.07ms 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, μ: 2142611, ~: 2153089)
[PASS] test_borrow_fuzz_single_spoke_multi_reserves(uint256,uint256,uint256,uint256) (runs: 5000, μ: 2274098, ~: 2283509)
[PASS] test_borrow_fuzz_single_spoke_multi_reserves_multi_user(uint256,uint256,uint256,uint256) (runs: 5000, μ: 2691713, ~: 2702309)
[PASS] test_borrow_fuzz_skip_borrow(uint256,uint256,uint256) (runs: 5000, μ: 1050696, ~: 1050706)
[PASS] test_borrow_skip_borrow() (gas: 1049658)
Logs:
  Bound result 10000000000000000000
  Bound result 20000000000000000000
  Bound result 31536000

[PASS] test_userAccountData_does_not_include_zero_cf_collateral() (gas: 1171144)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 164.03s (164.00s CPU time)

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

[PASS] test_remove_all_with_interest() (gas: 366338)
[PASS] test_remove_fuzz(uint256,uint256) (runs: 5000, μ: 206371, ~: 206312)
[PASS] test_remove_fuzz_all_liquidity_with_interest(uint256,uint256) (runs: 5000, μ: 417150, ~: 417414)
[PASS] test_remove_fuzz_multi_spoke(uint256,uint256) (runs: 5000, μ: 287101, ~: 287219)
[PASS] test_remove_fuzz_multi_spoke_with_interest(uint256,uint256,uint256,uint256) (runs: 5000, μ: 419833, ~: 420326)
[PASS] test_remove_revertsWith_InsufficientLiquidity() (gas: 157978)
[PASS] test_remove_revertsWith_InsufficientLiquidity_exceeding_added_amount() (gas: 147045)
[PASS] test_remove_revertsWith_InsufficientLiquidity_zero_added() (gas: 21306)
[PASS] test_remove_revertsWith_InvalidAddress() (gas: 16413)
[PASS] test_remove_revertsWith_InvalidAmount() (gas: 18570)
[PASS] test_remove_revertsWith_SpokeHalted() (gas: 61741)
[PASS] test_remove_revertsWith_SpokeNotActive() (gas: 61650)
[PASS] test_remove_revertsWith_underflow_exceeding_added_amount() (gas: 184524)
[PASS] test_remove_revertsWtih_underflow_one_extra_wei() (gas: 362258)
Suite result: ok. 15 passed; 0 failed; 0 skipped; finished in 29.91s (52.37s CPU time)

Ran 15 tests for tests/unit/Spoke/Spoke.Supply.t.sol:SpokeSupplyTest
[PASS] test_fuzz_supply_effect_on_ex_rates(uint256,uint256) (runs: 5000, μ: 697112, ~: 697996)
[PASS] test_supply() (gas: 303081)
[PASS] test_supply_does_not_update_risk_premium() (gas: 1657276)
[PASS] test_supply_fuzz_amounts(uint256) (runs: 5000, μ: 427407, ~: 427081)
[PASS] test_supply_fuzz_index_increase_no_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 664373, ~: 664643)
[PASS] test_supply_fuzz_index_increase_with_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 760781, ~: 760912)
[PASS] test_supply_fuzz_revertsWith_ERC20InsufficientBalance(uint256) (runs: 5000, μ: 62041, ~: 61766)
[PASS] test_supply_index_increase_no_premium() (gas: 863329)
[PASS] test_supply_index_increase_with_premium() (gas: 920756)
[PASS] test_supply_revertsWith_ERC20InsufficientAllowance() (gas: 39631)
[PASS] test_supply_revertsWith_InvalidSupplyAmount() (gas: 42387)
[PASS] test_supply_revertsWith_ReentrancyGuardReentrantCall() (gas: 278514)
[PASS] test_supply_revertsWith_ReserveFrozen() (gas: 64400)
[PASS] test_supply_revertsWith_ReserveNotListed() (gas: 22912)
[PASS] test_supply_revertsWith_ReservePaused() (gas: 64304)
Suite result: ok. 15 passed; 0 failed; 0 skipped; finished in 47.47s (47.45s CPU time)

Ran 1 test for tests/unit/Spoke/Spoke.UpdateUserDynamicConfig.t.sol:SpokeUpdateUserDynamicConfigTest
[PASS] test_updateUserDynamicConfig_revertsWith_ReentrancyGuardReentrantCall() (gas: 629672)
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 21.85ms (814.81µs CPU time)

Ran 1 test for tests/unit/Spoke/Spoke.UpdateUserRiskPremium.t.sol:SpokeUpdateUserRiskPremiumTest
[PASS] test_updateUserRiskPremium_revertsWith_ReentrancyGuardReentrantCall() (gas: 628674)
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 21.32ms (811.40µs CPU time)

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

[PASS] test_restore_full_amount_with_interest_and_premium() (gas: 669355)
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, μ: 361753, ~: 361854)
[PASS] test_restore_fuzz_full_amount_with_interest_and_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 659847, ~: 671296)
[PASS] test_restore_fuzz_revertsWith_SurplusDrawnRestored_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 243224, ~: 244502)
[PASS] test_restore_fuzz_revertsWith_SurplusDrawnRestored_with_interest_and_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 634353, ~: 634546)
[PASS] test_restore_one_share_delta_increase_revertsWith_InvalidPremiumChange() (gas: 211496)
[PASS] test_restore_partial_drawn() (gas: 321738)
[PASS] test_restore_partial_same_block() (gas: 321892)
[PASS] test_restore_premiumDeltas_twoWeiIncrease_realizedDelta() (gas: 232199)
[PASS] test_restore_revertsWith_InsufficientTransferred() (gas: 251995)
[PASS] test_restore_revertsWith_InvalidAmount_zero() (gas: 55124)
[PASS] test_restore_revertsWith_InvalidPremiumChange_premiumIncrease() (gas:...*[Comment body truncated]*

@github-actions
Copy link

github-actions bot commented Jan 21, 2026

♻️ Forge Gas Snapshots

🔕 Unchanged
Path Value
snapshots/Hub.Operations.json
add 86,624
add: with transfer 107,921
draw 104,105
eliminateDeficit: full 72,338
eliminateDeficit: partial 81,943
mintFeeShares 82,661
payFee 70,786
refreshPremium 70,367
remove: full 75,357
remove: partial 80,495
reportDeficit 111,875
restore: full 76,533
restore: full - with transfer 169,118
restore: partial 85,255
restore: partial - with transfer 143,235
transferShares 69,588
snapshots/NativeTokenGateway.Operations.json
borrowNative 227,663
repayNative 166,157
supplyAsCollateralNative 160,016
supplyNative 135,699
withdrawNative: full 125,318
withdrawNative: partial 136,447
snapshots/SignatureGateway.Operations.json
borrowWithSig 212,853
repayWithSig 186,429
setSelfAsUserPositionManagerWithSig 75,397
setUsingAsCollateralWithSig 85,349
supplyWithSig 151,931
updateUserDynamicConfigWithSig 63,086
updateUserRiskPremiumWithSig 62,068
withdrawWithSig 130,572
snapshots/Spoke.Getters.json
getUserAccountData: supplies: 0, borrows: 0 12,962
getUserAccountData: supplies: 1, borrows: 0 49,251
getUserAccountData: supplies: 2, borrows: 0 80,826
getUserAccountData: supplies: 2, borrows: 1 100,237
getUserAccountData: supplies: 2, borrows: 2 118,994
snapshots/Spoke.Operations.ZeroRiskPremium.json
borrow: first 189,291
borrow: second action, same reserve 169,240
liquidationCall (receiveShares): full 294,978
liquidationCall (receiveShares): partial 294,696
liquidationCall: full 304,263
liquidationCall: partial 303,981
permitReserve + repay (multicall) 164,420
permitReserve + supply (multicall) 146,699
permitReserve + supply + enable collateral (multicall) 161,112
repay: full 123,736
repay: partial 128,706
setUserPositionManagersWithSig: disable 47,027
setUserPositionManagersWithSig: enable 68,939
supply + enable collateral (multicall) 141,292
supply: 0 borrows, collateral disabled 122,767
supply: 0 borrows, collateral enabled 105,738
supply: second action, same reserve 105,667
updateUserDynamicConfig: 1 collateral 74,548
updateUserDynamicConfig: 2 collaterals 89,453
updateUserRiskPremium: 1 borrow 94,781
updateUserRiskPremium: 2 borrows 103,916
usingAsCollateral: 0 borrows, enable 59,578
usingAsCollateral: 1 borrow, disable 104,896
usingAsCollateral: 1 borrow, enable 42,466
usingAsCollateral: 2 borrows, disable 125,992
usingAsCollateral: 2 borrows, enable 42,478
withdraw: 0 borrows, full 127,659
withdraw: 0 borrows, partial 132,345
withdraw: 1 borrow, partial 158,727
withdraw: 2 borrows, partial 172,833
withdraw: non collateral 105,615
snapshots/Spoke.Operations.json
borrow: first 258,193
borrow: second action, same reserve 201,142
liquidationCall (receiveShares): full 326,985
liquidationCall (receiveShares): partial 326,703
liquidationCall: full 336,270
liquidationCall: partial 335,988
permitReserve + repay (multicall) 161,920
permitReserve + supply (multicall) 146,699
permitReserve + supply + enable collateral (multicall) 161,112
repay: full 117,815
repay: partial 137,185
setUserPositionManagersWithSig: disable 47,027
setUserPositionManagersWithSig: enable 68,939
supply + enable collateral (multicall) 141,292
supply: 0 borrows, collateral disabled 122,767
supply: 0 borrows, collateral enabled 105,738
supply: second action, same reserve 105,667
updateUserDynamicConfig: 1 collateral 74,548
updateUserDynamicConfig: 2 collaterals 89,453
updateUserRiskPremium: 1 borrow 148,104
updateUserRiskPremium: 2 borrows 197,811
usingAsCollateral: 0 borrows, enable 59,578
usingAsCollateral: 1 borrow, disable 158,219
usingAsCollateral: 1 borrow, enable 42,466
usingAsCollateral: 2 borrows, disable 227,887
usingAsCollateral: 2 borrows, enable 42,478
withdraw: 0 borrows, full 127,659
withdraw: 0 borrows, partial 132,345
withdraw: 1 borrow, partial 209,548
withdraw: 2 borrows, partial 255,261
withdraw: non collateral 105,615

// Bob borrows more dai to trigger accrual
Utils.borrow(spoke2, _daiReserveId(spoke2), bob, 1e18, bob);
// Account for the dai we just borrowed
testAmounts[0].originalBorrowAmount += 1e18;
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: maybe can define an intermediate var for 1e18 to be clear about where this comes from

contract SpokeAccrueInterestScenarioTest is SpokeBase {
using SharesMath for uint256;
using WadRayMath for *;
using PercentageMath for uint256;
Copy link
Contributor

Choose a reason for hiding this comment

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

can rm this import and sharesMath too i think

Copy link
Contributor

@yan-man yan-man left a comment

Choose a reason for hiding this comment

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

pending some minor cleanup

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants