ETH Price: $2,837.36 (-9.94%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim184843882023-11-02 12:26:35458 days ago1698927995IN
0x825172f5...182d9481C
0 ETH0.0013853820.99423962
Claim184843712023-11-02 12:22:59458 days ago1698927779IN
0x825172f5...182d9481C
0 ETH0.0014162821.46240341
Stake184840932023-11-02 11:26:59458 days ago1698924419IN
0x825172f5...182d9481C
0 ETH0.0019637518.5155287
Withdraw175784962023-06-28 14:44:59585 days ago1687963499IN
0x825172f5...182d9481C
0 ETH0.0020460926.32546232
Claim175784932023-06-28 14:44:23585 days ago1687963463IN
0x825172f5...182d9481C
0 ETH0.0021873826.32546232
Withdraw175756502023-06-28 5:10:47585 days ago1687929047IN
0x825172f5...182d9481C
0 ETH0.0015141319.48120549
Claim175756492023-06-28 5:10:35585 days ago1687929035IN
0x825172f5...182d9481C
0 ETH0.0016576519.48120549
Claim175756152023-06-28 5:03:47585 days ago1687928627IN
0x825172f5...182d9481C
0 ETH0.0018319521.52966
Claim175756032023-06-28 5:01:11585 days ago1687928471IN
0x825172f5...182d9481C
0 ETH0.0015129317.78044357
Claim175756002023-06-28 5:00:35585 days ago1687928435IN
0x825172f5...182d9481C
0 ETH0.0014921717.53638927
Claim175755012023-06-28 4:40:35585 days ago1687927235IN
0x825172f5...182d9481C
0 ETH0.0016655516.6239868
Withdraw175745272023-06-28 1:24:11585 days ago1687915451IN
0x825172f5...182d9481C
0 ETH0.0013369817.20187262
Claim175745252023-06-28 1:23:47585 days ago1687915427IN
0x825172f5...182d9481C
0 ETH0.001463717.20187262
Withdraw175740252023-06-27 23:43:11586 days ago1687909391IN
0x825172f5...182d9481C
0 ETH0.0009204311.84256348
Claim175740222023-06-27 23:42:23586 days ago1687909343IN
0x825172f5...182d9481C
0 ETH0.0011206812
Claim175706832023-06-27 12:26:11586 days ago1687868771IN
0x825172f5...182d9481C
0 ETH0.0018053621.21707891
Withdraw175703182023-06-27 11:09:47586 days ago1687864187IN
0x825172f5...182d9481C
0 ETH0.0012999616.72561076
Claim175703172023-06-27 11:09:35586 days ago1687864175IN
0x825172f5...182d9481C
0 ETH0.0017091916.72561076
Withdraw175687502023-06-27 5:51:11586 days ago1687845071IN
0x825172f5...182d9481C
0 ETH0.0013549617.4332451
Claim175687392023-06-27 5:48:59586 days ago1687844939IN
0x825172f5...182d9481C
0 ETH0.0014833917.4332451
Withdraw175682472023-06-27 4:10:11586 days ago1687839011IN
0x825172f5...182d9481C
0 ETH0.0018782524.16602365
Claim175682462023-06-27 4:09:59586 days ago1687838999IN
0x825172f5...182d9481C
0 ETH0.0024695224.16602365
Withdraw175680762023-06-27 3:35:23586 days ago1687836923IN
0x825172f5...182d9481C
0 ETH0.0018679624.03358936
Claim175680742023-06-27 3:34:59586 days ago1687836899IN
0x825172f5...182d9481C
0 ETH0.0020450124.03358936
Claim175680362023-06-27 3:27:23586 days ago1687836443IN
0x825172f5...182d9481C
0 ETH0.0021575325.96621373
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x66057c96...77d5A341a
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
EsgSHIP

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion
File 1 of 6 : EsgSHIP.sol
pragma solidity >=0.5.16;
pragma experimental ABIEncoderV2;

import "./EIP20Interface.sol";
import "./SafeMath.sol";
import "./LendingWhiteList.sol";
import "./EnumerableSet.sol";
import "./owned.sol";

contract EsgSHIP is owned, LendingWhiteList {
	using SafeMath for uint256;
    using EnumerableSet for EnumerableSet.AddressSet;
    EnumerableSet.AddressSet private _set;

    /// @notice ESG token
    EIP20Interface public esg;

    /// @notice Emitted when referral set referral
    event SetReferral(address referralAddress);

    /// @notice Emitted when ESG is staked  
    event EsgStaked(address account, uint amount);

    /// @notice Emitted when ESG is withdrawn 
    event EsgWithdrawn(address account, uint amount);

    /// @notice Emitted when ESG is claimed 
    event EsgClaimed(address account, uint amount);

    // @notice The rate every day. 
    uint256 public dayEsgRate; 

    // @notice A checkpoint for staking
    struct Checkpoint {
        uint256 deposit_time; //last check time
        uint256 total_staked;
        uint256 bonus_unclaimed;
    }

    // @notice staking struct of every account
    mapping (address => Checkpoint) public stakings;

    mapping (address => EnumerableSet.AddressSet) inviteelist;//1:n

	struct User {
        address referrer_addr;
    }

    mapping (address => User) referrerlist;//1:1

    // @notice total stake amount
    uint256 public total_deposited;
    uint256 public referrer_rate;
    uint256 public ship_rate;
    uint256 public referrer_limit_num;
    uint256 public referrer_reward_limit_num;
    uint256 public ship_reward_limit_num;

    constructor(address esgAddress) public {
        owner = msg.sender;
		dayEsgRate = 1.37e15;
		referrer_rate = 2e17;
	    ship_rate = 8e16;
	    referrer_limit_num = 1e21;
	    referrer_reward_limit_num = 1e21;
	    ship_reward_limit_num = 1e23;
		esg = EIP20Interface(esgAddress);
    }

    function setInvitee(address inviteeAddress) public returns (bool) {
    	require(inviteeAddress != address(0), "inviteeAddress should not be 0x0.");

    	EnumerableSet.AddressSet storage es = inviteelist[msg.sender];
    	User storage user = referrerlist[inviteeAddress];
    	require(user.referrer_addr == address(0), "This account had been invited!");

    	Checkpoint storage cpt = stakings[inviteeAddress];
    	require(cpt.total_staked == 0, "This account had staked!");

    	Checkpoint storage cp = stakings[msg.sender];

    	if(isWhitelisted(msg.sender)){
    		EnumerableSet.add(es, inviteeAddress);  	
	    	user.referrer_addr = msg.sender;
	    }else{
	    	if(cp.total_staked >= referrer_limit_num){
	    		EnumerableSet.add(es, inviteeAddress);
		    	user.referrer_addr = msg.sender;
		    }else{
		        return false;
		    }
	    }
    	emit SetReferral(inviteeAddress);
        return true;   
    }

    function getInviteelist(address referrerAddress) public view returns (address[] memory) {
    	require(referrerAddress != address(0), "referrerAddress should not be 0x0.");
    	EnumerableSet.AddressSet storage es = inviteelist[referrerAddress];
    	uint256 _length = EnumerableSet.length(es);
    	address[] memory _inviteelist = new address[](_length);
    	for(uint i=0; i<EnumerableSet.length(es); i++){
    		_inviteelist[i] = EnumerableSet.at(es,i);
    	}
    	return _inviteelist;
    }

    function getReferrer(address inviteeAddress) public view returns (address) {
    	require(inviteeAddress != address(0), "inviteeAddress should not be 0x0.");
    	User storage user = referrerlist[inviteeAddress];
    	return user.referrer_addr;
    }

    /**
     * @notice Stake ESG token to contract 
     * @param amount The amount of address to be staked 
     * @return Success indicator for whether staked 
     */
    function stake(uint256 amount) public returns (bool) {
		require(amount > 0, "No zero.");
		require(amount <= esg.balanceOf(msg.sender), "Insufficient ESG token.");

		Checkpoint storage cp = stakings[msg.sender];

		esg.transferFrom(msg.sender, address(this), amount);

		if(cp.deposit_time > 0)
		{
			uint256 bonus = block.timestamp.sub(cp.deposit_time).mul(cp.total_staked).mul(dayEsgRate).div(1e18).div(86400);
			cp.bonus_unclaimed = cp.bonus_unclaimed.add(bonus);
			cp.total_staked = cp.total_staked.add(amount);
			cp.deposit_time = block.timestamp;
		}else
		{
			cp.total_staked = amount;
			cp.deposit_time = block.timestamp;
		}
	    total_deposited = total_deposited.add(amount);
		emit EsgStaked(msg.sender, amount);

		return true;
    }

    /**
     * @notice withdraw all ESG token staked in contract 
     * @return Success indicator for success 
     */
    function withdraw() public returns (bool) {
    	
    	Checkpoint storage cp = stakings[msg.sender];
		uint256 amount = cp.total_staked;
		uint256 bonus = block.timestamp.sub(cp.deposit_time).mul(cp.total_staked).mul(dayEsgRate).div(1e18).div(86400);
		cp.bonus_unclaimed = cp.bonus_unclaimed.add(bonus);
		cp.total_staked = 0;
		cp.deposit_time = 0;
	    total_deposited = total_deposited.sub(amount);
		
		esg.transfer(msg.sender, amount);

		emit EsgWithdrawn(msg.sender, amount); 

		return true;
    }

    /**
     * @notice claim all ESG token bonus in contract 
     * @return Success indicator for success 
     */
    function claim() public returns (bool) {
		User storage user = referrerlist[msg.sender];
    	address _referrer_addr = user.referrer_addr;
    	uint256 incentive;
    	uint256 incentive_holder;

		Checkpoint storage cp = stakings[msg.sender];
		Checkpoint storage cpt = stakings[_referrer_addr];

		uint256 amount = cp.bonus_unclaimed;
		if(cp.deposit_time > 0)
		{
			uint256 bonus = block.timestamp.sub(cp.deposit_time).mul(cp.total_staked).mul(dayEsgRate).div(1e18).div(86400);
			amount = amount.add(bonus);
			cp.bonus_unclaimed = 0; 
			cp.deposit_time = block.timestamp;
			
		}else{
			//has beed withdrawn
			cp.bonus_unclaimed = 0;
		}

		if(total_deposited >= ship_reward_limit_num){
			incentive_holder = amount.mul(ship_rate).div(1e18);
			if(_referrer_addr != address(0)){
				if(cpt.total_staked >= referrer_reward_limit_num){
					incentive = amount.mul(referrer_rate).div(1e18);
					esg.transfer(_referrer_addr, incentive);
				}
				esg.transfer(owner, incentive_holder);
				esg.transfer(msg.sender, amount);
    		}else
	    	{
	    		esg.transfer(owner, incentive_holder);
	    		esg.transfer(msg.sender, amount.sub(incentive_holder));
	    	}
		}else
		{
			if(_referrer_addr != address(0)){
				if(cpt.total_staked >= referrer_reward_limit_num){
					incentive = amount.mul(referrer_rate).div(1e18);
					esg.transfer(_referrer_addr, incentive);
				}
				esg.transfer(msg.sender, amount);
    		}else
	    	{
	    		esg.transfer(msg.sender, amount);
	    	}
		}

		emit EsgClaimed (msg.sender, amount); 

		return true;
    }

    // set the dayrate
    function setDayEsgRate(uint256 dayRateMantissa) public{
	    require(msg.sender == owner, "only owner can set this value.");
	    dayEsgRate = dayRateMantissa;
    }

    // set referrerRate
    function setReferrerRate(uint256 referrerRateMantissa) public{
	    require(msg.sender == owner, "only owner can set this value.");
	    referrer_rate = referrerRateMantissa;
    }

    // set shipRate
    function setShipRate(uint256 shipRateMantissa) public{
	    require(msg.sender == owner, "only owner can set this value.");
	    ship_rate = shipRateMantissa;
    }

    // set referrerLimitNum
    function setReferrerLimitNum(uint256 referrerLimitNum) public{
	    require(msg.sender == owner, "only owner can set this value.");
	    referrer_limit_num = referrerLimitNum;
    }

    // set referrerRewardLimitNum
    function setReferrerRewardLimitNum(uint256 referrerRewardLimitNum) public{
	    require(msg.sender == owner, "only owner can set this value.");
	    referrer_reward_limit_num = referrerRewardLimitNum;
    }

    // set shipRewardLimitNum
    function setShipRewardLimitNum(uint256 shipRewardLimitNum) public{
	    require(msg.sender == owner, "only owner can set this value.");
	    ship_reward_limit_num = shipRewardLimitNum;
    }

    function _withdrawERC20Token(address tokenAddress) external onlyOwner {
        require(tokenAddress != address(0), "invalid address");
        uint256 tokenAmount = esg.balanceOf(address(this));
        if(tokenAmount > 0)
            esg.transfer(msg.sender, tokenAmount);
        else
            revert("insufficient ERC20 tokens");
    }

    /**
     * @notice Returns the balance of ESG an account has staked
     * @param account The address of the account 
     * @return balance of ESG 
     */
    function getStakingBalance(address account) external view returns (uint256) {
		Checkpoint memory cp = stakings[account];
        return cp.total_staked;
    }

    /**
     * @notice Return the unclaimed bonus ESG of staking 
     * @param account The address of the account 
     * @return The amount of unclaimed ESG 
     */
    function getUnclaimedEsg(address account) public view returns (uint256) {
		Checkpoint memory cp = stakings[account];

		uint256 amount = cp.bonus_unclaimed;
		if(cp.deposit_time > 0)
		{
			uint256 bonus = block.timestamp.sub(cp.deposit_time).mul(cp.total_staked).mul(dayEsgRate).div(1e18).div(86400);
			amount = amount.add(bonus);
		}
		return amount;
    }

    /**
     * @notice Return the APY of staking 
     * @return The APY multiplied 1e18
     */
    function getStakingAPYMantissa() public view returns (uint256) {
        return dayEsgRate.mul(365);
    }

    /**
     * @notice Return the address of the ESG token
     * @return The address of ESG 
     */
    function getEsgAddress() public view returns (address) {
        return address(esg);
    }

}

File 2 of 6 : owned.sol
pragma solidity >=0.5.16;

contract owned {
    address public owner;
 
    constructor() public {
        owner = msg.sender;
    }
 
    modifier onlyOwner {
        require (msg.sender == owner);
        _;
    }
 
    function transferOwnership(address newOwner) onlyOwner public {
        if (newOwner != address(0)) {
        owner = newOwner;
      }
    }
}

File 3 of 6 : SafeMath.sol
pragma solidity ^0.5.16;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts with custom message on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    /**
   * @dev gives square root of given x.
   */
  function sqrt(uint256 x) internal pure returns(uint256 y) {
        uint256 z = ((add(x, 1)) / 2);
        y = x;
        while (z < y) {
            y = z;
            z = ((add((x / z), z)) / 2);
        }
  }

  /**
   * @dev gives square. multiplies x by x
   */
  function sq(uint256 x) internal pure returns(uint256) {
       return (mul(x, x));
  }

  /**
   * @dev x to the power of y
   */
  function pwr(uint256 x, uint256 y) internal pure returns(uint256) {
    if (x == 0)
      return (0);
    else if (y == 0)
      return (1);
    else {
      uint256 z = x;
      for (uint256 i = 1; i < y; i++)
        z = mul(z, x);
      return (z);
    }
  }
}

File 4 of 6 : LendingWhiteList.sol
pragma solidity >=0.5.16;

import "./EnumerableSet.sol";
import "./owned.sol";

contract LendingWhiteList is owned {

    using EnumerableSet for EnumerableSet.AddressSet;
    EnumerableSet.AddressSet private _whitelist;

    event AddedToWhitelist(address indexed account);
    event RemovedFromWhitelist(address indexed account);

    constructor() public {
    }

    modifier onlyWhitelisted {
        require(isWhitelisted(msg.sender), "LendingWhiteList: caller is not in whitelist");
        _;
    }

    function add(address _address) public onlyOwner returns(bool) {
        require(_address != address(0), "LendingWhiteList: _address is the zero address");
        EnumerableSet.add(_whitelist, _address);
        emit AddedToWhitelist(_address);
        return true;
    }

    function remove(address _address) public onlyOwner returns(bool) {
        require(_address != address(0), "LendingWhiteList: _address is the zero address");
        EnumerableSet.remove(_whitelist, _address);
        emit RemovedFromWhitelist(_address);
        return true;
    }

    function isWhitelisted(address _address) public view returns(bool) {
        return EnumerableSet.contains(_whitelist, _address);
    }
}

File 5 of 6 : EnumerableSet.sol
pragma solidity >=0.5.16;
/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

File 6 of 6 : EIP20Interface.sol
pragma solidity ^0.5.16;

/**
 * @title ERC 20 Token Standard Interface
 *  https://eips.ethereum.org/EIPS/eip-20
 */
interface EIP20Interface {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    /**
      * @notice Get the total number of tokens in circulation
      * @return The supply of tokens
      */
    function totalSupply() external view returns (uint256);

    /**
     * @notice Gets the balance of the specified address
     * @param owner The address from which the balance will be retrieved
     * @return The balance
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
      * @notice Transfer `amount` tokens from `msg.sender` to `dst`
      * @param dst The address of the destination account
      * @param amount The number of tokens to transfer
      * @return Whether or not the transfer succeeded
      */
    function transfer(address dst, uint256 amount) external returns (bool success);

    /**
      * @notice Transfer `amount` tokens from `src` to `dst`
      * @param src The address of the source account
      * @param dst The address of the destination account
      * @param amount The number of tokens to transfer
      * @return Whether or not the transfer succeeded
      */
    function transferFrom(address src, address dst, uint256 amount) external returns (bool success);

    /**
      * @notice Approve `spender` to transfer up to `amount` from `src`
      * @dev This will overwrite the approval amount for `spender`
      *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
      * @param spender The address of the account which may transfer tokens
      * @param amount The number of tokens that are approved (-1 means infinite)
      * @return Whether or not the approval succeeded
      */
    function approve(address spender, uint256 amount) external returns (bool success);

    /**
      * @notice Get the current allowance from `owner` for `spender`
      * @param owner The address of the account which owns the tokens to be spent
      * @param spender The address of the account which may transfer tokens
      * @return The number of tokens allowed to be spent (-1 means infinite)
      */
    function allowance(address owner, address spender) external view returns (uint256 remaining);

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 300
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"esgAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EsgClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EsgStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EsgWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"referralAddress","type":"address"}],"name":"SetReferral","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"_withdrawERC20Token","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"add","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dayEsgRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"esg","outputs":[{"internalType":"contract EIP20Interface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getEsgAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"referrerAddress","type":"address"}],"name":"getInviteelist","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"inviteeAddress","type":"address"}],"name":"getReferrer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakingAPYMantissa","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnclaimedEsg","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referrer_limit_num","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referrer_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referrer_reward_limit_num","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"remove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"dayRateMantissa","type":"uint256"}],"name":"setDayEsgRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"inviteeAddress","type":"address"}],"name":"setInvitee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"referrerLimitNum","type":"uint256"}],"name":"setReferrerLimitNum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"referrerRateMantissa","type":"uint256"}],"name":"setReferrerRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"referrerRewardLimitNum","type":"uint256"}],"name":"setReferrerRewardLimitNum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"shipRateMantissa","type":"uint256"}],"name":"setShipRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"shipRewardLimitNum","type":"uint256"}],"name":"setShipRewardLimitNum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ship_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ship_reward_limit_num","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakings","outputs":[{"internalType":"uint256","name":"deposit_time","type":"uint256"},{"internalType":"uint256","name":"total_staked","type":"uint256"},{"internalType":"uint256","name":"bonus_unclaimed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80637a4562fb1161010f578063d326a6c9116100a2578063e4aceddf11610071578063e4aceddf146103c2578063f2e31e81146103ca578063f2fde38b146103dd578063f8115d83146103f0576101e5565b8063d326a6c914610388578063dc6e13e114610390578063de560cca146103b2578063e28dfe52146103ba576101e5565b8063bc35651c116100de578063bc35651c1461033a578063bd6e3ac31461034d578063bfede9ba14610360578063cac0652214610373576101e5565b80637a4562fb146103045780638da5cb5b1461030c578063a694fc3a14610314578063b04ef9c214610327576101e5565b80633ccfd60b116101875780634e71d92d116101565780634e71d92d146102ce5780634fa77a48146102d65780634fff4709146102e9578063552d64f4146102f1576101e5565b80633ccfd60b146102965780634a9fefc71461029e5780634e0aebbe146102be5780634e64aab6146102c6576101e5565b806330143c6c116101c357806330143c6c1461024657806336d8a8931461024e57806339fcaa4c1461026e5780633af32abf14610283576101e5565b80630a3b0a4f146101ea5780631df6ec121461021357806329092d0e14610233575b600080fd5b6101fd6101f8366004611876565b610403565b60405161020a9190611d4f565b60405180910390f35b610226610221366004611876565b610493565b60405161020a9190611e4c565b6101fd610241366004611876565b610555565b6102266105db565b61026161025c366004611876565b6105e1565b60405161020a9190611d3e565b61028161027c3660046118ba565b6106ae565b005b6101fd610291366004611876565b6106dd565b6101fd6106f0565b6102b16102ac366004611876565b61083f565b60405161020a9190611cd1565b610226610886565b61022661088c565b6101fd610892565b6101fd6102e4366004611876565b610e24565b610226610f73565b6102816102ff366004611876565b610f79565b6102266110e5565b6102b16110eb565b6101fd6103223660046118ba565b6110fa565b610226610335366004611876565b611337565b6102816103483660046118ba565b611384565b61028161035b3660046118ba565b6113b3565b61028161036e3660046118ba565b6113e2565b61037b611411565b60405161020a9190611d5d565b610226611420565b6103a361039e366004611876565b61143d565b60405161020a93929190611e5a565b61022661145e565b6102b1611464565b610226611473565b6102816103d83660046118ba565b611479565b6102816103eb366004611876565b6114a8565b6102816103fe3660046118ba565b6114ed565b600080546001600160a01b0316331461041b57600080fd5b6001600160a01b03821661044a5760405162461bcd60e51b815260040161044190611dac565b60405180910390fd5b61045560018361151c565b506040516001600160a01b038316907fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab0390600090a25060015b919050565b600061049d611829565b506001600160a01b0382166000908152600760209081526040918290208251606081018452815480825260018301549382019390935260029091015492810183905291901561054e5760006105386201518061052c670de0b6b3a764000061052c60065461052089602001516105208b600001514261153190919063ffffffff16565b9063ffffffff61157316565b9063ffffffff6115ad16565b905061054a828263ffffffff6115ef16565b9150505b9392505050565b600080546001600160a01b0316331461056d57600080fd5b6001600160a01b0382166105935760405162461bcd60e51b815260040161044190611dac565b61059e600183611614565b506040516001600160a01b038316907fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df75790600090a2506001919050565b600d5481565b60606001600160a01b0382166106095760405162461bcd60e51b815260040161044190611ddc565b6001600160a01b03821660009081526008602052604081209061062b82611629565b9050606081604051908082528060200260200182016040528015610659578160200160208202803883390190505b50905060005b61066884611629565b8110156106a5576106798482611634565b82828151811061068557fe5b6001600160a01b039092166020928302919091019091015260010161065f565b50949350505050565b6000546001600160a01b031633146106d85760405162461bcd60e51b815260040161044190611dbc565b600f55565b60006106ea600183611640565b92915050565b33600090815260076020526040812060018101546006548254849161073991620151809161052c91670de0b6b3a76400009183916105209089908290429063ffffffff61153116565b6002840154909150610751908263ffffffff6115ef16565b60028401556000600184018190558355600a54610774908363ffffffff61153116565b600a5560055460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906107a99033908690600401611d15565b602060405180830381600087803b1580156107c357600080fd5b505af11580156107d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107fb919081019061189c565b507f32b18a663d6a49ec24c56b0b6a4019af7b097bbd7f0930bcb8670ba002109088338360405161082d929190611d15565b60405180910390a16001935050505090565b60006001600160a01b0382166108675760405162461bcd60e51b815260040161044190611e2c565b506001600160a01b039081166000908152600960205260409020541690565b60065481565b600b5481565b336000908152600960209081526040808320805460079093528184206001600160a01b03909316808552918420600284015484549294869384939192901561093357600061090e6201518061052c670de0b6b3a764000061052c6006546105208a600101546105208c600001544261153190919063ffffffff16565b9050610920828263ffffffff6115ef16565b60006002860155428555915061093b9050565b600060028401555b600f54600a5410610c6157610967670de0b6b3a764000061052c600c548461157390919063ffffffff16565b93506001600160a01b03861615610b4057600e54826001015410610a2d576109a6670de0b6b3a764000061052c600b548461157390919063ffffffff16565b60055460405163a9059cbb60e01b81529196506001600160a01b03169063a9059cbb906109d99089908990600401611d30565b602060405180830381600087803b1580156109f357600080fd5b505af1158015610a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a2b919081019061189c565b505b60055460005460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610a63929116908890600401611d30565b602060405180830381600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ab5919081019061189c565b5060055460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610ae89033908590600401611d15565b602060405180830381600087803b158015610b0257600080fd5b505af1158015610b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b3a919081019061189c565b50610c5c565b60055460005460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92610b76929116908890600401611d30565b602060405180830381600087803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc8919081019061189c565b506005546001600160a01b031663a9059cbb33610beb848863ffffffff61153116565b6040518363ffffffff1660e01b8152600401610c08929190611d15565b602060405180830381600087803b158015610c2257600080fd5b505af1158015610c36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c5a919081019061189c565b505b610ddd565b6001600160a01b03861615610d5757600e54826001015410610d2557610c9e670de0b6b3a764000061052c600b548461157390919063ffffffff16565b60055460405163a9059cbb60e01b81529196506001600160a01b03169063a9059cbb90610cd19089908990600401611d30565b602060405180830381600087803b158015610ceb57600080fd5b505af1158015610cff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d23919081019061189c565b505b60055460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610c089033908590600401611d15565b60055460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d899033908590600401611d15565b602060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ddb919081019061189c565b505b7f33fc5cbbab043468d397f2d10aea907885d46e24cdc8758828f08deb1738cf143382604051610e0e929190611d15565b60405180910390a1600197505050505050505090565b60006001600160a01b038216610e4c5760405162461bcd60e51b815260040161044190611e2c565b3360009081526008602090815260408083206001600160a01b03868116855260099093529220805490911615610e945760405162461bcd60e51b815260040161044190611e3c565b6001600160a01b0384166000908152600760205260409020600181015415610ece5760405162461bcd60e51b815260040161044190611d9c565b33600081815260076020526040902090610ee7906106dd565b15610f0c57610ef6848761151c565b5082546001600160a01b03191633178355610f30565b600d54816001015410610f2357610ef6848761151c565b600094505050505061048e565b7f7b57a333749628b79c0989800fe7069e65a2cd4aeaea4fe57c024e9cb1b7533f86604051610f5f9190611cd1565b60405180910390a150600195945050505050565b600e5481565b6000546001600160a01b03163314610f9057600080fd5b6001600160a01b038116610fb65760405162461bcd60e51b815260040161044190611dcc565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610fe7903090600401611cd1565b60206040518083038186803b158015610fff57600080fd5b505afa158015611013573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061103791908101906118d8565b905080156110c95760055460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906110719033908590600401611d15565b602060405180830381600087803b15801561108b57600080fd5b505af115801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110c3919081019061189c565b506110e1565b60405162461bcd60e51b815260040161044190611e1c565b5050565b600f5481565b6000546001600160a01b031681565b600080821161111b5760405162461bcd60e51b815260040161044190611dfc565b6005546040516370a0823160e01b81526001600160a01b03909116906370a082319061114b903390600401611cdf565b60206040518083038186803b15801561116357600080fd5b505afa158015611177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061119b91908101906118d8565b8211156111ba5760405162461bcd60e51b815260040161044190611e0c565b336000818152600760205260409081902060055491516323b872dd60e01b815290926001600160a01b03909216916323b872dd916111ff919030908890600401611ced565b602060405180830381600087803b15801561121957600080fd5b505af115801561122d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611251919081019061189c565b508054156112d35760006112936201518061052c670de0b6b3a764000061052c60065461052088600101546105208a600001544261153190919063ffffffff16565b60028301549091506112ab908263ffffffff6115ef16565b600283015560018201546112c5908563ffffffff6115ef16565b6001830155504281556112de565b600181018390554281555b600a546112f1908463ffffffff6115ef16565b600a556040517f610d6fd9e2e4aaee6b7c85effc30243d3830d3ef8d920a414478e183dca1969c906113269033908690611d15565b60405180910390a150600192915050565b6000611341611829565b50506001600160a01b0316600090815260076020908152604091829020825160608101845281548152600182015492810183905260029091015492019190915290565b6000546001600160a01b031633146113ae5760405162461bcd60e51b815260040161044190611dbc565b600c55565b6000546001600160a01b031633146113dd5760405162461bcd60e51b815260040161044190611dbc565b600e55565b6000546001600160a01b0316331461140c5760405162461bcd60e51b815260040161044190611dbc565b600d55565b6005546001600160a01b031681565b6006546000906114389061016d63ffffffff61157316565b905090565b60076020526000908152604090208054600182015460029092015490919083565b600a5481565b6005546001600160a01b031690565b600c5481565b6000546001600160a01b031633146114a35760405162461bcd60e51b815260040161044190611dbc565b600655565b6000546001600160a01b031633146114bf57600080fd5b6001600160a01b038116156114ea57600080546001600160a01b0319166001600160a01b0383161790555b50565b6000546001600160a01b031633146115175760405162461bcd60e51b815260040161044190611dbc565b600b55565b600061054e836001600160a01b038416611655565b600061054e83836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f770081525061169f565b600082611582575060006106ea565b8282028284828161158f57fe5b041461054e5760405162461bcd60e51b815260040161044190611dec565b600061054e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506116cb565b60008282018381101561054e5760405162461bcd60e51b815260040161044190611d8c565b600061054e836001600160a01b038416611702565b60006106ea826117c8565b600061054e83836117cc565b600061054e836001600160a01b038416611811565b60006116618383611811565b611697575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106ea565b5060006106ea565b600081848411156116c35760405162461bcd60e51b81526004016104419190611d6b565b505050900390565b600081836116ec5760405162461bcd60e51b81526004016104419190611d6b565b5060008385816116f857fe5b0495945050505050565b600081815260018301602052604081205480156117be578354600019808301919081019060009087908390811061173557fe5b906000526020600020015490508087600001848154811061175257fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061178257fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506106ea565b60009150506106ea565b5490565b815460009082106117ef5760405162461bcd60e51b815260040161044190611d7c565b8260000182815481106117fe57fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b60405180606001604052806000815260200160008152602001600081525090565b80356106ea81611ef3565b80516106ea81611f07565b80356106ea81611f10565b80516106ea81611f10565b60006020828403121561188857600080fd5b6000611894848461184a565b949350505050565b6000602082840312156118ae57600080fd5b60006118948484611855565b6000602082840312156118cc57600080fd5b60006118948484611860565b6000602082840312156118ea57600080fd5b6000611894848461186b565b60006119028383611919565b505060200190565b61191381611ea7565b82525050565b61191381611e88565b600061192d82611e7b565b6119378185611e7f565b935061194283611e75565b8060005b8381101561197057815161195a88826118f6565b975061196583611e75565b925050600101611946565b509495945050505050565b61191381611e93565b61191381611eae565b600061199882611e7b565b6119a28185611e7f565b93506119b2818560208601611eb9565b6119bb81611ee9565b9093019392505050565b60006119d2602283611e7f565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e815261647360f01b602082015260400192915050565b6000611a16601b83611e7f565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000611a4f601883611e7f565b7f54686973206163636f756e7420686164207374616b6564210000000000000000815260200192915050565b6000611a88602e83611e7f565b7f4c656e64696e6757686974654c6973743a205f6164647265737320697320746881526d65207a65726f206164647265737360901b602082015260400192915050565b6000611ad8601e83611e7f565b7f6f6e6c79206f776e65722063616e2073657420746869732076616c75652e0000815260200192915050565b6000611b11600f83611e7f565b6e696e76616c6964206164647265737360881b815260200192915050565b6000611b3c602283611e7f565b7f7265666572726572416464726573732073686f756c64206e6f74206265203078815261181760f11b602082015260400192915050565b6000611b80602183611e7f565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b6000611bc3600883611e7f565b672737903d32b9379760c11b815260200192915050565b6000611be7601783611e7f565b7f496e73756666696369656e742045534720746f6b656e2e000000000000000000815260200192915050565b6000611c20601983611e7f565b7f696e73756666696369656e7420455243323020746f6b656e7300000000000000815260200192915050565b6000611c59602183611e7f565b7f696e7669746565416464726573732073686f756c64206e6f74206265203078308152601760f91b602082015260400192915050565b6000611c9c601e83611e7f565b7f54686973206163636f756e7420686164206265656e20696e7669746564210000815260200192915050565b61191381611ea4565b602081016106ea8284611919565b602081016106ea828461190a565b60608101611cfb828661190a565b611d086020830185611919565b6118946040830184611cc8565b60408101611d23828561190a565b61054e6020830184611cc8565b60408101611d238285611919565b6020808252810161054e8184611922565b602081016106ea828461197b565b602081016106ea8284611984565b6020808252810161054e818461198d565b602080825281016106ea816119c5565b602080825281016106ea81611a09565b602080825281016106ea81611a42565b602080825281016106ea81611a7b565b602080825281016106ea81611acb565b602080825281016106ea81611b04565b602080825281016106ea81611b2f565b602080825281016106ea81611b73565b602080825281016106ea81611bb6565b602080825281016106ea81611bda565b602080825281016106ea81611c13565b602080825281016106ea81611c4c565b602080825281016106ea81611c8f565b602081016106ea8284611cc8565b60608101611e688286611cc8565b611d086020830185611cc8565b60200190565b5190565b90815260200190565b60006106ea82611e98565b151590565b6001600160a01b031690565b90565b60006106ea825b60006106ea82611e88565b60005b83811015611ed4578181015183820152602001611ebc565b83811115611ee3576000848401525b50505050565b601f01601f191690565b611efc81611e88565b81146114ea57600080fd5b611efc81611e93565b611efc81611ea456fea365627a7a723158203cfde807d71a689b159b013e1a6d78cc6be32b7e70dac675d1583919b57edae16c6578706572696d656e74616cf564736f6c63430005100040

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.