Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0x0612e37Ea353D53d89727d4229EB3cbFa4C95594
Balance 0 ETH
Nonce 1
Code Size 9167 bytes
Indexed Transactions 0 (1 on-chain, 0.7% indexed)
External Etherscan · Sourcify

Contract Bytecode

9167 bytes
0x608060405260043610610042575f3560e01c80631b11d0ff1461004d5780638da5cb5b14610089578063ba1cfe22146100b3578063f3fef3a3146100db57610049565b3661004957005b5f5ffd5b348015610058575f5ffd5b50610073600480360381019061006e9190611110565b610103565b60405161008091906111c0565b60405180910390f35b348015610094575f5ffd5b5061009d610725565b6040516100aa91906111e8565b60405180910390f35b3480156100be575f5ffd5b506100d960048036038101906100d49190611224565b610749565b005b3480156100e6575f5ffd5b5061010160048036038101906100fc91906112d6565b610873565b005b5f5f5f84848101906101159190611683565b915091508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017e90611737565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146101f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec9061179f565b60405180910390fd5b8060e00151156102d457610211898260a001515f01518a610a35565b5f8160a001515f015173ffffffffffffffffffffffffffffffffffffffff168260a00151604001518360a001516020015160405161024f919061180f565b5f6040518083038185875af1925050503d805f8114610289576040519150601f19603f3d011682016040523d82523d5f602084013e61028e565b606091505b50509050806102d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c99061186f565b60405180910390fd5b505b5f816020015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161031291906111e8565b602060405180830381865afa15801561032d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035191906118a1565b90505f8111610395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038c90611916565b60405180910390fd5b6103ab826020015183606001515f015183610a35565b5f82606001515f015173ffffffffffffffffffffffffffffffffffffffff168360600151604001518460600151602001516040516103e9919061180f565b5f6040518083038185875af1925050503d805f8114610423576040519150601f19603f3d011682016040523d82523d5f602084013e610428565b606091505b505090508061046c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104639061197e565b60405180910390fd5b505080610100015115610614575f816040015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104b791906111e8565b602060405180830381865afa1580156104d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f691906118a1565b90505f811161053a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610531906119e6565b60405180910390fd5b61055082604001518360c001515f015183610a35565b5f8260c001515f015173ffffffffffffffffffffffffffffffffffffffff168360c00151604001518460c001516020015160405161058e919061180f565b5f6040518083038185875af1925050503d805f81146105c8576040519150601f19603f3d011682016040523d82523d5f602084013e6105cd565b606091505b5050905080610611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060890611a4e565b60405180910390fd5b50505b5f87896106219190611a99565b90505f8a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161065d91906111e8565b602060405180830381865afa158015610678573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069c91906118a1565b9050818110156106e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d890611b16565b60405180910390fd5b6106ec8b3384610a35565b5f82826106f99190611b34565b90505f811115610712576107118c855f015183610e54565b5b6001955050505050509695505050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90611bb1565b60405180910390fd5b5f86826040516020016107eb929190611e95565b60405160208183030381529060405290508673ffffffffffffffffffffffffffffffffffffffff166342b0b77c308888855f6040518663ffffffff1660e01b815260040161083d959493929190611f69565b5f604051808303815f87803b158015610854575f5ffd5b505af1158015610866573d5f5f3e3d5ffd5b5050505050505050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890611bb1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a255780471015610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e9061200b565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff168260405161099c9061204c565b5f6040518083038185875af1925050503d805f81146109d6576040519150601f19603f3d011682016040523d82523d5f602084013e6109db565b606091505b5050905080610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a16906120aa565b60405180910390fd5b50610a31565b610a30823383610e54565b5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90612112565b60405180910390fd5b5f5f8473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8585604051602401610ad7929190612130565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b41919061180f565b5f604051808303815f865af19150503d805f8114610b7a576040519150601f19603f3d011682016040523d82523d5f602084013e610b7f565b606091505b5091509150818015610bac57505f81511480610bab575080806020019051810190610baa919061216b565b5b5b15610bb8575050610e4f565b5f5f8673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b875f604051602401610bec9291906121d2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610c56919061180f565b5f604051808303815f865af19150503d805f8114610c8f576040519150601f19603f3d011682016040523d82523d5f602084013e610c94565b606091505b5091509150818015610cc157505f81511480610cc0575080806020019051810190610cbf919061216b565b5b5b610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790612243565b60405180910390fd5b5f5f8873ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8989604051602401610d34929190612130565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d9e919061180f565b5f604051808303815f865af19150503d805f8114610dd7576040519150601f19603f3d011682016040523d82523d5f602084013e610ddc565b606091505b5091509150818015610e0957505f81511480610e08575080806020019051810190610e07919061216b565b5b5b610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f906122ab565b60405180910390fd5b5050505050505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb990612313565b60405180910390fd5b5f5f8473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401610ef6929190612130565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610f60919061180f565b5f604051808303815f865af19150503d805f8114610f99576040519150601f19603f3d011682016040523d82523d5f602084013e610f9e565b606091505b5091509150818015610fcb57505f81511480610fca575080806020019051810190610fc9919061216b565b5b5b61100a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110019061237b565b60405180910390fd5b5050505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61104b82611022565b9050919050565b61105b81611041565b8114611065575f5ffd5b50565b5f8135905061107681611052565b92915050565b5f819050919050565b61108e8161107c565b8114611098575f5ffd5b50565b5f813590506110a981611085565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126110d0576110cf6110af565b5b8235905067ffffffffffffffff8111156110ed576110ec6110b3565b5b602083019150836001820283011115611109576111086110b7565b5b9250929050565b5f5f5f5f5f5f60a0878903121561112a5761112961101a565b5b5f61113789828a01611068565b965050602061114889828a0161109b565b955050604061115989828a0161109b565b945050606061116a89828a01611068565b935050608087013567ffffffffffffffff81111561118b5761118a61101e565b5b61119789828a016110bb565b92509250509295509295509295565b5f8115159050919050565b6111ba816111a6565b82525050565b5f6020820190506111d35f8301846111b1565b92915050565b6111e281611041565b82525050565b5f6020820190506111fb5f8301846111d9565b92915050565b5f5ffd5b5f610120828403121561121b5761121a611201565b5b81905092915050565b5f5f5f5f5f5f60a0878903121561123e5761123d61101a565b5b5f61124b89828a01611068565b965050602061125c89828a01611068565b955050604061126d89828a0161109b565b945050606087013567ffffffffffffffff81111561128e5761128d61101e565b5b61129a89828a016110bb565b9350935050608087013567ffffffffffffffff8111156112bd576112bc61101e565b5b6112c989828a01611205565b9150509295509295509295565b5f5f604083850312156112ec576112eb61101a565b5b5f6112f985828601611068565b925050602061130a8582860161109b565b9150509250929050565b5f61131e82611022565b9050919050565b61132e81611314565b8114611338575f5ffd5b50565b5f8135905061134981611325565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61139982611353565b810181811067ffffffffffffffff821117156113b8576113b7611363565b5b80604052505050565b5f6113ca611011565b90506113d68282611390565b919050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff8211156113fd576113fc611363565b5b61140682611353565b9050602081019050919050565b828183375f83830152505050565b5f61143361142e846113e3565b6113c1565b90508281526020810184848401111561144f5761144e6113df565b5b61145a848285611413565b509392505050565b5f82601f830112611476576114756110af565b5b8135611486848260208601611421565b91505092915050565b5f606082840312156114a4576114a361134f565b5b6114ae60606113c1565b90505f6114bd84828501611068565b5f83015250602082013567ffffffffffffffff8111156114e0576114df6113db565b5b6114ec84828501611462565b60208301525060406115008482850161109b565b60408301525092915050565b611515816111a6565b811461151f575f5ffd5b50565b5f813590506115308161150c565b92915050565b5f610120828403121561154c5761154b61134f565b5b6115576101206113c1565b90505f61156684828501611068565b5f83015250602061157984828501611068565b602083015250604061158d84828501611068565b604083015250606082013567ffffffffffffffff8111156115b1576115b06113db565b5b6115bd8482850161148f565b606083015250608082013567ffffffffffffffff8111156115e1576115e06113db565b5b6115ed8482850161148f565b60808301525060a082013567ffffffffffffffff811115611611576116106113db565b5b61161d8482850161148f565b60a08301525060c082013567ffffffffffffffff811115611641576116406113db565b5b61164d8482850161148f565b60c08301525060e061166184828501611522565b60e08301525061010061167684828501611522565b6101008301525092915050565b5f5f604083850312156116995761169861101a565b5b5f6116a68582860161133b565b925050602083013567ffffffffffffffff8111156116c7576116c661101e565b5b6116d385828601611536565b9150509250929050565b5f82825260208201905092915050565b7f496e76616c696420706f6f6c2063616c6c6572000000000000000000000000005f82015250565b5f6117216013836116dd565b915061172c826116ed565b602082019050919050565b5f6020820190508181035f83015261174e81611715565b9050919050565b7f496e76616c696420696e69746961746f720000000000000000000000000000005f82015250565b5f6117896011836116dd565b915061179482611755565b602082019050919050565b5f6020820190508181035f8301526117b68161177d565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6117e9826117bd565b6117f381856117c7565b93506118038185602086016117d1565b80840191505092915050565b5f61181a82846117df565b915081905092915050565b7f70726553776170206661696c65640000000000000000000000000000000000005f82015250565b5f611859600e836116dd565b915061186482611825565b602082019050919050565b5f6020820190508181035f8301526118868161184d565b9050919050565b5f8151905061189b81611085565b92915050565b5f602082840312156118b6576118b561101a565b5b5f6118c38482850161188d565b91505092915050565b7f4e6f20696e7465726d65646961746520617373657400000000000000000000005f82015250565b5f6119006015836116dd565b915061190b826118cc565b602082019050919050565b5f6020820190508181035f83015261192d816118f4565b9050919050565b7f66696c6c4f72646572206661696c6564000000000000000000000000000000005f82015250565b5f6119686010836116dd565b915061197382611934565b602082019050919050565b5f6020820190508181035f8301526119958161195c565b9050919050565b7f4e6f2074617267657420617373657400000000000000000000000000000000005f82015250565b5f6119d0600f836116dd565b91506119db8261199c565b602082019050919050565b5f6020820190508181035f8301526119fd816119c4565b9050919050565b7f706f737453776170206661696c656400000000000000000000000000000000005f82015250565b5f611a38600f836116dd565b9150611a4382611a04565b602082019050919050565b5f6020820190508181035f830152611a6581611a2c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611aa38261107c565b9150611aae8361107c565b9250828201905080821115611ac657611ac5611a6c565b5b92915050565b7f496e73756666696369656e742072657061792062616c616e63650000000000005f82015250565b5f611b00601a836116dd565b9150611b0b82611acc565b602082019050919050565b5f6020820190508181035f830152611b2d81611af4565b9050919050565b5f611b3e8261107c565b9150611b498361107c565b9250828203905081811115611b6157611b60611a6c565b5b92915050565b7f4e6f74206f776e657200000000000000000000000000000000000000000000005f82015250565b5f611b9b6009836116dd565b9150611ba682611b67565b602082019050919050565b5f6020820190508181035f830152611bc881611b8f565b9050919050565b5f611bdd6020840184611068565b905092915050565b611bee81611041565b82525050565b5f5ffd5b5f82356001606003833603038112611c1357611c12611bf4565b5b82810191505092915050565b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112611c4357611c42611bf4565b5b83810192508235915060208301925067ffffffffffffffff821115611c6b57611c6a611c1f565b5b600182023603831315611c8157611c80611c23565b5b509250929050565b5f82825260208201905092915050565b5f611ca48385611c89565b9350611cb1838584611413565b611cba83611353565b840190509392505050565b5f611cd3602084018461109b565b905092915050565b611ce48161107c565b82525050565b5f60608301611cfb5f840184611bcf565b611d075f860182611be5565b50611d156020840184611c27565b8583036020870152611d28838284611c99565b92505050611d396040840184611cc5565b611d466040860182611cdb565b508091505092915050565b5f611d5f6020840184611522565b905092915050565b611d70816111a6565b82525050565b5f6101208301611d885f840184611bcf565b611d945f860182611be5565b50611da26020840184611bcf565b611daf6020860182611be5565b50611dbd6040840184611bcf565b611dca6040860182611be5565b50611dd86060840184611bf8565b8482036060860152611dea8282611cea565b915050611dfa6080840184611bf8565b8482036080860152611e0c8282611cea565b915050611e1c60a0840184611bf8565b84820360a0860152611e2e8282611cea565b915050611e3e60c0840184611bf8565b84820360c0860152611e508282611cea565b915050611e6060e0840184611d51565b611e6d60e0860182611d67565b50611e7c610100840184611d51565b611e8a610100860182611d67565b508091505092915050565b5f604082019050611ea85f8301856111d9565b8181036020830152611eba8184611d76565b90509392505050565b611ecc8161107c565b82525050565b5f82825260208201905092915050565b5f611eec826117bd565b611ef68185611ed2565b9350611f068185602086016117d1565b611f0f81611353565b840191505092915050565b5f819050919050565b5f61ffff82169050919050565b5f819050919050565b5f611f53611f4e611f4984611f1a565b611f30565b611f23565b9050919050565b611f6381611f39565b82525050565b5f60a082019050611f7c5f8301886111d9565b611f8960208301876111d9565b611f966040830186611ec3565b8181036060830152611fa88185611ee2565b9050611fb76080830184611f5a565b9695505050505050565b7f496e73756666696369656e7420455448000000000000000000000000000000005f82015250565b5f611ff56010836116dd565b915061200082611fc1565b602082019050919050565b5f6020820190508181035f83015261202281611fe9565b9050919050565b50565b5f6120375f836117c7565b915061204282612029565b5f82019050919050565b5f6120568261202c565b9150819050919050565b7f455448207769746864726177206661696c6564000000000000000000000000005f82015250565b5f6120946013836116dd565b915061209f82612060565b602082019050919050565b5f6020820190508181035f8301526120c181612088565b9050919050565b7f5a65726f207370656e64657200000000000000000000000000000000000000005f82015250565b5f6120fc600c836116dd565b9150612107826120c8565b602082019050919050565b5f6020820190508181035f830152612129816120f0565b9050919050565b5f6040820190506121435f8301856111d9565b6121506020830184611ec3565b9392505050565b5f815190506121658161150c565b92915050565b5f602082840312156121805761217f61101a565b5b5f61218d84828501612157565b91505092915050565b5f60ff82169050919050565b5f6121bc6121b76121b284611f1a565b611f30565b612196565b9050919050565b6121cc816121a2565b82525050565b5f6040820190506121e55f8301856111d9565b6121f260208301846121c3565b9392505050565b7f617070726f7665283029206661696c65640000000000000000000000000000005f82015250565b5f61222d6011836116dd565b9150612238826121f9565b602082019050919050565b5f6020820190508181035f83015261225a81612221565b9050919050565b7f617070726f76652876616c756529206661696c656400000000000000000000005f82015250565b5f6122956015836116dd565b91506122a082612261565b602082019050919050565b5f6020820190508181035f8301526122c281612289565b9050919050565b7f5a65726f20726563697069656e740000000000000000000000000000000000005f82015250565b5f6122fd600e836116dd565b9150612308826122c9565b602082019050919050565b5f6020820190508181035f83015261232a816122f1565b9050919050565b7f7472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f612365600f836116dd565b915061237082612331565b602082019050919050565b5f6020820190508181035f83015261239281612359565b905091905056fea2646970667358221220fbf5ae7f214956aefc19a17c9073e8a76ccf813e28aa77f3866744dfe40cba7b64736f6c634300081e0033

Verified Source Code Partial Match

Compiler: v0.8.30+commit.73712a01 EVM: prague Optimization: No
ArbitrageExecutor.sol 188 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/// ---- Minimal ERC20 interface (no OZ dependency) ----
interface IERC20 {
    function balanceOf(address) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address, uint256) external returns (bool);
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns (bool);
}

/// ---- Aave V3 pool interface (simple flash loan) ----
interface IAaveV3Pool {
    function flashLoanSimple(
        address receiverAddress,
        address asset,
        uint256 amount,
        bytes calldata params,
        uint16 referralCode
    ) external;
}

contract ArbitrageExecutor {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

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

    struct CallData {
        address to;
        bytes data;
        uint256 value; // ETH value if needed (usually 0)
    }

    struct ArbitrageParams {
        address beneficiary;       // Address to receive profit
        address intermediateAsset; // Asset received after preSwap
        address targetAsset;       // Asset received after fillOrder
        CallData fillOrder;        // fillOrder call details
        CallData swap;             // Reserved (not used here)
        CallData preSwap;          // Optional: loaned asset -> intermediate asset
        CallData postSwap;         // Optional: target asset -> loaned asset
        bool enablePreSwap;
        bool enablePostSwap;
    }

    /// @notice Initiate Aave V3 simple flash loan
    /// @dev The pool address is encoded into params for validation in callback
    function execute(
        address flashLoanProvider,
        address flashLoanToken,
        uint256 flashLoanAmount,
        bytes calldata, // flashLoanParams placeholder
        ArbitrageParams calldata arbitrageParams
    ) external onlyOwner {
        bytes memory params = abi.encode(
            flashLoanProvider,
            arbitrageParams
        );

        IAaveV3Pool(flashLoanProvider).flashLoanSimple(
            address(this),
            flashLoanToken,
            flashLoanAmount,
            params,
            0
        );
    }

    /// @notice Aave V3 flash loan callback
    /// @dev Uses _forceApprove to handle USDT-style non-zero -> non-zero approve restrictions.
    ///      Uses _safeTransfer to handle tokens that return false or have no return value.
    function executeOperation(
        address asset,
        uint256 amount,
        uint256 premium,
        address initiator,
        bytes calldata params
    ) external returns (bool) {
        (address pool, ArbitrageParams memory ap) =
            abi.decode(params, (address, ArbitrageParams));

        // Security checks: only the correct pool can call, and must be initiated by this contract
        require(msg.sender == pool, "Invalid pool caller");
        require(initiator == address(this), "Invalid initiator");

        // Step 0: preSwap (loaned asset -> intermediate asset)
        if (ap.enablePreSwap) {
            _forceApprove(IERC20(asset), ap.preSwap.to, amount);
            (bool okPre, ) = ap.preSwap.to.call{value: ap.preSwap.value}(ap.preSwap.data);
            require(okPre, "preSwap failed");
        }

        // Step 1: fillOrder (intermediate asset -> target asset)
        {
            uint256 intermediateBalance = IERC20(ap.intermediateAsset).balanceOf(address(this));
            require(intermediateBalance > 0, "No intermediate asset");
            _forceApprove(IERC20(ap.intermediateAsset), ap.fillOrder.to, intermediateBalance);

            (bool okFill, ) = ap.fillOrder.to.call{value: ap.fillOrder.value}(ap.fillOrder.data);
            require(okFill, "fillOrder failed");
        }

        // Step 2: postSwap (target asset -> loaned asset)
        if (ap.enablePostSwap) {
            uint256 targetBalance = IERC20(ap.targetAsset).balanceOf(address(this));
            require(targetBalance > 0, "No target asset");
            _forceApprove(IERC20(ap.targetAsset), ap.postSwap.to, targetBalance);

            (bool okPost, ) = ap.postSwap.to.call{value: ap.postSwap.value}(ap.postSwap.data);
            require(okPost, "postSwap failed");
        }

        // Step 3: repay flash loan
        uint256 totalOwed = amount + premium;
        uint256 repayAssetBalance = IERC20(asset).balanceOf(address(this));
        require(repayAssetBalance >= totalOwed, "Insufficient repay balance");

        // Approve the pool (msg.sender) to pull repayment
        _forceApprove(IERC20(asset), msg.sender, totalOwed);

        // Step 4: transfer profit to beneficiary
        uint256 profit = repayAssetBalance - totalOwed;
        if (profit > 0) {
            _safeTransfer(IERC20(asset), ap.beneficiary, profit);
        }

        return true;
    }

    /// @notice Withdraw tokens or ETH (only owner)
    function withdraw(address token, uint256 amount) external onlyOwner {
        if (token == address(0)) {
            require(address(this).balance >= amount, "Insufficient ETH");
            (bool ok, ) = msg.sender.call{value: amount}("");
            require(ok, "ETH withdraw failed");
        } else {
            _safeTransfer(IERC20(token), msg.sender, amount);
        }
    }

    /// ---- Internal helper functions (no OZ dependency) ----

    /// @dev Safe approve handling USDT-style non-zero -> non-zero restrictions.
    ///      Also handles tokens with no return value or bool return.
    function _forceApprove(IERC20 token, address spender, uint256 value) internal {
        require(spender != address(0), "Zero spender");

        // Try direct approve(value)
        (bool s1, bytes memory r1) = address(token).call(
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
        if (s1 && (r1.length == 0 || abi.decode(r1, (bool)))) {
            return; // Succeeded directly
        }

        // If failed, approve(0) first
        (bool s2, bytes memory r2) = address(token).call(
            abi.encodeWithSelector(token.approve.selector, spender, 0)
        );
        require(s2 && (r2.length == 0 || abi.decode(r2, (bool))), "approve(0) failed");

        // Then approve(value)
        (bool s3, bytes memory r3) = address(token).call(
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
        require(s3 && (r3.length == 0 || abi.decode(r3, (bool))), "approve(value) failed");
    }

    /// @dev Safe transfer handling tokens with no return value or bool return.
    function _safeTransfer(IERC20 token, address to, uint256 value) internal {
        require(to != address(0), "Zero recipient");
        (bool s, bytes memory r) = address(token).call(
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
        require(s && (r.length == 0 || abi.decode(r, (bool))), "transfer failed");
    }

    /// Accept ETH
    receive() external payable {}
}

Read Contract

owner 0x8da5cb5b → address

Write Contract 3 functions

These functions modify contract state and require a wallet transaction to execute.

execute 0xe429ae13
address flashLoanProvider
address flashLoanToken
uint256 flashLoanAmount
bytes
tuple arbitrageParams
executeOperation 0x1b11d0ff
address asset
uint256 amount
uint256 premium
address initiator
bytes params
returns: bool
withdraw 0xf3fef3a3
address token
uint256 amount

Recent Transactions

This address has 1 on-chain transactions, but only 0.7% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →