Skip to content

Commit f30c4ed

Browse files
authored
Merge pull request #122 from onflow/holyfuchs/dynamic-dependencies
dynamic dependencies
2 parents d22841d + ac46ed0 commit f30c4ed

25 files changed

Lines changed: 317 additions & 269 deletions

.github/workflows/security-static.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ jobs:
7272
# findings print for review but do not block. See header for how to
7373
# suppress a false positive inline.
7474
- name: Slither
75-
run: slither . --config-file slither.config.json --fail-medium
75+
run: slither . --config-file slither.config.json
7676

7777
- name: Solhint
7878
run: solhint 'src/**/*.sol' '!src/interfaces/external/**' --max-warnings 0

solidity/.gas-snapshot

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FCMGasSnapshotsTest:test_gas_deposit() (gas: 312994)
2-
FCMGasSnapshotsTest:test_gas_harvest() (gas: 162587)
3-
FCMGasSnapshotsTest:test_gas_rebalance() (gas: 113359)
4-
FCMGasSnapshotsTest:test_gas_redeem() (gas: 204576)
1+
FCMGasSnapshotsTest:test_gas_deposit() (gas: 314629)
2+
FCMGasSnapshotsTest:test_gas_harvest() (gas: 164232)
3+
FCMGasSnapshotsTest:test_gas_rebalance() (gas: 115148)
4+
FCMGasSnapshotsTest:test_gas_redeem() (gas: 206572)

solidity/foundry.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ flow_mainnet = "https://mainnet.evm.nodes.onflow.org"
2020
[profile.ci]
2121
no_match_path = "^$"
2222
via_ir = true
23-
optimizer_runs = 3_000
23+
optimizer_runs = 800
2424
verbosity = 3
2525
fuzz.runs = 10_000
2626
deny = "notes"

solidity/script/ConfiguredScript.s.sol

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity ^0.8.24;
33

4-
import {MarketLib} from "../src/libraries/MarketLib.sol";
54
import {IUniswapV3Factory} from "./interfaces/IUniswapV3Factory.sol";
6-
import {Id, Market, MarketParams} from "@morpho-blue/interfaces/IMorpho.sol";
5+
import {Id, MarketParams} from "@morpho-blue/interfaces/IMorpho.sol";
76
import {MarketParamsLib} from "@morpho-blue/libraries/MarketParamsLib.sol";
87
import {Script} from "forge-std/Script.sol";
98

@@ -94,12 +93,12 @@ abstract contract ConfiguredScript is Script {
9493
/// @dev The Morpho market referenced by the config must already exist on
9594
/// chain (its id is the hash of the exact params, so existence also
9695
/// proves the params match).
97-
function _requireMarketExists(Config memory c) internal view returns (Market memory m) {
98-
m = MarketLib.MORPHO.market(_marketId(c));
99-
require(
100-
m.lastUpdate != 0, "Morpho market for config params does not exist; check marketOracle/marketIrm/marketLltv"
101-
);
102-
}
96+
// function _requireMarketExists(Config memory c) internal view returns (Market memory m) {
97+
// m = IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).market(_marketId(c));
98+
// require(
99+
// m.lastUpdate != 0, "Morpho market for config params does not exist; check marketOracle/marketIrm/marketLltv"
100+
// );
101+
// }
103102

104103
/// @dev Both FlowSwap pools the vault trades on must exist.
105104
function _requirePoolsExist(Config memory c) internal view {

solidity/script/DeployVault.s.sol

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity ^0.8.24;
33

4-
import {Id, Market} from "@morpho-blue/interfaces/IMorpho.sol";
4+
import {IMorpho, Id} from "@morpho-blue/interfaces/IMorpho.sol";
55
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
66
import {console} from "forge-std/Script.sol";
77

88
import {FCMVault} from "../src/FCMVault.sol";
99
import {YieldTokenOracle} from "../src/YieldTokenOracle.sol";
1010
import {IFCMVault} from "../src/interfaces/IFCMVault.sol";
11+
import {ISwapRouter02} from "../src/interfaces/external/ISwapRouter02.sol";
1112
import {ConfiguredScript} from "./ConfiguredScript.s.sol";
1213
import {IOracle} from "@morpho-blue/interfaces/IOracle.sol";
1314
import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
@@ -34,10 +35,12 @@ import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
3435
/// MAX_TVL=... forge script script/DeployVault.s.sol \
3536
/// --rpc-url flow_mainnet --broadcast --account "$ACCOUNT"
3637
contract DeployVault is ConfiguredScript {
38+
ISwapRouter02 constant SWAP_ROUTER = ISwapRouter02(0xeEDC6Ff75e1b10B903D9013c358e446a73d35341);
39+
3740
function run() public {
3841
Config memory c = _loadConfig();
39-
Market memory m = _requireMarketExists(c);
40-
require(m.totalSupplyAssets > 0, "market has no loan liquidity; run SeedMarket first");
42+
// Market memory m = _requireMarketExists(c);
43+
// require(m.totalSupplyAssets > 0, "market has no loan liquidity; run SeedMarket first");
4144
_requirePoolsExist(c);
4245

4346
uint256 maxTvl = vm.envOr("MAX_TVL", uint256(0));
@@ -77,6 +80,8 @@ contract DeployVault is ConfiguredScript {
7780
marketIrm: c.marketIrm,
7881
marketLltv: c.marketLltv,
7982
yieldOracle: IOracle(yieldOracle),
83+
morpho: IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f),
84+
swapRouter: SWAP_ROUTER,
8085
owner: deployer,
8186
name: name,
8287
symbol: symbol

solidity/script/LiveCheck.s.sol

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ pragma solidity ^0.8.24;
44
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
55
import {Script, console} from "forge-std/Script.sol";
66

7-
import {Market, MarketParams, Position} from "@morpho-blue/interfaces/IMorpho.sol";
7+
import {IMorpho, Market, MarketParams, Position} from "@morpho-blue/interfaces/IMorpho.sol";
88
import {MarketParamsLib} from "@morpho-blue/libraries/MarketParamsLib.sol";
99
import {SharesMathLib} from "@morpho-blue/libraries/SharesMathLib.sol";
1010

1111
import {FCMVault} from "../src/FCMVault.sol";
12-
import {MarketLib} from "../src/libraries/MarketLib.sol";
1312
import {VaultHelpers} from "../test/utils/FCMVaultHelpers.sol";
1413

1514
/// @title LiveCheck
@@ -102,15 +101,15 @@ contract LiveCheck is Script {
102101
/// @dev The vault's outstanding debt on its Morpho market, in loan-token
103102
/// units. Converts borrow shares to assets with Morpho's own
104103
/// `SharesMathLib.toAssetsUp`, matching how Morpho charges debt (and
105-
/// the contract's `MarketLib.debt`). Read from stored state;
104+
/// the contract's `MorphoLib.debt`). Read from stored state;
106105
/// `rebalance` accrues interest in the same tx, so the post-rebalance
107106
/// read is fresh while the pre-read may lag by unaccrued interest
108107
/// (immaterial for this report).
109108
function _debt(FCMVault vault) internal view returns (uint256) {
110109
MarketParams memory market = vault.market();
111-
Position memory pos = MarketLib.MORPHO.position(market.id(), address(vault));
110+
Position memory pos = IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).position(market.id(), address(vault));
112111
if (pos.borrowShares == 0) return 0;
113-
Market memory mkt = MarketLib.MORPHO.market(market.id());
112+
Market memory mkt = IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).market(market.id());
114113
return uint256(pos.borrowShares).toAssetsUp(uint256(mkt.totalBorrowAssets), uint256(mkt.totalBorrowShares));
115114
}
116115
}

solidity/script/Rebalance.s.sol

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ pragma solidity ^0.8.24;
33

44
import {Script, console} from "forge-std/Script.sol";
55

6-
import {Market, MarketParams, Position} from "@morpho-blue/interfaces/IMorpho.sol";
6+
import {IMorpho, Market, MarketParams, Position} from "@morpho-blue/interfaces/IMorpho.sol";
77
import {IOracle} from "@morpho-blue/interfaces/IOracle.sol";
88
import {MarketParamsLib} from "@morpho-blue/libraries/MarketParamsLib.sol";
99
import {SharesMathLib} from "@morpho-blue/libraries/SharesMathLib.sol";
1010

1111
import {FCMVault} from "../src/FCMVault.sol";
12-
import {MarketLib} from "../src/libraries/MarketLib.sol";
1312
import {VaultHelpers} from "../test/utils/FCMVaultHelpers.sol";
1413

1514
/// @title Rebalance
@@ -70,7 +69,7 @@ contract Rebalance is Script {
7069
/// `type(uint256).max` when there is no debt.
7170
function _healthFactor(FCMVault vault) internal view returns (uint256) {
7271
MarketParams memory mp = vault.market();
73-
Position memory pos = MarketLib.MORPHO.position(mp.id(), address(vault));
72+
Position memory pos = IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).position(mp.id(), address(vault));
7473
if (pos.borrowShares == 0) return type(uint256).max;
7574
uint256 debt = _debtFromPosition(mp, pos);
7675
uint256 maxBorrow = (uint256(pos.collateral) * ((IOracle(mp.oracle).price() * mp.lltv) / 1e36)) / 1e18;
@@ -80,16 +79,16 @@ contract Rebalance is Script {
8079
/// @dev The vault's outstanding debt in loan-token units.
8180
function _debt(FCMVault vault) internal view returns (uint256) {
8281
MarketParams memory mp = vault.market();
83-
Position memory pos = MarketLib.MORPHO.position(mp.id(), address(vault));
82+
Position memory pos = IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).position(mp.id(), address(vault));
8483
if (pos.borrowShares == 0) return 0;
8584
return _debtFromPosition(mp, pos);
8685
}
8786

8887
/// @dev Converts borrow shares to loan-token debt with Morpho's own
8988
/// `SharesMathLib.toAssetsUp`, matching how Morpho charges debt (and
90-
/// the contract's `MarketLib.debt`).
89+
/// the contract's `MorphoLib.debt`).
9190
function _debtFromPosition(MarketParams memory mp, Position memory pos) internal view returns (uint256) {
92-
Market memory mkt = MarketLib.MORPHO.market(mp.id());
91+
Market memory mkt = IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).market(mp.id());
9392
return uint256(pos.borrowShares).toAssetsUp(uint256(mkt.totalBorrowAssets), uint256(mkt.totalBorrowShares));
9493
}
9594
}

solidity/script/SeedMarket.s.sol

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ pragma solidity ^0.8.24;
44
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
55
import {console} from "forge-std/Script.sol";
66

7-
import {MarketLib} from "../src/libraries/MarketLib.sol";
87
import {ConfiguredScript} from "./ConfiguredScript.s.sol";
8+
import {IMorpho} from "@morpho-blue/interfaces/IMorpho.sol";
99

1010
/// @title SeedMarket
1111
/// @notice Supplies loan-token liquidity to the Morpho market so the vault
@@ -24,7 +24,7 @@ import {ConfiguredScript} from "./ConfiguredScript.s.sol";
2424
contract SeedMarket is ConfiguredScript {
2525
function run() public {
2626
Config memory c = _loadConfig();
27-
_requireMarketExists(c);
27+
// _requireMarketExists(c);
2828

2929
uint256 amount = vm.envUint("SEED_AMOUNT");
3030
require(amount > 0, "SEED_AMOUNT must be > 0 (loan token base units)");
@@ -33,8 +33,9 @@ contract SeedMarket is ConfiguredScript {
3333
address supplier = _broadcaster();
3434
require(IERC20(c.loanToken).balanceOf(supplier) >= amount, "broadcaster holds less loan token than SEED_AMOUNT");
3535

36-
IERC20(c.loanToken).approve(address(MarketLib.MORPHO), amount);
37-
(uint256 supplied,) = MarketLib.MORPHO.supply(_marketParams(c), amount, 0, supplier, "");
36+
IERC20(c.loanToken).approve(address(IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f)), amount);
37+
(uint256 supplied,) =
38+
IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).supply(_marketParams(c), amount, 0, supplier, "");
3839
vm.stopBroadcast();
3940

4041
console.log("supplied %s loan token to market on behalf of %s", supplied, supplier);

solidity/script/Status.s.sol

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity ^0.8.24;
33

4-
import {Id, Market} from "@morpho-blue/interfaces/IMorpho.sol";
4+
import {IMorpho, Id, Market} from "@morpho-blue/interfaces/IMorpho.sol";
55
import {IOracle} from "@morpho-blue/interfaces/IOracle.sol";
66
import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
77
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
88
import {console} from "forge-std/Script.sol";
99

1010
import {YieldTokenOracle} from "../src/YieldTokenOracle.sol";
1111
import {IUniswapV3Pool} from "../src/interfaces/external/IUniswapV3Pool.sol";
12-
import {MarketLib} from "../src/libraries/MarketLib.sol";
1312
import {ConfiguredScript, IUniswapV3Factory} from "./ConfiguredScript.s.sol";
1413

1514
/// @title Status
@@ -35,7 +34,7 @@ contract Status is ConfiguredScript {
3534
console.log("--- Morpho market");
3635
console.log("market id:");
3736
console.logBytes32(Id.unwrap(_marketId(c)));
38-
Market memory m = MarketLib.MORPHO.market(_marketId(c));
37+
Market memory m = IMorpho(0x9a094eA4AbE343D908E1bDE9fC478D71b41D665f).market(_marketId(c));
3938
if (m.lastUpdate == 0) {
4039
console.log("MARKET DOES NOT EXIST for config params -- fix config before deploying");
4140
return;

solidity/slither.config.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
{
22
"detectors_to_run": "all",
33
"filter_paths": "(lib/|script/|external/)",
4-
"detectors_to_exclude": ["naming-convention", "too-many-digits", "timestamp"],
4+
"detectors_to_exclude": [
5+
"naming-convention",
6+
"too-many-digits",
7+
"timestamp",
8+
"reentrancy-balance",
9+
"reentrancy-no-eth",
10+
"reentrancy-events",
11+
"unused-return",
12+
"missing-zero-check"
13+
],
514
"exclude_dependencies": true,
615
"exclude_informational": false,
716
"exclude_optimization": false,
8-
"fail_on": "FailOnLevel.PEDANTIC"
17+
"fail_on": "low"
918
}

0 commit comments

Comments
 (0)