Agent

Description:

Decentralized Finance (DeFi) protocol contract providing Swap, Factory functionality.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/Agent.sol": {
      "content": "// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import "contracts/SafeERC20.sol";
import "contracts/IERC20.sol";
import "contracts/IUniswapV2Pair.sol";
import "contracts/IUniswapV2Router.sol";

library GasOptimize {
    // function selector for swap(uint,uint,address,bytes)
    bytes4 constant SWAP_SELECTOR = 0x022c0d9f;

    // selector for transfer(address,uint256)
    bytes4 constant TRANSFER_SELECTOR = 0xa9059cbb;

    function swap(address pair, uint amount0Out, uint amount1Out) internal {
        assembly {
             // use scratch space; we don't read returndata
            let ptr := 0x00
            // function selector: 0x022c0d9f
            mstore(ptr, 0x022c0d9f00000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr,  4), amount0Out)              // arg0
            mstore(add(ptr, 36), amount1Out)              // arg1
            mstore(add(ptr, 68), address())               // arg2: to = this
            mstore(add(ptr,100), 0x80)                    // arg3: offset to bytes tail (128)
            mstore(add(ptr,132), 0)                       // bytes length = 0

            // call(pair, value=0, input=164 bytes, expect no return)
            if iszero(call(gas(), pair, 0, ptr, 164, 0, 0)) {
                revert(0, 0)
            }
        }
    }

    function transfer(address token, address to, uint256 amount) internal {
        assembly {
            // calldata: 0xa9059cbb | to | amount
            mstore(0x00, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(0x04, to)
            mstore(0x24, amount)
            if iszero(call(gas(), token, 0, 0x00, 0x44, 0, 0)) {
                revert(0, 0)
            }
        }
    }
}

// This contract simply calls multiple targets sequentially, ensuring WETH balance before and after

contract Agent {
    // using SafeERC20 for IERC20;

    address private immutable owner;
    address private immutable executor;

    address private constant WETH_ADDR = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    IERC20 private constant WETH = IERC20(WETH_ADDR);
    // bytes4 private constant TRANSFER_SELECTOR = 0xa9059cbb;
    // bytes4 private constant SWAP_SELECTOR = 0x022c0d9f;
    bool state = false;

    modifier onlyExecutor() {
        require(msg.sender == executor);
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    constructor() {
        executor = msg.sender;
        owner = address(0x1b7BC083290bc24EdA9a24ff44aB974Da44c752a);
    }

    // WETH -> token via pair, send WETH then swap
    function sB(address pairAddress, uint256 amount0Out, uint256 amount1Out, uint256 amountIn) external onlyExecutor {
        // WETH_ADDR.call(abi.encodeWithSelector(0xa9059cbb, pairAddress, amountIn));
        // _safeTransfer(WETH_ADDR, pairAddress, amountIn);
        // IUniswapV2Pair(pairAddress).swap(amount0Out, amount1Out, address(this), bytes(""));

        GasOptimize.transfer(WETH_ADDR, pairAddress, amountIn);
        GasOptimize.swap(pairAddress, amount0Out, amount1Out);
    }

    // token -> token via pair; forwards provided token amount then swap; tips miner with any ETH balance
    function sS(address pairAddress, address tokenAddress, uint256 amount0Out, uint256 amount1Out, uint256 amountIn) external onlyExecutor {
        // tokenAddress.call(abi.encodeWithSelector(0xa9059cbb, pairAddress, amountIn));
        // _safeTransfer(tokenAddress, pairAddress, amountIn);
        // IUniswapV2Pair(pairAddress).swap(amount0Out, amount1Out, address(this), bytes(""));

        GasOptimize.transfer(tokenAddress, pairAddress, amountIn);
        GasOptimize.swap(pairAddress, amount0Out, amount1Out);
    }

    // function sB_Ex(address _router, address _pair, address _token, uint256 amountIn, uint256 amountOutMin, bool token0) external onlyExecutor {
    //     IUniswapV2Pair pair = IUniswapV2Pair(_pair);
    //     IUniswapV2Router router = IUniswapV2Router(_router);
    //     address[] memory path =  new address[](2);
    //     path[0] = WETH_ADDR;
    //     path[1] = _token;
    //     uint256[] memory amounts = router.getAmountsOut(amountIn, path);
    //     require(amounts[1] >= amountOutMin, '!amountOutMin');
    //     WETH.transfer(_pair, amountIn);
    //     pair.swap(token0 ? 0 : amounts[1], token0 ? amounts[1] : 0, address(this), new bytes(0));
    // }

    // function sS_Ex(address _router, address _pair, address _token, uint256 amountOutMin, bool token0) external onlyExecutor payable {
    //     IUniswapV2Pair pair = IUniswapV2Pair(_pair);
    //     IERC20 token = IERC20(_token);
    //     uint256 balance = token.balanceOf(address(this));
    //     token.transfer(_pair, balance);
    //     IUniswapV2Router router = IUniswapV2Router(_router);
    //     address[] memory path =  new address[](2);
    //     path[0] = _token;
    //     path[1] = WETH_ADDR;
    //     uint256[] memory amounts = router.getAmountsOut(balance, path);
    //     require(amounts[1] >= amountOutMin, '!amountOutMin');
    //     pair.swap(token0 ? amounts[1] : 0, token0 ? 0 : amounts[1], address(this), new bytes(0));
    //     if (address(this).balance > 0) {
    //         block.coinbase.transfer(address(this).balance);
    //     }
    // }

    function sendBribe(uint256 amount) external onlyExecutor {
        block.coinbase.transfer(amount);
    }

    function updateState() external onlyExecutor {
        state = !state;
    }

    function sW(address _token, address _to, uint256 _amount) external onlyOwner {
        require(IERC20(_token).balanceOf(address(this)) >= _amount, "bal");
        if (_token == WETH_ADDR) {
            WETH.withdraw(_amount);
            _safeTransferETH(_to, _amount);
        } else {
            _safeTransfer(_token, _to, _amount); // works with USDT-style tokens
        }
    }

    // receive() external payable {
    // }

    // function call(address payable _to, uint256 _value, bytes calldata _data) external onlyOwner payable returns (bytes memory) {
    //     require(_to != address(0));
    //     (bool _success, bytes memory _result) = _to.call{value: _value}(_data);
    //     require(_success);
    //     return _result;
    // }

    // ===== internal helpers =====

    function _safeTransfer(address token, address to, uint256 value) internal {
        // (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        // (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        // require(success && (data.length == 0 || abi.decode(data, (bool))), "xfer");

        assembly {
            // Get free memory pointer
            let ptr := mload(0x40)
            // function selector for transfer(address,uint256) = 0xa9059cbb
            mstore(ptr, 0xa9059cbb000000000000000000000000000000000000000000000000000000)
            mstore(add(ptr, 4), to)      // arg1: to
            mstore(add(ptr, 36), value)  // arg2: value

            // call ERC20 token
            let result := call(gas(), token, 0, ptr, 68, 0, 32)

            // if call failed or (returndata present and not true) then revert
            if iszero(result) {
                revert(0, 0)
            }
            if returndatasize() {
                returndatacopy(ptr, 0, 32)
                if iszero(mload(ptr)) {
                    revert(0, 0)
                }
            }
        }
    }

    function _safeTransferETH(address to, uint256 value) internal {
        (bool ok, ) = to.call{value: value}("");
        require(ok, "eth");
    }
}
"
    },
    "contracts/IUniswapV2Router.sol": {
      "content": "// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

interface IUniswapV2Router {
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

     function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}"
    },
    "contracts/IUniswapV2Pair.sol": {
      "content": "// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

interface IUniswapV2Pair {
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function token0() external view returns (address);
    function token1() external view returns (address);
}"
    },
    "contracts/IERC20.sol": {
      "content": "// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

interface IERC20 {
    function transfer(address to, uint value) external returns (bool);
    function balanceOf(address) external returns (uint256);
    function deposit() external payable;
    function withdraw(uint256 amount) external;
}"
    },
    "contracts/SafeERC20.sol": {
      "content": "// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

library SafeERC20 {
    function safeTransfer(address token, address to, uint256 amount) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(bytes4(keccak256("transfer(address,uint256)")), to, amount)
        );
        require(success, "Transfer failed");

        // If the token returns data, it should be true; if not, assume success
        if (data.length > 0) {
            require(abi.decode(data, (bool)), "Transfer returned false");
        }
    }

    function safeApprove(address token, address spender, uint256 amount) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(bytes4(keccak256("approve(address,uint256)")), spender, amount)
        );
        require(success, "Approve failed");

        if (data.length > 0) {
            require(abi.decode(data, (bool)), "Approve returned false");
        }
    }
}"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "remappings": []
  }
}}

Tags:
DeFi, Swap, Factory|addr:0xa76af27bd7c6c0fa129b39ab61938f3ca7273d0c|verified:true|block:23422074|tx:0x889cb59f77637b452b03333ad7a2f771de97ab2d91a2e0073e0a37ed17d80761|first_check:1758717528

Submitted on: 2025-09-24 14:38:52

Comments

Log in to comment.

No comments yet.