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": []
}
}}
Submitted on: 2025-10-31 20:18:45
Comments
Log in to comment.
No comments yet.