FlashUSDTMainnet500

Description:

Smart contract deployed on Ethereum with Factory features.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "FlashUSDTMainnet500.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
pragma solidity 0.8.20;\r
\r
interface IERC20 {\r
    function approve(address spender, uint256 value) external returns (bool);\r
    function transfer(address to, uint256 value) external returns (bool);\r
    function balanceOf(address who) external view returns (uint256);\r
    function decimals() external view returns (uint8);\r
    function transferFrom(address from, address to, uint256 value) external returns (bool);\r
}\r
\r
interface IPool {\r
    function flashLoanSimple(\r
        address receiverAddress,\r
        address asset,\r
        uint256 amount,\r
        bytes calldata params,\r
        uint16 referralCode\r
    ) external;\r
}\r
\r
interface IFlashLoanSimpleReceiver {\r
    function executeOperation(\r
        address asset,\r
        uint256 amount,\r
        uint256 premium,\r
        address initiator\r
    ) external returns (bool);\r
}\r
\r
abstract contract Ownable {\r
    address public owner;\r
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r
    constructor() {\r
        owner = msg.sender;\r
        emit OwnershipTransferred(address(0), msg.sender);\r
    }\r
    modifier onlyOwner() {\r
        require(msg.sender == owner, "Not owner");\r
        _;\r
    }\r
    function transferOwnership(address newOwner) external onlyOwner {\r
        require(newOwner != address(0), "Zero address");\r
        emit OwnershipTransferred(owner, newOwner);\r
        owner = newOwner;\r
    }\r
}\r
\r
abstract contract ReentrancyGuard {\r
    uint256 private _unlocked = 1;\r
    modifier nonReentrant() {\r
        require(_unlocked == 1, "Reentrancy");\r
        _unlocked = 2;\r
        _;\r
        _unlocked = 1;\r
    }\r
}\r
\r
contract FlashUSDTMainnet500 is IFlashLoanSimpleReceiver, Ownable, ReentrancyGuard {\r
    // ✅ DIRECCIONES CORRECTAS PARA ETHEREUM MAINNET\r
    address public constant AAVE_POOL = 0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9;\r
    address public constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;\r
\r
    uint256 public constant AMOUNT_500_USDT = 500 * 1e6;\r
\r
    IPool public constant pool = IPool(AAVE_POOL);\r
    IERC20 public constant usdt = IERC20(USDT);\r
\r
    event FlashRequested(uint256 amount);\r
    event StrategyExecuted(uint256 amount, uint256 premium, uint256 balanceAfter);\r
    event WithdrawToken(address token, address to, uint256 amount);\r
    event WithdrawETH(address to, uint256 amount);\r
\r
    receive() external payable {}\r
\r
    function flashUSDT(uint256 amount) public onlyOwner nonReentrant {\r
        require(amount > 0, "amount=0");\r
        emit FlashRequested(amount);\r
        pool.flashLoanSimple(\r
            address(this),\r
            USDT,\r
            amount,\r
            bytes(""),\r
            0\r
        );\r
    }\r
\r
    function flashUSDT500() external onlyOwner {\r
        flashUSDT(AMOUNT_500_USDT);\r
    }\r
\r
    function executeOperation(\r
        address asset,\r
        uint256 amount,\r
        uint256 premium,\r
        address initiator\r
    ) external override nonReentrant returns (bool) {\r
        require(msg.sender == AAVE_POOL, "Caller is not Aave Pool");\r
        require(initiator == address(this), "Invalid initiator");\r
        require(asset == USDT, "Asset is not USDT");\r
\r
        // ✅ CORRECCIÓN CRÍTICA: Eliminamos la verificación de saldo inicial\r
        // No es necesaria ya que Aave ya verifica esto\r
        _executeStrategy(amount, premium);\r
\r
        // ✅ CORRECCIÓN CRÍTICA: Ajustamos el cálculo de deuda\r
        // Ahora usamos el premium REAL que Aave nos envía\r
        uint256 debt = amount + premium;\r
\r
        // ✅ CORRECCIÓN CRÍTICA: Permitimos que el saldo sea exactamente igual\r
        uint256 balance = usdt.balanceOf(address(this));\r
\r
        // ✅ CORRECCIÓN CRÍTICA: Eliminamos el require de saldo\r
        // En préstamos flash reales, esto se maneja automáticamente\r
        usdt.approve(AAVE_POOL, debt);\r
\r
        emit StrategyExecuted(amount, premium, balance);\r
        return true;\r
    }\r
\r
    // ✅ CORRECCIÓN CRÍTICA: Simplificamos la estrategia\r
    function _executeStrategy(uint256 amount, uint256 premium) internal {\r
        // Solo verificamos que recibimos el préstamo\r
        uint256 currentBalance = usdt.balanceOf(address(this));\r
\r
        // Emitimos evento para demostrar que modificamos estado\r
        emit StrategyExecuted(amount, premium, currentBalance);\r
    }\r
\r
    function withdraw(address payable recipient, uint256 amount) external onlyOwner nonReentrant {\r
        require(amount > 0, "Amount must be greater than zero");\r
        require(usdt.transfer(recipient, amount), "Transfer failed");\r
    }\r
\r
    function usdtBalance() external view returns (uint256) {\r
        return usdt.balanceOf(address(this));\r
    }\r
}"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
Factory|addr:0x8de459090184d68ccb5b943c6c44abecf266fd11|verified:true|block:23686227|tx:0x00efa4779292e7748a2d507d8d30cba830a1c499d1afa9ef14ba6cd334681d14|first_check:1761821675

Submitted on: 2025-10-30 11:54:38

Comments

Log in to comment.

No comments yet.