Skip to content

fix: revert back to minting at the start of each action#1186

Open
DhairyaSethi wants to merge 14 commits intodevfrom
rft/mint-fee-shares-2
Open

fix: revert back to minting at the start of each action#1186
DhairyaSethi wants to merge 14 commits intodevfrom
rft/mint-fee-shares-2

Conversation

@DhairyaSethi
Copy link
Member

@DhairyaSethi DhairyaSethi commented Feb 4, 2026

revert #933

@DhairyaSethi DhairyaSethi changed the title wip: revert back to fee share mech fix: revert back to minting at the start of each action Feb 4, 2026
@DhairyaSethi DhairyaSethi marked this pull request as ready for review February 4, 2026 16:31
@github-actions
Copy link

github-actions bot commented Feb 4, 2026

♻️ Forge Gas Snapshots

Path Value
snapshots/Hub.Operations.json
add ↓1% (-665) 86,038
add: with transfer ↓1% (-677) 107,323
draw ↓3% (-2721) 101,438
eliminateDeficit: full ↓1% (-704) 71,874
eliminateDeficit: partial ↓1% (-704) 81,479
payFee ↑3% (+2467) 73,283
refreshPremium ↓4% (-2516) 67,857
remove: full ↓2% (-1219) 74,388
remove: partial ↓1% (-704) 80,041
reportDeficit ↑9% (+9577) 121,470
restore: full ↑16% (+12377) 88,940
restore: full - with transfer ↑8% (+12721) 181,893
restore: partial ↑15% (+12377) 97,650
restore: partial - with transfer ↑9% (+12365) 155,618
transferShares ↑13% (+9267) 78,897
mintFeeShares 82,752
snapshots/NativeTokenGateway.Operations.json
borrowNative ↓1% (-2758) 225,898
repayNative ↓1% (-2032) 164,439
supplyAsCollateralNative ↓0% (-665) 159,468
supplyNative ↓0% (-532) 135,230
withdrawNative: full ↓1% (-731) 124,826
withdrawNative: partial ↓1% (-914) 135,832
snapshots/SignatureGateway.Operations.json
borrowWithSig ↓0% (-758) 213,131
repayWithSig ↓1% (-2032) 184,711
supplyWithSig ↓0% (-532) 151,462
withdrawWithSig ↓1% (-732) 130,080
snapshots/Spoke.Getters.json
getUserAccountData: supplies: 1, borrows: 0 ↓0% (-210) 49,216
getUserAccountData: supplies: 2, borrows: 0 ↓1% (-420) 80,682
getUserAccountData: supplies: 2, borrows: 1 ↓0% (-333) 101,198
getUserAccountData: supplies: 2, borrows: 2 ↓0% (-246) 120,545
snapshots/Spoke.Operations.ZeroRiskPremium.json
borrow: first ↑6% (+12254) 202,638
borrow: second action, same reserve ↑7% (+12254) 182,504
liquidationCall (receiveShares): full ↑3% (+10596) 313,853
liquidationCall (receiveShares): partial ↑4% (+10596) 313,271
liquidationCall (reportDeficit): full ↑3% (+9686) 377,372
liquidationCall: full ↑3% (+9682) 330,575
liquidationCall: partial ↑3% (+9682) 329,993
permitReserve + repay (multicall) ↓1% (-2119) 162,457
permitReserve + supply (multicall) ↓0% (-665) 146,091
permitReserve + supply + enable collateral (multicall) ↓0% (-665) 160,542
repay: full ↓2% (-2119) 121,795
repay: partial ↓2% (-2119) 126,753
supply + enable collateral (multicall) ↓0% (-665) 140,744
supply: 0 borrows, collateral disabled ↓1% (-665) 122,181
supply: 0 borrows, collateral enabled ↓1% (-665) 105,152
supply: second action, same reserve ↓1% (-665) 105,081
updateUserRiskPremium: 1 borrow ↓0% (-123) 95,611
updateUserRiskPremium: 2 borrows ↑1% (+660) 106,074
usingAsCollateral: 1 borrow, disable ↓0% (-123) 105,655
usingAsCollateral: 2 borrows, disable ↓0% (-36) 127,291
withdraw: 0 borrows, full ↓1% (-1429) 126,526
withdraw: 0 borrows, partial ↓1% (-1124) 131,727
withdraw: 1 borrow, partial ↓1% (-1552) 158,430
withdraw: 2 borrows, partial ↓1% (-950) 173,590
withdraw: non collateral ↓1% (-914) 104,988
snapshots/Spoke.Operations.json
borrow: first ↑5% (+11825) 271,144
borrow: second action, same reserve ↑6% (+11825) 214,010
liquidationCall (receiveShares): full ↑3% (+10167) 345,468
liquidationCall (receiveShares): partial ↑3% (+10167) 344,886
liquidationCall (reportDeficit): full ↑3% (+9686) 369,572
liquidationCall: full ↑3% (+9253) 362,190
liquidationCall: partial ↑3% (+9253) 361,608
permitReserve + repay (multicall) ↓1% (-1695) 160,349
permitReserve + supply (multicall) ↓0% (-665) 146,091
permitReserve + supply + enable collateral (multicall) ↓0% (-665) 160,542
repay: full ↓2% (-2119) 115,874
repay: partial ↓2% (-2119) 135,232
supply + enable collateral (multicall) ↓0% (-665) 140,744
supply: 0 borrows, collateral disabled ↓1% (-665) 122,181
supply: 0 borrows, collateral enabled ↓1% (-665) 105,152
supply: second action, same reserve ↓1% (-665) 105,081
updateUserRiskPremium: 1 borrow ↑6% (+9231) 158,324
updateUserRiskPremium: 2 borrows ↑10% (+19368) 218,723
usingAsCollateral: 1 borrow, disable ↑6% (+9231) 168,365
usingAsCollateral: 2 borrows, disable ↑8% (+18672) 247,936
withdraw: 0 borrows, full ↓1% (-1429) 126,526
withdraw: 0 borrows, partial ↓1% (-1124) 131,727
withdraw: 1 borrow, partial ↑4% (+7802) 218,638
withdraw: 2 borrows, partial ↓2% (-5808) 251,204
withdraw: non collateral ↓1% (-914) 104,988
🔕 Unchanged
Path Value
snapshots/SignatureGateway.Operations.json
setSelfAsUserPositionManagerWithSig 75,385
setUsingAsCollateralWithSig 85,387
updateUserDynamicConfigWithSig 63,120
updateUserRiskPremiumWithSig 62,090
snapshots/Spoke.Getters.json
getUserAccountData: supplies: 0, borrows: 0 13,014
snapshots/Spoke.Operations.ZeroRiskPremium.json
setUserPositionManagersWithSig: disable 47,039
setUserPositionManagersWithSig: enable 68,951
updateUserDynamicConfig: 1 collateral 74,545
updateUserDynamicConfig: 2 collaterals 89,413
usingAsCollateral: 0 borrows, enable 59,616
usingAsCollateral: 1 borrow, enable 42,504
usingAsCollateral: 2 borrows, enable 42,516
snapshots/Spoke.Operations.json
setUserPositionManagersWithSig: disable 47,039
setUserPositionManagersWithSig: enable 68,951
updateUserDynamicConfig: 1 collateral 74,545
updateUserDynamicConfig: 2 collaterals 89,413
usingAsCollateral: 0 borrows, enable 59,616
usingAsCollateral: 1 borrow, enable 42,504
usingAsCollateral: 2 borrows, enable 42,516

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

🌈 Test Results
No files changed, compilation skipped

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

Ran 14 tests for tests/gas/Spoke.Operations.gas.t.sol:SpokeOperations_ZeroRiskPremium_Gas_Tests
[PASS] test_borrow() (gas: 1126608)
[PASS] test_liquidation_full() (gas: 10760914)
[PASS] test_liquidation_partial() (gas: 10760331)
[PASS] test_liquidation_receiveShares_full() (gas: 10744251)
[PASS] test_liquidation_receiveShares_partial() (gas: 10743670)
[PASS] test_liquidation_reportDeficit_full() (gas: 10798145)
[PASS] test_multicall_ops() (gas: 1313299)
[PASS] test_repay() (gas: 769670)
[PASS] test_setUserPositionManagersWithSig() (gas: 311606)
[PASS] test_supply() (gas: 539107)
[PASS] test_updateRiskPremium() (gas: 939304)
[PASS] test_updateUserDynamicConfig() (gas: 592076)
[PASS] test_usingAsCollateral() (gas: 1082401)
[PASS] test_withdraw() (gas: 1574004)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 105.79ms (39.87ms CPU time)

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

Ran 10 tests for tests/unit/Spoke/Spoke.PositionManager.t.sol:SpokePositionManagerTest
[PASS] test_onlyPositionManager_on_borrow() (gas: 537371)
[PASS] test_onlyPositionManager_on_repay() (gas: 562922)
[PASS] test_onlyPositionManager_on_supply() (gas: 290522)
[PASS] test_onlyPositionManager_on_updateUserDynamicConfig() (gas: 1284164)
[PASS] test_onlyPositionManager_on_updateUserRiskPremium() (gas: 1520597)
[PASS] test_onlyPositionManager_on_usingAsCollateral() (gas: 144395)
[PASS] test_onlyPositionManager_on_withdraw() (gas: 318539)
[PASS] test_renouncePositionManagerRole() (gas: 20268)
[PASS] test_renouncePositionManagerRole_noop_from_disabled() (gas: 21904)
[PASS] test_setApprovalForPositionManager(bytes32) (runs: 5000, μ: 18111, ~: 18111)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 572.64ms (542.11ms CPU time)

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

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

Ran 7 tests for tests/unit/Spoke/Spoke.Repay.EdgeCases.t.sol:SpokeRepayEdgeCaseTest
[PASS] test_fuzz_repay_effect_on_ex_rates(uint256,uint256) (runs: 5000, μ: 706457, ~: 706668)
Logs:
  Bound result 27500000000000000000
  Bound result 10559
  Bound result 20859807470807806218

[PASS] test_repay_less_than_share() (gas: 608885)
[PASS] test_repay_only_base_debt_interest() (gas: 775144)
[PASS] test_repay_only_base_debt_no_premium() (gas: 653412)
[PASS] test_repay_supply_ex_rate_decr() (gas: 1459319)
[PASS] test_repay_supply_ex_rate_decr_skip_time() (gas: 1455840)
[PASS] test_repay_zero_shares_nonzero_premium_debt() (gas: 763399)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 16.88s (16.85s CPU time)

Ran 5 tests for tests/unit/Spoke/Spoke.AccrueLiquidityFee.EdgeCases.t.sol:SpokeAccrueLiquidityFeeEdgeCasesTest
[PASS] test_accrueLiquidityFee_fuzz_maxLiquidityFee_with_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 531607, ~: 531665)
Logs:
  Bound result 13485
  Bound result 96000000
  Bound result 2
  Bound result 1653

[PASS] test_accrueLiquidityFee_fuzz_maxLiquidityFee_with_premium_multiple_users(uint256,uint256,uint256,uint256,uint256) (runs: 5000, μ: 785072, ~: 785166)
Logs:
  Bound result 4386
  Bound result 864000000
  Bound result 0
  Bound result 2187330274
  Bound result 1834

[PASS] test_accrueLiquidityFee_maxLiquidityFee_multi_spoke() (gas: 528711499)
[PASS] test_accrueLiquidityFee_maxLiquidityFee_multi_user() (gas: 230957611)
[PASS] test_accrueLiquidityFee_maxLiquidityFee_with_premium() (gas: 531727)
Logs:
  Bound result 5000
  Bound result 34560000
  Bound result 2
  Bound result 500000000000000000000

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ran 8 tests for tests/unit/Spoke/Spoke.Upgradeable.t.sol:SpokeUpgradeableTest
[PASS] test_implementation_constructor_fuzz(uint64) (runs: 5000, μ: 6810642, ~: 6810642)
[PASS] test_proxy_constructor_fuzz(uint64) (runs: 5000, μ: 6833828, ~: 6833820)
Logs:
  Bound result 649

[PASS] test_proxy_constructor_fuzz_revertsWith_InvalidInitialization(uint64) (runs: 5000, μ: 13612162, ~: 13612154)
Logs:
  Bound result 649

[PASS] test_proxy_constructor_revertsWith_InvalidAddress() (gas: 5039468)
[PASS] test_proxy_constructor_revertsWith_InvalidInitialization_ZeroRevision() (gas: 6808027)
[PASS] test_proxy_reinitialization_fuzz(uint64) (runs: 5000, μ: 15184761, ~: 15184744)
Logs:
  Bound result 649

[PASS] test_proxy_reinitialization_revertsWith_CallerNotProxyAdmin() (gas: 11843983)
[PASS] test_proxy_reinitialization_revertsWith_InvalidAddress() (gas: 11844718)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 27.39s (27.37s CPU time)

Ran 6 tests for tests/unit/Spoke/Spoke.UserAccountData.t.sol:SpokeUserAccountDataTest
[PASS] test_userAccountData_scenario1() (gas: 501403)
[PASS] test_userAccountData_scenario2() (gas: 562253)
[PASS] test_userAccountData_scenario3() (gas: 562499)
[PASS] test_userAccountData_scenario4() (gas: 837029)
[PASS] test_userAccountData_scenario5() (gas: 719869)
[PASS] test_userAccountData_scenario6() (gas: 689859)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 30.11ms (4.69ms CPU time)

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

[PASS] test_accrueLiquidityFee_exact() (gas: 820347)
[PASS] test_accrueLiquidityFee_fuzz_BorrowAmountAndSkipTime(uint256,uint40) (runs: 5000, μ: 858041, ~: 879432)
Logs:
  Bound result 68691281934999
  Bound result 0

[PASS] test_accrueLiquidityFee_maxLiquidityFee() (gas: 532685)
[PASS] test_accrueLiquidityFee_setUsingAsCollateral() (gas: 871058)
Suite result: ok. 7 passed; 0 failed; 0 skipped; finished in 16.95s (16.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, μ: 453554, ~: 449260)
[PASS] test_hash_setUsingAsCollateral_fuzz((address,uint256,bool,address,uint256,uint256)) (runs: 5000, μ: 7305, ~: 7305)
[PASS] test_hash_supply_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6849, ~: 6849)
[PASS] test_hash_updateUserDynamicConfig_fuzz((address,address,uint256,uint256)) (runs: 5000, μ: 6450, ~: 6450)
[PASS] test_hash_updateUserRiskPremium_fuzz((address,address,uint256,uint256)) (runs: 5000, μ: 6471, ~: 6471)
[PASS] test_hash_withdraw_fuzz((address,uint256,uint256,address,uint256,uint256)) (runs: 5000, μ: 6805, ~: 6805)
Suite result: ok. 10 passed; 0 failed; 0 skipped; finished in 21.69s (21.69s 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, μ: 1039313, ~: 1039418)
Logs:
  Bound result 68691281934999
  Bound result 100

[PASS] test_borrow_fuzz_rounding_effect_inflated_ex_rate(uint256,uint256,uint256) (runs: 5000, μ: 1420662, ~: 1420749)
Logs:
  Bound result 6000000000
  Bound result 3000000000000000000
  Bound result 832465527

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

[PASS] test_borrow_rounding_effect_multiple_actions() (gas: 1153455)
[PASS] test_borrow_rounding_effect_shares() (gas: 1091176)
Logs:
  Bound result 5000000000000000000
  Bound result 94608000

Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 56.54s (56.51s 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, μ: 954777, ~: 941172)
Logs:
  Bound result 812

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

Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 59.21s (59.21s 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 400.01ms (376.69ms CPU time)

Ran 5 tests for tests/gas/Gateways.Operations.gas.t.sol:NativeTokenGateway_Gas_Tests
[PASS] test_borrowNative() (gas: 911271)
[PASS] test_repayNative() (gas: 981226)
[PASS] test_supplyAndCollateralNative() (gas: 303869)
[PASS] test_supplyNative() (gas: 285614)
[PASS] test_withdrawNative() (gas: 505743)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 47.85ms (4.14ms CPU time)

Ran 8 tests for tests/gas/Gateways.Operations.gas.t.sol:SignatureGateway_Gas_Tests
[PASS] test_borrowWithSig() (gas: 743209)
[PASS] test_repayWithSig() (gas: 974460)
[PASS] test_setSelfAsUserPositionManagerWithSig() (gas: 209574)
[PASS] test_setUsingAsCollateralWithSig() (gas: 288706)
[PASS] test_supplyWithSig() (gas: 459683)
[PASS] test_updateUserDynamicConfigWithSig() (gas: 145257)
[PASS] test_updateUserRiskPremiumWithSig() (gas: 143188)
[PASS] test_withdrawWithSig() (gas: 407809)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 50.95ms (7.64ms CPU time)

Ran 6 tests for tests/unit/Hub/Hub.Access.t.sol:HubAccessTest
[PASS] test_change_authority() (gas: 204058)
[PASS] test_change_role_responsibility() (gas: 108216)
[PASS] test_hub_access_manager_exposure() (gas: 13417)
[PASS] test_hub_admin_access() (gas: 1347551)
[PASS] test_migrate_role_responsibility() (gas: 695216)
[PASS] test_setInterestRateData_access() (gas: 102003)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 27.03ms (3.69ms CPU time)

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

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

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

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

[PASS] test_add_fuzz_revertsWith_InvalidShares_due_to_index(uint256,uint256,uint256) (runs: 5000, μ: 227934, ~: 228133)
Logs:
  Bound result 259687373138152882882532576126
  Bound result 3153599999
  Bound result 2

[PASS] test_add_fuzz_single_asset(uint256,address,uint256) (runs: 5000, μ: 341271, ~: 341291)
Logs:
  Bound result 0
  Bound result 685310246717412709691342439141

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

[PASS] test_add_multi_add_minimal_shares() (gas: 331694)
[PASS] test_add_revertsWith_AmountDowncastOverflow() (gas: 359674)
[PASS] test_add_revertsWith_InsufficientTransferred() (gas: 64492)
[PASS] test_add_revertsWith_InvalidAmount() (gas: 13619)
[PASS] test_add_revertsWith_InvalidShares() (gas: 228035)
[PASS] test_add_revertsWith_SharesDowncastOverflow() (gas: 224061)
[PASS] test_add_revertsWith_SpokeHalted() (gas: 99583)
[PASS] test_add_revertsWith_SpokeNotActive() (gas: 99619)
[PASS] test_add_single_asset() (gas: 329140)
Logs:
  Bound result 2
  Bound result 100000000000000000000

[PASS] test_add_with_increased_index() (gas: 311603)
[PASS] test_add_with_increased_index_with_premium() (gas: 685202)
Suite result: ok. 19 passed; 0 failed; 0 skipped; finished in 43.68s (43.66s CPU time)

Ran 21 tests for tests/unit/Spoke/Spoke.Withdraw.HealthFactor.t.sol:SpokeWithdrawHealthFactorTest
[PASS] test_unsetCollateral_fuzz_revertsWith_HealthFactorBelowThreshold(uint256) (runs: 5000, μ: 758766, ~: 758374)
Logs:
  Bound result 3124043968137

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_interest_increase(uint256,uint256) (runs: 5000, μ: 651442, ~: 651806)
Logs:
  Bound result 2
  Bound result 595590744

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls(uint256,uint256) (runs: 5000, μ: 877309, ~: 877471)
Logs:
  Bound result 12049
  Bound result 3273568480

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_dai(uint256,uint256,uint256) (runs: 5000, μ: 1161378, ~: 1161831)
Logs:
  Bound result 42
  Bound result 5000000000
  Bound result 2458

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_weth(uint256,uint256,uint256) (runs: 5000, μ: 1161919, ~: 1161848)
Logs:
  Bound result 4200000000
  Bound result 5000000000
  Bound result 2458

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest(uint256,uint256) (runs: 5000, μ: 929344, ~: 930070)
Logs:
  Bound result 12049
  Bound result 3273568480

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts(uint256,uint256) (runs: 5000, μ: 999096, ~: 998544)
Logs:
  Bound result 133
  Bound result 200

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_price_drop(uint256,uint256,uint256) (runs: 5000, μ: 1271157, ~: 1270879)
Logs:
  Bound result 19207
  Bound result 2000000000
  Bound result 222

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 1035825, ~: 1035449)
Logs:
  Bound result 19207
  Bound result 2000000000
  Bound result 222

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_price_drop(uint256,uint256) (runs: 5000, μ: 887486, ~: 887690)
Logs:
  Bound result 195048251870
  Bound result 160047259400334145866830271

[PASS] test_withdraw_fuzz_revertsWith_HealthFactorBelowThreshold_singleBorrow(uint256) (runs: 5000, μ: 617669, ~: 617636)
Logs:
  Bound result 233383506133744352954861287961

[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_interest_increase() (gas: 646536)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls() (gas: 872923)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_dai() (gas: 1155681)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls_price_drop_weth() (gas: 1155683)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest() (gas: 925093)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_debts() (gas: 993643)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_debts_price_drop() (gas: 1264323)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest() (gas: 1029186)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_price_drop() (gas: 882306)
[PASS] test_withdraw_revertsWith_HealthFactorBelowThreshold_singleBorrow() (gas: 618468)
Suite result: ok. 21 passed; 0 failed; 0 skipped; finished in 153.62s (153.60s 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, μ: 907707, ~: 907686)
Logs:
  Bound result 100
  Bound result 68691281934999

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls(uint256,uint256) (runs: 5000, μ: 852653, ~: 853104)
Logs:
  Bound result 484210221
  Bound result 283

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 894527, ~: 896490)
Logs:
  Bound result 50000000000000000
  Bound result 7
  Bound result 548233215

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

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest(uint256,uint256,uint256) (runs: 5000, μ: 1146469, ~: 1147609)
Logs:
  Bound result 9126
  Bound result 239011241747776432643867876764
  Bound result 32000000

[PASS] test_borrow_fuzz_revertsWith_HealthFactorBelowThreshold_with_interest(uint256,uint256) (runs: 5000, μ: 677676, ~: 678424)
Logs:
  Bound result 12545083154
  Bound result 262228412

[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold() (gas: 638120)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_collateral_price_drop_weth() (gas: 901936)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls() (gas: 846886)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai() (gas: 1120240)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth() (gas: 1120284)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_with_interest() (gas: 891797)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts() (gas: 1085156)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_multiple_debts_with_interest() (gas: 1139275)
[PASS] test_borrow_revertsWith_HealthFactorBelowThreshold_with_interest() (gas: 673130)
[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_dai(uint256,uint256,uint256) (runs: 5000, μ: 1124385, ~: 1124764)
Logs:
  Bound result 8000
  Bound result 1757
  Bound result 96

[PASS] test_fuzz_borrow_revertsWith_HealthFactorBelowThreshold_multiple_colls_collateral_price_drop_weth(uint256,uint256,uint256) (runs: 5000, μ: 1124857, ~: 1124786)
Logs:
  Bound result 8000
  Bound result 1757
  Bound result 96

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

Ran 5 tests for tests/unit/Spoke/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, μ: 935625, ~: 955578)
Logs:
  Bound result 3
  Bound result 596322004
  Bound result 18108
  Bound result 23658264
  Bound result 714429949
  Bound result 263013256
  Bound result 800

[PASS] test_withdraw_fuzz_partial_full_with_interest(uint256,uint256,uint256,uint40) (runs: 5000, μ: 741722, ~: 753724)
Logs:
  Bound result 1735
  Bound result 613
  Bound result 110
  Bound result 1

[PASS] test_withdraw_round_trip_deposit_withdraw(uint256,uint256,address,uint256) (runs: 5000, μ: 410874, ~: 410850)
Logs:
  Bound result 0
  Bound result 5625
  Bound result 9591

[PASS] test_withdraw_round_trip_withdraw_deposit(uint256,uint256,uint256,address,uint256) (runs: 5000, μ: 431113, ~: 430427)
Logs:
  Bound result 2
  Bound result 40156480554970129807
  Bound result 17274227773553515385346548028
  Bound result 92642689526256742147726145192

[PASS] test_withdraw_underwater_reserve_not_collateral() (gas: 812447)
Suite result: ok. 5 passed; 0 failed; 0 skipped; finished in 56.25s (56.23s CPU time)

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

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_feeReceiver(address,uint8,address) (runs: 5000, μ: 45259, ~: 44961)
Logs:
  Bound result 16

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_irStrategy(address,uint8,address) (runs: 5000, μ: 45302, ~: 45004)
Logs:
  Bound result 16

[PASS] test_addAsset_fuzz_revertsWith_InvalidAddress_underlying(uint8,address,address) (runs: 5000, μ: 36666, ~: 36666)
[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals(address,uint8,address,address) (runs: 5000, μ: 45913, ~: 45955)
Logs:
  Bound result 23

[PASS] test_addAsset_fuzz_revertsWith_InvalidAssetDecimals_tooLow(address,uint8,address,address) (runs: 5000, μ: 46036, ~: 46322)
Logs:
  Bound result 5

[PASS] test_addAsset_fuzz_reverts_InvalidIrData(address,uint8,address,address) (runs: 5000, μ: 77562642283, ~: 34910)
Logs:
  Bound result 4

[PASS] test_addAsset_revertsWith_BlockTimestampDowncastOverflow() (gas: 956623)
[PASS] test_addAsset_revertsWith_DrawnRateDowncastOverflow() (gas: 953756)
[PASS] test_addAsset_reverts_UnderlyingAlreadyListed() (gas: 48905)
[PASS] test_addSpoke_fuzz(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 126566, ~: 126616)
Logs:
  Bound result 2

[PASS] test_addSpoke_fuzz_revertsWith_AssetNotListed(uint256,(uint40,uint40,uint24,bool,bool)) (runs: 5000, μ: 35266, ~: 35255)
Logs:
  Bound result 18482

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

[PASS] test_addSpoke_revertsWith_SpokeAlreadyListed() (gas: 39752)
[PASS] test_getAssetId() (gas: 73028)
[PASS] test_getAssetId_fuzz_revertsWith_AssetNotListed(address) (runs: 5000, μ: 18584, ~: 18584)
[PASS] test_hub_deploy_reverts_on_InvalidConstructorInput() (gas: 829827)
[PASS] test_hub_max_riskPremium() (gas: 8566)
[PASS] test_isUnderlyingListed() (gas: 1178228)
[PASS] test_updateAssetConfig_NewFeeReceiver_noFees() (gas: 701919)
[PASS] test_updateAssetConfig_UseExistingSpokeAndListedAsFeeReceiver_revertsWith_SpokeAlreadyListed() (gas: 62252)
[PASS] test_updateAssetConfig_fuzz(uint256,(address,uint16,address,address)) (runs: 5000, μ: 265880, ~: 266223)
Logs:
  Bound result 2
  Bound result 5526

[PASS] test_updateAssetConfig_fuzz_FromZeroLiquidityFee(uint256,uint16) (runs: 5000, μ: 821659, ~: 821518)
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, μ: 689080, ~: 688939)
Logs:
  Bound result 3
  Bound result 1
  Bound result 3
  Bound result 1

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

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

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

[PASS] test_updateAssetConfig_fuzz_Scenario(uint256) (runs: 5000, μ: 712941, ~: 712994)
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, μ: 61021, ~: 61074)
Logs:
  Bound result 3

[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidLiquidityFee(uint256,(address,uint16,address,address)) (runs: 5000, μ: 40109, ~: 40008)
Logs:
  Bound result 2
  Bound result 5526

[PASS] test_updateAssetConfig_fuzz_revertsWith_InvalidReinvestmentController() (gas: 482818)
[PASS] test_updateAssetConfig_fuzz_revertsWith_calculateInterestRateReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 192285, ~: 192721)
Logs:
  Bound result 2
  Bound result 163

[PASS] test_updateAssetConfig_fuzz_revertsWith_setInterestRateDataReverts(uint256,(address,uint16,address,address)) (runs: 5000, μ: 95844, ~: 96237)
Logs:
  Bound result 2
  Bound result 0

[PASS] test_updateAssetConfig_oldFeeReceiver_flags() (gas: 873446)
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, μ: 59115, ~: 59174)
Logs:
  Bound result 2

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

[PASS] test_updateSpokeConfig_revertsWith_AssetNotListed() (gas: 29640)
Suite result: ok. 37 passed; 0 failed; 0 skipped; finished in 89.16s (89.13s CPU time)

Ran 6 tests for tests/unit/Spoke/Spoke.Withdraw.Validation.t.sol:SpokeWithdrawValidationTest
[PASS] test_withdraw_fuzz_revertsWith_InsufficientLiquidity_with_debt(uint256,uint256,uint256,uint256,uint256) (runs: 5000, μ: 439256, ~: 439654)
Logs:
  Bound result 0
  Bound result 2695802188
  Bound result 812204877
  Bound result 81
  Bound result 704000000

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

[PASS] test_withdraw_revertsWith_InsufficientLiquidity_with_debt() (gas: 436072)
[PASS] test_withdraw_revertsWith_InvalidAmount_zero_supplied() (gas: 51000)
[PASS] test_withdraw_revertsWith_ReserveNotListed() (gas: 22408)
[PASS] test_withdraw_revertsWith_ReservePaused() (gas: 62929)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.73s (5.70s CPU time)

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

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

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

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

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

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

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

[PASS] test_draw_fuzz_revertsWith_InvalidAddress(uint256) (runs: 5000, μ: 16126, ~: 16126)
[PASS] test_draw_revertsWith_DrawCapExceeded_due_to_deficit() (gas: 269073)
[PASS] test_draw_revertsWith_InsufficientLiquidity() (gas: 28459)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_draw() (gas: 167982)
[PASS] test_draw_revertsWith_InsufficientLiquidity_due_to_remove() (gas: 130336)
[PASS] test_draw_revertsWith_InvalidAmount() (gas: 16257)
[PASS] test_draw_revertsWith_SpokeHalted() (gas: 61330)
[PASS] test_draw_revertsWith_SpokeNotActive() (gas: 61269)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 22.94s (22.92s CPU time)

Ran 8 tests for tests/unit/Hub/Hub.EliminateDeficit.t.sol:HubEliminateDeficitTest
[PASS] test_eliminateDeficit(uint256) (runs: 5000, μ: 668283, ~: 668283)
[PASS] test_eliminateDeficit_fuzz_revertsWith_AccessManagedUnauthorized(address) (runs: 5000, μ: 32536, ~: 32536)
[PASS] test_eliminateDeficit_fuzz_revertsWith_ArithmeticUnderflow_CallerSpokeNoFunds(uint256) (runs: 5000, μ: 354628, ~: 354628)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountNoDeficit() (gas: 36013)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_ZeroAmountWithDeficit() (gas: 350991)
[PASS] test_eliminateDeficit_revertsWith_InvalidAmount_on_UnregisteredCoveredSpoke() (gas: 36400)
[PASS] test_eliminateDeficit_revertsWith_SpokeNotActive_on_UnregisteredAsset() (gas: 384254)
[PASS] test_eliminateDeficit_revertsWith_callerSpokeNotActive() (gas: 159268)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 16.08s (16.05s CPU time)

Ran 8 tests for tests/gas/Hub.Operations.gas.t.sol:HubOperations_Gas_Tests
[PASS] test_add() (gas: 268776)
[PASS] test_deficit() (gas: 1346057)
[PASS] test_draw() (gas: 414511)
[PASS] test_payFee_transferShares() (gas: 975861)
[PASS] test_refreshPremium() (gas: 630919)
[PASS] test_remove() (gas: 308097)
[PASS] test_restore() (gas: 897440)
[PASS] test_restore_with_transfer() (gas: 898083)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 49.10ms (6.34ms CPU time)

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

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

[PASS] test_payFee_revertsWith_InvalidShares() (gas: 20344)
[PASS] test_payFee_revertsWith_SpokeNotActive() (gas: 61268)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded() (gas: 137852)
[PASS] test_payFee_revertsWith_underflow_added_shares_exceeded_with_interest() (gas: 648056)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 24.41s (24.38s CPU time)

Ran 14 tests for tests/unit/Spoke/Spoke.Withdraw.t.sol:SpokeWithdrawTest
[PASS] test_fuzz_withdraw_effect_on_ex_rates(uint256,uint256) (runs: 5000, μ: 733388, ~: 736854)
Logs:
  Bound result 100
  Bound result 68691281934999

[PASS] test_withdraw_all_liquidity() (gas: 236912)
[PASS] test_withdraw_all_liquidity_with_interest_no_premium() (gas: 820131)
[PASS] test_withdraw_all_liquidity_with_interest_with_premium() (gas: 827262)
[PASS] test_withdraw_fuzz_all_elapsed_with_interest(uint256,uint256,uint40) (runs: 5000, μ: 682274, ~: 694515)
Logs:
  Bound result 415250750193385653249839645126
  Bound result 193534747585829059132444755694
  Bound result 3

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

[PASS] test_withdraw_fuzz_all_liquidity_with_interest_no_premium((uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 875530, ~: 884322)
Logs:
  Bound result 0
  Bound result 2
  Bound result 1
  Bound result 2
  Bound result 286517826

[PASS] test_withdraw_fuzz_all_liquidity_with_interest_with_premium((uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 885771, ~: 892594)
Logs:
  Bound result 0
  Bound result 2
  Bound result 1
  Bound result 2
  Bound result 286517826

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

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

[PASS] test_withdraw_max_greater_than_supplied() (gas: 219412)
[PASS] test_withdraw_revertsWith_ReentrancyGuardReentrantCall_hubRefreshPremium() (gas: 652347)
[PASS] test_withdraw_revertsWith_ReentrancyGuardReentrantCall_hubRemove() (gas: 401218)
[PASS] test_withdraw_same_block() (gas: 241776)
Suite result: ok. 14 passed; 0 failed; 0 skipped; finished in 72.43s (72.41s 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, μ: 1262564, ~: 1266011)
Logs:
  Bound result 6853
  Bound result 9298
  Bound result 650000000000000000
  Bound result 7095
  Bound result 3208
  Bound result 5001

[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, μ: 2028128, ~: 2000801)
Logs:
  Bound result 15934
  Bound result 37500000000000000000
  Bound result 100000000000
  Bound result 3293
  Bound result 12
  Bound result 1006300000000000000
  Bound result 12356

[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, μ: 6059220, ~: 6059778)
Logs:
  Bound result 3374
  Bound result 10000000000000000000000
  Bound result 308
  Bound result 19823
  Bound result 10000000000000000000000000000000
  Bound result 216
  Bound result 9133
  Bound result 184
  Bound result 15672
  Bound result 259200000
  Bound result 49
  Bound result 7094
  Bound result 1100
  Bound result 1200000000
  Bound result 11292
  Bound result 3630907520
  Bound result 21
  Bound result 78340066645871065499466465281
  Bound result 68714368097779712
  Bound result 3000
  Bound result 31536000
  Bound result 36
  Bound result 5584291536134403582968657168161544113489737823055532299503869510765864528817
  Bound result 19028
  Bound result 8528

[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, μ: 4297131, ~: 4298191)
Logs:
  Bound result 120213601575954653122792521727
  Bound result 18552
  Bound result 125000000000000000
  Bound result 557
  Bound result 25000000000000000000000
  Bound result 10600
  Bound result 9700
  Bound result 3793
  Bound result 13052238805970149254
  Bound result 65535
  Bound result 3636
  Bound result 8548
  Bound result 115792089237315784047431654707177369111314627694935256818954550220379060699134
  Bound result 1600000000000000000000000000
  Bound result 7185
  Bound result 1000000000000
  Bound result 303532247

[PASS] test_repay_partial_then_max() (gas: 700403)
[PASS] test_repay_round_trip_borrow_repay(uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 873794, ~: 879406)
Logs:
  Bound result 3
  Bound result 5000000000
  Bound result 20722
  Bound result 4000

[PASS] test_repay_round_trip_repay_borrow(uint256,uint256,uint256,uint40,address,uint256) (runs: 5000, μ: 955217, ~: 959149)
Logs:
  Bound result 1
  Bound result 18047060368052194589
  Bound result 854880972
  Bound result 314150998774991029
  Bound result 830

[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, μ: 1467076, ~: 1497430)
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 299.49s (299.46s CPU time)

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

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

[PASS] test_reclaim_fullAmount() (gas: 632599)
[PASS] test_reclaim_fuzz(uint256,uint256,uint256) (runs: 5000, μ: 651718, ~: 650945)
Logs:
  Bound result 615514462186775432459
  Bound result 571193127101173104469
  Bound result 564283877115702805413

[PASS] test_reclaim_multipleSweepsAndReclaims() (gas: 740281)
[PASS] test_reclaim_revertsWith_AssetNotListed() (gas: 13049)
[PASS] test_reclaim_revertsWith_InsufficientTransferred() (gas: 454548)
[PASS] test_reclaim_revertsWith_InsufficientTransferred_noSwept() (gas: 99951)
[PASS] test_reclaim_revertsWith_InvalidAmount_zero() (gas: 90149)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController(address) (runs: 5000, μ: 91032, ~: 91032)
[PASS] test_reclaim_revertsWith_OnlyReinvestmentController_init() (gas: 40295)
[PASS] test_reclaim_revertsWith_underflow_exceedsSwept_afterSweep() (gas: 617866)
Suite result: ok. 11 passed; 0 failed; 0 skipped; finished in 14.41s (14.39s CPU time)

Ran 16 tests for tests/unit/SpokeConfigurator.GranularAccessControl.t.sol:SpokeConfiguratorGranularAccessControlTest
[PASS] test_fuzz_unauthorized_cannotCall_liquidationConfigManagerMethods(address) (runs: 5000, μ: 117059, ~: 117059)
[PASS] test_fuzz_unauthorized_cannotCall_positionManagerAdminMethods(address) (runs: 5000, μ: 39761, ~: 39761)
[PASS] test_fuzz_unauthorized_cannotCall_reserveManagerMethods(address) (runs: 5000, μ: 483447, ~: 483447)
[PASS] test_liquidationConfigManager_canCall_updateLiquidationConfig() (gas: 62503)
[PASS] test_liquidationConfigManager_canCall_updateLiquidationTargetHealthFactor() (gas: 62044)
[PASS] test_liquidationConfigManager_cannotCall_anyPositionManagerAdminMethod() (gas: 38976)
[PASS] test_liquidationConfigManager_cannotCall_anyReserveMethod() (gas: 486121)
[PASS] test_positionManagerAdmin_canCall_updatePositionManager() (gas: 75206)
[PASS] test_positionManagerAdmin_cannotCall_anyLiquidationConfigMethod() (gas: 117021)
[PASS] test_positionManagerAdmin_cannotCall_anyReserveMethod() (gas: 485869)
[PASS] test_reserveManager_canCall_freezeAllReserves() (gas: 156806)
[PASS] test_reserveManager_canCall_pauseAllReserves() (gas: 156791)
[PASS] test_reserveManager_canCall_updateFrozen() (gas: 65173)
[PASS] test_reserveManager_canCall_updatePaused() (gas: 65119)
[PASS] test_reserveManager_cannotCall_anyLiquidationConfigMethod() (gas: 116976)
[PASS] test_reserveManager_cannotCall_anyPositionManagerAdminMethod() (gas: 38975)
Suite result: ok. 16 passed; 0 failed; 0 skipped; finished in 6.26s (6.23s CPU time)

Ran 51 tests for tests/unit/SpokeConfigurator.t.sol:SpokeConfiguratorTest
[PASS] test_addCollateralFactor() (gas: 125615)
[PASS] test_addCollateralFactor_revertsWith_AccessManagedUnauthorized() (gas: 29173)
[PASS] test_addDynamicReserveConfig() (gas: 105429)
[PASS] test_addDynamicReserveConfig_revertsWith_AccessManagedUnauthorized() (gas: 29344)
[PASS] test_addLiquidationBonus_revertsWith_AccessManagedUnauthorized() (gas: 29072)
[PASS] test_addLiquidationFee() (gas: 125602)
[PASS] test_addLiquidationFee_revertsWith_AccessManagedUnauthorized() (gas: 29073)
[PASS] test_addMaxLiquidationBonus() (gas: 125652)
[PASS] test_addReserve() (gas: 456675)
[PASS] test_addReserve_revertsWith_AccessManagedUnauthorized() (gas: 30019)
[PASS] test_addReserve_revertsWith_MaximumReservesReached() (gas: 289234)
[PASS] test_freezeAllReserves() (gas: 202540)
[PASS] test_freezeAllReserves_revertsWith_AccessManagedUnauthorized() (gas: 26853)
[PASS] test_freezeReserve() (gas: 72273)
[PASS] test_freezeReserve_revertsWith_AccessManagedUnauthorized() (gas: 28955)
[PASS] test_pauseAllReserves() (gas: 202442)
[PASS] test_pauseAllReserves_revertsWith_AccessManagedUnauthorized() (gas: 26808)
[PASS] test_pauseReserve() (gas: 72245)
[PASS] test_pauseReserve_revertsWith_AccessManagedUnauthorized() (gas: 28976)
[PASS] test_updateBorrowable() (gas: 102767)
[PASS] test_updateBorrowable_revertsWith_AccessManagedUnauthorized() (gas: 29057)
[PASS] test_updateCollateralFactor() (gas: 82719)
[PASS] test_updateCollateralFactor_revertsWith_AccessManagedUnauthorized() (gas: 29198)
[PASS] test_updateCollateralRisk() (gas: 76917)
[PASS] test_updateCollateralRisk_revertsWith_AccessManagedUnauthorized() (gas: 29028)
[PASS] test_updateDynamicReserveConfig() (gas: 201323)
[PASS] test_updateDynamicReserveConfig_revertsWith_AccessManagedUnauthorized() (gas: 29433)
[PASS] test_updateFrozen() (gas: 105534)
[PASS] test_updateFrozen_revertsWith_AccessManagedUnauthorized() (gas: 29056)
[PASS] test_updateHealthFactorForMaxBonus() (gas: 68165)
[PASS] test_updateHealthFactorForMaxBonus_revertsWith_AccessManagedUnauthorized() (gas: 26799)
[PASS] test_updateLiquidationBonusFactor() (gas: 71080)
[PASS] test_updateLiquidationBonusFactor_revertsWith_AccessManagedUnauthorized() (gas: 26844)
[PASS] test_updateLiquidationConfig() (gas: 65757)
[PASS] test_updateLiquidationConfig_revertsWith_AccessManagedUnauthorized() (gas: 27193)
[PASS] test_updateLiquidationFee() (gas: 82779)
[PASS] test_updateLiquidationFee_revertsWith_AccessManagedUnauthorized() (gas: 29173)
[PASS] test_updateLiquidationTargetHealthFactor() (gas: 71043)
[PASS] test_updateLiquidationTargetHealthFactor_revertsWith_AccessManagedUnauthorized() (gas: 26909)
[PASS] test_updateMaxLiquidationBonus() (gas: 82715)
[PASS] test_updateMaxLiquidationBonus_revertsWith_AccessManagedUnauthorized() (gas: 29109)
[PASS] test_updateMaxReserves() (gas: 53672)
[PASS] test_updateMaxReserves_revertsWith_AccessManagedUnauthorized() (gas: 26909)
[PASS] test_updatePaused() (gas: 105536)
[PASS] test_updatePaused_revertsWith_AccessManagedUnauthorized() (gas: 29077)
[PASS] test_updatePositionManager() (gas: 74331)
[PASS] test_updatePositionManager_revertsWith_AccessManagedUnauthorized() (gas: 26996)
[PASS] test_updateReceiveSharesEnabled() (gas: 102864)
[PASS] test_updateReceiveSharesEnabled_revertsWith_AccessManagedUnauthorized() (gas: 29121)
[PASS] test_updateReservePriceSource() (gas: 280163)
[PASS] test_updateReservePriceSource_revertsWith_AccessManagedUnauthorized() (gas: 29052)
Suite result: ok. 51 passed; 0 failed; 0 skipped; finished in 40.36ms (14.85ms CPU time)

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

[PASS] test_get() (gas: 180696)
[PASS] test_get_revertsWith_ReserveNotListed() (gas: 167195)
[PASS] test_toValue() (gas: 8806)
[PASS] test_toValue_revertsWith_ArithmeticOverflow() (gas: 8959)
[PASS] test_toValue_revertsWith_ArithmeticUnderflow() (gas: 8734)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 461.43ms (438.21ms CPU time)

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

[PASS] test_refreshPremium_fuzz_withAccrual(uint256,uint256,uint256,uint256) (runs: 5000, μ: 471394, ~: 480967)
Logs:
  Bound result 926
  Bound result 128
  Bound result 960000000000000000
  Bound result 13550

[PASS] test_refreshPremium_haltedSpokesAllowed() (gas: 118705)
[PASS] test_refreshPremium_maxRiskPremiumThreshold() (gas: 904907)
[PASS] test_refreshPremium_negativeDeltas(uint256) (runs: 5000, μ: 456235, ~: 456789)
Logs:
  Bound result 3124043968137

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

[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_NonZeroRestoredPremiumRay() (gas: 863708)
[PASS] test_refreshPremium_revertsWith_InvalidPremiumChange_RiskPremiumThresholdExceeded_DecreasingPremium() (gas: 882519)
[PASS] test_refreshPremium_revertsWith_SpokeNotActive() (gas: 58799)
[PASS] test_refreshPremium_riskPremiumThreshold() (gas: 930043)
[PASS] test_refreshPremium_spokePremiumUpdateIsContained() (gas: 714903)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 19.89s (19.87s CPU time)

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

[PASS] test_remove_all_with_interest() (gas: 405730)
[PASS] test_remove_fuzz(uint256,uint256) (runs: 5000, μ: 204832, ~: 204773)
Logs:
  Bound result 4
  Bound result 100

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

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

[PASS] test_remove_fuzz_multi_spoke_with_interest(uint256,uint256,uint256,uint256) (runs: 5000, μ: 448998, ~: 455251)
Logs:
  Bound result 45962924587436021823203788457
  Bound result 27029206682129614226788765975
  Bound result 960000000000000000
  Bound result 13837

[PASS] test_remove_revertsWith_InsufficientLiquidity() (gas: 157109)
[PASS] test_remove_revertsWith_InsufficientLiquidity_exceeding_added_amount() (gas: 145873)
[PASS] test_remove_revertsWith_InsufficientLiquidity_zero_added() (gas: 21364)
[PASS] test_remove_revertsWith_InvalidAddress() (gas: 16459)
[PASS] test_remove_revertsWith_InvalidAmount() (gas: 18616)
[PASS] test_remove_revertsWith_SpokeHalted() (gas: 61849)
[PASS] test_remove_revertsWith_SpokeNotActive() (gas: 61758)
[PASS] test_remove_revertsWith_underflow_exceeding_added_amount() (gas: 183016)
[PASS] test_remove_revertsWtih_underflow_one_extra_wei() (gas: 364551)
Suite result: ok. 15 passed; 0 failed; 0 skipped; finished in 29.78s (29.75s 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, μ: 2162330, ~: 2171679)
Logs:
  Bound result 10000000000000000000000000000
  Bound result 2057199179
  Bound result 1947
  Bound result 1728000000
  Bound result 4466

[PASS] test_borrow_fuzz_single_spoke_multi_reserves(uint256,uint256,uint256,uint256) (runs: 5000, μ: 2311361, ~: 2321493)
Logs:
  Bound result 640744107
  Bound result 530
  Bound result 209999999999999997
  Bound result 13499

[PASS] test_borrow_fuzz_single_spoke_multi_reserves_multi_user(uint256,uint256,uint256,uint256) (runs: 5000, μ: 2717979, ~: 2728116)
Logs:
  Bound result 640744107
  Bound result 530
  Bound result 960000000000000000
  Bound result 13499

[PASS] test_borrow_fuzz_skip_borrow(uint256,uint256,uint256) (runs: 5000, μ: 1063154, ~: 1064452)
Logs:
  Bound result 615514462186775432459
  Bound result 218470873395738003579119570309
  Bound result 10765498

[PASS] test_borrow_skip_borrow() (gas: 1063684)
Logs:
  Bound result 10000000000000000000
  Bound result 20000000000000000000
  Bound result 31536000

[PASS] test_userAccountData_does_not_include_zero_cf_collateral() (gas: 1287304)
Suite result: ok. 6 passed; 0 failed; 0 skipped; finished in 158.96s (158.93s CPU time)

Ran 17 tests for tests/unit/Spoke/TreasurySpoke.t.sol:TreasurySpokeTest
[PASS] test_borrow_revertsWith_UnsupportedAction() (gas: 9654)
[PASS] test_deploy_reverts_on_invalid_params() (gas: 4182)
[PASS] test_getters() (gas: 752792)
[PASS] test_initial_state() (gas: 186810)
[PASS] test_liquidationCall_revertsWith_UnsupportedAction() (gas: 10474)
[PASS] test_repay_revertsWith_UnsupportedAction() (gas: 9656)
[PASS] test_supply(uint256) (runs: 5000, μ: 126658, ~: 126446)
Logs:
  Bound result 3124043968137

[PASS] test_supply_revertsWith_Unauthorized(address) (runs: 5000, μ: 16113, ~: 16113)
[PASS] test_transfer_fuzz(address,uint256,uint256) (runs: 5000, μ: 100139, ~: 101179)
Logs:
  Bound result 15388
  Bound result 11000

[PASS] test_transfer_revertsWith_ERC20InsufficientBalance(uint256) (runs: 5000, μ: 604008, ~: 604008)
[PASS] test_transfer_revertsWith_Unauthorized(address) (runs: 5000, μ: 14826, ~: 14826)
[PASS] test_withdraw_fuzz_amount_feesOnly(uint256) (runs: 5000, μ: 755785, ~: 755500)
Logs:
  Bound result 3124043968137

[PASS] test_withdraw_fuzz_amount_interestAndFees(uint256) (runs: 5000, μ: 788973, ~: 788688)
Logs:
  Bound result 3124043968137

[PASS] test_withdraw_fuzz_amount_interestOnly(uint256) (runs: 5000, μ: 810106, ~: 809811)
Logs:
  Bound result 23432

[PASS] test_withdraw_fuzz_maxLiquidityFee(uint256,uint256,uint256) (runs: 5000, μ: 834874, ~: 834090)
Logs:
  Bound result 4
  Bound result 218470873395738003579119570309
  Bound result 173721804

[PASS] test_withdraw_maxLiquidityFee() (gas: 834554)
Logs:
  Bound result 2
  Bound result 1000000000000000000000
  Bound result 29376000

[PASS] test_withdraw_revertsWith_Unauthorized(address) (runs: 5000, μ: 16476, ~: 16476)
Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 51.85s (51.81s CPU time)

Ran 8 tests for tests/unit/UnitPriceFeed.t.sol:UnitPriceFeedTest
[PASS] testDECIMALS() (gas: 8305)
[PASS] test_constructor_revertsWith_Uint8Overflow() (gas: 4674)
[PASS] test_description() (gas: 11865)
[PASS] test_fuzz_latestRoundData(uint80) (runs: 5000, μ: 11105, ~: 11105)
[PASS] test_fuzz_latestRoundData_DifferentDecimals(uint8) (runs: 5000, μ: 14420, ~: 14578)
Logs:
  Bound result 1

[PASS] test_getRoundData() (gas: 12402)
[PASS] test_getRoundData_futureRound() (gas: 12325)
[PASS] test_version() (gas: 8261)
Suite result: ok. 8 passed; 0 failed; 0 skipped; finished in 978.50ms (964.98ms CPU time)

Ran 12 tests for tests/unit/libraries/UserPositionDebt.t.sol:UserPositionUtilsTest
[PASS] test_applyPremiumDelta() (gas: 26101)
[PASS] test_calculatePremiumDelta() (gas: 17592)
[PASS] test_calculatePremiumRay() (gas: 19352)
[PASS] test_calculateRestoreAmount() (gas: 24204)
[PASS] test_fuzz_applyPremiumDelta((int256,int256,uint256)) (runs: 5000, μ: 34090, ~: 34184)
Logs:
  Bound result 215016815803108445248527167096
  Bound result 331073717946348281691194968263

[PASS] test_fuzz_calculatePremiumDelta((uint256,uint256,int256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 48829, ~: 49021)
Logs:
  Bound result 99000000050384421173548891413
  Bound result 267064735
  Bound result 15166708452425474209087810086592205507
  Bound result 310273141488122044938099248275
  Bound result 16212485736382855360724910945
  Bound result 99999
  Bound result 11272700326030427879754413608164415047

[PASS] test_fuzz_calculatePremiumRay(uint256,int256,uint256) (runs: 5000, μ: 33197, ~: 33181)
Logs:
  Bound result 99000000000000000000517440284
  Bound result 2000000000000000000000000000
  Bound result -1

[PASS] test_fuzz_calculateRestoreAmount(uint256,uint256,int256,uint256,uint256) (runs: 5000, μ: 42317, ~: 42270)
Logs:
  Bound result 59609612905231002086766766882
  Bound result 1040000000000000000
  Bound result 15355
  Bound result 12245
  Bound result 1010000000000000000000

[PASS] test_fuzz_getUserDebt_DrawnIndex(uint256,uint256,int256,uint256) (runs: 5000, μ: 39428, ~: 39396)
Logs:
  Bound result 99000000010605966300000000001
  Bound result 9600
  Bound result -40000000000000000000
  Bound result 518877802919256876800202355087

[PASS] test_fuzz_getUserDebt_HubAndAssetId(uint256,uint256,int256,uint256) (runs: 5000, μ: 45388, ~: 45356)
Logs:
  Bound result 99000000010605966300000000001
  Bound result 9600
  Bound result -40000000000000000000
  Bound result 518877802919256876800202355087

[PASS] test_getUserDebt_DrawnIndex() (gas: 23419)
[PASS] test_getUserDebt_HubAndAssetId() (gas: 30124)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 4.58s (4.58s CPU time)

Ran 12 tests for tests/unit/libraries/UserPositionUtils.t.sol:UserPositionUtilsTest
[PASS] test_applyPremiumDelta() (gas: 26101)
[PASS] test_calculatePremiumDelta() (gas: 17592)
[PASS] test_calculatePremiumRay() (gas: 19352)
[PASS] test_calculateRestoreAmount() (gas: 24204)
[PASS] test_fuzz_applyPremiumDelta((int256,int256,uint256)) (runs: 5000, μ: 34090, ~: 34184)
Logs:
  Bound result 215016815803108445248527167096
  Bound result 331073717946348281691194968263

[PASS] test_fuzz_calculatePremiumDelta((uint256,uint256,int256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 48829, ~: 49021)
Logs:
  Bound result 99000000050384421173548891413
  Bound result 267064735
  Bound result 15166708452425474209087810086592205507
  Bound result 310273141488122044938099248275
  Bound result 16212485736382855360724910945
  Bound result 99999
  Bound result 11272700326030427879754413608164415047

[PASS] test_fuzz_calculatePremiumRay(uint256,int256,uint256) (runs: 5000, μ: 33197, ~: 33181)
Logs:
  Bound result 99000000000000000000517440284
  Bound result 2000000000000000000000000000
  Bound result -1

[PASS] test_fuzz_calculateRestoreAmount(uint256,uint256,int256,uint256,uint256) (runs: 5000, μ: 42317, ~: 42270)
Logs:
  Bound result 59609612905231002086766766882
  Bound result 1040000000000000000
  Bound result 15355
  Bound result 12245
  Bound result 1010000000000000000000

[PASS] test_fuzz_getUserDebt_DrawnIndex(uint256,uint256,int256,uint256) (runs: 5000, μ: 39428, ~: 39396)
Logs:
  Bound result 99000000010605966300000000001
  Bound result 9600
  Bound result -40000000000000000000
  Bound result 518877802919256876800202355087

[PASS] test_fuzz_getUserDebt_HubAndAssetId(uint256,uint256,int256,uint256) (runs: 5000, μ: 45388, ~: 45356)
Logs:
  Bound result 99000000010605966300000000001
  Bound result 9600
  Bound result -40000000000000000000
  Bound result 518877802919256876800202355087

[PASS] test_getUserDebt_DrawnIndex() (gas: 23419)
[PASS] test_getUserDebt_HubAndAssetId() (gas: 30124)
Suite result: ok. 12 passed; 0 failed; 0 skipped; finished in 4.32s (4.32s CPU time)

Ran 7 tests for tests/unit/Hub/Hub.ReportDeficit.t.sol:HubReportDeficitTest
[PASS] test_reportDeficit_fuzz_revertsWith_SurplusDrawnDeficitReported(uint256) (runs: 5000, μ: 230986, ~: 232684)
Logs:
  Bound result 3124043968137

[PASS] test_reportDeficit_fuzz_revertsWith_SurplusPremiumRayDeficitReported(uint256) (runs: 5000, μ: 231902, ~: 233600)
Logs:
  Bound result 3124043968137

[PASS] test_reportDeficit_fuzz_with_premium(uint256,uint256,uint256,uint256) (runs: 5000, μ: 678780, ~: 680969)
Logs:
  Bound result 906
  Bound result 17790
  Bound result 307
  Bound result 960000000000000000

[PASS] test_reportDeficit_halted() (gas: 264124)
[PASS] test_reportDeficit_revertsWith_InvalidAmount() (gas: 24881)
[PASS] test_reportDeficit_revertsWith_SpokeNotActive(address) (runs: 5000, μ: 33809, ~: 33809)
[PASS] test_reportDeficit_with_premium() (gas: 679329)
Logs:
  Bound result 10000000000
  Bound result 31536000
  Bound result 5000000000
  Bound result 0

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

Ran 17 tests for tests/unit/WadRayMath.t.sol:WadRayMathDifferentialTests
[PASS] test_bpsToRay_fuzz(uint256) (runs: 5000, μ: 11774, ~: 11826)
[PASS] test_bpsToWad_fuzz(uint256) (runs: 5000, μ: 11770, ~: 11813)
[PASS] test_constants() (gas: 12879)
[PASS] test_fromRayUp_fuzz(uint256) (runs: 5000, μ: 11046, ~: 11072)
[PASS] test_fromWadDown_fuzz(uint256) (runs: 5000, μ: 9378, ~: 9378)
[PASS] test_fuzz_rayDiv(uint256,uint256) (runs: 5000, μ: 12436, ~: 12807)
[PASS] test_fuzz_rayMul(uint256,uint256) (runs: 5000, μ: 11633, ~: 12155)
[PASS] test_fuzz_wadDiv(uint256,uint256) (runs: 5000, μ: 12617, ~: 12918)
[PASS] test_fuzz_wadMul(uint256,uint256) (runs: 5000, μ: 11593, ~: 12134)
[PASS] test_rayDiv() (gas: 39659)
[PASS] test_rayMul() (gas: 28767)
[PASS] test_roundRayUp_fuzz(uint256) (runs: 5000, μ: 12759, ~: 12909)
[PASS] test_roundRayUp_overflow() (gas: 14831)
[PASS] test_toRay_fuzz(uint256) (runs: 5000, μ: 11694, ~: 12264)
[PASS] test_toWad_fuzz(uint256) (runs: 5000, μ: 11843, ~: 12262)
[PASS] test_wadDiv() (gas: 40065)
[PASS] test_wadMul() (gas: 28408)
Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 2.20s (2.20s CPU time)

Ran 17 tests for tests/unit/Spoke/Spoke.Borrow.Validation.t.sol:SpokeBorrowValidationTest
[PASS] test_borrow_fuzz_revertsWith_DrawCapExceeded(uint256,uint40) (runs: 5000, μ: 110770, ~: 110780)
Logs:
  Bound result 4
  Bound result 1

[PASS] test_borrow_fuzz_revertsWith_DrawCapExceeded_due_to_interest(uint256) (runs: 5000, μ: 691009, ~: 691234)
Logs:
  Bound result 683968137

[PASS] test_borrow_fuzz_revertsWith_InsufficientLiquidity(uint256,uint256) (runs: 5000, μ: 294281, ~: 294033)
Logs:
  Bound result 100

[PASS] test_borrow_fuzz_revertsWith_InvalidAmount(uint256) (runs: 5000, μ: 34410, ~: 34466)
Logs:
  Bound result 2

[PASS] test_borrow_fuzz_revertsWith_ReserveFrozen(uint256,uint256) (runs: 5000, μ: 70974, ~: 70746)
Logs:
  Bound result 4
  Bound result 100

[PASS] test_borrow_fuzz_revertsWith_ReserveNotBorrowable(uint256,uint256) (runs: 5000, μ: 71072, ~: 70844)
Logs:
  Bound result 4
  Bound result 100

[PASS] test_borrow_fuzz_revertsWith_ReserveNotListed(uint256,uint256) (runs: 5000, μ: 27420, ~: 27138)
Logs:
  Bound result 670000000000000000

[PASS] test_borrow_fuzz_revertsWith_ReservePaused(uint256,uint256) (runs: 5000, μ: 70890, ~: 70662)
Logs:
  Bound result 4
  Bound result 100

[PASS] test_borrow_revertsWith_InsufficientLiquidity() (gas: 293966)
Logs:
  Bound result 10000000000000000000

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

[PASS] test_borrow_revertsWith_MaximumUserReservesExceeded() (gas: 6862645)
[PASS] test_borrow_revertsWith_ReserveFrozen() (gas: 72284)
Logs:
  Bound result 2
  Bound result 1

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

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

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

[PASS] test_borrow_to_limit_repay_borrow_again() (gas: 7122814)
[PASS] test_borrow_unlimited_whenLimitIsMax() (gas: 2074851)
Suite result: ok. 17 passed; 0 failed; 0 skipped; finished in 14.97s (14.94s CPU time)

Ran 2 tests for tests/unit/libraries/LiquidationLogic/LiquidationLogic.CollateralToLiquidate.t.sol:LiquidationLogicCollateralToLiquidateTest
[PASS] test_calculateCollateralAmountToLiquidate() (gas: 166897)
[PASS] test_calculateCollateralToLiquidate_fuzz((address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)) (runs: 5000, μ: 189838, ~: 178467)
Logs:
  Bound result 0
  Bound result 6
  Bound result 3000000000
  Bound result 99000000000000000002518900893
  Bound result 3
  Bound result 64
  Bound result 8
  Bound result 204060929119175441
  Bound result 12702

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

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

[PASS] test_calculateDebtToLiquidate_fuzz_AmountAdjustedDueToDust((uint256,uint2...*[Comment body truncated]*

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

Forge Build Sizes

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

@DhairyaSethi DhairyaSethi force-pushed the rft/mint-fee-shares-2 branch from 754a4a5 to 63cbeb5 Compare February 7, 2026 08:30
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.

2 participants