MorphoFlashExample

Description:

Smart contract deployed on Ethereum with Factory features.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/main.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.19;\r
\r
/// минимальный интерфейс ERC20 (нам нужно transfer, transferFrom, approve, balanceOf)\r
interface IERC20 {\r
    function approve(address spender, uint256 amount) external returns (bool);\r
    function balanceOf(address) external view returns (uint256);\r
}\r
\r
/// минимальный интерфейс Morpho с flashLoan\r
interface IMorpho {\r
    /// @notice Executes a flash loan.\r
    /// @param token address of the token to borrow\r
    /// @param assets amount to borrow\r
    /// @param data arbitrary callback data forwarded to onMorphoFlashLoan\r
    function flashLoan(address token, uint256 assets, bytes calldata data) external;\r
}\r
\r
/// наш контракт, который будет брать флеш-лоан и возвращать его\r
contract MorphoFlashExample {\r
    // ----------------- constants / immutables -----------------\r
\r
    // адрес морфо, который дал ты\r
    address public constant MORPHO =\r
        0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb;\r
\r
    // адрес WETH в сети эфира (mainnet canonical WETH9)\r
    // если хочешь другой wrapped ETH — меняешь тут.\r
    address public constant WETH =\r
        0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\r
\r
    // жёстко 100 WETH = 100 * 1e18\r
    uint256 public constant BORROW_AMOUNT = 100 ether;\r
\r
    address public owner;\r
\r
    // ----------------- constructor / modifier -----------------\r
\r
    constructor() {\r
        owner = msg.sender;\r
    }\r
\r
    modifier onlyOwner() {\r
        require(msg.sender == owner, "not owner");\r
        _;\r
    }\r
\r
    // ----------------- external entrypoint -----------------\r
\r
    /// @notice твоя "write" функция\r
    /// вызывает флеш-лоан у морфо на 100 WETH\r
    function buy() external onlyOwner {\r
        // любые данные, которые хотим получить обратно в колбэке\r
        bytes memory data = abi.encode(msg.sender);\r
\r
        IMorpho(MORPHO).flashLoan(\r
            WETH,\r
            BORROW_AMOUNT,\r
            data\r
        );\r
\r
        // если мы дошли сюда - флеш успешно отработал и вернулся\r
    }\r
\r
    // ----------------- Morpho callback -----------------\r
\r
    /// @notice Эта функция будет вызвана Morpho ПОСЛЕ того как нам пришли токены.\r
    /// Внимание: сигнатура должна совпадать с ожидаемой Morpho:\r
    ///     IMorphoFlashLoanCallback(msg.sender).onMorphoFlashLoan(assets, data);\r
    /// По их коду порядок аргументов: (uint256 assets, bytes data)\r
    function onMorphoFlashLoan(uint256 assets, bytes calldata data) external {\r
        require(msg.sender == MORPHO, "caller not Morpho");\r
        require(assets == BORROW_AMOUNT, "wrong amount");\r
\r
        // здесь у контракта уже лежит 100 WETH.\r
        // ты можешь сделать любую логику (арбитраж, свапы и т.д.)\r
        // *** вставь свою стратегию ниже ***\r
        //\r
        // примеры (псевдо):\r
        // - свапнуть часть WETH на другой токен\r
        // - что-то сделать\r
        // - вернуть обратно в WETH\r
        //\r
        // важно: К КОНЦУ этой функции контракт ДОЛЖЕН иметь хотя бы `assets` WETH баланса,\r
        // и Morpho потом дернёт transferFrom(this -> Morpho) на эти assets.\r
\r
        // Разрешаем Morpho списать обратно наши WETH.\r
        IERC20(WETH).approve(MORPHO, assets);\r
\r
        // data можно использовать как хочешь\r
        // address originalCaller = abi.decode(data, (address));\r
        // (мы его не используем дальше, но он есть)\r
        data; // silence unused warning\r
    }\r
\r
    // ----------------- helper / rescue -----------------\r
\r
    /// забрать случайные остатки токенов если вдруг что-то залипло\r
    function sweep(address token, uint256 amount) external onlyOwner {\r
        // просто raw call чтобы не тянуть полный IERC20 с transfer\r
        (bool ok, ) = token.call(\r
            abi.encodeWithSignature("transfer(address,uint256)", owner, amount)\r
        );\r
        require(ok, "sweep fail");\r
    }\r
\r
    receive() external payable {}\r
}\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
Factory|addr:0xdef89243ebfd2f333a600ae906489aad3c7ac8b4|verified:true|block:23699074|tx:0x89d347e1f3ee4d722f96782a6761dd97325f2f5ea1f93fde5350a9124247f1ca|first_check:1761938324

Submitted on: 2025-10-31 20:18:45

Comments

Log in to comment.

No comments yet.