ETH Price: $2,064.43 (+3.25%)

Transaction Decoder

Block:
12561409 at Jun-03-2021 11:56:30 AM +UTC
Transaction Fee:
0.002778192 ETH $5.74
Gas Used:
102,896 Gas / 27 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
0x5096704F...8f90Ae54F
0xa80f2C8f...e72c45d4C
(Huobi Mining Pool 2)
206.167013598921019741 Eth206.169791790921019741 Eth0.002778192
0xC7781bf4...C1d7BA6b3
(Unique Utility: Deployer)
156.793256676354622043 Eth156.853256676354622043 Eth0.06
0xeCd4999D...0a8f9c5bC
0.0714 Eth
Nonce: 0
0.008621808 Eth
Nonce: 1
0.062778192

Execution Trace

ETH 0.06 UNQTpresale.CALL( )
  • UniqueUtilityToken.transfer( to=0xeCd4999D57760db48f54047608123A60a8f9c5bC, tokens=1140000000000000000000 ) => ( success=True )
  • ETH 0.06 Unique Utility: Deployer.CALL( )
    File 1 of 2: UNQTpresale
    pragma solidity ^0.6.0;
    
    // SPDX-License-Identifier: MIT
    
    /**
     * @title SafeMath
     * @dev Math operations with safety checks that throw on error
     *
    */
    
    library SafeMath {
      function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
          return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
      }
    
      function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
      }
    
      function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
      }
    
      function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
      }
    
      function ceil(uint a, uint m) internal pure returns (uint r) {
        return (a + m - 1) / m * m;
      }
    }
    
    // ----------------------------------------------------------------------------
    // Owned contract
    // ----------------------------------------------------------------------------
    contract Owned {
        address payable public owner;
    
        event OwnershipTransferred(address indexed _from, address indexed _to);
    
        constructor() public {
            owner = msg.sender;
        }
    
        modifier onlyOwner {
            require(msg.sender == owner);
            _;
        }
    
        function transferOwnership(address payable _newOwner) public onlyOwner {
            owner = _newOwner;
            emit OwnershipTransferred(msg.sender, _newOwner);
        }
    }
    
    
    // ----------------------------------------------------------------------------
    // ERC Token Standard #20 Interface
    // ----------------------------------------------------------------------------
    interface IToken {
        function transfer(address to, uint256 tokens) external returns (bool success);
        function burnTokens(uint256 _amount) external;
        function balanceOf(address tokenOwner) external view returns (uint256 balance);
    }
    
    
    contract UNQTpresale is Owned {
        using SafeMath for uint256;
        
        bool public isPresaleOpen;
        
        //@dev ERC20 token address and decimals
        address public tokenAddress;
        uint256 public tokenDecimals = 18;
        
        //@dev amount of tokens per ether 1000 indicates 1 token per eth
        uint256 public tokenRatePerEth = 1000_00;
        //@dev decimal for tokenRatePerEth,
        //2 means if you want 100 tokens per eth then set the rate as 100 + number of rateDecimals i.e => 10000
        uint256 public rateDecimals = 2;
        
        //@dev max and min token buy limit per account
        uint256 public minEthLimit = 1 finney; // 0.00100000 ETH
        uint256 public maxEthLimit = 5 ether;
        
        mapping(address => uint256) public usersInvestments;
        
        constructor() public {
            owner = msg.sender;
        }
        
        function startPresale() external onlyOwner{
            require(!isPresaleOpen, "Presale is open");
            
            isPresaleOpen = true;
        }
        
        function closePresale() external onlyOwner{
            require(isPresaleOpen, "Presale is not open yet.");
            
            isPresaleOpen = false;
        }
        
        function setTokenAddress(address token) external onlyOwner {
            require(tokenAddress == address(0), "Token address is already set.");
            require(token != address(0), "Token address zero not allowed.");
            
            tokenAddress = token;
        }
        
        function setTokenDecimals(uint256 decimals) external onlyOwner {
           tokenDecimals = decimals;
        }
        
        function setMinEthLimit(uint256 amount) external onlyOwner {
            minEthLimit = amount;    
        }
        
        function setMaxEthLimit(uint256 amount) external onlyOwner {
            maxEthLimit = amount;    
        }
        
        function setTokenRatePerEth(uint256 rate) external onlyOwner {
            tokenRatePerEth = rate;
        }
        
        function setRateDecimals(uint256 decimals) external onlyOwner {
            rateDecimals = decimals;
        }
        
        receive() external payable{
            require(isPresaleOpen, "Presale is not open.");
            require(
                    usersInvestments[msg.sender].add(msg.value) <= maxEthLimit
                    && usersInvestments[msg.sender].add(msg.value) >= minEthLimit,
                    "Installment Invalid."
                );
            
            //@dev calculate the amount of tokens to transfer for the given eth
            uint256 tokenAmount = getTokensPerEth(msg.value);
            
            require(IToken(tokenAddress).transfer(msg.sender, tokenAmount), "Insufficient balance of presale contract!");
            
            usersInvestments[msg.sender] = usersInvestments[msg.sender].add(msg.value);
            
            //@dev send received funds to the owner
            owner.transfer(msg.value);
        }
        
        function getTokensPerEth(uint256 amount) internal view returns(uint256) {
            return amount.mul(tokenRatePerEth).div(
                10**(uint256(18).sub(tokenDecimals).add(rateDecimals))
                );
        }
        
        function burnUnsoldTokens() external onlyOwner {
            require(!isPresaleOpen, "You cannot burn tokens untitl the presale is closed.");
            
            IToken(tokenAddress).burnTokens(IToken(tokenAddress).balanceOf(address(this)));   
        }
        
        function getUnsoldTokens() external onlyOwner {
            require(!isPresaleOpen, "You cannot get tokens until the presale is closed.");
            
            IToken(tokenAddress).transfer(owner, IToken(tokenAddress).balanceOf(address(this)) );
        }
    }

    File 2 of 2: UniqueUtilityToken
    pragma solidity 0.8.3;
    
    // SPDX-License-Identifier: MIT
    
    // ----------------------------------------------------------------------------
    // Safe maths
    // ----------------------------------------------------------------------------
    
    contract SafeMath {
        function safeAdd(uint a, uint b) public pure returns (uint c) {
            c = a + b;
            require(c >= a);
        }
        function safeSub(uint a, uint b) public pure returns (uint c) {
            require(b <= a);
            c = a - b;
        }
        function safeMul(uint a, uint b) public pure returns (uint c) {
            c = a * b;
            require(a == 0 || c / a == b);
        }
        function safeDiv(uint a, uint b) public pure returns (uint c) {
            require(b > 0);
            c = a / b;
        }
    }
    
    
    // ----------------------------------------------------------------------------
    // ERC Token Standard #20 Interface
    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
    // ----------------------------------------------------------------------------
    
    interface IERC20 {
        /**
         * @dev Returns the amount of tokens in existence.
         */
        function totalSupply() external view returns (uint256);
    
        function balanceOf(address account) external view returns (uint256);
    
        function transfer(address recipient, uint256 amount) external returns (bool);
    
        function allowance(address owner, address spender) external view returns (uint256);
        
        function approve(address spender, uint256 amount) external returns (bool);
    
        function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    
        event Transfer(address indexed from, address indexed to, uint256 value);
    
        event Approval(address indexed owner, address indexed spender, uint256 value);
    }
    
    // ----------------------------------------------------------------------------
    // Contract function to receive approval and execute function in one call
    //
    // Borrowed from MiniMeToken
    // ----------------------------------------------------------------------------
    abstract contract ApproveAndCallFallBack {
        function receiveApproval(address from, uint256 tokens, address token, bytes memory data) virtual public;
    }
    
    
    // ----------------------------------------------------------------------------
    // Owned contract
    // ----------------------------------------------------------------------------
    contract Owned {
        address public owner;
        address public newOwner;
    
        event OwnershipTransferred(address indexed _from, address indexed _to);
    
        constructor()  {
            owner = 0xC7781bf45EE2C64AA6E330Bd0e35522C1d7BA6b3;
        }
    
        modifier onlyOwner {
            require(msg.sender == owner);
            _;
        }
    
        function transferOwnership(address _newOwner) public onlyOwner {
            newOwner = _newOwner;
        }
        function acceptOwnership() public {
            require(msg.sender == newOwner);
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            newOwner = address(0);
        }
    }
    
    
    // ----------------------------------------------------------------------------
    // ERC20 Token, with the addition of symbol, name and decimals and assisted
    // token transfers
    // ----------------------------------------------------------------------------
    
    contract UniqueUtilityToken is IERC20, Owned, SafeMath {
        string public symbol;
        string public  name;
        uint8 public decimals;
        uint public _totalSupply;
    
        mapping(address => uint) balances;
        mapping(address => mapping(address => uint)) allowed;
    
    
        // ------------------------------------------------------------------------
        // Constructor
        // ------------------------------------------------------------------------
        
     constructor() {
            name = "Unique Utility Token";
            symbol = "UNQT";
            decimals = 18;
            _totalSupply = 100000000e18;         // 100,000,000 UNQT
            address owner = owner;
            balances[owner] = _totalSupply;
            emit Transfer(address(0), owner, _totalSupply);
        }
    
    
        // ------------------------------------------------------------------------
        // Total supply
        // ------------------------------------------------------------------------
        function totalSupply() public view override returns (uint) {
            return _totalSupply;
        }
    
    
        // ------------------------------------------------------------------------
        // Get the token balance for account tokenOwner
        // ------------------------------------------------------------------------
        function balanceOf(address tokenOwner) public view override returns (uint balance) {
            return balances[tokenOwner];
        }
    
    
        // ------------------------------------------------------------------------
        // Transfer the balance from token owner's account to to account
        // - Owner's account must have sufficient balance to transfer
        // - 0 value transfers are allowed
        // ------------------------------------------------------------------------
        function transfer(address to, uint tokens) public override returns (bool success) {
            balances[msg.sender] = safeSub(balances[msg.sender], tokens);
            balances[to] = safeAdd(balances[to], tokens);
            Transfer(msg.sender, to, tokens);
            return true;
        }
    
    
        // ------------------------------------------------------------------------
        // Token owner can approve for spender to transferFrom(...) tokens
        // from the token owner's account
        //
        // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
        // recommends that there are no checks for the approval double-spend attack
        // as this should be implemented in user interfaces 
        // ------------------------------------------------------------------------
        function approve(address spender, uint tokens) public virtual override returns (bool success) {
            allowed[msg.sender][spender] = tokens;
            Approval(msg.sender, spender, tokens);
            return true;
        }
    
        // ------------------------------------------------------------------------
        // Transfer tokens from the from account to the to account
        // 
        // The calling account must already have sufficient tokens approve(...)-d
        // for spending from the from account and
        // - From account must have sufficient balance to transfer
        // - Spender must have sufficient allowance to transfer
        // - 0 value transfers are allowed
        // ------------------------------------------------------------------------
        function transferFrom(address from, address to, uint tokens) public virtual override returns (bool success) {
            balances[from] = safeSub(balances[from], tokens);
            allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], tokens);
            balances[to] = safeAdd(balances[to], tokens);
            Transfer(from, to, tokens);
            return true;
        }
    
    
        // ------------------------------------------------------------------------
        // Returns the amount of tokens approved by the owner that can be
        // transferred to the spender's account
        // ------------------------------------------------------------------------
        function allowance(address tokenOwner, address spender) public view virtual override  returns (uint remaining) {
            return allowed[tokenOwner][spender];
        }
    
    
        // ------------------------------------------------------------------------
        // Token owner can approve for spender to transferFrom(...) tokens
        // from the token owner's account. The spender contract function
        // receiveApproval(...) is then executed
        // ------------------------------------------------------------------------
        function approveAndCall(address spender, uint tokens, bytes memory data) public returns (bool success) {
            allowed[msg.sender][spender] = tokens;
            Approval(msg.sender, spender, tokens);
            ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, address(this), data);
            return true;
        }
    
    
        // ------------------------------------------------------------------------
        // Don't accept ETH
        // ------------------------------------------------------------------------
        receive () external payable {
            revert();
        }
    
    
        // ------------------------------------------------------------------------
        // Owner can transfer out any accidentally sent ERC20 tokens
        // ------------------------------------------------------------------------
        function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) {
            return IERC20(tokenAddress).transfer(owner, tokens);
        }
    }