Skip to content

feat: certora cvl v0.5.11#1292

Open
yan-man wants to merge 13 commits intomainfrom
feat/certora-cvl-v0.5.11
Open

feat: certora cvl v0.5.11#1292
yan-man wants to merge 13 commits intomainfrom
feat/certora-cvl-v0.5.11

Conversation

@yan-man
Copy link
Copy Markdown
Contributor

@yan-man yan-man commented Mar 28, 2026

  • incorporate Certora formal verification specs for v0.5.11, including CI workflow

certora-run[bot]

This comment was marked as resolved.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

🌈 Test Results
No files changed, compilation skipped

Ran 2 tests for tests/contracts/spoke/multi-hub/Spoke.MultipleHub.t.sol:SpokeMultipleHubTest
[PASS] test_borrow_secondHub() (gas: 911937)
[PASS] test_borrow_thirdHub() (gas: 752607)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 40.47ms (3.34ms CPU time)

Ran 14 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_Gas_Tests
[PASS] test_borrow() (gas: 1371799)
[PASS] test_liquidation_full() (gas: 10933918)
[PASS] test_liquidation_partial() (gas: 10933334)
[PASS] test_liquidation_receiveShares_full() (gas: 10915397)
[PASS] test_liquidation_receiveShares_partial() (gas: 10914815)
[PASS] test_liquidation_reportDeficit_full() (gas: 10911977)
[PASS] test_multicall_ops() (gas: 1450594)
[PASS] test_repay() (gas: 898901)
[PASS] test_setUserPositionManagersWithSig() (gas: 306627)
[PASS] test_supply() (gas: 558759)
[PASS] test_updateRiskPremium() (gas: 1366793)
[PASS] test_updateUserDynamicConfig() (gas: 592852)
[PASS] test_usingAsCollateral() (gas: 1525378)
[PASS] test_withdraw() (gas: 2028769)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 78.14ms (35.69ms CPU time)

Ran 14 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_ZeroRiskPremium_Gas_Tests
[PASS] test_borrow() (gas: 1134901)
[PASS] test_liquidation_full() (gas: 10797506)
[PASS] test_liquidation_partial() (gas: 10796922)
[PASS] test_liquidation_receiveShares_full() (gas: 10778985)
[PASS] test_liquidation_receiveShares_partial() (gas: 10778403)
[PASS] test_liquidation_reportDeficit_full() (gas: 10835462)
[PASS] test_multicall_ops() (gas: 1369306)
[PASS] test_repay() (gas: 807209)
[PASS] test_setUserPositionManagersWithSig() (gas: 311081)
[PASS] test_supply() (gas: 561440)
[PASS] test_updateRiskPremium() (gas: 989523)
[PASS] test_updateUserDynamicConfig() (gas: 597306)
[PASS] test_usingAsCollateral() (gas: 1138795)
[PASS] test_withdraw() (gas: 1664153)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 74.80ms (31.27ms CPU time)

Ran 4 tests for tests/contracts/spoke/misc/Spoke.PermitReserve.t.sol:SpokePermitReserveTest
[PASS] test_permitReserve() (gas: 88250)
[PASS] test_permitReserve_forwards_correct_call() (gas: 35555)
[PASS] test_permitReserve_ignores_permit_reverts() (gas: 24413)
[PASS] test_permitReserve_revertsWith_ReserveNotListedIn() (gas: 22972)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 24.80ms (1.08ms CPU time)

Ran 10 tests for tests/contracts/spoke/position-manager/Spoke.PositionManager.t.sol:SpokePositionManagerTest
[PASS] test_onlyPositionManager_on_borrow() (gas: 548693)
[PASS] test_onlyPositionManager_on_repay() (gas: 578448)
[PASS] test_onlyPositionManager_on_supply() (gas: 298243)
[PASS] test_onlyPositionManager_on_updateUserDynamicConfig() (gas: 1449120)
[PASS] test_onlyPositionManager_on_updateUserRiskPremium() (gas: 1696157)
[PASS] test_onlyPositionManager_on_usingAsCollateral() (gas: 144498)
[PASS] test_onlyPositionManager_on_withdraw() (gas: 328129)
[PASS] test_renouncePositionManagerRole() (gas: 20246)
[PASS] test_renouncePositionManagerRole_noop_from_disabled() (gas: 21936)
[PASS] test_setApprovalForPositionManager(bytes32) (runs: 5000, μ: 18155, ~: 18155)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 430.42ms (406.46ms CPU time)

Ran 19 tests for tests/contracts/spoke/AaveOracle.t.sol:AaveOracleTest
[PASS] test_constructor() (gas: 15306)
[PASS] test_decimals() (gas: 8358)
[PASS] test_fuzz_constructor(uint8) (runs: 5000, μ: 16734, ~: 17061)
Logs:
  Bound result 1

[PASS] test_getReservePrice() (gas: 46794)
[PASS] test_getReservePrice_revertsWith_InvalidPrice() (gas: 44603)
[PASS] test_getReservePrice_revertsWith_InvalidSource() (gas: 10899)
[PASS] test_getReservePrices() (gas: 76746)
[PASS] test_getReservePrices_revertsWith_InvalidSource() (gas: 48911)
[PASS] test_getReserveSource() (gas: 47184)
[PASS] test_setReserveSource() (gas: 44249)
[PASS] test_setReserveSource_revertsWith_InvalidPrice() (gas: 97493)
[PASS] test_setReserveSource_revertsWith_InvalidSource() (gas: 17183)
[PASS] test_setReserveSource_revertsWith_InvalidSourceDecimals() (gas: 16954)
[PASS] test_setReserveSource_revertsWith_OnlySpoke() (gas: 12996)
[PASS] test_setReserveSource_revertsWith_OracleMismatch() (gas: 5029386)
[PASS] test_setSpoke() (gas: 5057683)
[PASS] test_setSpoke_revertsWith_InvalidAddress() (gas: 10870)
[PASS] test_setSpoke_revertsWith_OnlyDeployer(address) (runs: 5000, μ: 13442, ~: 13442)
[PASS] test_setSpoke_revertsWith_SpokeAlreadySet() (gas: 15102)
Suite result: ok. 19 passed; 0 failed; 0 skipped; finished in 1.09s (1.06s CPU time)

Ran 7 tests for tests/contracts/spoke/repay/Spoke.Repay.EdgeCases.t.sol:SpokeRepayEdgeCaseTest
[PASS] test_fuzz_repay_effect_on_ex_rates(uint256,uint256) (runs: 5000, μ: 724158, ~: 724076)
Logs:
  Bound result 99999999999999999999999999999
  Bound result 489261355
  Bound result 36944886581538291355593328238

[PASS] test_repay_less_than_share() (gas: 758581)
[PASS] test_repay_only_base_debt_interest() (gas: 891207)
[PASS] test_repay_only_base_debt_no_premium() (gas: 779192)
[PASS] test_repay_supply_ex_rate_decr() (gas: 1784318)
[PASS] test_repay_supply_ex_rate_decr_skip_time() (gas: 1779911)
[PASS] test_repay_zero_shares_nonzero_premium_debt() (gas: 893063)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 17.22s (17.20s CPU time)

Ran 50 tests for tests/contracts/access/AccessManagerEnumerable.t.sol:AccessManagerEnumerableTest
[PASS] test_getLabelOfRole_revertsForAdminRole() (gas: 15937)
[PASS] test_getLabelOfRole_revertsForPublicRole() (gas: 15996)
[PASS] test_getLabelOfRole_revertsForUnlabeledRole() (gas: 15965)
[PASS] test_getLabelRole_revertsWithUnregisteredLabel() (gas: 11859)
[PASS] test_getRoleMembers_fuzz(uint256,uint256) (runs: 5000, μ: 2096845, ~: 2095721)
Logs:
  Bound result 9
  Bound result 10

[PASS] test_getRoleOfTargetSelector() (gas: 505164)
[PASS] test_getRoleOfTargetSelector_afterReassignment() (gas: 364143)
[PASS] test_getRoleTargetSelectors_fuzz(uint256,uint256) (runs: 5000, μ: 1743646, ~: 1742778)
Logs:
  Bound result 9
  Bound result 10

[PASS] test_grantRole() (gas: 435571)
[PASS] test_grantRole_fuzz(uint64,uint256) (runs: 5000, μ: 1029869, ~: 1034661)
Logs:
  Bound result 9

[PASS] test_isAdminRole() (gas: 245794)
[PASS] test_isAdminRole_excludesAdminRole() (gas: 89137)
[PASS] test_isAdminRole_multipleRoles() (gas: 441098)
[PASS] test_isLabelAssigned() (gas: 206189)
[PASS] test_isLabelAssigned_afterRelabel() (gas: 257137)
[PASS] test_isLabelAssigned_afterRemoval() (gas: 164483)
[PASS] test_isRole() (gas: 245831)
[PASS] test_isRoleLabeled() (gas: 204928)
[PASS] test_isRoleLabeled_afterRelabel() (gas: 256147)
[PASS] test_isRoleLabeled_afterRemoval() (gas: 163819)
[PASS] test_isRole_afterLabel() (gas: 201007)
[PASS] test_isRole_excludesAdminAndPublicRole() (gas: 218195)
[PASS] test_labelRole_onlyAuthorized_revertsWithUnauthorizedAccount() (gas: 13327)
[PASS] test_labelRole_relabel() (gas: 268258)
[PASS] test_labelRole_relabelTrackedRole_noDuplicate() (gas: 264781)
[PASS] test_labelRole_removeLabel() (gas: 175413)
[PASS] test_labelRole_removeLabelOnUnlabeledRole_revertsWithUnlabeledRole() (gas: 20083)
[PASS] test_labelRole_revertsWithAlreadyLabeledRole() (gas: 204993)
[PASS] test_labelRole_revertsWithAlreadyLabeledRole_evenIfLabelAlsoUsed() (gas: 347242)
[PASS] test_labelRole_revertsWithDuplicateLabel() (gas: 208101)
[PASS] test_labelRole_trackLabels() (gas: 368802)
[PASS] test_labelRole_tracksAlreadyTrackedRole_noDuplicate() (gas: 214156)
[PASS] test_labelRole_tracksUntrackedRole() (gas: 206424)
[PASS] test_renounceRole() (gas: 435727)
[PASS] test_renounceRole_shouldNotTrack() (gas: 24687)
[PASS] test_revokeRole() (gas: 437941)
[PASS] test_revokeRole_shouldNotTrack() (gas: 33311)
[PASS] test_setRoleAdmin_fuzz_trackAdminRoles_multipleRoles_multipleAdmins(uint256) (runs: 5000, μ: 2144605, ~: 2197017)
Logs:
  Bound result 12

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

[PASS] test_setRoleAdmin_trackAdminOfRoles() (gas: 606296)
[PASS] test_setRoleAdmin_trackAdminOfRoles_changeAdminRole() (gas: 577396)
[PASS] test_setRoleAdmin_trackAdminRoles() (gas: 609417)
[PASS] test_setRoleAdmin_trackRolesAndTrackAdminRoles() (gas: 386651)
[PASS] test_setRoleGuardian_trackRoles() (gas: 266703)
[PASS] test_setTargetFunctionRole() (gas: 611297)
[PASS] test_setTargetFunctionRole_multipleTargets() (gas: 1198461)
[PASS] test_setTargetFunctionRole_removeTarget() (gas: 1029312)
[PASS] test_setTargetFunctionRole_skipAddPublicRole() (gas: 211675)
[PASS] test_setTargetFunctionRole_skipAddToAdminRole() (gas: 39629)
[PASS] test_setTargetFunctionRole_withReplace() (gas: 884760)
Suite result: ok. 50 passed; 0 failed; 0 skipped; finished in 25.69s (25.69s CPU time)

Ran 22 tests for tests/contracts/hub/AssetInterestRateStrategy.t.sol:AssetInterestRateStrategyTest
[PASS] test_calculateInterestRate_AtMaxUtilization() (gas: 24643)
Logs:
  Bound result 10000
  Bound result 778565440757296803935461404101

[PASS] test_calculateInterestRate_AtOptimalPoint() (gas: 24281)
Logs:
  Bound result 2000
  Bound result 778565440757296803935461404101

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

[PASS] test_calculateInterestRate_RightToOptimalPoint(uint256) (runs: 5000, μ: 25366, ~: 25416)
Logs:
  Bound result 8137
  Bound result 252173843969976304268974536488

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

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

[PASS] test_calculateInterestRate_revertsWith_InterestRateDataNotSet() (gas: 11226)
[PASS] test_deploy_revertsWith_InvalidAddress() (gas: 3724)
[PASS] test_getBaseDrawnRate() (gas: 14789)
[PASS] test_getInterestRateData() (gas: 19326)
[PASS] test_getMaxDrawnRate() (gas: 15235)
[PASS] test_getOptimalUsageRatio() (gas: 14750)
[PASS] test_getRateGrowthAfterOptimal() (gas: 14791)
[PASS] test_getRateGrowthBeforeOptimal() (gas: 14813)
[PASS] test_maxDrawnRate() (gas: 8270)
[PASS] test_maxOptimalRatio() (gas: 8313)
[PASS] test_minOptimalRatio() (gas: 8321)
[PASS] test_setInterestRateData() (gas: 68976)
[PASS] test_setInterestRateData_revertsWith_InvalidMaxDrawnRate() (gas: 41783)
[PASS] test_setInterestRateData_revertsWith_InvalidOptimalUsageRatio() (gas: 42401)
[PASS] test_setInterestRateData_revertsWith_InvalidRateData() (gas: 35313)
[PASS] test_setInterestRateData_revertsWith_OnlyHub() (gas: 23563)
Suite result: ok. 22 passed; 0 failed; 0 skipped; finished in 1.22s (1.20s CPU time)

Ran 6 tests for tests/contracts/position-manager/libraries/ConfigPermissionsMap.t.sol:ConfigPermissionsMapTest
[PASS] test_constants() (gas: 12031)
[PASS] test_getConfigPermissionValues(uint8) (runs: 5000, μ: 13703, ~: 13703)
[PASS] test_setCanSetUsingAsCollateral_fuzz(uint8,bool) (runs: 5000, μ: 10578, ~: 10566)
[PASS] test_setCanUpdateUserDynamicConfig_fuzz(uint8,bool) (runs: 5000, μ: 10602, ~: 10590)
[PASS] test_setCanUpdateUserRiskPremium_fuzz(uint8,bool) (runs: 5000, μ: 10634, ~: 10622)
[PASS] test_setGlobalPermissions_fuzz(bool) (runs: 5000, μ: 13145, ~: 13155)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.08s (1.08s CPU time)

Ran 10 tests for tests/contracts/spoke/configuration/Spoke.DynamicConfig.Triggers.t.sol:SpokeDynamicConfigTriggersTest
[PASS] test_borrow_triggers_dynamicConfigUpdate() (gas: 1506111)
[PASS] test_liquidate_does_not_trigger_dynamicConfigUpdate() (gas: 1790730)
[PASS] test_repay_does_not_trigger_dynamicConfigUpdate() (gas: 1058891)
[PASS] test_supply_does_not_trigger_dynamicConfigUpdate() (gas: 1277274)
[PASS] test_updateUserDynamicConfig_doesHFCheck() (gas: 945792)
[PASS] test_updateUserDynamicConfig_reverts_when_not_authorized(address) (runs: 5000, μ: 1287585, ~: 1287585)
[PASS] test_updateUserDynamicConfig_triggers_dynamicConfigUpdate() (gas: 733095)
[PASS] test_updateUserDynamicConfig_updatesRP() (gas: 1455009)
[PASS] test_usingAsCollateral_triggers_dynamicConfigUpdate() (gas: 1531925)
[PASS] test_withdraw_triggers_dynamicConfigUpdate() (gas: 1536691)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 29.92s (29.90s CPU time)

Ran 21 tests for tests/contracts/spoke/configuration/Spoke.DynamicConfig.t.sol:SpokeDynamicConfigTest
[PASS] test_addDynamicReserveConfig() (gas: 79180)
[PASS] test_addDynamicReserveConfig_fuzz_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_incompatible(uint16,uint32) (runs: 5000, μ: 46219, ~: 46391)
Logs:
  Bound result 9010
  Bound result 11100

[PASS] test_addDynamicReserveConfig_once() (gas: 508859)
[PASS] test_addDynamicReserveConfig_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 45602, ~: 45602)
[PASS] test_addDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_collateralFactor() (gas: 57217)
[PASS] test_addDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_liquidationBonus() (gas: 40371)
[PASS] test_addDynamicReserveConfig_revertsWith_InvalidLiquidationFee() (gas: 40878)
[PASS] test_addDynamicReserveConfig_revertsWith_MaximumDynamicConfigKeyReached() (gas: 43361)
[PASS] test_addDynamicReserveConfig_revertsWith_ReserveNotListed() (gas: 28264)
[PASS] test_fuzz_addDynamicReserveConfig_spaced_dup_updates(bytes32) (runs: 5000, μ: 415388, ~: 445873)
[PASS] test_fuzz_addDynamicReserveConfig_trailing_order(bytes32) (runs: 5000, μ: 396633, ~: 429985)
[PASS] test_offboardReserve_existing_borrows_remain_unaffected() (gas: 1263146)
[PASS] test_updateDynamicReserveConfig() (gas: 1718912)
[PASS] test_updateDynamicReserveConfig_fuzz_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus(uint16,uint32) (runs: 5000, μ: 56823, ~: 56995)
Logs:
  Bound result 9010
  Bound result 11100

[PASS] test_updateDynamicReserveConfig_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 45581, ~: 45581)
[PASS] test_updateDynamicReserveConfig_revertsWith_DynamicConfigKeyUninitialized() (gas: 48973)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidCollateralFactor() (gas: 50049)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_collateralFactor() (gas: 50783)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidCollateralFactorAndMaxLiquidationBonus_liquidationBonus() (gas: 50953)
[PASS] test_updateDynamicReserveConfig_revertsWith_InvalidLiquidationFee() (gas: 51457)
[PASS] test_updateDynamicReserveConfig_revertsWith_ReserveNotListed() (gas: 28657)
Suite result: ok. 21 passed; 0 failed; 0 skipped; finished in 23.56s (23.54s CPU time)

Ran 5 tests for tests/gas/Spoke.Getters.gas.t.sol:SpokeGetters_Gas_Tests
[PASS] test_getUserAccountData() (gas: 23662)
[PASS] test_getUserAccountData_oneSupplies() (gas: 295196)
[PASS] test_getUserAccountData_twoSupplies() (gas: 537085)
[PASS] test_getUserAccountData_twoSupplies_oneBorrows() (gas: 1078969)
[PASS] test_getUserAccountData_twoSupplies_twoBorrows() (gas: 1661266)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 46.02ms (4.56ms CPU time)

Ran 6 tests for tests/contracts/spoke/misc/Spoke.Getters.t.sol:SpokeGettersTest
[PASS] test_getLiquidationBonus_configured() (gas: 100881)
Logs:
  Bound result 2
  Bound result 1000000000000000000
  Bound result 4000
  Bound result 900000000000000000

[PASS] test_getLiquidationBonus_fuzz_configured(uint256,uint256,uint16,uint64) (runs: 5000, μ: 99668, ~: 100011)
Logs:
  Bound result 1
  Bound result 6862
  Bound result 2999
  Bound result 469390602750270781

[PASS] test_getLiquidationBonus_fuzz_notConfigured(uint256,uint256) (runs: 5000, μ: 77602, ~: 77822)
Logs:
  Bound result 4
  Bound result 100

[PASS] test_getLiquidationBonus_notConfigured() (gas: 78810)
Logs:
  Bound result 2
  Bound result 1000000000000000000

[PASS] test_premiumRayGetters() (gas: 1712630)
[PASS] test_protocol_getters() (gas: 303359)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.65s (2.63s CPU time)

Ran 4 tests for tests/contracts/spoke/liquidation/Spoke.LiquidationCall.Dust.t.sol:SpokeLiquidationCallDustTest
[PASS] test_collateralDust_min_debtToTarget() (gas: 18141111)
[PASS] test_debtToCover_exceeds_collateralValue() (gas: 18129444)
[PASS] test_dustColl_allowed() (gas: 17988464)
[PASS] test_dustDebt_allowed() (gas: 18119832)
Suite result: ok. 4 passed; 0 failed; 0 skipped; finished in 62.86ms (29.01ms CPU time)

Ran 14 tests for tests/contracts/spoke/liquidation/Spoke.LiquidationCall.Scenarios.t.sol:SpokeLiquidationCallScenariosTest
[PASS] test_liquidationCall_revertsWith_ReentrancyGuardReentrantCall_hubRefreshPremium() (gas: 26375540)
[PASS] test_liquidationCall_revertsWith_ReentrancyGuardReentrantCall_hubRemove() (gas: 26245173)
[PASS] test_liquidationCall_revertsWith_ReentrancyGuardReentrantCall_hubReportDeficit() (gas: 26358115)
[PASS] test_liquidationCall_revertsWith_ReentrancyGuardReentrantCall_hubRestore() (gas: 26321528)
[PASS] test_liquidationCall_scenario1() (gas: 4733599)
[PASS] test_liquidationCall_scenario2() (gas: 4741968)
[PASS] test_liquidationCall_scenario3() (gas: 3800889)
[PASS] test_liquidationCall_scenario4() (gas: 28132837)
[PASS] test_liquidationCall_scenario5() (gas: 3946383)
[PASS] test_liquidationCall_scenario6() (gas: 2711353)
[PASS] test_liquidationCall_scenario7() (gas: 3777151)
[PASS] test_liquidationCall_scenario8() (gas: 2540326)
[PASS] test_scenario_halted_asset() (gas: 27308008)
[PASS] test_scenario_halted_asset_with_deficit() (gas: 27150906)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 210.87ms (179.32ms CPU time)

Ran 26 tests for tests/contracts/position-manager/ConfigPositionManager/ConfigPositionManager.Permit.t.sol:ConfigPositionManagerPermitTest
[PASS] test_DOMAIN_SEPARATOR() (gas: 5711)
[PASS] test_eip712Domain() (gas: 10941)
[PASS] test_setCanSetUsingAsCollateralPermissionPermit_typeHash() (gas: 9929)
[PASS] test_setCanSetUsingAsCollateralPermissionWithSig_fuzz(address,bool) (runs: 5000, μ: 158903, ~: 159261)
[PASS] test_setCanSetUsingAsCollateralPermissionWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 145129, ~: 142733)
[PASS] test_setCanSetUsingAsCollateralPermissionWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 28465)
[PASS] test_setCanSetUsingAsCollateralPermissionWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 32780)
[PASS] test_setCanSetUsingAsCollateralPermissionWithSig_revertsWith_SpokeNotRegistered() (gas: 61776)
[PASS] test_setCanUpdateUserDynamicConfigPermissionPermit_typeHash() (gas: 9863)
[PASS] test_setCanUpdateUserDynamicConfigPermissionWithSig_fuzz(address,bool) (runs: 5000, μ: 158842, ~: 159200)
[PASS] test_setCanUpdateUserDynamicConfigPermissionWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 145106, ~: 142710)
[PASS] test_setCanUpdateUserDynamicConfigPermissionWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 28434)
[PASS] test_setCanUpdateUserDynamicConfigPermissionWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 32782)
[PASS] test_setCanUpdateUserDynamicConfigPermissionWithSig_revertsWith_SpokeNotRegistered() (gas: 61767)
[PASS] test_setCanUpdateUserRiskPremiumPermissionPermit_typeHash() (gas: 9949)
[PASS] test_setCanUpdateUserRiskPremiumPermissionWithSig_fuzz(address,bool) (runs: 5000, μ: 158886, ~: 159244)
[PASS] test_setCanUpdateUserRiskPremiumPermissionWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 145107, ~: 142711)
[PASS] test_setCanUpdateUserRiskPremiumPermissionWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 28411)
[PASS] test_setCanUpdateUserRiskPremiumPermissionWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 32749)
[PASS] test_setCanUpdateUserRiskPremiumPermissionWithSig_revertsWith_SpokeNotRegistered() (gas: 61744)
[PASS] test_setGlobalPermissionPermit_typeHash() (gas: 10002)
[PASS] test_setGlobalPermissionWithSig_fuzz(address,bool) (runs: 5000, μ: 161306, ~: 160329)
[PASS] test_setGlobalPermissionWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 145089, ~: 142693)
[PASS] test_setGlobalPermissionWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 28398)
[PASS] test_setGlobalPermissionWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 32788)
[PASS] test_setGlobalPermissionWithSig_revertsWith_SpokeNotRegistered() (gas: 61729)
Suite result: ok. 26 passed; 0 failed; 0 skipped; finished in 50.05s (50.02s CPU time)

Ran 40 tests for tests/contracts/position-manager/ConfigPositionManager/ConfigPositionManager.t.sol:ConfigPositionManagerTest
[PASS] test_multicall() (gas: 85051)
[PASS] test_renounceCanUpdateUserDynamicConfigPermission() (gas: 42286)
[PASS] test_renounceCanUpdateUserDynamicConfigPermission_revertsWith_SpokeNotRegistered() (gas: 17445)
[PASS] test_renounceCanUpdateUserRiskPremiumPermission() (gas: 42198)
[PASS] test_renounceCanUpdateUserRiskPremiumPermission_revertsWith_SpokeNotRegistered() (gas: 17400)
[PASS] test_renounceCanUpdateUsingAsCollateralPermission() (gas: 42190)
[PASS] test_renounceCanUpdateUsingAsCollateralPermission_revertsWith_SpokeNotRegistered() (gas: 17446)
[PASS] test_renounceGlobalPermission() (gas: 42969)
[PASS] test_renounceGlobalPermission_revertsWith_SpokeNotRegistered() (gas: 17445)
[PASS] test_setCanSetUsingAsCollateralPermission() (gas: 52808)
[PASS] test_setCanSetUsingAsCollateralPermission_remove() (gas: 42331)
[PASS] test_setCanSetUsingAsCollateralPermission_revertsWith_InvalidAddress_zeroDelegatee() (gas: 17884)
[PASS] test_setCanSetUsingAsCollateralPermission_revertsWith_SpokeNotRegistered() (gas: 17540)
[PASS] test_setCanUpdateUserDynamicConfigPermission() (gas: 52817)
[PASS] test_setCanUpdateUserDynamicConfigPermission_remove() (gas: 42340)
[PASS] test_setCanUpdateUserDynamicConfigPermission_revertsWith_InvalidAddress_zeroDelegatee() (gas: 17959)
[PASS] test_setCanUpdateUserDynamicConfigPermission_revertsWith_SpokeNotRegistered() (gas: 17560)
[PASS] test_setCanUpdateUserRiskPremiumPermission() (gas: 52796)
[PASS] test_setCanUpdateUserRiskPremiumPermission_remove() (gas: 42357)
[PASS] test_setCanUpdateUserRiskPremiumPermission_revertsWith_InvalidAddress_zeroDelegatee() (gas: 17937)
[PASS] test_setCanUpdateUserRiskPremiumPermission_revertsWith_SpokeNotRegistered() (gas: 17542)
[PASS] test_setGlobalPermission() (gas: 54258)
[PASS] test_setGlobalPermission_removeAllPermissions() (gas: 43109)
[PASS] test_setGlobalPermission_removePreviousPermissions() (gas: 47740)
[PASS] test_setGlobalPermission_revertsWith_InvalidAddress_zeroDelegatee() (gas: 17911)
[PASS] test_setGlobalPermission_revertsWith_SpokeNotRegistered() (gas: 17561)
[PASS] test_setGlobalPermission_setThenRemove() (gas: 49380)
[PASS] test_setUsingAsCollateralOnBehalfOf_fuzz_withGlobalPermission(uint256,bool) (runs: 5000, μ: 114593, ~: 119432)
Logs:
  Bound result 2

[PASS] test_setUsingAsCollateralOnBehalfOf_fuzz_withPermission(uint256,bool) (runs: 5000, μ: 114630, ~: 119469)
Logs:
  Bound result 2

[PASS] test_setUsingAsCollateralOnBehalfOf_noop_whenStatusUnchanged(uint256,bool) (runs: 5000, μ: 92267, ~: 104979)
Logs:
  Bound result 2

[PASS] test_setUsingAsCollateralOnBehalfOf_revertsWith_CallerNotAllowed() (gas: 22145)
[PASS] test_setUsingAsCollateralOnBehalfOf_revertsWith_SpokeNotRegistered() (gas: 17556)
[PASS] test_updateUserDynamicConfigOnBehalfOf_revertsWith_CallerNotAllowed() (gas: 19930)
[PASS] test_updateUserDynamicConfigOnBehalfOf_revertsWith_SpokeNotRegistered() (gas: 17489)
[PASS] test_updateUserDynamicConfigOnBehalfOf_withGlobalPermission() (gas: 74670)
[PASS] test_updateUserDynamicConfigOnBehalfOf_withPermission() (gas: 74683)
[PASS] test_updateUserRiskPremiumOnBehalfOf_revertsWith_CallerNotAllowed() (gas: 19910)
[PASS] test_updateUserRiskPremiumOnBehalfOf_revertsWith_SpokeNotRegistered() (gas: 17469)
[PASS] test_updateUserRiskPremiumOnBehalfOf_withGlobalPermission() (gas: 829671)
[PASS] test_updateUserRiskPremiumOnBehalfOf_withPermission() (gas: 829751)
Suite result: ok. 40 passed; 0 failed; 0 skipped; finished in 11.60s (11.57s CPU time)

Ran 8 tests for tests/contracts/position-manager/libraries/EIP712Hash.t.sol:EIP712HashTest
[PASS] test_constants() (gas: 11129)
[PASS] test_hash_borrow_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6689, ~: 6689)
[PASS] test_hash_repay_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6690, ~: 6690)
[PASS] test_hash_setUsingAsCollateral_fuzz((address,uint256,bool,address,uint256,uint256)) (runs: 5000, μ: 7148, ~: 7148)
[PASS] test_hash_supply_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6733, ~: 6733)
[PASS] test_hash_updateUserDynamicConfig_fuzz((address,address,uint256,uint256)) (runs: 5000, μ: 6349, ~: 6349)
[PASS] test_hash_updateUserRiskPremium_fuzz((address,address,uint256,uint256)) (runs: 5000, μ: 6370, ~: 6370)
[PASS] test_hash_withdraw_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6711, ~: 6711)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 5.23s (5.23s CPU time)

Ran 3 tests for tests/contracts/utils/ExtSload.t.sol:ExtSloadTest
[PASS] test_extSload(bytes32) (runs: 5000, μ: 9767, ~: 9767)
[PASS] test_extSloads(uint256) (runs: 5000, μ: 952128, ~: 914497)
Logs:
  Bound result 812

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

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

Ran 5 tests for tests/gas/Gateways.Operations.gas.t.sol:NativeTokenGateway_Gas_Tests
[PASS] test_borrowNative() (gas: 947983)
[PASS] test_repayNative() (gas: 1020514)
[PASS] test_supplyAndCollateralNative() (gas: 315108)
[PASS] test_supplyNative() (gas: 294582)
[PASS] test_withdrawNative() (gas: 527815)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 45.64ms (4.20ms CPU time)

Ran 8 tests for tests/gas/Gateways.Operations.gas.t.sol:SignatureGateway_Gas_Tests
[PASS] test_borrowWithSig() (gas: 766879)
[PASS] test_repayWithSig() (gas: 983023)
[PASS] test_setSelfAsUserPositionManagerWithSig() (gas: 209294)
[PASS] test_setUsingAsCollateralWithSig() (gas: 294316)
[PASS] test_supplyWithSig() (gas: 447274)
[PASS] test_updateUserDynamicConfigWithSig() (gas: 145250)
[PASS] test_updateUserRiskPremiumWithSig() (gas: 143093)
[PASS] test_withdrawWithSig() (gas: 423521)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 49.64ms (8.00ms CPU time)

Ran 21 tests for tests/contracts/spoke/withdraw/Spoke.Withdraw.HealthFactor.t.sol:SpokeWithdrawHealthFactorTest
[PASS] test_unsetCollateral_fuzz_revertsWith_HealthFactorBelowThreshold(uint256) (runs: 5000, μ: 917470, ~: 917078)
Logs:
  Bound result 3124043968137

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_interest_increase(uint256,uint256) (runs: 5000, μ: 666458, ~: 666838)
Logs:
  Bound result 80
  Bound result 327323530

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls(uint256,uint256) (runs: 5000, μ: 897442, ~: 897544)
Logs:
  Bound result 2867247507249
  Bound result 2917432920835457

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_dai(uint256,uint256,uint256) (runs: 5000, μ: 1160991, ~: 1161267)
Logs:
  Bound result 2
  Bound result 1100000000000000000
  Bound result 96

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_weth(uint256,uint256,uint256) (runs: 5000, μ: 1161429, ~: 1161283)
Logs:
  Bound result 200000000
  Bound result 1100000000000000000
  Bound result 96

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest(uint256,uint256) (runs: 5000, μ: 952450, ~: 953011)
Logs:
  Bound result 2867247507249
  Bound result 2917432920835457

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts(uint256,uint256) (runs: 5000, μ: 1020824, ~: 1020247)
Logs:
  Bound result 1831884821
  Bound result 120

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_price_drop(uint256,uint256,uint256) (runs: 5000, μ: 1270776, ~: 1270471)
Logs:
  Bound result 16223
  Bound result 294810381084112878185707385574
  Bound result 3000000000000000000

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 1058463, ~: 1058058)
Logs:
  Bound result 16223
  Bound result 294810381084112878185707385574
  Bound result 3000000000000000000

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_price_drop(uint256,uint256) (runs: 5000, μ: 879467, ~: 879813)
Logs:
  Bound result 132268384570
  Bound result 644966812442621595807

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_singleBorrow(uint256) (runs: 5000, μ: 631157, ~: 631109)
Logs:
  Bound result 24080

[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_interest_increase() (gas: 661569)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls() (gas: 892897)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_dai() (gas: 1155120)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_weth() (gas: 1155123)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest() (gas: 948033)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_debts() (gas: 1015367)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_debts_price_drop() (gas: 1263948)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest() (gas: 1051862)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_price_drop() (gas: 874315)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_singleBorrow() (gas: 632627)
Suite result: ok. 21 passed; 0 failed; 0 skipped; finished in 174.87s (174.82s CPU time)

Ran 12 tests for tests/contracts/position-manager/GiverPositionManager.t.sol:GiverPositionManagerTest
[PASS] test_multicall() (gas: 348052)
[PASS] test_repayOnBehalfOf() (gas: 662400)
Logs:
  Bound result 50000000000000000000

[PASS] test_repayOnBehalfOf_fuzz(uint256) (runs: 5000, μ: 659291, ~: 662628)
Logs:
  Bound result 3124043968137

[PASS] test_repayOnBehalfOf_fuzz_withInterest(uint256,uint256) (runs: 5000, μ: 593858, ~: 590214)
Logs:
  Bound result 900000068691281935000
  Bound result 25920101

[PASS] test_repayOnBehalfOf_maxRepay() (gas: 583981)
[PASS] test_repayOnBehalfOf_maxRepay_revertsWith_InvalidRepayAmount() (gas: 490693)
[PASS] test_repayOnBehalfOf_revertsWith_ReserveNotListed() (gas: 32367)
[PASS] test_repayOnBehalfOf_revertsWith_SpokeNotRegistered() (gas: 28767)
[PASS] test_supplyOnBehalfOf() (gas: 315270)
Logs:
  Bound result 100000000000000000000

[PASS] test_supplyOnBehalfOf_fuzz(uint256) (runs: 5000, μ: 315567, ~: 315341)
Logs:
  Bound result 3124043968137

[PASS] test_supplyOnBehalfOf_revertsWith_ReserveNotListed() (gas: 32428)
[PASS] test_supplyOnBehalfOf_revertsWith_SpokeNotRegistered() (gas: 28817)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 30.73s (30.71s CPU time)

Ran 6 tests for tests/contracts/hub/misc/Hub.Access.t.sol:HubAccessTest
[PASS] test_change_authority() (gas: 213977)
[PASS] test_change_role_responsibility() (gas: 131759)
[PASS] test_hub_access_manager_exposure() (gas: 18422)
[PASS] test_hub_admin_access() (gas: 1364028)
[PASS] test_migrate_role_responsibility() (gas: 718316)
[PASS] test_setInterestRateData_access() (gas: 113564)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 28.01ms (3.83ms CPU time)

Ran 19 tests for tests/contracts/hub/add-remove/Hub.Add.t.sol:HubAddTest
[PASS] test_add_AddCapReachedButNotExceeded_rounding() (gas: 680262)
[PASS] test_add_fuzz_AddCapReachedButNotExceeded(uint40) (runs: 5000, μ: 173465, ~: 173421)
Logs:
  Bound result 9

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

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

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

[PASS] test_add_fuzz_revertsWith_InvalidShares_due_to_index(uint256,uint256,uint256) (runs: 5000, μ: 228039, ~: 228238)
Logs:
  Bound result 999999999904900000000000000001
  Bound result 3122070484
  Bound result 9

[PASS] test_add_fuzz_single_asset(uint256,address,uint256) (runs: 5000, μ: 360363, ~: 360383)
Logs:
  Bound result 0
  Bound result 714477922937634359008573850498

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

[PASS] test_add_multi_add_minimal_shares() (gas: 332551)
[PASS] test_add_revertsWith_AmountDowncastOverflow() (gas: 363552)
[PASS] test_add_revertsWith_InsufficientTransferred() (gas: 69426)
[PASS] test_add_revertsWith_InvalidAmount() (gas: 18616)
[PASS] test_add_revertsWith_InvalidShares() (gas: 228061)
[PASS] test_add_revertsWith_SharesDowncastOverflow() (gas: 228597)
[PASS] test_add_revertsWith_SpokeHalted() (gas: 106274)
[PASS] test_add_revertsWith_SpokeNotActive() (gas: 106255)
[PASS] test_add_single_asset() (gas: 351288)
Logs:
  Bound result 2
  Bound result 100000000000000000000

[PASS] test_add_with_increased_index() (gas: 324174)
[PASS] test_add_with_increased_index_with_premium() (gas: 687684)
Suite result: ok. 19 passed; 0 failed; 0 skipped; finished in 50.56s (50.53s CPU time)

Ran 5 tests for tests/contracts/spoke/withdraw/Spoke.Withdraw.Scenario.t.sol:SpokeWithdrawScenarioTest
[PASS] test_withdraw_fuzz_all_liquidity_with_interest_multi_user((uint256,uint256,uint256,uint256,uint256[2],uint256)) (runs: 5000, μ: 1127826, ~: 1152296)
Logs:
  Bound result 2
  Bound result 991466614162668518126885086414
  Bound result 3692366002731856463108822170
  Bound result 454377326
  Bound result 136923370
  Bound result 440735623449517850262567531806
  Bound result 16904

[PASS] test_withdraw_fuzz_partial_full_with_interest(uint256,uint256,uint256,uint40) (runs: 5000, μ: 963937, ~: 963915)
Logs:
  Bound result 3
  Bound result 1
  Bound result 1
  Bound result 5355

[PASS] test_withdraw_round_trip_deposit_withdraw(uint256,uint256,address,uint256) (runs: 5000, μ: 417459, ~: 417444)
Logs:
  Bound result 4
  Bound result 386061929037201014875895872375
  Bound result 50000000000000000000

[PASS] test_withdraw_round_trip_withdraw_deposit(uint256,uint256,uint256,address,uint256) (runs: 5000, μ: 438568, ~: 437872)
Logs:
  Bound result 2
  Bound result 2
  Bound result 435990357906337338302356819498
  Bound result 950702884693869056163874704002

[PASS] test_withdraw_underwater_reserve_not_collateral() (gas: 973916)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 79.72s (79.69s CPU time)

Ran 6 tests for tests/contracts/spoke/withdraw/Spoke.Withdraw.Validation.t.sol:SpokeWithdrawValidationTest
[PASS] test_withdraw_fuzz_revertsWith_InsufficientLiquidity_with_debt(uint256,uint256,uint256,uint256,uint256) (runs: 5000, μ: 445269, ~: 445345)
Logs:
  Bound result 1
  Bound result 13800454394220
  Bound result 519825888141
  Bound result 73242
  Bound result 175908665

[PASS] test_withdraw_fuzz_revertsWith_InsufficientSupply_zero_supplied(uint256) (runs: 5000, μ: 60954, ~: 60661)
Logs:
  Bound result 3124043968137

[PASS] test_withdraw_revertsWith_InsufficientLiquidity_with_debt() (gas: 437909)
[PASS] test_withdraw_revertsWith_InvalidAmount_zero_supplied() (gas: 57304)
[PASS] test_withdraw_revertsWith_ReserveNotListed() (gas: 22475)
[PASS] test_withdraw_revertsWith_ReservePaused() (gas: 63021)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.48s (6.46s CPU time)

Ran 38 tests for tests/contracts/hub/configuration/Hub.Config.t.sol:HubConfigTest
[PASS] test_addAsset_fuzz(address,uint8,address) (runs: 5000, μ: 399470, ~: 399509)
Logs:
  Bound result 18

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_feeReceiver(address,uint8,address) (runs: 5000, μ: 50340, ~: 50038)
Logs:
  Bound result 12

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_irStrategy(address,uint8,address) (runs: 5000, μ: 50317, ~: 50015)
Logs:
  Bound result 12

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_underlying(uint8,address,address) (runs: 5000, μ: 41634, ~: 41634)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals(address,uint8,address,address) (runs: 5000, μ: 50946, ~: 50988)
Logs:
  Bound result 28

[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals_tooLow(address,uint8,address,address) (runs: 5000, μ: 51047, ~: 51333)
Logs:
  Bound result 4

[PASS] test_addAsset_fuzz_reverts_InvalidIrData(address,uint8,address,address) (runs: 5000, μ: 80545823534, ~: 39937)
Logs:
  Bound result 9

[PASS] test_addAsset_revertsWith_BlockTimestampDowncastOverflow() (gas: 961606)
[PASS] test_addAsset_revertsWith_DrawnRateDowncastOverflow() (gas: 958639)
[PASS] test_addAsset_reverts_UnderlyingAlreadyListed() (gas: 54353)
[PASS] test_addSpoke_fuzz(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 132572, ~: 132621)
Logs:
  Bound result 3

[PASS] test_addSpoke_fuzz_revertsWith_AssetNotListed(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 40664, ~: 40653)
Logs:
  Bound result 123

[PASS] test_addSpoke_fuzz_revertsWith_InvalidAddress_spoke(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 39262, ~: 39311)
Logs:
  Bound result 3

[PASS] test_addSpoke_revertsWith_SpokeAlreadyListed() (gas: 45260)
[PASS] test_getAssetId() (gas: 80480)
[PASS] test_getAssetId_fuzz_revertsWith_AssetNotListed(address) (runs: 5000, μ: 23521, ~: 23521)
[PASS] test_hub_deploy_reverts_on_InvalidConstructorInput() (gas: 772359)
[PASS] test_hub_max_riskPremium() (gas: 13555)
[PASS] test_isUnderlyingListed() (gas: 1184175)
[PASS] test_updateAssetConfig_NewFeeReceiver_noFees() (gas: 729791)
[PASS] test_updateAssetConfig_NewFeeReceiver_revertsWith_SpokeNotActive_noFees() (gas: 626700)
[PASS] test_updateAssetConfig_UseExistingSpokeAndListedAsFeeReceiver_revertsWith_SpokeAlreadyListed() (gas: 76582)
[PASS] test_updateAssetConfig_fuzz(uint256,(address,uint16,address,address)) (runs: 5000, μ: 280291, ~: 280609)
Logs:
  Bound result 1
  Bound result 184

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

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

[PASS] test_updateAssetConfig_fuzz_NewDrawnRateStrategy(uint256) (runs: 5000, μ: 715963, ~: 715964)
Logs:
  Bound result 3

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

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

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

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

[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidLiquidityFee(uint256,(address,uint16,address,address)) (runs: 5000, μ: 45585, ~: 45483)
Logs:
  Bound result 1
  Bound result 184

[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidReinvestmentController() (gas: 478878)
[PASS] test_updateAssetConfig_fuzz_revertsWith_calculateInterestRateReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 204774, ~: 204737)
Logs:
  Bound result 4
  Bound result 15

[PASS] test_updateAssetConfig_fuzz_revertsWith_setInterestRateDataReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 102202, ~: 102162)
Logs:
  Bound result 0
  Bound result 7500

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

[PASS] test_updateSpokeConfig_fuzz(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 65097, ~: 65156)
Logs:
  Bound result 3

[PASS] test_updateSpokeConfig_fuzz_revertsWith_SpokeNotListed(uint256,address,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 45965, ~: 46032)
Logs:
  Bound result 1

[PASS] test_updateSpokeConfig_revertsWith_AssetNotListed() (gas: 35036)
Suite result: ok. 38 passed; 0 failed; 0 skipped; finished in 105.08s (105.05s CPU time)

Ran 16 tests for tests/contracts/hub/draw-restore/Hub.Draw.t.sol:HubDrawTest
[PASS] test_draw_DifferentSpokes() (gas: 364759)
[PASS] test_draw_fuzz_IncreasedDrawnRate(uint256,uint256) (runs: 5000, μ: 708524, ~: 708759)
Logs:
  Bound result 3
  Bound result 100

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

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

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

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

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

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

[PASS] test_draw_fuzz_revertsWith_InvalidAddress(uint256) (runs: 5000, μ: 21086, ~: 21086)
[PASS] test_draw_revertsWith_DrawCapExceeded_due_to_deficit() (gas: 276496)
[PASS] test_draw_revertsWith_InsufficientLiquidity() (gas: 33608)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_draw() (gas: 173401)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_remove() (gas: 135105)
[PASS] test_draw_revertsWith_InvalidAmount() (gas: 21172)
[PASS] test_draw_revertsWith_SpokeHalted() (gas: 67990)
[PASS] test_draw_revertsWith_SpokeNotActive() (gas: 67929)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 25.40s (25.36s CPU time)

Ran 8 tests for tests/contracts/hub/deficit/Hub.EliminateDeficit.t.sol:HubEliminateDeficitTest
[PASS] test_eliminateDeficit(uint256) (runs: 5000, μ: 679549, ~: 679549)
[PASS] test_eliminateDeficit_fuzz_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 36483, ~: 36483)
[PASS] test_eliminateDeficit_fuzz_revertsWith_ArithmeticUnderflow_CallerSpokeNoFunds(uint256) (runs: 5000, μ: 360097, ~: 360097)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountNoDeficit() (gas: 41035)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountWithDeficit() (gas: 356186)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_on_UnregisteredCoveredSpoke() (gas: 41421)
[PASS] test_eliminateDeficit_revertsWith_SpokeNotActive_on_UnregisteredAsset() (gas: 392804)
[PASS] test_eliminateDeficit_revertsWith_callerSpokeNotActive() (gas: 166526)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 18.77s (18.75s CPU time)

Ran 6 tests for tests/contracts/hub/fees/Hub.MintFeeShares.t.sol:HubMintFeeSharesTest
[PASS] test_mintFeeShares() (gas: 325674)
[PASS] test_mintFeeShares_noFees() (gas: 384713)
[PASS] test_mintFeeShares_noShares() (gas: 301726)
[PASS] test_mintFeeShares_revertsWith_AccessManagedUnauthorized() (gas: 29096)
[PASS] test_mintFeeShares_revertsWith_AssetNotListed() (gas: 32893)
[PASS] test_mintFeeShares_revertsWith_SpokeNotActive() (gas: 248741)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 28.87ms (4.09ms CPU time)

Ran 9 tests for tests/gas/Hub.Operations.gas.t.sol:HubOperations_Gas_Tests
[PASS] test_add() (gas: 279985)
[PASS] test_deficit() (gas: 1392056)
[PASS] test_draw() (gas: 433345)
[PASS] test_mintFeeShares() (gas: 519642)
[PASS] test_payFee_transferShares() (gas: 971202)
[PASS] test_refreshPremium() (gas: 672333)
[PASS] test_remove() (gas: 325571)
[PASS] test_restore() (gas: 946828)
[PASS] test_restore_with_transfer() (gas: 947491)
Suite result: ok. 9 passed; 0 failed; 0 skipped; finished in 47.78ms (7.05ms CPU time)

Ran 14 tests for tests/contracts/spoke/withdraw/Spoke.Withdraw.t.sol:SpokeWithdrawTest
[PASS] test_fuzz_withdraw_effect_on_ex_rates(uint256,uint256) (runs: 5000, μ: 748539, ~: 750397)
Logs:
  Bound result 100
  Bound result 68691281934999

[PASS] test_withdraw_all_liquidity() (gas: 407035)
[PASS] test_withdraw_all_liquidity_with_interest_no_premium() (gas: 1203912)
[PASS] test_withdraw_all_liquidity_with_interest_with_premium() (gas: 1211960)
[PASS] test_withdraw_fuzz_all_elapsed_with_interest(uint256,uint256,uint40) (runs: 5000, μ: 790118, ~: 790035)
Logs:
  Bound result 8159
  Bound result 3915
  Bound result 7741

[PASS] test_withdraw_fuzz_all_greater_than_supplied(uint256) (runs: 5000, μ: 410940, ~: 410647)
Logs:
  Bound result 3124043968137

[PASS] test_withdraw_fuzz_all_liquidity_with_interest_no_premium((uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 1323629, ~: 1336608)
Logs:
  Bound result 3
  Bound result 8792994619245588
  Bound result 469278318579570
  Bound result 26447
  Bound result 711545419

[PASS] test_withdraw_fuzz_all_liquidity_with_interest_with_premium((uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 1323291, ~: 1336131)
Logs:
  Bound result 3
  Bound result 8792994619245588
  Bound result 469278318579570
  Bound result 26447
  Bound result 711545419

[PASS] test_withdraw_fuzz_all_with_interest(uint256,uint256) (runs: 5000, μ: 804141, ~: 804080)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_withdraw_fuzz_suppliedAmount(uint256) (runs: 5000, μ: 412822, ~: 412529)
Logs:
  Bound result 3124043968137

[PASS] test_withdraw_max_greater_than_supplied() (gas: 381530)
[PASS] test_withdraw_revertsWith_ReentrancyGuardReentrantCall_hubRefreshPremium() (gas: 665292)
[PASS] test_withdraw_revertsWith_ReentrancyGuardReentrantCall_hubRemove() (gas: 407535)
[PASS] test_withdraw_same_block() (gas: 322792)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 131.53s (131.51s CPU time)

Ran 16 tests for tests/contracts/spoke/configurator/SpokeConfigurator.GranularAccessControl.t.sol:SpokeConfiguratorGranularAccessControlTest
[PASS] test_fuzz_unauthorized_cannotCall_liquidationConfigManagerMethods(address) (runs: 5000, μ: 117192, ~: 117192)
[PASS] test_fuzz_unauthorized_cannotCall_positionManagerAdminMethods(address) (runs: 5000, μ: 39805, ~: 39805)
[PASS] test_fuzz_unauthorized_cannotCall_reserveManagerMethods(address) (runs: 5000, μ: 458658, ~: 458658)
[PASS] test_liquidationConfigManager_canCall_updateLiquidationConfig() (gas: 62548)
[PASS] test_liquidationConfigManager_canCall_updateLiquidationTargetHealthFactor() (gas: 62133)
[PASS] test_liquidationConfigManager_cannotCall_anyPositionManagerAdminMethod() (gas: 39043)
[PASS] test_liquidationConfigManager_cannotCall_anyReserveMethod() (gas: 461097)
[PASS] test_positionManagerAdmin_canCall_updatePositionManager() (gas: 75207)
[PASS] test_positionManagerAdmin_cannotCall_anyLiquidationConfigMethod() (gas: 117087)
[PASS] test_positionManagerAdmin_cannotCall_anyReserveMethod() (gas: 460879)
[PASS] test_reserveManager_canCall_freezeAllReserves() (gas: 157066)
[PASS] test_reserveManager_canCall_pauseAllReserves() (gas: 157029)
[PASS] test_reserveManager_canCall_updateFrozen() (gas: 65260)
[PASS] test_reserveManager_canCall_updatePaused() (gas: 65207)
[PASS] test_reserveManager_cannotCall_anyLiquidationConfigMethod() (gas: 117064)
[PASS] test_reserveManager_cannotCall_anyPositionManagerAdminMethod() (gas: 39020)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 6.34s (6.31s CPU time)

Ran 48 tests for tests/contracts/spoke/configurator/SpokeConfigurator.t.sol:SpokeConfiguratorTest
[PASS] test_addCollateralFactor() (gas: 125701)
[PASS] test_addCollateralFactor_revertsWith_AccessManagedUnauthorized() (gas: 29160)
[PASS] test_addDynamicReserveConfig() (gas: 105440)
[PASS] test_addDynamicReserveConfig_revertsWith_AccessManagedUnauthorized() (gas: 29375)
[PASS] test_addLiquidationBonus_revertsWith_AccessManagedUnauthorized() (gas: 29147)
[PASS] test_addLiquidationFee() (gas: 125688)
[PASS] test_addLiquidationFee_revertsWith_AccessManagedUnauthorized() (gas: 29081)
[PASS] test_addMaxLiquidationBonus() (gas: 125737)
[PASS] test_addReserve() (gas: 407205)
[PASS] test_addReserve_revertsWith_AccessManagedUnauthorized() (gas: 30045)
[PASS] test_freezeAllReserves() (gas: 202923)
[PASS] test_freezeAllReserves_revertsWith_AccessManagedUnauthorized() (gas: 26879)
[PASS] test_freezeReserve() (gas: 72401)
[PASS] test_freezeReserve_revertsWith_AccessManagedUnauthorized() (gas: 29026)
[PASS] test_pauseAllReserves() (gas: 202782)
[PASS] test_pauseAllReserves_revertsWith_AccessManagedUnauthorized() (gas: 26857)
[PASS] test_pauseReserve() (gas: 72328)
[PASS] test_pauseReserve_revertsWith_AccessManagedUnauthorized() (gas: 28959)
[PASS] test_updateBorrowable() (gas: 102957)
[PASS] test_updateBorrowable_revertsWith_AccessManagedUnauthorized() (gas: 29083)
[PASS] test_updateCollateralFactor() (gas: 82803)
[PASS] test_updateCollateralFactor_revertsWith_AccessManagedUnauthorized() (gas: 29202)
[PASS] test_updateCollateralRisk() (gas: 77023)
[PASS] test_updateCollateralRisk_revertsWith_AccessManagedUnauthorized() (gas: 29054)
[PASS] test_updateDynamicReserveConfig() (gas: 201369)
[PASS] test_updateDynamicReserveConfig_revertsWith_AccessManagedUnauthorized() (gas: 29436)
[PASS] test_updateFrozen() (gas: 105722)
[PASS] test_updateFrozen_revertsWith_AccessManagedUnauthorized() (gas: 29104)
[PASS] test_updateHealthFactorForMaxBonus() (gas: 68206)
[PASS] test_updateHealthFactorForMaxBonus_revertsWith_AccessManagedUnauthorized() (gas: 26869)
[PASS] test_updateLiquidationBonusFactor() (gas: 71122)
[PASS] test_updateLiquidationBonusFactor_revertsWith_AccessManagedUnauthorized() (gas: 26892)
[PASS] test_updateLiquidationConfig() (gas: 65776)
[PASS] test_updateLiquidationConfig_revertsWith_AccessManagedUnauthorized() (gas: 27176)
[PASS] test_updateLiquidationFee() (gas: 82864)
[PASS] test_updateLiquidationFee_revertsWith_AccessManagedUnauthorized() (gas: 29199)
[PASS] test_updateLiquidationTargetHealthFactor() (gas: 71084)
[PASS] test_updateLiquidationTargetHealthFactor_revertsWith_AccessManagedUnauthorized() (gas: 26913)
[PASS] test_updateMaxLiquidationBonus() (gas: 82778)
[PASS] test_updateMaxLiquidationBonus_revertsWith_AccessManagedUnauthorized() (gas: 29180)
[PASS] test_updatePaused() (gas: 105637)
[PASS] test_updatePaused_revertsWith_AccessManagedUnauthorized() (gas: 29103)
[PASS] test_updatePositionManager() (gas: 74403)
[PASS] test_updatePositionManager_revertsWith_AccessManagedUnauthorized() (gas: 27045)
[PASS] test_updateReceiveSharesEnabled() (gas: 103009)
[PASS] test_updateReceiveSharesEnabled_revertsWith_AccessManagedUnauthorized() (gas: 29126)
[PASS] test_updateReservePriceSource() (gas: 257997)
[PASS] test_updateReservePriceSource_revertsWith_AccessManagedUnauthorized() (gas: 29078)
Suite result: ok. 48 passed; 0 failed; 0 skipped; finished in 40.88ms (14.32ms CPU time)

Ran 6 tests for tests/contracts/spoke/libraries/SpokeUtils.t.sol:SpokeUtilsTest
[PASS] test_fuzz_toValue(uint256,uint256,uint256) (runs: 5000, μ: 15810, ~: 15867)
Logs:
  Bound result 615514462186775432459
  Bound result 9
  Bound result 9140094126966428

[PASS] test_get() (gas: 180662)
[PASS] test_get_revertsWith_ReserveNotListed() (gas: 167206)
[PASS] test_toValue() (gas: 8851)
[PASS] test_toValue_revertsWith_ArithmeticOverflow() (gas: 8982)
[PASS] test_toValue_revertsWith_ArithmeticUnderflow() (gas: 8757)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 457.07ms (433.19ms CPU time)

Ran 6 tests for tests/contracts/hub/fees/Hub.PayFee.t.sol:HubPayFeeTest
[PASS] test_payFee_fuzz(uint256,uint256) (runs: 5000, μ: 712181, ~: 712339)
Logs:
  Bound result 68691281934999
  Bound result 0
  Bound result 100

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

[PASS] test_payFee_revertsWith_InvalidShares() (gas: 25275)
[PASS] test_payFee_revertsWith_SpokeNotActive() (gas: 67944)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded() (gas: 142706)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded_with_interest() (gas: 646829)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 28.00s (27.98s CPU time)

Ran 14 tests for tests/contracts/position-manager/TakerPositionManager/TakerPositionManager.Permit.t.sol:TakerPositionManagerPermitTest
[PASS] test_DOMAIN_SEPARATOR() (gas: 5688)
[PASS] test_approveBorrowWithSig_fuzz(address,uint256,uint256) (runs: 5000, μ: 192219, ~: 191823)
Logs:
  Bound result 2
  Bound result 633674229709637574468961046058

[PASS] test_approveBorrowWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 155952, ~: 155678)
[PASS] test_approveBorrowWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 39837)
[PASS] test_approveBorrowWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 37722)
[PASS] test_approveBorrowWithSig_revertsWith_SpokeNotRegistered() (gas: 171897)
[PASS] test_approveWithdrawWithSig_fuzz(address,uint256,uint256) (runs: 5000, μ: 192164, ~: 191768)
Logs:
  Bound result 2
  Bound result 633674229709637574468961046058

[PASS] test_approveWithdrawWithSig_revertsWith_InvalidAccountNonce(bytes32) (runs: 5000, μ: 155906, ~: 155632)
[PASS] test_approveWithdrawWithSig_revertsWith_InvalidSignature_dueTo_ExpiredDeadline() (gas: 39833)
[PASS] test_approveWithdrawWithSig_revertsWith_InvalidSignature_dueTo_InvalidSigner() (gas: 37689)
[PASS] test_approveWithdrawWithSig_revertsWith_SpokeNotRegistered() (gas: 171831)
[PASS] test_borrowPermit_typeHash() (gas: 9850)
[PASS] test_eip712Domain() (gas: 11029)
[PASS] test_withdrawPermit_typeHash() (gas: 9845)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 25.51s (25.48s CPU time)

Ran 11 tests for tests/contracts/hub/add-remove/Hub.Reclaim.t.sol:HubReclaimTest
[PASS] test_reclaim() (gas: 642168)
Logs:
  Bound result 1000000000000000000000
  Bound result 500000000000000000000
  Bound result 200000000000000000000

[PASS] test_reclaim_fullAmount() (gas: 623288)
[PASS] test_reclaim_fuzz(uint256,uint256,uint256) (runs: 5000, μ: 643900, ~: 643144)
Logs:
  Bound result 615514462186775432459
  Bound result 571193127101173104469
  Bound result 564283877115702805413

[PASS] test_reclaim_multipleSweepsAndReclaims() (gas: 733882)
[PASS] test_reclaim_revertsWith_AssetNotListed() (gas: 18447)
[PASS] test_reclaim_revertsWith_InsufficientTransferred() (gas: 442803)
[PASS] test_reclaim_revertsWith_InsufficientTransferred_noSwept() (gas: 109383)
[PASS] test_reclaim_revertsWith_InvalidAmount_zero() (gas: 99136)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController(address) (runs: 5000, μ: 98355, ~: 98355)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController_init() (gas: 46036)
[PASS] test_reclaim_revertsWith_underflow_exceedsSwept_afterSweep() (gas: 606504)
Suite result: ok. 11 passed; 0 failed; 0 skipped; finished in 16.45s (16.42s CPU time)

Ran 12 tests for tests/contracts/hub/draw-restore/Hub.RefreshPremium.t.sol:HubRefreshPremiumTest
[PASS] test_refreshPremium_emitsEvent() (gas: 264186)
[PASS] test_refreshPremium_fuzz_positiveDeltas(uint256,int256,int256) (runs: 5000, μ: 503673, ~: 509051)
Logs:
  Bound result 999999999910000000000000000001
  Bound result 1
  Bound result 11520

[PASS] test_refreshPremium_fuzz_withAccrual(uint256,uint256,uint256,uint256) (runs: 5000, μ: 480421, ~: 490442)
Logs:
  Bound result 1349
  Bound result 45
  Bound result 250000000000000000000
  Bound result 30275

[PASS] test_refreshPremium_haltedSpokesAllowed() (gas: 129381)
[PASS] test_refreshPremium_maxRiskPremiumThreshold() (gas: 910733)
[PASS] test_refreshPremium_negativeDeltas(uint256) (runs: 5000, μ: 472452, ~: 473015)
Logs:
  Bound result 3124043968137

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

[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_NonZeroRestoredPremiumRay() (gas: 867321)
[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_RiskPremiumThresholdExceeded_DecreasingPremium() (gas: 886141)
[PASS] test_refreshPremium_revertsWith_SpokeNotActive() (gas: 65397)
[PASS] test_refreshPremium_riskPremiumThreshold() (gas: 933823)
[PASS] test_refreshPremium_spokePremiumUpdateIsContained() (gas: 723261)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 22.44s (22.41s CPU time)

Ran 15 tests for tests/contracts/hub/add-remove/Hub.Remove.t.sol:HubRemoveTest
[PASS] test_remove() (gas: 221513)
Logs:
  Bound result 2
  Bound result 100000000000000000000

[PASS] test_remove_all_with_interest() (gas: 387820)
[PASS] test_remove_fuzz(uint256,uint256) (runs: 5000, μ: 220334, ~: 220386)
Logs:
  Bound result 4
  Bound result 100

[PASS] test_remove_fuzz_all_liquidity_with_interest(uint256,uint256) (runs: 5000, μ: 438568, ~: 438795)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_remove_fuzz_multi_spoke(uint256,uint256) (runs: 5000, μ: 304441, ~: 304538)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_remove_fuzz_multi_spoke_with_interest(uint256,uint256,uint256,uint256) (runs: 5000, μ: 439575, ~: 440042)
Logs:
  Bound result 1099511627775
  Bound result 7237
  Bound result 1041086160924
  Bound result 143249407

[PASS] test_remove_revertsWith_InsufficientLiquidity() (gas: 162043)
[PASS] test_remove_revertsWith_InsufficientLiquidity_exceeding_added_amount() (gas: 151233)
[PASS] test_remove_revertsWith_InsufficientLiquidity_zero_added() (gas: 26348)
[PASS] test_remove_revertsWith_InvalidAddress() (gas: 21463)
[PASS] test_remove_revertsWith_InvalidAmount() (gas: 23620)
[PASS] test_remove_revertsWith_SpokeHalted() (gas: 68420)
[PASS] test_remove_revertsWith_SpokeNotActive() (gas: 68396)
[PASS] test_remove_revertsWith_underflow_exceeding_added_amount() (gas: 186917)
[PASS] test_remove_revertsWtih_underflow_one_extra_wei() (gas: 367430)
Suite result: ok. 15 passed; 0 failed; 0 skipped; finished in 34.11s (34.09s CPU time)

Ran 8 tests for tests/contracts/spoke/repay/Spoke.Repay.Scenario.t.sol:SpokeRepayScenarioTest
[PASS] test_fuzz_repay_borrow_twice_repay_twice((uint256,uint256,uint256,uint40),(uint256,uint256,uint256,uint40)) (runs: 5000, μ: 1566455, ~: 1570871)
Logs:
  Bound result 22356
  Bound result 18418
  Bound result 1500000000000000000
  Bound result 16950
  Bound result 783019655932542976
  Bound result 626

[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, μ: 2448671, ~: 2419483)
Logs:
  Bound result 1172
  Bound result 600
  Bound result 10400
  Bound result 441
  Bound result 111
  Bound result 2000000000000000000000
  Bound result 505134529

[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, μ: 7730730, ~: 7698586)
Logs:
  Bound result 2327
  Bound result 90000000000000000000
  Bound result 7860
  Bound result 4710
  Bound result 2600000000
  Bound result 208
  Bound result 15238
  Bound result 176
  Bound result 1075
  Bound result 20000
  Bound result 26294474059186177
  Bound result 16949
  Bound result 7500
  Bound result 100000000000000000000000000000000000000000
  Bound result 19429
  Bound result 4019
  Bound result 99
  Bound result 90498858828761399680434953562
  Bound result 47257590356822065
  Bound result 101
  Bound result 1000000
  Bound result 26959946660873538060741835960174461801791452538186943042387869433855
  Bound result 20296
  Bound result 58295842187128421368902784785846135528097650416799773691871981469083027636225
  Bound result 22835

[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, μ: 5402718, ~: 5358272)
Logs:
  Bound result 955
  Bound result 16483
  Bound result 125000000000000000
  Bound result 3871
  Bound result 1000001000000000000000000000000
  Bound result 900000000000000000
  Bound result 750000000000000000000
  Bound result 19134
  Bound result 9500000000000000000000
  Bound result 10
  Bound result 2924
  Bound result 16387
  Bound result 56988696150268759067033853745049141362335364605175666696514897554729450063378
  Bound result 10627200
  Bound result 11288
  Bound result 45000000000000000000
  Bound result 1

[PASS] test_repay_partial_then_max() (gas: 993402)
[PASS] test_repay_round_trip_borrow_repay(uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 880588, ~: 884320)
Logs:
  Bound result 4
  Bound result 102314711
  Bound result 170430
  Bound result 4454419372094181496958201405

[PASS] test_repay_round_trip_repay_borrow(uint256,uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 966179, ~: 975544)
Logs:
  Bound result 0
  Bound result 8767
  Bound result 20701
  Bound result 104292884335243981197522250303
  Bound result 10416

[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, μ: 1749954, ~: 1777967)
Logs:
  Bound result 5401549876140600956580819487
  Bound result 65251468040295843421393
  Bound result 11263328023241632836759
  Bound result 7707153379656042561281651440489383780992440
  Bound result 681445185

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

Ran 2 tests for tests/contracts/spoke/repay/Spoke.Repay.Validation.t.sol:SpokeRepayValidationTest
[PASS] test_repay_revertsWith_ReserveNotListed() (gas: 23251)
[PASS] test_repay_revertsWith_ReservePaused() (gas: 63929)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 24.64ms (372.34µs CPU time)

Ran 26 tests for tests/contracts/position-manager/TakerPositionManager/TakerPositionManager.t.sol:TakerPositionManagerTest
[PASS] test_approveBorrow_fuzz(address,uint256,uint256) (runs: 5000, μ: 63796, ~: 63570)
Logs:
  Bound result 4
  Bound result 144506855745494289

[PASS] test_approveBorrow_revertsWith_SpokeNotRegistered() (gas: 17537)
[PASS] test_approveWithdraw_fuzz(address,uint256,uint256) (runs: 5000, μ: 63752, ~: 63526)
Logs:
  Bound result 4
  Bound result 144506855745494289

[PASS] test_approveWithdraw_revertsWith_SpokeNotRegistered() (gas: 17514)
[PASS] test_borrowOnBehalfOf() (gas: 649822)
Logs:
  Bound result 5000000000000000000
  Bound result 5000000000000000000

[PASS] test_borrowOnBehalfOf_fuzz(uint256,uint256) (runs: 5000, μ: 670297, ~: 670428)
Logs:
  Bound result 68691281934999
  Bound result 618221537415092

[PASS] test_borrowOnBehalfOf_fuzz_noAllowanceDecrease(uint256) (runs: 5000, μ: 647825, ~: 647572)
Logs:
  Bound result 3124043968137

[PASS] test_borrowOnBehalfOf_fuzz_withInterest(uint256,uint256,uint256) (runs: 5000, μ: 807301, ~: 807294)
Logs:
  Bound result 499999999999999999999999999997
  Bound result 249999999999999999999999999997
  Bound result 3720931007421144222457544

[PASS] test_borrowOnBehalfOf_revertsWith_InsufficientBorrowAllowance(uint256) (runs: 5000, μ: 312895, ~: 313097)
Logs:
  Bound result 3124043968137

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

Forge Build Sizes

🔕 Unchanged
Contract Runtime Size (B) Initcode Size (B) Runtime Margin (B) Initcode Margin (B)
AaveOracle 2,396 2,529 22,180 46,623
AccessManager 12,985 14,210 11,591 34,942
AccessManagerEnumerable 21,008 22,847 3,568 26,305
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,626 2,811 21,950 46,341
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
ConfigPermissionsMap 44 94 24,532 49,058
ConfigPermissionsMapWrapper 1,001 1,029 23,575 48,123
ConfigPositionManager 13,555 14,109 11,021 35,043
Create2Utils 134 184 24,442 48,968
DeployUtils 44 94 24,532 49,058
DeployWrapper 3,478 3,506 21,098 45,646
ECDSA 44 94 24,532 49,058
ECDSA.spoke 16 44 24,560 49,108
EIP712Hash (src/position-manager/libraries/EIP712Hash.sol) 771 823 23,805 48,329
EIP712Hash (src/spoke/libraries/EIP712Hash.sol) 441 493 24,135 48,659
EIP712Hash.spoke 491 521 24,085 48,631
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
GiverPositionManager 6,924 7,199 17,652 41,953
Hashes 44 94 24,532 49,058
HubActions 44 94 24,532 49,058
HubConfigurator 13,833 14,067 10,743 35,085
HubInstance 24,353 24,560 223 24,592
KeyValueList 44 94 24,532 49,058
KeyValueList.spoke 16 44 24,560 49,108
KeyValueListWrapper 957 985 23,619 48,167
LibBit 44 94 24,532 49,058
LibBit.spoke 16 44 24,560 49,108
LiquidationLogic 12,519 12,571 12,057 36,581
LiquidationLogic.spoke 9,835 9,867 14,741 39,285
LiquidationLogicWrapper 18,611 18,785 5,965 30,367
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 538 1,187 24,038 47,965
MockReentrantCaller 882 1,083 23,694 48,069
MockSkimSpoke 1,116 1,275 23,460 47,877
NativeTokenGateway 8,787 9,204 15,789 39,948
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
PositionManagerBaseWrapper 5,100 5,375 19,476 43,777
PositionManagerNoMulticall 5,036 5,311 19,540 43,841
PositionStatusMap 44 94 24,532 49,058
PositionStatusMap.spoke 16 44 24,560 49,108
PositionStatusMapWrapper 3,341 3,369 21,235 45,783
Premium 44 94 24,532 49,058
Premium.hub 16 44 24,560 49,108
Premium.spoke 16 44 24,560 49,108
ProxyAdmin 1,320 1,556 23,256 47,596
RescuableWrapper 973 1,107 23,603 48,045
ReserveFlagsMap 44 94 24,532 49,058
ReserveFlagsMap.spoke 16 44 24,560 49,108
ReserveFlagsMapWrapper 928 956 23,648 48,196
Roles 218 269 24,358 48,883
SafeCast 44 94 24,532 49,058
SafeCast.hub 16 44 24,560 49,108
SafeCast.spoke 16 44 24,560 49,108
SafeERC20 44 94 24,532 49,058
SafeERC20.hub 16 44 24,560 49,108
SafeERC20.spoke 16 44 24,560 49,108
SharesMath 44 94 24,532 49,058
SharesMath.hub 16 44 24,560 49,108
SignatureChecker 44 94 24,532 49,058
SignatureChecker.spoke 16 44 24,560 49,108
SignatureGateway 12,208 12,749 12,368 36,403
SlotDerivation 44 94 24,532 49,058
SlotDerivation.hub 16 44 24,560 49,108
SlotDerivation.spoke 16 44 24,560 49,108
SpokeActions 44 94 24,532 49,058
SpokeConfigurator 11,825 12,059 12,751 37,093
SpokeInstance 24,291 25,098 285 24,054
SpokeUtils 96 146 24,480 49,006
SpokeUtils.spoke 71 99 24,505 49,053
SpokeUtilsWrapper 1,827 1,855 22,749 47,297
StorageSlot 44 94 24,532 49,058
StorageSlot.hub 16 44 24,560 49,108
StorageSlot.spoke 16 44 24,560 49,108
TakerPositionManager 12,153 12,707 12,423 36,445
TestnetERC20 3,649 4,525 20,927 44,627
Time 44 94 24,532 49,058
TokenizationSpokeInstance 13,627 14,953 10,949 34,199
TransientSlot 44 94 24,532 49,058
TransientSlot.spoke 16 44 24,560 49,108
TransparentUpgradeableProxy 1,419 4,078 23,157 45,074
TreasurySpokeInstance 4,004 4,218 20,572 44,934
UserPositionUtils 44 94 24,532 49,058
UserPositionUtils.spoke 16 44 24,560 49,108
UserPositionUtilsWrapper 3,263 3,291 21,313 45,861
WETH9 2,148 2,614 22,428 46,538
WadRayMath 44 94 24,532 49,058
WadRayMath.hub 16 44 24,560 49,108
WadRayMath.spoke 16 44 24,560 49,108
WadRayMathWrapper 1,514 1,542 23,062 47,610

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

♻️ Forge Gas Snapshots

🔕 Unchanged
Path Value
snapshots/ConfigPositionManager.Operations.json
renounceCanUpdateUserDynamicConfigPermission 28,037
renounceCanUpdateUserRiskPremiumPermission 27,971
renounceCanUpdateUsingAsCollateralPermission 27,994
renounceGlobalPermission 27,952
setCanSetUsingAsCollateralPermission 50,136
setCanUpdateUserDynamicConfigPermission 50,158
setCanUpdateUserRiskPremiumPermission 50,158
setGlobalPermission 50,110
setUsingAsCollateralOnBehalfOf 77,828
updateUserDynamicConfigOnBehalfOf 52,342
updateUserRiskPremiumOnBehalfOf 140,135
snapshots/GiverPositionManager.Operations.json
repayOnBehalfOf 176,497
supplyOnBehalfOf 143,072
snapshots/Hub.Operations.json
add 91,610
add: with transfer 112,916
draw 109,072
eliminateDeficit: full 77,541
eliminateDeficit: partial 87,146
mintFeeShares 87,668
payFee 75,720
refreshPremium 75,289
remove: full 80,564
remove: partial 85,702
reportDeficit 116,908
restore: full 81,488
restore: full - with transfer 188,884
restore: partial 90,198
restore: partial - with transfer 148,178
transferShares 74,540
snapshots/NativeTokenGateway.Operations.json
borrowNative 238,707
repayNative 172,321
supplyAsCollateralNative 165,113
supplyNative 139,728
withdrawNative: full 129,898
withdrawNative: partial 142,172
snapshots/PositionManagerBase.Operations.json
setSelfAsUserPositionManagerWithSig 75,029
snapshots/SignatureGateway.Operations.json
borrowWithSig 222,132
repayWithSig 192,513
setSelfAsUserPositionManagerWithSig 75,126
setUsingAsCollateralWithSig 85,380
supplyWithSig 155,914
updateUserDynamicConfigWithSig 63,113
updateUserRiskPremiumWithSig 61,995
withdrawWithSig 135,124
snapshots/Spoke.Getters.json
getUserAccountData: supplies: 0, borrows: 0 13,014
getUserAccountData: supplies: 1, borrows: 0 56,072
getUserAccountData: supplies: 2, borrows: 0 89,894
getUserAccountData: supplies: 2, borrows: 1 112,389
getUserAccountData: supplies: 2, borrows: 2 133,792
snapshots/Spoke.Operations.ZeroRiskPremium.json
borrow: first 199,509
borrow: second action, same reserve 179,375
liquidationCall (receiveShares): full 314,227
liquidationCall (receiveShares): partial 313,645
liquidationCall (reportDeficit): full 380,307
liquidationCall: full 332,763
liquidationCall: partial 332,181
permitReserve + repay (multicall) 169,938
permitReserve + supply (multicall) 151,663
permitReserve + supply + enable collateral (multicall) 166,114
repay: full 129,276
repay: partial 134,234
setUserPositionManagersWithSig: disable 46,772
setUserPositionManagersWithSig: enable 68,684
supply + enable collateral (multicall) 146,316
supply: 0 borrows, collateral disabled 127,753
supply: 0 borrows, collateral enabled 110,724
supply: second action, same reserve 110,653
updateUserDynamicConfig: 1 collateral 76,251
updateUserDynamicConfig: 2 collaterals 92,825
updateUserRiskPremium: 1 borrow 104,446
updateUserRiskPremium: 2 borrows 114,563
usingAsCollateral: 0 borrows, enable 59,616
usingAsCollateral: 1 borrow, disable 114,490
usingAsCollateral: 1 borrow, enable 42,504
usingAsCollateral: 2 borrows, disable 138,182
usingAsCollateral: 2 borrows, enable 42,516
withdraw: 0 borrows, full 135,058
withdraw: 0 borrows, partial 140,394
withdraw: 1 borrow, partial 169,591
withdraw: 2 borrows, partial 186,292
withdraw: non collateral 111,299
snapshots/Spoke.Operations.json
borrow: first 269,297
borrow: second action, same reserve 212,163
liquidationCall (receiveShares): full 347,124
liquidationCall (receiveShares): partial 346,542
liquidationCall (reportDeficit): full 372,507
liquidationCall: full 365,660
liquidationCall: partial 365,078
permitReserve + repay (multicall) 166,334
permitReserve + supply (multicall) 151,663
permitReserve + supply + enable collateral (multicall) 166,114
repay: full 123,355
repay: partial 142,713
setUserPositionManagersWithSig: disable 46,772
setUserPositionManagersWithSig: enable 68,684
supply + enable collateral (multicall) 146,316
supply: 0 borrows, collateral disabled 127,753
supply: 0 borrows, collateral enabled 110,724
supply: second action, same reserve 110,653
updateUserDynamicConfig: 1 collateral 76,251
updateUserDynamicConfig: 2 collaterals 92,825
updateUserRiskPremium: 1 borrow 158,658
updateUserRiskPremium: 2 borrows 210,210
usingAsCollateral: 0 borrows, enable 59,616
usingAsCollateral: 1 borrow, disable 168,699
usingAsCollateral: 1 borrow, enable 42,504
usingAsCollateral: 2 borrows, disable 241,825
usingAsCollateral: 2 borrows, enable 42,516
withdraw: 0 borrows, full 135,058
withdraw: 0 borrows, partial 140,394
withdraw: 1 borrow, partial 221,298
withdraw: 2 borrows, partial 270,470
withdraw: non collateral 111,299
snapshots/TakerPositionManager.Operations.json
approveBorrow 49,807
approveBorrowWithSig 65,689
approveWithdraw 49,816
approveWithdrawWithSig 65,643
borrowOnBehalfOf 332,512
renounceBorrowAllowance 27,929
renounceWithdrawAllowance 27,983
withdrawOnBehalfOf: full 127,209
withdrawOnBehalfOf: partial 138,811
snapshots/TokenizationSpoke.Operations.json
deposit 118,614
depositWithSig 129,518
mint 118,251
mintWithSig 129,118
permit 62,766
redeem: on behalf, full 95,212
redeem: on behalf, partial 119,015
redeem: self, full 94,282
redeem: self, partial 113,482
redeemWithSig 128,864
withdraw: on behalf, full 95,646
withdraw: on behalf, partial 119,557
withdraw: self, full 94,824
withdraw: self, partial 114,024
withdrawWithSig 129,417

@yan-man yan-man marked this pull request as ready for review March 30, 2026 17:15
# certora/conf/libs/LiquidationLogic.conf --rule collateralToLiquidateValueLessThanDebtToLiquidate
# certora/conf/HubValidState.conf --rule totalAssetsVsShares_eliminateDeficit
# certora/conf/LiquidationReportDeficit.conf
# certora/conf/Liquidation.conf
Copy link
Copy Markdown
Contributor Author

@yan-man yan-man Mar 30, 2026

Choose a reason for hiding this comment

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

note: Liquidation spec is flaky and commented out here (but succeeds on local run)

certora-run[bot]

This comment was marked as resolved.

2. Hub added assets amount >= sum of all Spokes' added assets amount (converted from shares)
3. Hub added shares == sum of Spoke added shares
4. Supply share price and drawn index cannot decrease (remains constant or increases)
5. Hub's actual token balance is always >= internally tracked available liquidity
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@miguelmtzinf added this invariant here, from some of the Certora specs

@yan-man yan-man mentioned this pull request Mar 31, 2026
Copy link
Copy Markdown

@certora-run certora-run bot left a comment

Choose a reason for hiding this comment

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

Verified Rules

  • Group ID: ce42bc38-a297-4349-9056-e5b7a28e550d
  • Commit: adba16f
Job Result VERIFIED Link
Successful Jobs
Job Result VERIFIED Link
SpokeWithHub.conf --rule userSuppliedShareConsistency 2 Link
SpokeWithHub.conf --rule userPremiumShareConsistency 2 Link
SpokeWithHub.conf --rule userPremiumOffsetConsistency 2 Link
SpokeWithHub.conf --rule userDrawnShareConsistency 2 Link
SpokeWithHub.conf --exclude_rule userDrawnShareConsistency userPremiumShareConsistency userPremiumOffsetConsistency userSuppliedShareConsistency 3 Link
SpokeUserIntegrity.conf 1 Link
SpokeIntegrity.conf 10 Link
SpokeHealthFactor.conf --exclude_rule userHealthAboveThreshold userHealthBelowThresholdCanOnlyIncreaseHealthFactor 1 Link
SpokeHealthCheck.conf 2 Link
Spoke.conf --rule realizedPremiumRayConsistency 2 Link
Spoke.conf --rule increaseCollateralOrReduceDebtFunctions 2 Link
Spoke.conf --rule drawnSharesZero 2 Link
Spoke.conf --rule collateralFactorNotZero 2 Link
Spoke.conf --exclude_rule drawnSharesZero noCollateralNoDebt increaseCollateralOrReduceDebtFunctions collateralFactorNotZero realizedPremiumRayConsistency 13 Link
LiquidationUserIntegrity.conf 1 Link
LiquidationIntegrity.conf 2 Link
libs/VerifySymbolicPositionStatus.conf 8 Link
libs/SpokeUtils_toValue.conf 2 Link
libs/SharesMath.conf 10 Link
libs/Premium.conf 2 Link
libs/PositionStatus.conf 9 Link
libs/Math.conf 19 Link
libs/LiquidationLogic_debtToLiquidate.conf 4 Link
libs/LiquidationLogic.conf --exclude_rule collateralToLiquidateValueLessThanDebtToLiquidate collateralToLiquidateValueLessThanDebtToLiquidate_general 5 Link
libs/LiquidationLogic_Bonus.conf 8 Link
libs/LibBit.conf 6 Link
HubValidState.conf --exclude_rule totalAssetsVsShares_eliminateDeficit totalAssetsVsShares 12 Link
HubIntegrity.conf 17 Link
Hub.conf --rule noChangeToOtherSpoke 1 Link
Hub.conf --exclude_rule noChangeToOtherSpoke supplyExchangeRateIsMonotonic supplyExchangeRateIsMonotonic_eliminateDeficit_simplified totalAssetsCompareToSuppliedAmount_noVirtual 3 Link
HubAccrueUnrealizedFee.conf 3 Link
HubAccrueSupplyRate.conf --exclude_rule previewRemoveByShares_withoutAccrue_time_monotonic previewRemoveByAssets_withoutAccrue_time_monotonic 10 Link
HubAccrueIntegrity.conf 9 Link

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.

3 participants