ETH Price: $3,107.87 (-0.25%)

Contract

0xA545C54593DC5B14887035148349EF003D5c17D7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw184850342023-11-02 14:37:59382 days ago1698935879IN
0xA545C545...03D5c17D7
0 ETH0.0028089738.51970326
Claim184850222023-11-02 14:35:35382 days ago1698935735IN
0xA545C545...03D5c17D7
0 ETH0.0024052736.44964171
Stake184847422023-11-02 13:39:11382 days ago1698932351IN
0xA545C545...03D5c17D7
0 ETH0.0037267430.25936601
Withdraw175822212023-06-29 3:15:35509 days ago1688008535IN
0xA545C545...03D5c17D7
0 ETH0.0017403423.86550962
Claim175822192023-06-29 3:15:11509 days ago1688008511IN
0xA545C545...03D5c17D7
0 ETH0.001187818
Withdraw175774082023-06-28 11:05:59509 days ago1687950359IN
0xA545C545...03D5c17D7
0 ETH0.0014269418.35932512
Claim175774072023-06-28 11:05:47509 days ago1687950347IN
0xA545C545...03D5c17D7
0 ETH0.0015621918.35932512
Withdraw175774032023-06-28 11:04:59509 days ago1687950299IN
0xA545C545...03D5c17D7
0 ETH0.0013573517.46406789
Claim175774022023-06-28 11:04:47509 days ago1687950287IN
0xA545C545...03D5c17D7
0 ETH0.0011614713.65
Withdraw175758592023-06-28 5:52:35510 days ago1687931555IN
0xA545C545...03D5c17D7
0 ETH0.0014207218.27940095
Claim175758572023-06-28 5:52:11510 days ago1687931531IN
0xA545C545...03D5c17D7
0 ETH0.0015553918.27940095
Claim175758522023-06-28 5:51:11510 days ago1687931471IN
0xA545C545...03D5c17D7
0 ETH0.0015149317.80386448
Claim175758432023-06-28 5:49:23510 days ago1687931363IN
0xA545C545...03D5c17D7
0 ETH0.0013304115.63541775
Claim175757692023-06-28 5:34:35510 days ago1687930475IN
0xA545C545...03D5c17D7
0 ETH0.0014915417.5290466
Claim175754972023-06-28 4:39:47510 days ago1687927187IN
0xA545C545...03D5c17D7
0 ETH0.0014933717.55048656
Claim175746552023-06-28 1:49:47510 days ago1687916987IN
0xA545C545...03D5c17D7
0 ETH0.0008578513
Claim175746212023-06-28 1:42:59510 days ago1687916579IN
0xA545C545...03D5c17D7
0 ETH0.0009898315
Claim175746052023-06-28 1:39:47510 days ago1687916387IN
0xA545C545...03D5c17D7
0 ETH0.0009238414
Claim175746002023-06-28 1:38:47510 days ago1687916327IN
0xA545C545...03D5c17D7
0 ETH0.0011352414
Withdraw175710482023-06-27 13:41:35510 days ago1687873295IN
0xA545C545...03D5c17D7
0 ETH0.0011658415
Claim175710452023-06-27 13:40:59510 days ago1687873259IN
0xA545C545...03D5c17D7
0 ETH0.0012763515
Withdraw175710232023-06-27 13:36:35510 days ago1687872995IN
0xA545C545...03D5c17D7
0 ETH0.0013212917
Claim175710212023-06-27 13:36:11510 days ago1687872971IN
0xA545C545...03D5c17D7
0 ETH0.0014125317
Withdraw175706602023-06-27 12:21:35510 days ago1687868495IN
0xA545C545...03D5c17D7
0 ETH0.0010103913
Claim175706582023-06-27 12:21:11510 days ago1687868471IN
0xA545C545...03D5c17D7
0 ETH0.0013269113
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
184850342023-11-02 14:37:59382 days ago1698935879
0xA545C545...03D5c17D7
0 ETH
184850222023-11-02 14:35:35382 days ago1698935735
0xA545C545...03D5c17D7
0 ETH
184847422023-11-02 13:39:11382 days ago1698932351
0xA545C545...03D5c17D7
0 ETH
184847422023-11-02 13:39:11382 days ago1698932351
0xA545C545...03D5c17D7
0 ETH
184846402023-11-02 13:18:23382 days ago1698931103
0xA545C545...03D5c17D7
0 ETH
175822212023-06-29 3:15:35509 days ago1688008535
0xA545C545...03D5c17D7
0 ETH
175822192023-06-29 3:15:11509 days ago1688008511
0xA545C545...03D5c17D7
0 ETH
175774082023-06-28 11:05:59509 days ago1687950359
0xA545C545...03D5c17D7
0 ETH
175774072023-06-28 11:05:47509 days ago1687950347
0xA545C545...03D5c17D7
0 ETH
175774072023-06-28 11:05:47509 days ago1687950347
0xA545C545...03D5c17D7
0 ETH
175774032023-06-28 11:04:59509 days ago1687950299
0xA545C545...03D5c17D7
0 ETH
175774022023-06-28 11:04:47509 days ago1687950287
0xA545C545...03D5c17D7
0 ETH
175774022023-06-28 11:04:47509 days ago1687950287
0xA545C545...03D5c17D7
0 ETH
175758592023-06-28 5:52:35510 days ago1687931555
0xA545C545...03D5c17D7
0 ETH
175758572023-06-28 5:52:11510 days ago1687931531
0xA545C545...03D5c17D7
0 ETH
175758572023-06-28 5:52:11510 days ago1687931531
0xA545C545...03D5c17D7
0 ETH
175758522023-06-28 5:51:11510 days ago1687931471
0xA545C545...03D5c17D7
0 ETH
175758522023-06-28 5:51:11510 days ago1687931471
0xA545C545...03D5c17D7
0 ETH
175758432023-06-28 5:49:23510 days ago1687931363
0xA545C545...03D5c17D7
0 ETH
175758432023-06-28 5:49:23510 days ago1687931363
0xA545C545...03D5c17D7
0 ETH
175757692023-06-28 5:34:35510 days ago1687930475
0xA545C545...03D5c17D7
0 ETH
175757692023-06-28 5:34:35510 days ago1687930475
0xA545C545...03D5c17D7
0 ETH
175754972023-06-28 4:39:47510 days ago1687927187
0xA545C545...03D5c17D7
0 ETH
175754972023-06-28 4:39:47510 days ago1687927187
0xA545C545...03D5c17D7
0 ETH
175746552023-06-28 1:49:47510 days ago1687916987
0xA545C545...03D5c17D7
0 ETH
View All Internal Transactions
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.