Forkchoice Ethereum Mainnet

Address Contract Verified

Address 0x4dAEAf24Cd300a3DBc0caff3292B7840CDDa58eD
Balance 0 ETH
Nonce 1
Code Size 5826 bytes
Indexed Transactions 0 (1 on-chain, 0.8% indexed)
External Etherscan · Sourcify

Contract Bytecode

5826 bytes
0x608060405260043610610058575f3560e01c806301681a6214610063578063331782941461008b57806346904840146100b35780637de794e1146100dd578063bf333f2c146100f9578063e1a45218146101235761005f565b3661005f57005b5f80fd5b34801561006e575f80fd5b5061008960048036038101906100849190610f1c565b61014d565b005b348015610096575f80fd5b506100b160048036038101906100ac9190610fdb565b610399565b005b3480156100be575f80fd5b506100c7610795565b6040516100d4919061106e565b60405180910390f35b6100f760048036038101906100f29190611087565b6107b9565b005b348015610104575f80fd5b5061010d610af7565b60405161011a91906110f3565b60405180910390f35b34801561012e575f80fd5b50610137610afc565b60405161014491906110f3565b60405180910390f35b7f000000000000000000000000107f6eb7c3866c9cef5860952066e185e9383aba73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101d2576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036102d3575f7f000000000000000000000000107f6eb7c3866c9cef5860952066e185e9383aba73ffffffffffffffffffffffffffffffffffffffff164760405161024a90611139565b5f6040518083038185875af1925050503d805f8114610284576040519150601f19603f3d011682016040523d82523d5f602084013e610289565b606091505b50509050806102cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c4906111a7565b60405180910390fd5b50610396565b6103957f000000000000000000000000107f6eb7c3866c9cef5860952066e185e9383aba8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610330919061106e565b602060405180830381865afa15801561034b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036f91906111d9565b8373ffffffffffffffffffffffffffffffffffffffff16610b029092919063ffffffff16565b5b50565b60025f54036103d4576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f819055505f8403610414576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612710600a866104259190611231565b61042f919061129f565b90505f818661043e91906112cf565b905061046d3330888a73ffffffffffffffffffffffffffffffffffffffff16610b81909392919063ffffffff16565b6104b87f000000000000000000000000107f6eb7c3866c9cef5860952066e185e9383aba838973ffffffffffffffffffffffffffffffffffffffff16610b029092919063ffffffff16565b6104e385828973ffffffffffffffffffffffffffffffffffffffff16610c039092919063ffffffff16565b5f808673ffffffffffffffffffffffffffffffffffffffff16868660405161050c929190611334565b5f604051808303815f865af19150503d805f8114610545576040519150601f19603f3d011682016040523d82523d5f602084013e61054a565b606091505b50915091508161059157806040517fff9fa59500000000000000000000000000000000000000000000000000000000815260040161058891906113d6565b60405180910390fd5b6105bc875f8b73ffffffffffffffffffffffffffffffffffffffff16610c039092919063ffffffff16565b5f8973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105f6919061106e565b602060405180830381865afa158015610611573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063591906111d9565b90505f81111561066b5761066a33828c73ffffffffffffffffffffffffffffffffffffffff16610b029092919063ffffffff16565b5b5f4790505f811115610718575f3373ffffffffffffffffffffffffffffffffffffffff168260405161069c90611139565b5f6040518083038185875af1925050503d805f81146106d6576040519150601f19603f3d011682016040523d82523d5f602084013e6106db565b606091505b5050905080610716576040517ff0c49d4400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe41d09ea59537dbbeb0d52b509aff6db0348253cb4f871b7d2c163002576c0428d8d8a604051610779939291906113f6565b60405180910390a350505050505060015f819055505050505050565b7f000000000000000000000000107f6eb7c3866c9cef5860952066e185e9383aba81565b60025f54036107f4576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f819055505f3403610834576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612710600a346108459190611231565b61084f919061129f565b90505f813461085e91906112cf565b90505f7f000000000000000000000000107f6eb7c3866c9cef5860952066e185e9383aba73ffffffffffffffffffffffffffffffffffffffff16836040516108a590611139565b5f6040518083038185875af1925050503d805f81146108df576040519150601f19603f3d011682016040523d82523d5f602084013e6108e4565b606091505b505090508061091f576040517f0d1ac02a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808773ffffffffffffffffffffffffffffffffffffffff16848888604051610949929190611334565b5f6040518083038185875af1925050503d805f8114610983576040519150601f19603f3d011682016040523d82523d5f602084013e610988565b606091505b5091509150816109cf57806040517fff9fa5950000000000000000000000000000000000000000000000000000000081526004016109c691906113d6565b60405180910390fd5b5f4790505f811115610a7c575f3373ffffffffffffffffffffffffffffffffffffffff1682604051610a0090611139565b5f6040518083038185875af1925050503d805f8114610a3a576040519150601f19603f3d011682016040523d82523d5f602084013e610a3f565b606091505b5050905080610a7a576040517ff0c49d4400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe41d09ea59537dbbeb0d52b509aff6db0348253cb4f871b7d2c163002576c0425f348a604051610add939291906113f6565b60405180910390a350505050505060015f81905550505050565b600a81565b61271081565b610b7c838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610b3592919061142b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610d10565b505050565b610bfd848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610bb693929190611452565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610d10565b50505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b38484604051602401610c3392919061142b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050610c818482610e1d565b610d0a57610cff848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b3865f604051602401610cb89291906114c9565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610d10565b610d098482610d10565b5b50505050565b5f808373ffffffffffffffffffffffffffffffffffffffff1683604051610d379190611520565b5f604051808303815f865af19150503d805f8114610d70576040519150601f19603f3d011682016040523d82523d5f602084013e610d75565b606091505b509150915081610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190611580565b60405180910390fd5b5f81511115610e175780806020019051810190610dd791906115d3565b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d9061166e565b60405180910390fd5b5b50505050565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1684604051610e459190611520565b5f604051808303815f865af19150503d805f8114610e7e576040519150601f19603f3d011682016040523d82523d5f602084013e610e83565b606091505b5091509150818015610eb057505f81511480610eaf575080806020019051810190610eae91906115d3565b5b5b9250505092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610eeb82610ec2565b9050919050565b610efb81610ee1565b8114610f05575f80fd5b50565b5f81359050610f1681610ef2565b92915050565b5f60208284031215610f3157610f30610eba565b5b5f610f3e84828501610f08565b91505092915050565b5f819050919050565b610f5981610f47565b8114610f63575f80fd5b50565b5f81359050610f7481610f50565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112610f9b57610f9a610f7a565b5b8235905067ffffffffffffffff811115610fb857610fb7610f7e565b5b602083019150836001820283011115610fd457610fd3610f82565b5b9250929050565b5f805f805f60808688031215610ff457610ff3610eba565b5b5f61100188828901610f08565b955050602061101288828901610f66565b945050604061102388828901610f08565b935050606086013567ffffffffffffffff81111561104457611043610ebe565b5b61105088828901610f86565b92509250509295509295909350565b61106881610ee1565b82525050565b5f6020820190506110815f83018461105f565b92915050565b5f805f6040848603121561109e5761109d610eba565b5b5f6110ab86828701610f08565b935050602084013567ffffffffffffffff8111156110cc576110cb610ebe565b5b6110d886828701610f86565b92509250509250925092565b6110ed81610f47565b82525050565b5f6020820190506111065f8301846110e4565b92915050565b5f81905092915050565b50565b5f6111245f8361110c565b915061112f82611116565b5f82019050919050565b5f61114382611119565b9150819050919050565b5f82825260208201905092915050565b7f455448207377656570206661696c6564000000000000000000000000000000005f82015250565b5f61119160108361114d565b915061119c8261115d565b602082019050919050565b5f6020820190508181035f8301526111be81611185565b9050919050565b5f815190506111d381610f50565b92915050565b5f602082840312156111ee576111ed610eba565b5b5f6111fb848285016111c5565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61123b82610f47565b915061124683610f47565b925082820261125481610f47565b9150828204841483151761126b5761126a611204565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6112a982610f47565b91506112b483610f47565b9250826112c4576112c3611272565b5b828204905092915050565b5f6112d982610f47565b91506112e483610f47565b92508282039050818111156112fc576112fb611204565b5b92915050565b828183375f83830152505050565b5f61131b838561110c565b9350611328838584611302565b82840190509392505050565b5f611340828486611310565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611383578082015181840152602081019050611368565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6113a88261134c565b6113b28185611356565b93506113c2818560208601611366565b6113cb8161138e565b840191505092915050565b5f6020820190508181035f8301526113ee818461139e565b905092915050565b5f6060820190506114095f83018661105f565b61141660208301856110e4565b61142360408301846110e4565b949350505050565b5f60408201905061143e5f83018561105f565b61144b60208301846110e4565b9392505050565b5f6060820190506114655f83018661105f565b611472602083018561105f565b61147f60408301846110e4565b949350505050565b5f819050919050565b5f819050919050565b5f6114b36114ae6114a984611487565b611490565b610f47565b9050919050565b6114c381611499565b82525050565b5f6040820190506114dc5f83018561105f565b6114e960208301846114ba565b9392505050565b5f6114fa8261134c565b611504818561110c565b9350611514818560208601611366565b80840191505092915050565b5f61152b82846114f0565b915081905092915050565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65645f82015250565b5f61156a60208361114d565b915061157582611536565b602082019050919050565b5f6020820190508181035f8301526115978161155e565b9050919050565b5f8115159050919050565b6115b28161159e565b81146115bc575f80fd5b50565b5f815190506115cd816115a9565b92915050565b5f602082840312156115e8576115e7610eba565b5b5f6115f5848285016115bf565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f611658602a8361114d565b9150611663826115fe565b604082019050919050565b5f6020820190508181035f8301526116858161164c565b905091905056fea2646970667358221220d728cf1a1125f7136adf18c5a4fb50161281883b39600ef1209050133d3f1d2964736f6c63430008140033

Verified Source Code Full Match

Compiler: v0.8.20+commit.a1b79de6 EVM: shanghai Optimization: No
TeraSwapFeeCollector.sol 185 lines
// SPDX-License-Identifier: MIT
// TeraSwapFeeCollector — flattened for Remix deployment
// OpenZeppelin Contracts v5.0 (minimal excerpts)
pragma solidity ^0.8.20;

// ═══════════════════════════════════════════════════════════
//  OpenZeppelin: IERC20
// ═══════════════════════════════════════════════════════════
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// ═══════════════════════════════════════════════════════════
//  OpenZeppelin: SafeERC20
// ═══════════════════════════════════════════════════════════
library SafeERC20 {
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }

    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool)));
    }
}

// ═══════════════════════════════════════════════════════════
//  OpenZeppelin: ReentrancyGuard
// ═══════════════════════════════════════════════════════════
abstract contract ReentrancyGuard {
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;
    uint256 private _status;

    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    modifier nonReentrant() {
        if (_status == ENTERED) revert ReentrancyGuardReentrantCall();
        _status = ENTERED;
        _;
        _status = NOT_ENTERED;
    }
}

// ═══════════════════════════════════════════════════════════
//  TeraSwapFeeCollector
// ═══════════════════════════════════════════════════════════

/**
 * @title TeraSwapFeeCollector
 * @notice Universal fee collection proxy for TeraSwap DEX meta-aggregator.
 *         Collects 0.1% (10 bps) on every swap, forwards rest to DEX router.
 */
contract TeraSwapFeeCollector is ReentrancyGuard {
    using SafeERC20 for IERC20;

    address public immutable feeRecipient;
    uint256 public constant FEE_BPS = 10;           // 0.1%
    uint256 public constant BPS_DENOMINATOR = 10_000;

    event SwapWithFee(
        address indexed user,
        address indexed router,
        address tokenIn,
        uint256 totalAmount,
        uint256 feeAmount
    );

    error ZeroAddress();
    error ZeroAmount();
    error FeeFailed();
    error SwapFailed(bytes reason);
    error RefundFailed();
    error NotAuthorized();

    constructor(address _feeRecipient) {
        if (_feeRecipient == address(0)) revert ZeroAddress();
        feeRecipient = _feeRecipient;
    }

    /// @notice Swap native ETH with fee collection
    function swapETHWithFee(
        address router,
        bytes calldata routerData
    ) external payable nonReentrant {
        if (msg.value == 0) revert ZeroAmount();

        uint256 fee = (msg.value * FEE_BPS) / BPS_DENOMINATOR;
        uint256 netValue = msg.value - fee;

        (bool feeOk, ) = feeRecipient.call{value: fee}("");
        if (!feeOk) revert FeeFailed();

        (bool swapOk, bytes memory result) = router.call{value: netValue}(routerData);
        if (!swapOk) revert SwapFailed(result);

        uint256 remaining = address(this).balance;
        if (remaining > 0) {
            (bool refundOk, ) = msg.sender.call{value: remaining}("");
            if (!refundOk) revert RefundFailed();
        }

        emit SwapWithFee(msg.sender, router, address(0), msg.value, fee);
    }

    /// @notice Swap ERC-20 tokens with fee collection
    function swapTokenWithFee(
        address token,
        uint256 totalAmount,
        address router,
        bytes calldata routerData
    ) external nonReentrant {
        if (totalAmount == 0) revert ZeroAmount();

        uint256 fee = (totalAmount * FEE_BPS) / BPS_DENOMINATOR;
        uint256 netAmount = totalAmount - fee;

        IERC20(token).safeTransferFrom(msg.sender, address(this), totalAmount);
        IERC20(token).safeTransfer(feeRecipient, fee);

        IERC20(token).forceApprove(router, netAmount);
        (bool ok, bytes memory result) = router.call(routerData);
        if (!ok) revert SwapFailed(result);

        IERC20(token).forceApprove(router, 0);

        uint256 tokenBalance = IERC20(token).balanceOf(address(this));
        if (tokenBalance > 0) {
            IERC20(token).safeTransfer(msg.sender, tokenBalance);
        }

        uint256 ethBalance = address(this).balance;
        if (ethBalance > 0) {
            (bool refundOk, ) = msg.sender.call{value: ethBalance}("");
            if (!refundOk) revert RefundFailed();
        }

        emit SwapWithFee(msg.sender, router, token, totalAmount, fee);
    }

    /// @notice Rescue stuck funds (only feeRecipient)
    function sweep(address token) external {
        if (msg.sender != feeRecipient) revert NotAuthorized();
        if (token == address(0)) {
            (bool ok, ) = feeRecipient.call{value: address(this).balance}("");
            require(ok, "ETH sweep failed");
        } else {
            IERC20(token).safeTransfer(
                feeRecipient,
                IERC20(token).balanceOf(address(this))
            );
        }
    }

    receive() external payable {}
}

Read Contract

BPS_DENOMINATOR 0xe1a45218 → uint256
FEE_BPS 0xbf333f2c → uint256
feeRecipient 0x46904840 → address

Write Contract 3 functions

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

swapETHWithFee 0x7de794e1
address router
bytes routerData
swapTokenWithFee 0x33178294
address token
uint256 totalAmount
address router
bytes routerData
sweep 0x01681a62
address token

Recent Transactions

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