Skip to content

Commit

Permalink
fork deploy Swapper for Morpho
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeNervoXS committed Apr 11, 2024
1 parent 1db5568 commit afccf93
Show file tree
Hide file tree
Showing 9 changed files with 294 additions and 9 deletions.
85 changes: 85 additions & 0 deletions broadcast/SwapperLevMorpho.s.sol/1/run-1712585373.json

Large diffs are not rendered by default.

85 changes: 85 additions & 0 deletions broadcast/SwapperLevMorpho.s.sol/1/run-latest.json

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion contracts/swapper/LevSwapper/BaseLevSwapperMorpho.sol
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ abstract contract BaseLevSwapperMorpho is BaseLevSwapper, IMorphoLiquidateCallba
uint256 outTokenBalance = outToken.balanceOf(address(this));
if (outTokenBalance < minAmountOut) revert TooSmallAmountOut();

outToken.safeApprove(address(morpho), repaidOutToken);
if (outTokenBalance > repaidOutToken) {
// The `to` should keep the additional collateral
outToken.safeTransfer(to, outTokenBalance - repaidOutToken);
Expand Down
16 changes: 14 additions & 2 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,27 @@ runs = 500

[rpc_endpoints]
arbitrum = "${ETH_NODE_URI_ARBITRUM}"
gnosis = "${ETH_NODE_URI_GNOSIS}"
mainnet = "${ETH_NODE_URI_MAINNET}"
optimism = "${ETH_NODE_URI_OPTIMISM}"
polygon = "${ETH_NODE_URI_POLYGON}"
goerli = "${ETH_NODE_URI_GOERLI}"
fork = "${ETH_NODE_URI_FORK}"
avalanche = "${ETH_NODE_URI_AVALANCHE}"
celo = "${ETH_NODE_URI_CELO}"
polygonzkevm = "${ETH_NODE_URI_POLYGONZKEVM}"
bsc = "${ETH_NODE_URI_BSC}"
base = "${ETH_NODE_URI_BASE}"
linea = "${ETH_NODE_URI_LINEA}"

[etherscan]
arbitrum = { key = "${ARBITRUM_ETHERSCAN_API_KEY}" }
gnosis = { key = "${GNOSIS_ETHERSCAN_API_KEY}" , url = "https://api.gnosisscan.io/api"}
mainnet = { key = "${MAINNET_ETHERSCAN_API_KEY}" }
optimism = { key = "${OPTIMISM_ETHERSCAN_API_KEY}" }
polygon = { key = "${POLYGON_ETHERSCAN_API_KEY}" }
goerli = { key = "${GOERLI_ETHERSCAN_API_KEY}" }
avalanche = { key = "${AVALANCHE_ETHERSCAN_API_KEY}" }
celo = { key = "${CELO_ETHERSCAN_API_KEY}", url = "https://api.celoscan.io/api" }
base = { key = "${BASE_ETHERSCAN_API_KEY}", url = "https://api.basescan.org/api" }
polygon-zkevm = { key = "${POLYGONZKEVM_ETHERSCAN_API_KEY}", url = "https://api-zkevm.polygonscan.com/api" }
bsc = { key = "${BSC_ETHERSCAN_API_KEY}"}
linea = { key = "${LINEA_ETHERSCAN_API_KEY}"}
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
"coverage": "FOUNDRY_PROFILE=dev forge coverage --report lcov && yarn lcov:clean && yarn lcov:generate-html",
"compile": "forge build",
"compile:dev": "FOUNDRY_PROFILE=dev forge build",
"deploy": "forge script --skip test --broadcast --verify --slow -vvvv --rpc-url polygon ",
"deploy:test": "FOUNDRY_PROFILE=dev forge script --skip test --broadcast --verify --slow -vvvv --rpc-url polygon",
"deploy": "forge script --skip test --broadcast --verify --slow -vvvv --rpc-url",
"deploy:fork": "FOUNDRY_PROFILE=dev forge script --skip test --slow --fork-url fork --broadcast -vvvv",
"gas": "yarn test --gas-report",
"fork": "bash helpers/fork.sh",
Expand Down Expand Up @@ -82,4 +81,4 @@
"solc": "0.8.12",
"yargs": "^17.5.1"
}
}
}
4 changes: 4 additions & 0 deletions remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,7 @@ borrow/=lib/borrow-contracts/contracts
utils/=lib/utils
morpho-blue/=lib/morpho-blue/src
contracts/=contracts/
@chainlink/=node_modules/@chainlink/
@ensdomains/=node_modules/@ensdomains/
@openzeppelin/=node_modules/@openzeppelin/
@uniswap/=node_modules/@uniswap/
62 changes: 62 additions & 0 deletions scripts/foundry/Helpers.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Script.sol";
import "stringutils/strings.sol";
import { CommonUtils } from "utils/src/CommonUtils.sol";
import "utils/src/Constants.sol";

/// @title Utils
/// @author Angle Labs, Inc.
contract Helpers is CommonUtils, Script {
mapping(uint256 => uint256) internal forkIdentifier;
uint256 public arbitrumFork;
uint256 public avalancheFork;
uint256 public ethereumFork;
uint256 public optimismFork;
uint256 public polygonFork;
uint256 public gnosisFork;
uint256 public bnbFork;
uint256 public celoFork;
uint256 public polygonZkEVMFork;
uint256 public baseFork;
uint256 public lineaFork;

address public alice;
address public bob;
address public charlie;
address public dylan;
address public sweeper;

function setUp() public virtual {
arbitrumFork = vm.createFork(vm.envString("ETH_NODE_URI_ARBITRUM"));
avalancheFork = vm.createFork(vm.envString("ETH_NODE_URI_AVALANCHE"));
ethereumFork = vm.createFork(vm.envString("ETH_NODE_URI_MAINNET"));
optimismFork = vm.createFork(vm.envString("ETH_NODE_URI_OPTIMISM"));
polygonFork = vm.createFork(vm.envString("ETH_NODE_URI_POLYGON"));
gnosisFork = vm.createFork(vm.envString("ETH_NODE_URI_GNOSIS"));
bnbFork = vm.createFork(vm.envString("ETH_NODE_URI_BSC"));
celoFork = vm.createFork(vm.envString("ETH_NODE_URI_CELO"));
polygonZkEVMFork = vm.createFork(vm.envString("ETH_NODE_URI_POLYGON_ZKEVM"));
baseFork = vm.createFork(vm.envString("ETH_NODE_URI_BASE"));
lineaFork = vm.createFork(vm.envString("ETH_NODE_URI_LINEA"));

forkIdentifier[CHAIN_ARBITRUM] = arbitrumFork;
forkIdentifier[CHAIN_AVALANCHE] = avalancheFork;
forkIdentifier[CHAIN_ETHEREUM] = ethereumFork;
forkIdentifier[CHAIN_OPTIMISM] = optimismFork;
forkIdentifier[CHAIN_POLYGON] = polygonFork;
forkIdentifier[CHAIN_GNOSIS] = gnosisFork;
forkIdentifier[CHAIN_BNB] = bnbFork;
forkIdentifier[CHAIN_CELO] = celoFork;
forkIdentifier[CHAIN_POLYGONZKEVM] = polygonZkEVMFork;
forkIdentifier[CHAIN_BASE] = baseFork;
forkIdentifier[CHAIN_LINEA] = lineaFork;

alice = vm.addr(1);
bob = vm.addr(2);
charlie = vm.addr(3);
dylan = vm.addr(4);
sweeper = address(uint160(uint256(keccak256(abi.encodePacked("sweeper")))));
}
}
7 changes: 4 additions & 3 deletions scripts/foundry/mainnet/MainnetConstants.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ contract MainnetConstants {
address public constant CORE_BORROW = 0x5bc6BEf80DA563EBf6Df6D6913513fa9A7ec89BE;

address public constant ANGLE_ROUTER = 0x4579709627CA36BCe92f51ac975746f431890930;
address public constant ONE_INCH = 0x1111111254EEB25477B68fb85Ed929f73A960582;
address public constant ONE_INCH = 0x111111125421cA6dc452d289314280a0f8842A65;
address public constant UNI_V3_ROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564;
address public constant MORPHO_BLUE = 0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb;

// AGEUR Mainnet treasury
address public constant AGEUR_TREASURY = 0x8667DBEBf68B0BFa6Db54f550f41Be16c4067d60;

uint256 public constant BASE_TOKENS = 10**18;
uint64 public constant BASE_PARAMS = 10**9;
uint256 public constant BASE_TOKENS = 10 ** 18;
uint64 public constant BASE_PARAMS = 10 ** 9;

function deployUpgradeable(address implementation, bytes memory data) public returns (address) {
return address(new TransparentUpgradeableProxy(implementation, PROXY_ADMIN, data));
Expand Down
38 changes: 38 additions & 0 deletions scripts/foundry/mainnet/SwapperLevMorpho.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.17;

import "forge-std/Script.sol";
import { console } from "forge-std/console.sol";
import "borrow/interfaces/ICoreBorrow.sol";
import "borrow/interfaces/IAngleRouterSidechain.sol";
import "borrow/interfaces/external/uniswap/IUniswapRouter.sol";
import { SwapType, BaseLevSwapper, PendleLevSwapperMorphoWeETH, PendleLevSwapperMorpho, Swapper } from "contracts/swapper/LevSwapper/morpho/implementations/PendleLevSwapperMorphoWeETH.sol";
import "./MainnetConstants.s.sol";
import { IMorphoBase } from "morpho-blue/interfaces/IMorpho.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract SwapperLevMorpho is Script, MainnetConstants {
function run() external {
uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY");
vm.startBroadcast(deployerPrivateKey);

PendleLevSwapperMorphoWeETH swapperMorphoPTWeETH = new PendleLevSwapperMorphoWeETH(
ICoreBorrow(CORE_BORROW),
IUniswapV3Router(UNI_V3_ROUTER),
ONE_INCH,
IAngleRouterSidechain(ANGLE_ROUTER),
IMorphoBase(MORPHO_BLUE)
);

console.log("Successfully deployed swapper Morpho PT-weETH Pendle: ", address(swapperMorphoPTWeETH));

// Set oracles to have liquidable positions
// vm.mockCall(
// address(0x986b5E1e1755e3C2440e960477f25201B0a8bbD4),
// abi.encodeWithSelector(AggregatorV3Interface.latestRoundData.selector),
// abi.encode(0, 0.001 ether, 0, 0, 0)
// );

vm.stopBroadcast();
}
}

0 comments on commit afccf93

Please sign in to comment.