Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xcCe968120e6Ded56F32fbfe5A2Ec06CBF1e7c8ED
Balance 0 ETH
Nonce 1
Code Size 3398 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

3398 bytes
0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c8063859524541161008857806395d89b411161006357806395d89b4114610218578063a9059cbb14610220578063be45fd6214610233578063dd62ed3e14610246575f80fd5b806385952454146101c55780638cd4426d146101da5780638da5cb5b146101ed575f80fd5b806323b872dd116100c357806323b872dd1461013c578063313ce5671461014f5780635a3b7e421461016457806370a082311461019d575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f161027e565b6040516100fe91906109d0565b60405180910390f35b61011a610115366004610a04565b61030d565b60405190151581526020016100fe565b6003545b6040519081526020016100fe565b61011a61014a366004610a2c565b6103cd565b60025460405160ff90911681526020016100fe565b60408051808201909152600381527f323233000000000000000000000000000000000000000000000000000000000060208201526100f1565b61012e6101ab366004610a65565b6001600160a01b03165f9081526006602052604090205490565b6101d86101d3366004610a65565b61053c565b005b6101d86101e8366004610a04565b61058c565b600454610200906001600160a01b031681565b6040516001600160a01b0390911681526020016100fe565b6100f16106e1565b61011a61022e366004610a04565b6106f0565b61011a610241366004610a7e565b610837565b61012e610254366004610afe565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b60605f805461028c90610b2f565b80601f01602080910402602001604051908101604052809291908181526020018280546102b890610b2f565b80156103035780601f106102da57610100808354040283529160200191610303565b820191905f5260205f20905b8154815290600101906020018083116102e657829003601f168201915b5050505050905090565b5f6001600160a01b0383166103695760405162461bcd60e51b815260206004820152601760248201527f4552432d3232333a205370656e646572206572726f722e00000000000000000060448201526064015b60405180910390fd5b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060015b92915050565b6001600160a01b0383165f90815260056020908152604080832033845290915281205482111561043f5760405162461bcd60e51b815260206004820181905260248201527f4552432d3232333a20496e73756666696369656e7420616c6c6f77616e63652e6044820152606401610360565b6001600160a01b0384165f9081526006602052604081208054849290610466908490610bad565b90915550506001600160a01b0384165f9081526005602090815260408083203384529091528120805484929061049d908490610bad565b90915550506001600160a01b0383165f90815260066020526040812080548492906104c9908490610bc0565b92505081905550826001600160a01b0316846001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c168460405161052a9181526040602082018190526004908201525f606082015260800190565b60405180910390a35060019392505050565b6004546001600160a01b03163314610552575f80fd5b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6004546001600160a01b031633146105a2575f80fd5b60408051336024820152604480820184905282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905290515f9182916001600160a01b0386169161062791610bd3565b5f604051808303815f865af19150503d805f8114610660576040519150601f19603f3d011682016040523d82523d5f602084013e610665565b606091505b509150915081801561068f57508051158061068f57508080602001905181019061068f9190610bee565b6106db5760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610360565b50505050565b60606001805461028c90610b2f565b604080518082018252600481525f6020808301829052338252600690529182205461071c908490610bad565b335f90815260066020526040808220929092556001600160a01b03861681522054610748908490610bc0565b6001600160a01b0385165f90815260066020526040902055833b156107f2576040517f8943ec020000000000000000000000000000000000000000000000000000000081526001600160a01b03851690638943ec02906107b090339087908690600401610c0d565b6020604051808303815f875af11580156107cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f09190610c3d565b505b836001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16858460405161052a929190610c7c565b335f90815260066020526040812054610851908590610bad565b335f90815260066020526040808220929092556001600160a01b0387168152205461087d908590610bc0565b6001600160a01b0386165f90815260066020526040902055843b15610929576040517f8943ec020000000000000000000000000000000000000000000000000000000081526001600160a01b03861690638943ec02906108e7903390889088908890600401610cc5565b6020604051808303815f875af1158015610903573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109279190610c3d565b505b846001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1686868660405161097093929190610cf7565b60405180910390a3506001949350505050565b5f5b8381101561099d578181015183820152602001610985565b50505f910152565b5f81518084526109bc816020860160208601610983565b601f01601f19169290920160200192915050565b602081525f6109e260208301846109a5565b9392505050565b80356001600160a01b03811681146109ff575f80fd5b919050565b5f8060408385031215610a15575f80fd5b610a1e836109e9565b946020939093013593505050565b5f805f60608486031215610a3e575f80fd5b610a47846109e9565b9250610a55602085016109e9565b9150604084013590509250925092565b5f60208284031215610a75575f80fd5b6109e2826109e9565b5f805f8060608587031215610a91575f80fd5b610a9a856109e9565b935060208501359250604085013567ffffffffffffffff80821115610abd575f80fd5b818701915087601f830112610ad0575f80fd5b813581811115610ade575f80fd5b886020828501011115610aef575f80fd5b95989497505060200194505050565b5f8060408385031215610b0f575f80fd5b610b18836109e9565b9150610b26602084016109e9565b90509250929050565b600181811c90821680610b4357607f821691505b602082108103610b7a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156103c7576103c7610b80565b808201808211156103c7576103c7610b80565b5f8251610be4818460208701610983565b9190910192915050565b5f60208284031215610bfe575f80fd5b815180151581146109e2575f80fd5b6001600160a01b0384168152826020820152606060408201525f610c3460608301846109a5565b95945050505050565b5f60208284031215610c4d575f80fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146109e2575f80fd5b828152604060208201525f610c9460408301846109a5565b949350505050565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b6001600160a01b0385168152836020820152606060408201525f610ced606083018486610c9c565b9695505050505050565b838152604060208201525f610c34604083018486610c9c56fea264697066735822122047ee744bb13e89b62a7fa0fcba10918e8b29d447f3f37ba019a50391ed0dcd1864736f6c63430008160033

Verified Source Code Partial Match

Compiler: v0.8.22+commit.4fc1097e EVM: shanghai Optimization: Yes (2000 runs)
D223Token.sol 413 lines
// SPDX-License-Identifier: GPL-3.0

// Contracts are written by @Dexaran (twitter.com/Dexaran github.com/Dexaran)
// Read more about ERC-223 standard here: dexaran.github.io/erc223

// D223 is a token of Dex223.io exchange.

pragma solidity >=0.8.2;

abstract contract IERC223 {
    
    function name()        public view virtual returns (string memory);
    function symbol()      public view virtual returns (string memory);
    function decimals()    public view virtual returns (uint8);
    function totalSupply() public view virtual returns (uint256);
    
    /**
     * @dev Returns the balance of the `who` address.
     */
    function balanceOf(address who) public virtual view returns (uint);
        
    /**
     * @dev Transfers `value` tokens from `msg.sender` to `to` address
     * and returns `true` on success.
     */
    function transfer(address to, uint value) public virtual returns (bool success);
        
    /**
     * @dev Transfers `value` tokens from `msg.sender` to `to` address with `data` parameter
     * and returns `true` on success.
     */
    function transfer(address to, uint value, bytes calldata data) public virtual returns (bool success);
     
     /**
     * @dev Event that is fired on successful transfer.
     */
    event Transfer(address indexed from, address indexed to, uint value, bytes data);
}

abstract contract IERC223Recipient {


 struct ERC223TransferInfo
    {
        address token_contract;
        address sender;
        uint256 value;
        bytes   data;
    }
    
    ERC223TransferInfo private tkn;
    
/**
 * @dev Standard ERC223 function that will handle incoming token transfers.
 *
 * @param _from  Token sender address.
 * @param _value Amount of tokens.
 * @param _data  Transaction metadata.
 */
    function tokenReceived(address _from, uint _value, bytes memory _data) public virtual returns (bytes4)
    {
        /**
         * @dev Note that inside of the token transaction handler the actual sender of token transfer is accessible via the tkn.sender variable
         * (analogue of msg.sender for Ether transfers)
         * 
         * tkn.value - is the amount of transferred tokens
         * tkn.data  - is the "metadata" of token transfer
         * tkn.token_contract is most likely equal to msg.sender because the token contract typically invokes this function
        */
        tkn.token_contract = msg.sender;
        tkn.sender         = _from;
        tkn.value          = _value;
        tkn.data           = _data;
        
        // ACTUAL CODE

        return 0x8943ec02;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    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);
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

/**
 * @title Reference implementation of the ERC223 standard token.
 */
contract D223Token {

     /**
     * @dev Event that is fired on successful transfer.
     */
    event Transfer(address indexed from, address indexed to, uint value, bytes data);
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    string  private _name;
    string  private _symbol;
    uint8   private _decimals;
    uint256 private _totalSupply;
    address public  owner = msg.sender;
    mapping(address account => mapping(address spender => uint256)) private allowances;
    
    mapping(address => uint256) private balances; // List of user balances.

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
     
    constructor()
    {
        _name     = "Dex223 token";
        _symbol   = "D223";
        _decimals = 18;
        balances[msg.sender] = 8000000000 * 1e18;
        emit Transfer(address(0), msg.sender, balances[msg.sender], hex"000000");
        _totalSupply = balances[msg.sender];
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory)
    {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory)
    {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC223} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC223-balanceOf} and {IERC223-transfer}.
     */
    function decimals() public view returns (uint8)
    {
        return _decimals;
    }

    /**
     * @dev See {IERC223-totalSupply}.
     */
    function totalSupply() public view returns (uint256)
    {
        return _totalSupply;
    }

    /**
     * @dev See {IERC223-standard}.
     */
    function standard() public view returns (string memory)
    {
        return "223";
    }

    
    /**
     * @dev Returns balance of the `_owner`.
     *
     * @param _owner   The address whose balance will be returned.
     * @return balance Balance of the `_owner`.
     */
    function balanceOf(address _owner) public view returns (uint256)
    {
        return balances[_owner];
    }
    
    /**
     * @dev Transfer the specified amount of tokens to the specified address.
     *      Invokes the `tokenFallback` function if the recipient is a contract.
     *      The token transfer fails if the recipient is a contract
     *      but does not implement the `tokenFallback` function
     *      or the fallback function to receive funds.
     *
     * @param _to    Receiver address.
     * @param _value Amount of tokens that will be transferred.
     * @param _data  Transaction metadata.
     */
    function transfer(address _to, uint _value, bytes calldata _data) public returns (bool success)
    {
        // Standard function transfer similar to ERC20 transfer with no _data .
        // Added due to backwards compatibility reasons .
        balances[msg.sender] = balances[msg.sender] - _value;
        balances[_to] = balances[_to] + _value;
        if(Address.isContract(_to)) {
            IERC223Recipient(_to).tokenReceived(msg.sender, _value, _data);
        }
        emit Transfer(msg.sender, _to, _value, _data);
        return true;
    }
    
    /**
     * @dev Transfer the specified amount of tokens to the specified address.
     *      This function works the same with the previous one
     *      but doesn't contain `_data` param.
     *      Added due to backwards compatibility reasons.
     *
     * @param _to    Receiver address.
     * @param _value Amount of tokens that will be transferred.
     */
    function transfer(address _to, uint _value) public returns (bool success)
    {
        bytes memory _empty = hex"00000000";
        balances[msg.sender] = balances[msg.sender] - _value;
        balances[_to] = balances[_to] + _value;
        if(Address.isContract(_to)) {
            IERC223Recipient(_to).tokenReceived(msg.sender, _value, _empty);
        }
        emit Transfer(msg.sender, _to, _value, _empty);
        return true;
    }

    // ERC-20 functions for backwards compatibility.

    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return allowances[owner][spender];
    }

    function approve(address _spender, uint _value) public returns (bool) {

        // Safety checks.
        require(_spender != address(0), "ERC-223: Spender error.");

        allowances[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        
        return true;
    }

    function transferFrom(address _from, address _to, uint _value) public returns (bool) {
        
        require(allowances[_from][msg.sender] >= _value, "ERC-223: Insufficient allowance.");
        
        balances[_from] -= _value;
        allowances[_from][msg.sender] -= _value;
        balances[_to] += _value;
        
        emit Transfer(_from, _to, _value, hex"00000000");
        
        return true;
    }

    function rescueERC20(address _token, uint256 _value) external
    {
        require(msg.sender == owner);
        (bool success, bytes memory data) = _token.call(abi.encodeWithSelector(0xa9059cbb, msg.sender, _value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Transfer failed");
    }

    function newOwner(address _owner) external
    {
        require(msg.sender == owner);
        owner = _owner;
    }
}

abstract contract LinkOracle
{
   function latestAnswer() external view virtual returns (int256);
}

contract D223ICO {

    address public owner = msg.sender;

    uint256 public price_rate_USD = 1538; // Target price $0.00065 per D223 token.

    address public USDT_contract  = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
    address public USDC_contract  = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
    address public DAI_contract   = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address public ICO_token      = 0x7008D42622a8B4eF73e946833EA90E608de9e96B;

    LinkOracle public ETH_price_oracle = LinkOracle(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419);

    bool public active = true;

    modifier requireActive
    {
        require(active == true);
        _;
    }

    function setActive(bool _active) external
    {
        require(msg.sender == owner);
        active = _active;
    }

    receive() external payable requireActive
    {
        IERC20(ICO_token).transfer(msg.sender, msg.value * uint256(ETH_price_oracle.latestAnswer())/1e8);
    }

    function tokenReceived(address _from, uint _value, bytes memory _data) public returns (bytes4)
    {
        require(msg.sender == ICO_token);
        return this.tokenReceived.selector; //return 0x8943ec02;
    }

    function purchaseTokens(address _payment_token, uint256 _payment_amount) public requireActive
    {
        require(_payment_token == USDT_contract || _payment_token == USDC_contract || _payment_token == DAI_contract, "Wrong token");
        if(_payment_token == USDT_contract || _payment_token == USDC_contract)
        {
            _payment_amount = _payment_amount * 1e12; // USDT and USDC have 6 decimals.
        }
        safeTransferFrom(_payment_token, msg.sender, address(this), _payment_amount);
        IERC20(ICO_token).transfer(msg.sender, _payment_amount * price_rate_USD);
    }

    function getRewardAmount(address _payment_token, uint256 _deposit) public view returns (uint256)
    {
        if(_payment_token == USDT_contract || _payment_token == USDC_contract)
        {
            return _deposit * price_rate_USD * 1e12;
        } 
        if (_payment_token == DAI_contract) 
        {
            return _deposit * price_rate_USD;
        }
        if(_payment_token == address(0))     
        {
            return _deposit * price_rate_USD * uint256(ETH_price_oracle.latestAnswer())/1e8;
        }
        return 0;
    }

    function set(uint256 _price_USD, address _ICO_token, address _USDT, address _USDC, address _DAI) public
    {
        require(msg.sender == owner);
        price_rate_USD     = _price_USD;
        USDT_contract      = _USDT;
        USDC_contract      = _USDC;
        DAI_contract       = _DAI;
        ICO_token          = _ICO_token;
    }

    function extractTokens(address _token, uint256 _amount) public
    {
        require(msg.sender == owner);
        //IERC20(_token).transfer(msg.sender, _amount);
        safeTransfer(_token, msg.sender, _amount);
        if(_token == address(0))
        {
            payable(msg.sender).transfer(address(this).balance);
        }
    }
    
    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Transfer failed");
    }
    
    function safeTransfer(address token, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "Transfer failed");
    }
}

Read Contract

allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
name 0x06fdde03 → string
owner 0x8da5cb5b → address
standard 0x5a3b7e42 → string
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 6 functions

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

approve 0x095ea7b3
address _spender
uint256 _value
returns: bool
newOwner 0x85952454
address _owner
rescueERC20 0x8cd4426d
address _token
uint256 _value
transfer 0xa9059cbb
address _to
uint256 _value
returns: bool
transfer 0xbe45fd62
address _to
uint256 _value
bytes _data
returns: bool
transferFrom 0x23b872dd
address _from
address _to
uint256 _value
returns: bool

Recent Transactions

No transactions found for this address