Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0x90cE98B1Fa6BA1e958f5850Cd54404a35Fb4f8a8
Balance 0.010000 ETH ($19.49)
Nonce 1
Code Size 7726 bytes
Indexed Transactions 0 (1 on-chain, 1.6% indexed)
External Etherscan · Sourcify

Contract Bytecode

7726 bytes
Copy Bytecode
0x608060405260043610610094575f3560e01c80638da5cb5b116100585780638da5cb5b146101765780639cd441da146101a05780639d7de6b3146101bc578063a98ad46c146101e4578063f2fde38b1461020e5761009b565b80630902f1ac1461009f57806338d07436146100ca5780634312ae31146100f2578063443cb4bc146101225780635a76f25e1461014c5761009b565b3661009b57005b5f80fd5b3480156100aa575f80fd5b506100b3610236565b6040516100c19291906112ca565b60405180910390f35b3480156100d5575f80fd5b506100f060048036038101906100eb9190611354565b610246565b005b61010c60048036038101906101079190611392565b610571565b60405161011991906113e2565b60405180910390f35b34801561012d575f80fd5b50610136610b43565b60405161014391906113e2565b60405180910390f35b348015610157575f80fd5b50610160610b49565b60405161016d91906113e2565b60405180910390f35b348015610181575f80fd5b5061018a610b4f565b604051610197919061143a565b60405180910390f35b6101ba60048036038101906101b59190611453565b610b72565b005b3480156101c7575f80fd5b506101e260048036038101906101dd9190611453565b610def565b005b3480156101ef575f80fd5b506101f86110d7565b60405161020591906114ec565b60405180910390f35b348015610219575f80fd5b50610234600480360381019061022f919061152f565b6110fc565b005b5f80600254600354915091509091565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ca906115b4565b60405180910390fd5b80156103e45760025482111561031e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103159061161c565b60405180910390fd5b8160025f82825461032f9190611667565b925050819055505f3373ffffffffffffffffffffffffffffffffffffffff168360405161035b906116c7565b5f6040518083038185875af1925050503d805f8114610395576040519150601f19603f3d011682016040523d82523d5f602084013e61039a565b606091505b50509050806103de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d590611725565b60405180910390fd5b5061051d565b600354821115610429576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104209061178d565b60405180910390fd5b8160035f82825461043a9190611667565b9250508190555060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b815260040161049d9291906117ab565b6020604051808303815f875af11580156104b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104dd91906117e6565b61051c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105139061185b565b60405180910390fd5b5b3373ffffffffffffffffffffffffffffffffffffffff167f06e0c61e7e9f4912ee1f3ce060b59207b98f9a232d711462af3166aeeed1250a8383604051610565929190611888565b60405180910390a25050565b5f8084116105b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ab906118f9565b60405180910390fd5b82156107b1578334146105fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f390611961565b60405180910390fd5b836002541015610641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610638906119c9565b60405180910390fd5b6002546003548561065291906119e7565b61065c9190611a55565b9050818110156106a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069890611acf565b60405180910390fd5b8360025f8282546106b29190611aed565b925050819055508060035f8282546106ca9190611667565b9250508190555060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161072d9291906117ab565b6020604051808303815f875af1158015610749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076d91906117e6565b6107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a39061185b565b60405180910390fd5b610aea565b8360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161080e929190611b20565b602060405180830381865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190611b5b565b101561088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088590611bd0565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b81526004016108ec93929190611bee565b6020604051808303815f875af1158015610908573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092c91906117e6565b61096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109629061185b565b60405180910390fd5b8360035410156109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790611c6d565b60405180910390fd5b600354600254856109c191906119e7565b6109cb9190611a55565b905081811015610a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0790611acf565b60405180910390fd5b8360035f828254610a219190611aed565b925050819055508060025f828254610a399190611667565b925050819055505f3373ffffffffffffffffffffffffffffffffffffffff1682604051610a65906116c7565b5f6040518083038185875af1925050503d805f8114610a9f576040519150601f19603f3d011682016040523d82523d5f602084013e610aa4565b606091505b5050905080610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90611725565b60405180910390fd5b505b3373ffffffffffffffffffffffffffffffffffffffff167fcc65e4d9060ece2ecf63011ac580550b04c8daeba63fac4dfe8669353cd88859858386604051610b3493929190611c8b565b60405180910390a29392505050565b60025481565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906115b4565b60405180910390fd5b5f82118015610c0d57505f81115b610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390611d0a565b60405180910390fd5b813414610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590611961565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610cec93929190611bee565b6020604051808303815f875af1158015610d08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2c91906117e6565b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d629061185b565b60405180910390fd5b8160025f828254610d7c9190611aed565b925050819055508060035f828254610d949190611aed565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fac1d76749e5447b7b16f5ab61447e1bd502f3bb4807af3b28e620d1700a6ee458383604051610de39291906112ca565b60405180910390a25050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e73906115b4565b60405180910390fd5b6002548211158015610e9057506003548111155b610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec690611d72565b60405180910390fd5b8160025f828254610ee09190611667565b925050819055508060035f828254610ef89190611667565b925050819055505f3373ffffffffffffffffffffffffffffffffffffffff1683604051610f24906116c7565b5f6040518083038185875af1925050503d805f8114610f5e576040519150601f19603f3d011682016040523d82523d5f602084013e610f63565b606091505b5050905080610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90611725565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b81526004016110039291906117ab565b6020604051808303815f875af115801561101f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104391906117e6565b611082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110799061185b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f96cd817c6329656790ef8fba7675405193677d39619571282f5e21f3a98cd05984846040516110ca9291906112ca565b60405180910390a2505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611180906115b4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ee90611dda565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f819050919050565b6112c4816112b2565b82525050565b5f6040820190506112dd5f8301856112bb565b6112ea60208301846112bb565b9392505050565b5f80fd5b6112fe816112b2565b8114611308575f80fd5b50565b5f81359050611319816112f5565b92915050565b5f8115159050919050565b6113338161131f565b811461133d575f80fd5b50565b5f8135905061134e8161132a565b92915050565b5f806040838503121561136a576113696112f1565b5b5f6113778582860161130b565b925050602061138885828601611340565b9150509250929050565b5f805f606084860312156113a9576113a86112f1565b5b5f6113b68682870161130b565b93505060206113c786828701611340565b92505060406113d88682870161130b565b9150509250925092565b5f6020820190506113f55f8301846112bb565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611424826113fb565b9050919050565b6114348161141a565b82525050565b5f60208201905061144d5f83018461142b565b92915050565b5f8060408385031215611469576114686112f1565b5b5f6114768582860161130b565b92505060206114878582860161130b565b9150509250929050565b5f819050919050565b5f6114b46114af6114aa846113fb565b611491565b6113fb565b9050919050565b5f6114c58261149a565b9050919050565b5f6114d6826114bb565b9050919050565b6114e6816114cc565b82525050565b5f6020820190506114ff5f8301846114dd565b92915050565b61150e8161141a565b8114611518575f80fd5b50565b5f8135905061152981611505565b92915050565b5f60208284031215611544576115436112f1565b5b5f6115518482850161151b565b91505092915050565b5f82825260208201905092915050565b7f4e6f742074686520636f6e7472616374206f776e6572000000000000000000005f82015250565b5f61159e60168361155a565b91506115a98261156a565b602082019050919050565b5f6020820190508181035f8301526115cb81611592565b9050919050565b7f4e6f7420656e6f756768204554482072657365727665730000000000000000005f82015250565b5f61160660178361155a565b9150611611826115d2565b602082019050919050565b5f6020820190508181035f830152611633816115fa565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611671826112b2565b915061167c836112b2565b92508282039050818111156116945761169361163a565b5b92915050565b5f81905092915050565b50565b5f6116b25f8361169a565b91506116bd826116a4565b5f82019050919050565b5f6116d1826116a7565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f61170f60138361155a565b915061171a826116db565b602082019050919050565b5f6020820190508181035f83015261173c81611703565b9050919050565b7f4e6f7420656e6f756768205553445420726573657276657300000000000000005f82015250565b5f61177760188361155a565b915061178282611743565b602082019050919050565b5f6020820190508181035f8301526117a48161176b565b9050919050565b5f6040820190506117be5f83018561142b565b6117cb60208301846112bb565b9392505050565b5f815190506117e08161132a565b92915050565b5f602082840312156117fb576117fa6112f1565b5b5f611808848285016117d2565b91505092915050565b7f55534454207472616e73666572206661696c65640000000000000000000000005f82015250565b5f61184560148361155a565b915061185082611811565b602082019050919050565b5f6020820190508181035f83015261187281611839565b9050919050565b6118828161131f565b82525050565b5f60408201905061189b5f8301856112bb565b6118a86020830184611879565b9392505050565b7f416d6f756e74206d7573742062652067726561746572207468616e20300000005f82015250565b5f6118e3601d8361155a565b91506118ee826118af565b602082019050919050565b5f6020820190508181035f830152611910816118d7565b9050919050565b7f45544820616d6f756e74206d69736d61746368000000000000000000000000005f82015250565b5f61194b60138361155a565b915061195682611917565b602082019050919050565b5f6020820190508181035f8301526119788161193f565b9050919050565b7f4e6f7420656e6f75676820455448206c697175696469747900000000000000005f82015250565b5f6119b360188361155a565b91506119be8261197f565b602082019050919050565b5f6020820190508181035f8301526119e0816119a7565b9050919050565b5f6119f1826112b2565b91506119fc836112b2565b9250828202611a0a816112b2565b91508282048414831517611a2157611a2061163a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611a5f826112b2565b9150611a6a836112b2565b925082611a7a57611a79611a28565b5b828204905092915050565b7f536c6970706167652065786365656465640000000000000000000000000000005f82015250565b5f611ab960118361155a565b9150611ac482611a85565b602082019050919050565b5f6020820190508181035f830152611ae681611aad565b9050919050565b5f611af7826112b2565b9150611b02836112b2565b9250828201905080821115611b1a57611b1961163a565b5b92915050565b5f604082019050611b335f83018561142b565b611b40602083018461142b565b9392505050565b5f81519050611b55816112f5565b92915050565b5f60208284031215611b7057611b6f6112f1565b5b5f611b7d84828501611b47565b91505092915050565b7f5553445420616c6c6f77616e636520746f6f206c6f77000000000000000000005f82015250565b5f611bba60168361155a565b9150611bc582611b86565b602082019050919050565b5f6020820190508181035f830152611be781611bae565b9050919050565b5f606082019050611c015f83018661142b565b611c0e602083018561142b565b611c1b60408301846112bb565b949350505050565b7f4e6f7420656e6f7567682055534454206c6971756964697479000000000000005f82015250565b5f611c5760198361155a565b9150611c6282611c23565b602082019050919050565b5f6020820190508181035f830152611c8481611c4b565b9050919050565b5f606082019050611c9e5f8301866112bb565b611cab60208301856112bb565b611cb86040830184611879565b949350505050565b7f416d6f756e7473206d7573742062652067726561746572207468616e203000005f82015250565b5f611cf4601e8361155a565b9150611cff82611cc0565b602082019050919050565b5f6020820190508181035f830152611d2181611ce8565b9050919050565b7f4e6f7420656e6f756768207265736572766573000000000000000000000000005f82015250565b5f611d5c60138361155a565b9150611d6782611d28565b602082019050919050565b5f6020820190508181035f830152611d8981611d50565b9050919050565b7f4e6577206f776e65722063616e6e6f74206265207a65726f20616464726573735f82015250565b5f611dc460208361155a565b9150611dcf82611d90565b602082019050919050565b5f6020820190508181035f830152611df181611db8565b905091905056fea2646970667358221220b9fdc28252c412310f3e0299c29f89b82af0e316b4a2f16a6db2f2a504d6333d64736f6c634300081a0033

Verified Source Code Partial Match

Compiler: v0.8.26+commit.8a97fa7a EVM: cancun Optimization: No
AMM.sol 123 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20 {
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
}

contract AMM {
    address public owner;
    IERC20 public usdtToken;
    
    uint256 public reserve0; // ETH Reserve
    uint256 public reserve1; // USDT Reserve

    event LiquidityAdded(address indexed user, uint256 amount0, uint256 amount1);
    event LiquidityRemoved(address indexed user, uint256 amount0, uint256 amount1);
    event Swap(address indexed user, uint256 amountIn, uint256 amountOut, bool isEthToUsdt);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event Withdrawal(address indexed user, uint256 amount, bool isETH);

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

    constructor(address _usdtToken) {
        require(_usdtToken != address(0), "Invalid USDT token address");
        owner = msg.sender;
        usdtToken = IERC20(_usdtToken);
        emit OwnershipTransferred(address(0), owner);
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "New owner cannot be zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function addLiquidity(uint256 amount0, uint256 amount1) external payable onlyOwner {
        require(amount0 > 0 && amount1 > 0, "Amounts must be greater than 0");
        require(msg.value == amount0, "ETH amount mismatch");
        require(usdtToken.transferFrom(msg.sender, address(this), amount1), "USDT transfer failed");
        
        reserve0 += amount0;
        reserve1 += amount1;
        emit LiquidityAdded(msg.sender, amount0, amount1);
    }

    function removeLiquidity(uint256 amount0, uint256 amount1) external onlyOwner {
        require(amount0 <= reserve0 && amount1 <= reserve1, "Not enough reserves");

        // Update reserves before transfers (reentrancy protection)
        reserve0 -= amount0;
        reserve1 -= amount1;

        // Transfer ETH safely
        (bool sent, ) = msg.sender.call{value: amount0}("");
        require(sent, "ETH transfer failed");

        require(usdtToken.transfer(msg.sender, amount1), "USDT transfer failed");
        emit LiquidityRemoved(msg.sender, amount0, amount1);
    }

    function getReserves() external view returns (uint256, uint256) {
        return (reserve0, reserve1);
    }

    function swap(uint256 amountIn, bool isEthToUsdt, uint256 minAmountOut) external payable returns (uint256 amountOut) {
        require(amountIn > 0, "Amount must be greater than 0");

        if (isEthToUsdt) {
            require(msg.value == amountIn, "ETH amount mismatch");
            require(reserve0 >= amountIn, "Not enough ETH liquidity");

            amountOut = (amountIn * reserve1) / reserve0;
            require(amountOut >= minAmountOut, "Slippage exceeded");

            // Update reserves first
            reserve0 += amountIn;
            reserve1 -= amountOut;

            require(usdtToken.transfer(msg.sender, amountOut), "USDT transfer failed");
        } else {
            require(usdtToken.allowance(msg.sender, address(this)) >= amountIn, "USDT allowance too low");
            require(usdtToken.transferFrom(msg.sender, address(this), amountIn), "USDT transfer failed");
            require(reserve1 >= amountIn, "Not enough USDT liquidity");

            amountOut = (amountIn * reserve0) / reserve1;
            require(amountOut >= minAmountOut, "Slippage exceeded");

            // Update reserves first
            reserve1 += amountIn;
            reserve0 -= amountOut;

            (bool sent, ) = msg.sender.call{value: amountOut}("");
            require(sent, "ETH transfer failed");
        }

        emit Swap(msg.sender, amountIn, amountOut, isEthToUsdt);
        return amountOut;
    }

    function withdraw(uint256 amount, bool isETH) external onlyOwner {
        if (isETH) {
            require(amount <= reserve0, "Not enough ETH reserves");
            reserve0 -= amount;

            (bool sent, ) = msg.sender.call{value: amount}("");
            require(sent, "ETH transfer failed");
        } else {
            require(amount <= reserve1, "Not enough USDT reserves");
            reserve1 -= amount;
            require(usdtToken.transfer(msg.sender, amount), "USDT transfer failed");
        }
        emit Withdrawal(msg.sender, amount, isETH);
    }

    receive() external payable {}
}

Read Contract

getReserves 0x0902f1ac → uint256, uint256
owner 0x8da5cb5b → address
reserve0 0x443cb4bc → uint256
reserve1 0x5a76f25e → uint256
usdtToken 0xa98ad46c → address

Write Contract 5 functions

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

addLiquidity 0x9cd441da
uint256 amount0
uint256 amount1
removeLiquidity 0x9d7de6b3
uint256 amount0
uint256 amount1
swap 0x4312ae31
uint256 amountIn
bool isEthToUsdt
uint256 minAmountOut
returns: uint256
transferOwnership 0xf2fde38b
address newOwner
withdraw 0x38d07436
uint256 amount
bool isETH

Recent Transactions

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