ETH Price: $2,957.60 (+0.89%)
Gas: 0.05 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Ether71351982019-01-27 17:38:212553 days ago1548610701IN
0x7a11462A...bF51b152c
0 ETH0.000089133
Purchase71204992019-01-24 20:01:582556 days ago1548360118IN
0x7a11462A...bF51b152c
0.91 ETH0.000048681.8
Transfer71197732019-01-24 16:36:212556 days ago1548347781IN
0x7a11462A...bF51b152c
0 ETH0.0006402630
Transfer71197732019-01-24 16:36:212556 days ago1548347781IN
0x7a11462A...bF51b152c
0 ETH0.0006402630
Transfer71197732019-01-24 16:36:212556 days ago1548347781IN
0x7a11462A...bF51b152c
0 ETH0.0006402630
Purchase For71195822019-01-24 15:44:042556 days ago1548344644IN
0x7a11462A...bF51b152c
0.8832 ETH0.0004053915
Purchase For71195622019-01-24 15:37:042556 days ago1548344224IN
0x7a11462A...bF51b152c
0.23 ETH0.0004053915
Purchase For71194822019-01-24 15:11:062556 days ago1548342666IN
0x7a11462A...bF51b152c
3.68 ETH0.0004063515
Purchase For71193852019-01-24 14:47:272556 days ago1548341247IN
0x7a11462A...bF51b152c
4.6 ETH0.0004053915
Purchase For71190532019-01-24 13:17:302556 days ago1548335850IN
0x7a11462A...bF51b152c
0.2275 ETH0.0004053915
Purchase For71188672019-01-24 12:22:542557 days ago1548332574IN
0x7a11462A...bF51b152c
0.2275 ETH0.0004053915
Purchase For71186282019-01-24 11:11:322557 days ago1548328292IN
0x7a11462A...bF51b152c
0.2275 ETH0.0004063515
Purchase For71185992019-01-24 11:03:402557 days ago1548327820IN
0x7a11462A...bF51b152c
0.728 ETH0.0004063515
Purchase For71185622019-01-24 10:53:032557 days ago1548327183IN
0x7a11462A...bF51b152c
0.819 ETH0.0004073115
Pause71182452019-01-24 9:15:372557 days ago1548321337IN
0x7a11462A...bF51b152c
0 ETH0.000140895
Purchase For71181382019-01-24 8:48:432557 days ago1548319723IN
0x7a11462A...bF51b152c
0.91 ETH0.0026878215
Purchase71181152019-01-24 8:44:552557 days ago1548319495IN
0x7a11462A...bF51b152c
0.2275 ETH0.000357992
Purchase71181142019-01-24 8:44:382557 days ago1548319478IN
0x7a11462A...bF51b152c
18.2 ETH0.00046282.7
Purchase71181112019-01-24 8:44:032557 days ago1548319443IN
0x7a11462A...bF51b152c
8.19 ETH0.000462692.7
Purchase71180662019-01-24 8:31:012557 days ago1548318661IN
0x7a11462A...bF51b152c
18.2 ETH0.000359962.1
Purchase71180042019-01-24 8:16:072557 days ago1548317767IN
0x7a11462A...bF51b152c
0.728 ETH0.000733844.1
Purchase71180042019-01-24 8:16:072557 days ago1548317767IN
0x7a11462A...bF51b152c
0.91 ETH0.000733364.1
Purchase71179902019-01-24 8:11:492557 days ago1548317509IN
0x7a11462A...bF51b152c
2.0475 ETH0.000734314.1
Purchase71179702019-01-24 8:07:192557 days ago1548317239IN
0x7a11462A...bF51b152c
18.2 ETH0.000874195.1
Purchase For71179652019-01-24 8:06:172557 days ago1548317177IN
0x7a11462A...bF51b152c
0.182 ETH0.0026846815
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-71351982019-01-27 17:38:212553 days ago1548610701
0x7a11462A...bF51b152c
519.256 ETH
-71181382019-01-24 8:48:432557 days ago1548319723
0x7a11462A...bF51b152c
0.0455 ETH
-71181152019-01-24 8:44:552557 days ago1548319495
0x7a11462A...bF51b152c
0.011375 ETH
-71181142019-01-24 8:44:382557 days ago1548319478
0x7a11462A...bF51b152c
0.91 ETH
-71181112019-01-24 8:44:032557 days ago1548319443
0x7a11462A...bF51b152c
0.4095 ETH
-71180662019-01-24 8:31:012557 days ago1548318661
0x7a11462A...bF51b152c
0.91 ETH
-71180042019-01-24 8:16:072557 days ago1548317767
0x7a11462A...bF51b152c
0.0364 ETH
-71180042019-01-24 8:16:072557 days ago1548317767
0x7a11462A...bF51b152c
0.0455 ETH
-71179902019-01-24 8:11:492557 days ago1548317509
0x7a11462A...bF51b152c
0.102375 ETH
-71179702019-01-24 8:07:192557 days ago1548317239
0x7a11462A...bF51b152c
0.91 ETH
-71179652019-01-24 8:06:172557 days ago1548317177
0x7a11462A...bF51b152c
0.0091 ETH
-71179622019-01-24 8:05:132557 days ago1548317113
0x7a11462A...bF51b152c
0.0455 ETH
-71179162019-01-24 7:51:552557 days ago1548316315
0x7a11462A...bF51b152c
0.020475 ETH
-71179002019-01-24 7:48:072557 days ago1548316087
0x7a11462A...bF51b152c
0.0364 ETH
-71178982019-01-24 7:48:032557 days ago1548316083
0x7a11462A...bF51b152c
0.102375 ETH
-71178962019-01-24 7:47:462557 days ago1548316066
0x7a11462A...bF51b152c
0.91 ETH
-71177282019-01-24 6:56:542557 days ago1548313014
0x7a11462A...bF51b152c
0.011375 ETH
-71177122019-01-24 6:50:132557 days ago1548312613
0x7a11462A...bF51b152c
0.00728 ETH
-71176662019-01-24 6:38:152557 days ago1548311895
0x7a11462A...bF51b152c
0.002275 ETH
-71176382019-01-24 6:29:512557 days ago1548311391
0x7a11462A...bF51b152c
0.0455 ETH
-71176382019-01-24 6:29:512557 days ago1548311391
0x7a11462A...bF51b152c
0.002275 ETH
-71176242019-01-24 6:26:062557 days ago1548311166
0x7a11462A...bF51b152c
0.002275 ETH
-71175812019-01-24 6:16:222557 days ago1548310582
0x7a11462A...bF51b152c
0.00728 ETH
-71175052019-01-24 5:55:162557 days ago1548309316
0x7a11462A...bF51b152c
0.011375 ETH
-71174532019-01-24 5:40:572557 days ago1548308457
0x7a11462A...bF51b152c
0.0455 ETH
View All Internal Transactions
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LandSale

Compiler Version
v0.5.2+commit.1df8f40c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-01-22
*/

pragma solidity ^0.5.2;
pragma experimental ABIEncoderV2;

// File: @axie/contract-library/contracts/access/HasAdmin.sol

contract HasAdmin {
  event AdminChanged(address indexed _oldAdmin, address indexed _newAdmin);
  event AdminRemoved(address indexed _oldAdmin);

  address public admin;

  modifier onlyAdmin {
    require(msg.sender == admin);
    _;
  }

  constructor() internal {
    admin = msg.sender;
    emit AdminChanged(address(0), admin);
  }

  function changeAdmin(address _newAdmin) external onlyAdmin {
    require(_newAdmin != address(0));
    emit AdminChanged(admin, _newAdmin);
    admin = _newAdmin;
  }

  function removeAdmin() external onlyAdmin {
    emit AdminRemoved(admin);
    admin = address(0);
  }
}

// File: @axie/contract-library/contracts/lifecycle/Pausable.sol

contract Pausable is HasAdmin {
  event Paused();
  event Unpaused();

  bool public paused;

  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  modifier whenPaused() {
    require(paused);
    _;
  }

  function pause() public onlyAdmin whenNotPaused {
    paused = true;
    emit Paused();
  }

  function unpause() public onlyAdmin whenPaused {
    paused = false;
    emit Unpaused();
  }
}

// File: @axie/contract-library/contracts/math/Math.sol

library Math {
  function max(uint256 a, uint256 b) internal pure returns (uint256 c) {
    return a >= b ? a : b;
  }

  function min(uint256 a, uint256 b) internal pure returns (uint256 c) {
    return a < b ? a : b;
  }
}

// File: @axie/contract-library/contracts/token/erc20/IERC20.sol

interface IERC20 {
  event Transfer(address indexed _from, address indexed _to, uint256 _value);
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);

  function totalSupply() external view returns (uint256 _supply);
  function balanceOf(address _owner) external view returns (uint256 _balance);

  function approve(address _spender, uint256 _value) external returns (bool _success);
  function allowance(address _owner, address _spender) external view returns (uint256 _value);

  function transfer(address _to, uint256 _value) external returns (bool _success);
  function transferFrom(address _from, address _to, uint256 _value) external returns (bool _success);
}

// File: @axie/contract-library/contracts/ownership/Withdrawable.sol

contract Withdrawable is HasAdmin {
  function withdrawEther() external onlyAdmin {
    msg.sender.transfer(address(this).balance);
  }

  function withdrawToken(IERC20 _token) external onlyAdmin {
    require(_token.transfer(msg.sender, _token.balanceOf(address(this))));
  }
}

// File: @axie/contract-library/contracts/token/erc20/IERC20Receiver.sol

interface IERC20Receiver {
  function receiveApproval(
    address _from,
    uint256 _value,
    address _tokenAddress,
    bytes calldata _data
  )
    external;
}

// File: @axie/contract-library/contracts/token/swap/IKyber.sol

interface IKyber {
  function getExpectedRate(
    address _src,
    address _dest,
    uint256 _srcAmount
  )
    external
    view
    returns (
      uint256 _expectedRate,
      uint256 _slippageRate
    );

  function trade(
    address _src,
    uint256 _maxSrcAmount,
    address _dest,
    address payable _receiver,
    uint256 _maxDestAmount,
    uint256 _minConversionRate,
    address _wallet
  )
    external
    payable
    returns (uint256 _destAmount);
}

// File: @axie/contract-library/contracts/math/SafeMath.sol

library SafeMath {
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    require(c >= a);
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
    require(b <= a);
    return a - b;
  }

  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }

    c = a * b;
    require(c / a == b);
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Since Solidity automatically asserts when dividing by 0,
    // but we only need it to revert.
    require(b > 0);
    return a / b;
  }

  function mod(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Same reason as `div`.
    require(b > 0);
    return a % b;
  }

  function ceilingDiv(uint256 a, uint256 b) internal pure returns (uint256 c) {
    return add(div(a, b), mod(a, b) > 0 ? 1 : 0);
  }

  function subU64(uint64 a, uint64 b) internal pure returns (uint64 c) {
    require(b <= a);
    return a - b;
  }

  function addU8(uint8 a, uint8 b) internal pure returns (uint8 c) {
    c = a + b;
    require(c >= a);
  }
}

// File: @axie/contract-library/contracts/token/erc20/IERC20Detailed.sol

interface IERC20Detailed {
  function name() external view returns (string memory _name);
  function symbol() external view returns (string memory _symbol);
  function decimals() external view returns (uint8 _decimals);
}

// File: @axie/contract-library/contracts/token/swap/KyberTokenDecimals.sol

contract KyberTokenDecimals {
  using SafeMath for uint256;

  address public ethAddress = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

  function _getTokenDecimals(address _token) internal view returns (uint8 _decimals) {
    return _token != ethAddress ? IERC20Detailed(_token).decimals() : 18;
  }

  function _fixTokenDecimals(
    address _src,
    address _dest,
    uint256 _unfixedDestAmount,
    bool _ceiling
  )
    internal
    view
    returns (uint256 _destTokenAmount)
  {
    uint256 _unfixedDecimals = _getTokenDecimals(_src) + 18; // Kyber by default returns rates with 18 decimals.
    uint256 _decimals = _getTokenDecimals(_dest);

    if (_unfixedDecimals > _decimals) {
      // Divide token amount by 10^(_unfixedDecimals - _decimals) to reduce decimals.
      if (_ceiling) {
        return _unfixedDestAmount.ceilingDiv(10 ** (_unfixedDecimals - _decimals));
      } else {
        return _unfixedDestAmount.div(10 ** (_unfixedDecimals - _decimals));
      }
    } else {
      // Multiply token amount with 10^(_decimals - _unfixedDecimals) to increase decimals.
      return _unfixedDestAmount.mul(10 ** (_decimals - _unfixedDecimals));
    }
  }
}

// File: @axie/contract-library/contracts/token/swap/KyberAdapter.sol

contract KyberAdapter is KyberTokenDecimals {
  IKyber public kyber = IKyber(0x818E6FECD516Ecc3849DAf6845e3EC868087B755);

  function() external payable {
    require(msg.sender == address(kyber));
  }

  function _getConversionRate(
    address _src,
    uint256 _srcAmount,
    address _dest
  )
    internal
    view
    returns (
      uint256 _expectedRate,
      uint256 _slippageRate
    )
  {
    return kyber.getExpectedRate(_src, _dest, _srcAmount);
  }

  function _convertToken(
    address _src,
    uint256 _srcAmount,
    address _dest
  )
    internal
    view
    returns (
      uint256 _expectedAmount,
      uint256 _slippageAmount
    )
  {
    (uint256 _expectedRate, uint256 _slippageRate) = _getConversionRate(_src, _srcAmount, _dest);

    return (
      _fixTokenDecimals(_src, _dest, _srcAmount.mul(_expectedRate), false),
      _fixTokenDecimals(_src, _dest, _srcAmount.mul(_slippageRate), false)
    );
  }

  function _getTokenBalance(address _token, address _account) internal view returns (uint256 _balance) {
    return _token != ethAddress ? IERC20(_token).balanceOf(_account) : _account.balance;
  }

  function _swapToken(
    address _src,
    uint256 _maxSrcAmount,
    address _dest,
    uint256 _maxDestAmount,
    uint256 _minConversionRate,
    address payable _initiator,
    address payable _receiver
  )
    internal
    returns (
      uint256 _srcAmount,
      uint256 _destAmount
    )
  {
    require(_src != _dest);
    require(_src == ethAddress ? msg.value >= _maxSrcAmount : msg.value == 0);

    // Prepare for handling back the change if there is any.
    uint256 _balanceBefore = _getTokenBalance(_src, address(this));

    if (_src != ethAddress) {
      require(IERC20(_src).transferFrom(_initiator, address(this), _maxSrcAmount));
      require(IERC20(_src).approve(address(kyber), _maxSrcAmount));
    } else {
      // Since we are going to transfer the source amount to Kyber.
      _balanceBefore = _balanceBefore.sub(_maxSrcAmount);
    }

    _destAmount = kyber.trade.value(
      _src == ethAddress ? _maxSrcAmount : 0
    )(
      _src,
      _maxSrcAmount,
      _dest,
      _receiver,
      _maxDestAmount,
      _minConversionRate,
      address(0)
    );

    uint256 _balanceAfter = _getTokenBalance(_src, address(this));
    _srcAmount = _maxSrcAmount;

    // Handle back the change, if there is any, to the message sender.
    if (_balanceAfter > _balanceBefore) {
      uint256 _change = _balanceAfter - _balanceBefore;
      _srcAmount = _srcAmount.sub(_change);

      if (_src != ethAddress) {
        require(IERC20(_src).transfer(_initiator, _change));
      } else {
        _initiator.transfer(_change);
      }
    }
  }
}

// File: @axie/contract-library/contracts/token/swap/KyberCustomTokenRates.sol

contract KyberCustomTokenRates is HasAdmin, KyberAdapter {
  struct Rate {
    address quote;
    uint256 value;
  }

  event CustomTokenRateUpdated(
    address indexed _tokenAddress,
    address indexed _quoteTokenAddress,
    uint256 _rate
  );

  mapping (address => Rate) public customTokenRate;

  function _hasCustomTokenRate(address _tokenAddress) internal view returns (bool _correct) {
    return customTokenRate[_tokenAddress].value > 0;
  }

  function _setCustomTokenRate(address _tokenAddress, address _quoteTokenAddress, uint256 _rate) internal {
    require(_rate > 0);
    customTokenRate[_tokenAddress] = Rate({ quote: _quoteTokenAddress, value: _rate });
    emit CustomTokenRateUpdated(_tokenAddress, _quoteTokenAddress, _rate);
  }

  // solium-disable-next-line security/no-assign-params
  function _getConversionRate(
    address _src,
    uint256 _srcAmount,
    address _dest
  )
    internal
    view
    returns (
      uint256 _expectedRate,
      uint256 _slippageRate
    )
  {
    uint256 _numerator = 1;
    uint256 _denominator = 1;

    if (_hasCustomTokenRate(_src)) {
      Rate storage _rate = customTokenRate[_src];

      _src = _rate.quote;
      _srcAmount = _srcAmount.mul(_rate.value).div(10**18);

      _numerator = _rate.value;
      _denominator = 10**18;
    }

    if (_hasCustomTokenRate(_dest)) {
      Rate storage _rate = customTokenRate[_dest];

      _dest = _rate.quote;

      // solium-disable-next-line whitespace
      if (_numerator == 1) { _numerator = 10**18; }
      _denominator = _rate.value;
    }

    if (_src != _dest) {
      (_expectedRate, _slippageRate) = super._getConversionRate(_src, _srcAmount, _dest);
    } else {
      _expectedRate = _slippageRate = 10**18;
    }

    return (
      _expectedRate.mul(_numerator).div(_denominator),
      _slippageRate.mul(_numerator).div(_denominator)
    );
  }

  function _swapToken(
    address _src,
    uint256 _maxSrcAmount,
    address _dest,
    uint256 _maxDestAmount,
    uint256 _minConversionRate,
    address payable _initiator,
    address payable _receiver
  )
    internal
    returns (
      uint256 _srcAmount,
      uint256 _destAmount
    )
  {
    if (_hasCustomTokenRate(_src) || _hasCustomTokenRate(_dest)) {
      require(_src == ethAddress ? msg.value >= _maxSrcAmount : msg.value == 0);
      require(_receiver == address(this));

      (uint256 _expectedRate, ) = _getConversionRate(_src, _srcAmount, _dest);
      require(_expectedRate >= _minConversionRate);

      _srcAmount = _maxSrcAmount;
      _destAmount = _fixTokenDecimals(_src, _dest, _srcAmount.mul(_expectedRate), false);

      if (_destAmount > _maxDestAmount) {
        _destAmount = _maxDestAmount;
        _srcAmount = _fixTokenDecimals(_dest, _src, _destAmount.mul(10**36).ceilingDiv(_expectedRate), true);

        // To avoid rounding error.
        if (_srcAmount > _maxSrcAmount) {
          _srcAmount = _maxSrcAmount;
        }
      }

      if (_src != ethAddress) {
        require(IERC20(_src).transferFrom(_initiator, address(this), _srcAmount));
      } else if (msg.value > _srcAmount) {
        _initiator.transfer(msg.value - _srcAmount);
      }

      return (_srcAmount, _destAmount);
    }

    return super._swapToken(
      _src,
      _maxSrcAmount,
      _dest,
      _maxDestAmount,
      _minConversionRate,
      _initiator,
      _receiver
    );
  }
}

// File: @axie/contract-library/contracts/util/AddressUtils.sol

library AddressUtils {
  function toPayable(address _address) internal pure returns (address payable _payable) {
    return address(uint160(_address));
  }

  function isContract(address _address) internal view returns (bool _correct) {
    uint256 _size;
    // solium-disable-next-line security/no-inline-assembly
    assembly { _size := extcodesize(_address) }
    return _size > 0;
  }
}

// File: contracts/land/sale/LandSale.sol

contract LandSale is Pausable, Withdrawable, KyberCustomTokenRates, IERC20Receiver {
  using AddressUtils for address;

  enum ChestType {
    Savannah,
    Forest,
    Arctic,
    Mystic
  }

  event ChestPurchased(
    ChestType indexed _chestType,
    uint256 _chestAmount,
    address indexed _tokenAddress,
    uint256 _tokenAmount,
    uint256 _totalPrice,
    uint256 _lunaCashbackAmount,
    address _buyer, // Ran out of indexed fields.
    address indexed _owner
  );

  event ReferralRewarded(
    address indexed _referrer,
    uint256 _referralReward
  );

  event ReferralPercentageUpdated(
    address indexed _referrer,
    uint256 _percentage
  );

  address public daiAddress = 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359;
  address public loomAddress = 0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0;

  uint256 public startedAt = 1548165600; // Tuesday, January 22, 2019 2:00:00 PM GMT+00:00
  uint256 public endedAt = 1563804000; // Monday, July 22, 2019 2:00:00 PM GMT+00:00

  mapping (uint8 => bool) public chestTypeEnabled;
  mapping (address => bool) public tokenEnabled;

  uint256 public savannahChestPrice = 0.05 ether;
  uint256 public forestChestPrice   = 0.16 ether;
  uint256 public arcticChestPrice   = 0.45 ether;
  uint256 public mysticChestPrice   = 1.00 ether;

  uint256 public initialDiscountPercentage = 1000; // 10%.
  uint256 public initialDiscountDays = 10 days;

  uint256 public cashbackPercentage = 1000; // 10%.

  uint256 public defaultReferralPercentage = 500; // 5%.
  mapping (address => uint256) public referralPercentage;

  IERC20 public lunaContract;
  address public lunaBankAddress;

  modifier whenInSale {
    // solium-disable-next-line security/no-block-members
    require(now >= startedAt && now <= endedAt);
    _;
  }

  constructor(IERC20 _lunaContract, address _lunaBankAddress) public {
    // 1 LUNA = 1/10 DAI (rate has 18 decimals).
    _setCustomTokenRate(address(_lunaContract), daiAddress, 10**17);

    lunaContract = _lunaContract;
    lunaBankAddress = _lunaBankAddress;

    enableChestType(ChestType.Savannah, true);
    enableChestType(ChestType.Forest, true);
    enableChestType(ChestType.Arctic, true);
    enableChestType(ChestType.Mystic, true);

    enableToken(ethAddress, true);
    enableToken(daiAddress, true);
    enableToken(address(lunaContract), true);
  }

  function getPrice(
    ChestType _chestType,
    uint256 _chestAmount,
    address _tokenAddress
  )
    external
    view
    returns (
      uint256 _tokenAmount,
      uint256 _minConversionRate
    )
  {
    uint256 _totalPrice = _getEthPrice(_chestType, _chestAmount, _tokenAddress);

    if (_tokenAddress != ethAddress) {
      (_tokenAmount, ) = _convertToken(ethAddress, _totalPrice, _tokenAddress);
      (, _minConversionRate) = _getConversionRate(_tokenAddress, _tokenAmount, ethAddress);
      _tokenAmount = _totalPrice.mul(10**36).ceilingDiv(_minConversionRate);
      _tokenAmount = _fixTokenDecimals(ethAddress, _tokenAddress, _tokenAmount, true);
    } else {
      _tokenAmount = _totalPrice;
    }
  }

  function purchase(
    ChestType _chestType,
    uint256 _chestAmount,
    address _tokenAddress,
    uint256 _maxTokenAmount,
    uint256 _minConversionRate,
    address payable _referrer
  )
    external
    payable
    whenInSale
    whenNotPaused
  {
    _purchase(
      _chestType,
      _chestAmount,
      _tokenAddress,
      _maxTokenAmount,
      _minConversionRate,
      msg.sender,
      msg.sender,
      _referrer
    );
  }

  function purchaseFor(
    ChestType _chestType,
    uint256 _chestAmount,
    address _tokenAddress,
    uint256 _maxTokenAmount,
    uint256 _minConversionRate,
    address _owner
  )
    external
    payable
    whenInSale
    whenNotPaused
  {
    _purchase(
      _chestType,
      _chestAmount,
      _tokenAddress,
      _maxTokenAmount,
      _minConversionRate,
      msg.sender,
      _owner,
      msg.sender
    );
  }

  function receiveApproval(
    address _from,
    uint256 _value,
    address _tokenAddress,
    bytes calldata /* _data */
  )
    external
    whenInSale
    whenNotPaused
  {
    require(msg.sender == _tokenAddress);

    uint256 _action;
    ChestType _chestType;
    uint256 _chestAmount;
    uint256 _minConversionRate;
    address payable _referrerOrOwner;

    // solium-disable-next-line security/no-inline-assembly
    assembly {
      _action := calldataload(0xa4)
      _chestType := calldataload(0xc4)
      _chestAmount := calldataload(0xe4)
      _minConversionRate := calldataload(0x104)
      _referrerOrOwner := calldataload(0x124)
    }

    address payable _buyer;
    address _owner;
    address payable _referrer;

    if (_action == 0) { // Purchase.
      _buyer = _from.toPayable();
      _owner = _from;
      _referrer = _referrerOrOwner;
    } else if (_action == 1) { // Purchase for.
      _buyer = _from.toPayable();
      _owner = _referrerOrOwner;
      _referrer = _from.toPayable();
    } else {
      revert();
    }

    _purchase(
      _chestType,
      _chestAmount,
      _tokenAddress,
      _value,
      _minConversionRate,
      _buyer,
      _owner,
      _referrer
    );
  }

  function setReferralPercentages(address[] calldata _referrers, uint256[] calldata _percentage) external onlyAdmin {
    for (uint256 i = 0; i < _referrers.length; i++) {
      referralPercentage[_referrers[i]] = _percentage[i];
      emit ReferralPercentageUpdated(_referrers[i], _percentage[i]);
    }
  }

  function setCustomTokenRates(address[] memory _tokenAddresses, Rate[] memory _rates) public onlyAdmin {
    for (uint256 i = 0; i < _tokenAddresses.length; i++) {
      _setCustomTokenRate(_tokenAddresses[i], _rates[i].quote, _rates[i].value);
    }
  }

  function enableChestType(ChestType _chestType, bool _enabled) public onlyAdmin {
    chestTypeEnabled[uint8(_chestType)] = _enabled;
  }

  function enableToken(address _tokenAddress, bool _enabled) public onlyAdmin {
    tokenEnabled[_tokenAddress] = _enabled;
  }

  function _getPresentPercentage() internal view returns (uint256 _percentage) {
    // solium-disable-next-line security/no-block-members
    uint256 _elapsedDays = (now - startedAt).div(1 days).mul(1 days);

    return uint256(10000) // 100%.
      .sub(initialDiscountPercentage)
      .add(
        initialDiscountPercentage
          .mul(Math.min(_elapsedDays, initialDiscountDays))
          .div(initialDiscountDays)
      );
  }

  function _getEthPrice(
    ChestType _chestType,
    uint256 _chestAmount,
    address _tokenAddress
  )
    internal
    view
    returns (uint256 _price)
  {
    // solium-disable-next-line indentation
         if (_chestType == ChestType.Savannah) { _price = savannahChestPrice; } // solium-disable-line whitespace
    else if (_chestType == ChestType.Forest  ) { _price = forestChestPrice;   } // solium-disable-line whitespace, lbrace
    else if (_chestType == ChestType.Arctic  ) { _price = arcticChestPrice;   } // solium-disable-line whitespace, lbrace
    else if (_chestType == ChestType.Mystic  ) { _price = mysticChestPrice;   } // solium-disable-line whitespace, lbrace
    else { revert(); } // solium-disable-line whitespace, lbrace

    _price = _price
      .mul(_getPresentPercentage())
      .div(10000)
      .mul(_chestAmount);

    if (_tokenAddress == address(lunaContract)) {
      _price = _price
        .mul(uint256(10000).sub(cashbackPercentage))
        .ceilingDiv(10000);
    }
  }

  function _getLunaCashbackAmount(
    uint256 _ethPrice,
    address _tokenAddress
  )
    internal
    view
    returns (uint256 _lunaCashbackAmount)
  {
    if (_tokenAddress != address(lunaContract)) {
      (uint256 _lunaPrice, ) = _convertToken(ethAddress, _ethPrice, address(lunaContract));

      return _lunaPrice
        .mul(cashbackPercentage)
        .div(uint256(10000));
    }
  }

  function _getReferralPercentage(address _referrer, address _owner) internal view returns (uint256 _percentage) {
    return _referrer != _owner && _referrer != address(0)
      ? Math.max(referralPercentage[_referrer], defaultReferralPercentage)
      : 0;
  }

  function _purchase(
    ChestType _chestType,
    uint256 _chestAmount,
    address _tokenAddress,
    uint256 _maxTokenAmount,
    uint256 _minConversionRate,
    address payable _buyer,
    address _owner,
    address payable _referrer
  )
    internal
  {
    require(chestTypeEnabled[uint8(_chestType)]);
    require(tokenEnabled[_tokenAddress]);

    require(_tokenAddress == ethAddress ? msg.value >= _maxTokenAmount : msg.value == 0);

    uint256 _totalPrice = _getEthPrice(_chestType, _chestAmount, _tokenAddress);
    uint256 _lunaCashbackAmount = _getLunaCashbackAmount(_totalPrice, _tokenAddress);

    uint256 _tokenAmount;
    uint256 _ethAmount;

    if (_tokenAddress != ethAddress) {
      (_tokenAmount, _ethAmount) = _swapToken(
        _tokenAddress,
        _maxTokenAmount,
        ethAddress,
        _totalPrice,
        _minConversionRate,
        _buyer,
        address(this)
      );
    } else {
      // Check if the buyer allowed to spend that much ETH.
      require(_maxTokenAmount >= _totalPrice);

      // Require minimum conversion rate to be 0.
      require(_minConversionRate == 0);

      _tokenAmount = _totalPrice;
      _ethAmount = msg.value;
    }

    // Check if we received enough payment.
    require(_ethAmount >= _totalPrice);

    // Send back the ETH change, if there is any.
    if (_ethAmount > _totalPrice) {
      _buyer.transfer(_ethAmount - _totalPrice);
    }

    emit ChestPurchased(
      _chestType,
      _chestAmount,
      _tokenAddress,
      _tokenAmount,
      _totalPrice,
      _lunaCashbackAmount,
      _buyer,
      _owner
    );

    if (_tokenAddress != address(lunaContract)) {
      // Send LUNA cashback.
      require(lunaContract.transferFrom(lunaBankAddress, _owner, _lunaCashbackAmount));
    }

    if (!_hasCustomTokenRate(_tokenAddress)) {
      uint256 _referralReward = _totalPrice
        .mul(_getReferralPercentage(_referrer, _owner))
        .div(10000);

      // If the referral reward cannot be sent because of a referrer's fault, set it to 0.
      // solium-disable-next-line security/no-send
      if (_referralReward > 0 && !_referrer.send(_referralReward)) {
        _referralReward = 0;
      }

      if (_referralReward > 0) {
        emit ReferralRewarded(_referrer, _referralReward);
      }
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"initialDiscountPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"chestTypeEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cashbackPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_chestType","type":"uint8"},{"name":"_chestAmount","type":"uint256"},{"name":"_tokenAddress","type":"address"},{"name":"_maxTokenAmount","type":"uint256"},{"name":"_minConversionRate","type":"uint256"},{"name":"_owner","type":"address"}],"name":"purchaseFor","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"daiAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loomAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endedAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lunaBankAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_chestType","type":"uint8"},{"name":"_enabled","type":"bool"}],"name":"enableChestType","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultReferralPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_referrers","type":"address[]"},{"name":"_percentage","type":"uint256[]"}],"name":"setReferralPercentages","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"savannahChestPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialDiscountDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"_enabled","type":"bool"}],"name":"enableToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_chestType","type":"uint8"},{"name":"_chestAmount","type":"uint256"},{"name":"_tokenAddress","type":"address"},{"name":"_maxTokenAmount","type":"uint256"},{"name":"_minConversionRate","type":"uint256"},{"name":"_referrer","type":"address"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"customTokenRate","outputs":[{"name":"quote","type":"address"},{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mysticChestPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_tokenAddress","type":"address"},{"name":"","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddresses","type":"address[]"},{"components":[{"name":"quote","type":"address"},{"name":"value","type":"uint256"}],"name":"_rates","type":"tuple[]"}],"name":"setCustomTokenRates","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kyber","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_chestType","type":"uint8"},{"name":"_chestAmount","type":"uint256"},{"name":"_tokenAddress","type":"address"}],"name":"getPrice","outputs":[{"name":"_tokenAmount","type":"uint256"},{"name":"_minConversionRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lunaContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"referralPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"arcticChestPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startedAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"forestChestPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_lunaContract","type":"address"},{"name":"_lunaBankAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_chestType","type":"uint8"},{"indexed":false,"name":"_chestAmount","type":"uint256"},{"indexed":true,"name":"_tokenAddress","type":"address"},{"indexed":false,"name":"_tokenAmount","type":"uint256"},{"indexed":false,"name":"_totalPrice","type":"uint256"},{"indexed":false,"name":"_lunaCashbackAmount","type":"uint256"},{"indexed":false,"name":"_buyer","type":"address"},{"indexed":true,"name":"_owner","type":"address"}],"name":"ChestPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_referrer","type":"address"},{"indexed":false,"name":"_referralReward","type":"uint256"}],"name":"ReferralRewarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_referrer","type":"address"},{"indexed":false,"name":"_percentage","type":"uint256"}],"name":"ReferralPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_tokenAddress","type":"address"},{"indexed":true,"name":"_quoteTokenAddress","type":"address"},{"indexed":false,"name":"_rate","type":"uint256"}],"name":"CustomTokenRateUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_oldAdmin","type":"address"},{"indexed":true,"name":"_newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"}]

608060405260018054600160a060020a031990811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790915560028054821673818e6fecd516ecc3849daf6845e3ec868087b7551790556004805482167389d24a6b4ccb1b6faa2625fe562bdd9a232603591790556005805490911673a4e8c3ec456107ea67d3075bf9e3df3a75823db0179055635c4721e0600655635d35c16060075566b1a2bc2ec50000600a556702386f26fc100000600b5567063eb89da4ed0000600c55670de0b6b3a7640000600d556103e8600e819055620d2f00600f556010556101f4601155348015620000ec57600080fd5b5060405160408062002bd883398101806040526200010e9190810190620003d3565b60008054600160a060020a0319163317808255604051600160a060020a039190911691907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f908290a360045462000182908390600160a060020a031667016345785d8a00006401000000006200027d810204565b60138054600160a060020a03808516600160a060020a0319928316179092556014805492841692909116919091179055620001c9600060016401000000006200031d810204565b620001df6001806401000000006200031d810204565b620001f6600260016401000000006200031d810204565b6200020d600360016401000000006200031d810204565b600180546200023191600160a060020a03909116906401000000006200036d810204565b6004546200025390600160a060020a031660016401000000006200036d810204565b6013546200027590600160a060020a031660016401000000006200036d810204565b50506200045b565b600081116200028b57600080fd5b604080518082018252600160a060020a038481168083526020808401868152888416600081815260039093529186902094518554600160a060020a0319169416939093178455915160019093019290925591519091907f490cff0bf8cd6cf7f35e4cf75bccb7ceaacf4468027202ba40fc8cefb384eace906200031090859062000423565b60405180910390a3505050565b600054600160a060020a031633146200033557600080fd5b80600860008460038111156200034757fe5b60ff1681526020810191909152604001600020805460ff19169115159190911790555050565b600054600160a060020a031633146200038557600080fd5b600160a060020a03919091166000908152600960205260409020805460ff1916911515919091179055565b6000620003be825162000439565b9392505050565b6000620003be82516200044e565b60008060408385031215620003e757600080fd5b6000620003f58585620003c5565b92505060206200040885828601620003b0565b9150509250929050565b6200041d816200044b565b82525050565b6020810162000433828462000412565b92915050565b6000600160a060020a03821662000433565b90565b6000620004338262000439565b61276d806200046b6000396000f3fe6080604052600436106102135760003560e060020a900480638456cb591161011c578063a2d10ba5116100a4578063e2cdc1ee11610073578063e2cdc1ee14610585578063e5afd7111461059a578063f21f537d146105ba578063f851a440146105cf578063f8dc0221146105e457610213565b8063a2d10ba514610500578063a34cd51b14610522578063c9435f0514610550578063cb544bb21461056557610213565b80638af94048116100eb5780638af94048146104765780638f2839701461048b5780638f4ffcb1146104ab57806391ecdd23146104cb5780639a202d47146104eb57610213565b80638456cb5914610400578063846a33611461041557806387c53d0014610428578063894760691461045657610213565b80634b5459451161019f5780637362377b1161016e5780637362377b14610381578063772bf29b1461039657806377da37b3146103b65780637824c812146103cb5780637dc787fd146103e057610213565b80634b5459451461032257806353388f44146103375780635c975abb14610357578063711190301461036c57610213565b80632c387275116101e65780632c387275146102ac57806337179db8146102ce5780633d6a71e4146102e35780633f4ba83a146102f857806341398b151461030d57610213565b806311c9248f1461022c57806319cb7aa9146102575780631c9cef041461028457806321bbda0814610299575b600254600160a060020a0316331461022a57600080fd5b005b34801561023857600080fd5b506102416105f9565b60405161024e9190612638565b60405180910390f35b34801561026357600080fd5b506102776102723660046124cb565b6105ff565b60405161024e919061261c565b34801561029057600080fd5b50610241610614565b61022a6102a73660046123f6565b61061a565b3480156102b857600080fd5b506102c1610668565b60405161024e919061253a565b3480156102da57600080fd5b506102c1610677565b3480156102ef57600080fd5b50610241610686565b34801561030457600080fd5b5061022a61068c565b34801561031957600080fd5b506102c1610702565b34801561032e57600080fd5b506102c1610711565b34801561034357600080fd5b5061022a61035236600461238a565b610720565b34801561036357600080fd5b5061027761076e565b34801561037857600080fd5b5061024161077e565b34801561038d57600080fd5b5061022a610784565b3480156103a257600080fd5b5061022a6103b136600461227f565b6107cb565b3480156103c257600080fd5b506102416108b4565b3480156103d757600080fd5b506102416108ba565b3480156103ec57600080fd5b5061022a6103fb3660046121c7565b6108c0565b34801561040c57600080fd5b5061022a610902565b61022a6104233660046123f6565b61097d565b34801561043457600080fd5b506104486104433660046121a9565b6109c3565b60405161024e9291906125a6565b34801561046257600080fd5b5061022a61047136600461236c565b6109e8565b34801561048257600080fd5b50610241610b1b565b34801561049757600080fd5b5061022a6104a63660046121a9565b610b21565b3480156104b757600080fd5b5061022a6104c6366004612201565b610bb5565b3480156104d757600080fd5b5061022a6104e63660046122ef565b610c98565b3480156104f757600080fd5b5061022a610d1d565b34801561050c57600080fd5b50610515610d89565b60405161024e919061262a565b34801561052e57600080fd5b5061054261053d3660046123a9565b610d98565b60405161024e929190612646565b34801561055c57600080fd5b50610515610e59565b34801561057157600080fd5b506102416105803660046121a9565b610e68565b34801561059157600080fd5b50610241610e7a565b3480156105a657600080fd5b506102776105b53660046121a9565b610e80565b3480156105c657600080fd5b50610241610e95565b3480156105db57600080fd5b506102c1610e9b565b3480156105f057600080fd5b50610241610eaa565b600e5481565b60086020526000908152604090205460ff1681565b60105481565b600654421015801561062e57506007544211155b151561063957600080fd5b60005460a060020a900460ff161561065057600080fd5b6106608686868686338733610eb0565b505050505050565b600454600160a060020a031681565b600554600160a060020a031681565b60075481565b600054600160a060020a031633146106a357600080fd5b60005460a060020a900460ff1615156106bb57600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169339190a1565b600154600160a060020a031681565b601454600160a060020a031681565b600054600160a060020a0316331461073757600080fd5b806008600084600381111561074857fe5b60ff1681526020810191909152604001600020805460ff19169115159190911790555050565b60005460a060020a900460ff1681565b60115481565b600054600160a060020a0316331461079b57600080fd5b6040513390303180156108fc02916000818181858888f193505050501580156107c8573d6000803e3d6000fd5b50565b600054600160a060020a031633146107e257600080fd5b60005b838110156108ad578282828181106107f957fe5b9050602002013560126000878785818110151561081257fe5b60209081029290920135600160a060020a03168352508101919091526040016000205584848281811061084157fe5b90506020020135600160a060020a0316600160a060020a03167f60ad3b7a12751798871fd3f7ecd1572f445ce2fabab4e2672c9ca0e78fc6ba82848484818110151561088957fe5b9050602002013560405161089d9190612638565b60405180910390a26001016107e5565b5050505050565b600a5481565b600f5481565b600054600160a060020a031633146108d757600080fd5b600160a060020a03919091166000908152600960205260409020805460ff1916911515919091179055565b600054600160a060020a0316331461091957600080fd5b60005460a060020a900460ff161561093057600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600654421015801561099157506007544211155b151561099c57600080fd5b60005460a060020a900460ff16156109b357600080fd5b6106608686868686333388610eb0565b60036020526000908152604090208054600190910154600160a060020a039091169082565b600054600160a060020a031633146109ff57600080fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0382169063a9059cbb90339083906370a0823190610a4e90309060040161253a565b60206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a9e919081019061247d565b6040518363ffffffff1660e060020a028152600401610abe929190612570565b602060405180830381600087803b158015610ad857600080fd5b505af1158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b10919081019061234e565b15156107c857600080fd5b600d5481565b600054600160a060020a03163314610b3857600080fd5b600160a060020a0381161515610b4d57600080fd5b60008054604051600160a060020a03808516939216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6006544210158015610bc957506007544211155b1515610bd457600080fd5b60005460a060020a900460ff1615610beb57600080fd5b33600160a060020a03841614610c0057600080fd5b60a43560c43560e435610104356101243560008080871515610c3b57610c2e8d600160a060020a03166111f6565b92508c9150839050610c79565b8760011415610c7457610c568d600160a060020a03166111f6565b9250839150610c6d8d600160a060020a03166111f6565b9050610c79565b600080fd5b610c8987878d8f89888888610eb0565b50505050505050505050505050565b600054600160a060020a03163314610caf57600080fd5b60005b8251811015610d1857610d108382815181101515610ccc57fe5b906020019060200201518383815181101515610ce457fe5b60209081029091010151518451859085908110610cfd57fe5b90602001906020020151602001516111f9565b600101610cb2565b505050565b600054600160a060020a03163314610d3457600080fd5b60008054604051600160a060020a03909116917fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f91a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600254600160a060020a031681565b6000806000610da88686866112a3565b600154909150600160a060020a03858116911614610e4c57600154610dd790600160a060020a03168286611392565b50600154909350610df49085908590600160a060020a03166113e7565b9250610e27905082610e1b836ec097ce7bc90715b34b9f100000000063ffffffff6114fb16565b9063ffffffff61152d16565b60018054919450610e4591600160a060020a0316908690869061155f565b9250610e50565b8092505b50935093915050565b601354600160a060020a031681565b60126020526000908152604090205481565b600c5481565b60096020526000908152604090205460ff1681565b60065481565b600054600160a060020a031681565b600b5481565b60086000896003811115610ec057fe5b60ff9081168252602082019290925260400160002054161515610ee257600080fd5b600160a060020a03861660009081526009602052604090205460ff161515610f0957600080fd5b600154600160a060020a03878116911614610f25573415610f2a565b843410155b1515610f3557600080fd5b6000610f428989896112a3565b90506000610f5082896115e1565b6001549091506000908190600160a060020a038b8116911614610f9457600154610f8a908b908b90600160a060020a0316878c8c30611640565b9092509050610fb2565b83891015610fa157600080fd5b8715610fac57600080fd5b50829050345b83811015610fbf57600080fd5b8381111561100057604051600160a060020a0388169085830380156108fc02916000818181858888f19350505050158015610ffe573d6000803e3d6000fd5b505b85600160a060020a03168a600160a060020a03168d600381111561102057fe5b7f8d3eed3c141dc3f6b103a145f67cf590db4214dd0aef765580d273fd0e669b808e8689898e604051611057959493929190612654565b60405180910390a4601354600160a060020a038b8116911614611122576013546014546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03928316926323b872dd926110c5929116908a90889060040161258b565b602060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611117919081019061234e565b151561112257600080fd5b61112b8a611848565b15156111e857600061115f612710611153611146898b611867565b889063ffffffff6114fb16565b9063ffffffff6118c416565b90506000811180156111935750604051600160a060020a0387169082156108fc029083906000818181858888f19350505050155b1561119c575060005b6000811115610c895785600160a060020a03167fe02a129f98418d04669038a9874f706689ba7726c0c0e82c67319ec8ca9001ea826040516111de9190612638565b60405180910390a2505b505050505050505050505050565b90565b6000811161120657600080fd5b604080518082018252600160a060020a03848116808352602080840186815288841660008181526003909352918690209451855473ffffffffffffffffffffffffffffffffffffffff19169416939093178455915160019093019290925591519091907f490cff0bf8cd6cf7f35e4cf75bccb7ceaacf4468027202ba40fc8cefb384eace90611296908590612638565b60405180910390a3505050565b6000808460038111156112b257fe5b14156112c15750600a54611314565b60018460038111156112cf57fe5b14156112de5750600b54611314565b60028460038111156112ec57fe5b14156112fb5750600c54611314565b600384600381111561130957fe5b1415610c745750600d545b611342836113366127106111536113296118e5565b869063ffffffff6114fb16565b9063ffffffff6114fb16565b601354909150600160a060020a038381169116141561138b57611388612710610e1b61137b60105461271061195a90919063ffffffff16565b849063ffffffff6114fb16565b90505b9392505050565b6000806000806113a38787876113e7565b90925090506113c487866113bd898663ffffffff6114fb16565b600061155f565b6113d988876113bd8a8663ffffffff6114fb16565b935093505050935093915050565b6000806001806113f687611848565b1561145357600160a060020a0396871660009081526003602052604090208054600182015498169761143d90670de0b6b3a764000090611153908a9063ffffffff6114fb16565b965080600101549250670de0b6b3a76400009150505b61145c85611848565b1561149c57600160a060020a039485166000908152600360205260409020805490951694600183141561149557670de0b6b3a764000092505b6001015490505b600160a060020a03878116908616146114c4576114ba87878761196f565b90945092506114d3565b670de0b6b3a764000092508293505b6114e781611153868563ffffffff6114fb16565b6113d982611153868663ffffffff6114fb16565b600082151561150c57506000611527565b5081810281838281151561151c57fe5b041461152757600080fd5b92915050565b600061138b61153c84846118c4565b60006115488686611a1c565b11611554576000611557565b60015b60ff16611a3d565b60008061156b86611a4d565b60120160ff169050600061157e86611a4d565b60ff169050808211156115c45783156115af576115a685828403600a0a63ffffffff61152d16565b925050506115d9565b6115a685828403600a0a63ffffffff6118c416565b6115a685838303600a0a63ffffffff6114fb16565b949350505050565b601354600090600160a060020a038381169116146115275760015460135460009161161a91600160a060020a0391821691879116611392565b509050611638612710611153601054846114fb90919063ffffffff16565b915050611527565b60008061164c89611848565b8061165b575061165b87611848565b1561182857600154600160a060020a038a811691161461167c573415611681565b873410155b151561168c57600080fd5b600160a060020a03831630146116a157600080fd5b60006116ae8a848a6113e7565b509050858110156116be57600080fd5b8892506116d68a896113bd868563ffffffff6114fb16565b91508682111561172057869150611712888b61170b84610e1b876ec097ce7bc90715b34b9f100000000063ffffffff6114fb16565b600161155f565b925088831115611720578892505b600154600160a060020a038b81169116146117e0576040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038b16906323b872dd9061177e90889030908890600401612548565b602060405180830381600087803b15801561179857600080fd5b505af11580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117d0919081019061234e565b15156117db57600080fd5b611822565b8234111561182257604051600160a060020a038616903485900380156108fc02916000818181858888f19350505050158015611820573d6000803e3d6000fd5b505b5061183c565b61183789898989898989611ae1565b915091505b97509795505050505050565b600160a060020a03166000908152600360205260408120600101541190565b600081600160a060020a031683600160a060020a0316141580156118935750600160a060020a03831615155b61189e57600061138b565b600160a060020a03831660009081526012602052604090205460115461138b9190611e96565b60008082116118d257600080fd5b81838115156118dd57fe5b049392505050565b600080611909620151806113366201518060065442036118c490919063ffffffff16565b9050611954611932600f5461115361192385600f54611ead565b600e549063ffffffff6114fb16565b600e54611948906127109063ffffffff61195a16565b9063ffffffff611a3d16565b91505090565b60008282111561196957600080fd5b50900390565b6002546040517f809a9e550000000000000000000000000000000000000000000000000000000081526000918291600160a060020a039091169063809a9e55906119c19088908790899060040161258b565b604080518083038186803b1580156119d857600080fd5b505afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a10919081019061249b565b91509150935093915050565b6000808211611a2a57600080fd5b8183811515611a3557fe5b069392505050565b8181018281101561152757600080fd5b600154600090600160a060020a0383811691161415611a6d576012611527565b81600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611aa957600080fd5b505afa158015611abd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152791908101906124e9565b600080600160a060020a038981169088161415611afd57600080fd5b600154600160a060020a038a8116911614611b19573415611b1e565b873410155b1515611b2957600080fd5b6000611b358a30611ebc565b600154909150600160a060020a038b8116911614611ca2576040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038b16906323b872dd90611b9690889030908e90600401612548565b602060405180830381600087803b158015611bb057600080fd5b505af1158015611bc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611be8919081019061234e565b1515611bf357600080fd5b6002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038c81169263095ea7b392611c4092909116908d906004016125a6565b602060405180830381600087803b158015611c5a57600080fd5b505af1158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c92919081019061234e565b1515611c9d57600080fd5b611cb5565b611cb2818a63ffffffff61195a16565b90505b600254600154600160a060020a039182169163cb3c28c7918d8216911614611cde576000611ce0565b8a5b8c8c8c898d8d60006040518963ffffffff1660e060020a028152600401611d0d97969594939291906125b4565b6020604051808303818588803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250611d5f919081019061247d565b91506000611d6d8b30611ebc565b905089935081811115611e8857818103611d8d858263ffffffff61195a16565b600154909550600160a060020a038d8116911614611e4e576040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038d169063a9059cbb90611dec908a908590600401612570565b602060405180830381600087803b158015611e0657600080fd5b505af1158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e3e919081019061234e565b1515611e4957600080fd5b611e86565b604051600160a060020a0388169082156108fc029083906000818181858888f19350505050158015611e84573d6000803e3d6000fd5b505b505b505097509795505050505050565b600081831015611ea6578161138b565b5090919050565b6000818310611ea6578161138b565b600154600090600160a060020a0384811691161415611ee55781600160a060020a03163161138b565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038416906370a0823190611f2a90859060040161253a565b60206040518083038186803b158015611f4257600080fd5b505afa158015611f56573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061138b919081019061247d565b600061138b82356126e8565b600080601f83018413611f9857600080fd5b50813567ffffffffffffffff811115611fb057600080fd5b602083019150836020820283011115611fc857600080fd5b9250929050565b6000601f82018313611fe057600080fd5b8135611ff3611fee826126c7565b6126a0565b9150818183526020840193506020810190508385602084028201111561201857600080fd5b60005b83811015612044578161202e8882611f7a565b845250602092830192919091019060010161201b565b5050505092915050565b6000601f8201831361205f57600080fd5b813561206d611fee826126c7565b9150818183526020840193506020810190508385604084028201111561209257600080fd5b60005b8381101561204457816120a88882612132565b84525060209092019160409190910190600101612095565b600061138b82356126f3565b600061138b82516126f3565b600080601f830184136120ea57600080fd5b50813567ffffffffffffffff81111561210257600080fd5b602083019150836001820283011115611fc857600080fd5b600061138b8235612704565b600061138b823561270f565b60006040828403121561214457600080fd5b61214e60406126a0565b9050600061215c8484611f7a565b825250602061216d84848301612179565b60208301525092915050565b600061138b82356111f6565b600061138b82516111f6565b600061138b8235612722565b600061138b8251612722565b6000602082840312156121bb57600080fd5b60006115d98484611f7a565b600080604083850312156121da57600080fd5b60006121e68585611f7a565b92505060206121f7858286016120c0565b9150509250929050565b60008060008060006080868803121561221957600080fd5b60006122258888611f7a565b955050602061223688828901612179565b945050604061224788828901611f7a565b935050606086013567ffffffffffffffff81111561226457600080fd5b612270888289016120d8565b92509250509295509295909350565b6000806000806040858703121561229557600080fd5b843567ffffffffffffffff8111156122ac57600080fd5b6122b887828801611f86565b9450945050602085013567ffffffffffffffff8111156122d757600080fd5b6122e387828801611f86565b95989497509550505050565b6000806040838503121561230257600080fd5b823567ffffffffffffffff81111561231957600080fd5b61232585828601611fcf565b925050602083013567ffffffffffffffff81111561234257600080fd5b6121f78582860161204e565b60006020828403121561236057600080fd5b60006115d984846120cc565b60006020828403121561237e57600080fd5b60006115d9848461211a565b6000806040838503121561239d57600080fd5b60006121e68585612126565b6000806000606084860312156123be57600080fd5b60006123ca8686612126565b93505060206123db86828701612179565b92505060406123ec86828701611f7a565b9150509250925092565b60008060008060008060c0878903121561240f57600080fd5b600061241b8989612126565b965050602061242c89828a01612179565b955050604061243d89828a01611f7a565b945050606061244e89828a01612179565b935050608061245f89828a01612179565b92505060a061247089828a01611f7a565b9150509295509295509295565b60006020828403121561248f57600080fd5b60006115d98484612185565b600080604083850312156124ae57600080fd5b60006124ba8585612185565b92505060206121f785828601612185565b6000602082840312156124dd57600080fd5b60006115d98484612191565b6000602082840312156124fb57600080fd5b60006115d9848461219d565b61251081612728565b82525050565b612510816126e8565b612510816126f3565b61251081612704565b612510816111f6565b602081016115278284612516565b606081016125568286612507565b6125636020830185612507565b6115d96040830184612531565b6040810161257e8285612507565b61138b6020830184612531565b606081016125998286612516565b6125636020830185612516565b6040810161257e8285612516565b60e081016125c2828a612516565b6125cf6020830189612531565b6125dc6040830188612516565b6125e96060830187612516565b6125f66080830186612531565b61260360a0830185612531565b61261060c0830184612507565b98975050505050505050565b60208101611527828461251f565b602081016115278284612528565b602081016115278284612531565b6040810161257e8285612531565b60a081016126628288612531565b61266f6020830187612531565b61267c6040830186612531565b6126896060830185612531565b6126966080830184612507565b9695505050505050565b60405181810167ffffffffffffffff811182821017156126bf57600080fd5b604052919050565b600067ffffffffffffffff8211156126de57600080fd5b5060209081020190565b6000611527826126f8565b151590565b600160a060020a031690565b6000611527826126e8565b60006004821061271e57600080fd5b5090565b60ff1690565b60006115278261270456fea265627a7a72305820ef225a7cbb7d3544b1565d48f1027870a8fb9a7ccb9e31ccdf5ebb69120c48606c6578706572696d656e74616cf5003700000000000000000000000092bf969865c80eda082fd5d8b4e28da4d58e1c3a00000000000000000000000028fa65ab4a4a5f31e7958a00c1ce410a426e6fe8

Deployed Bytecode

0x6080604052600436106102135760003560e060020a900480638456cb591161011c578063a2d10ba5116100a4578063e2cdc1ee11610073578063e2cdc1ee14610585578063e5afd7111461059a578063f21f537d146105ba578063f851a440146105cf578063f8dc0221146105e457610213565b8063a2d10ba514610500578063a34cd51b14610522578063c9435f0514610550578063cb544bb21461056557610213565b80638af94048116100eb5780638af94048146104765780638f2839701461048b5780638f4ffcb1146104ab57806391ecdd23146104cb5780639a202d47146104eb57610213565b80638456cb5914610400578063846a33611461041557806387c53d0014610428578063894760691461045657610213565b80634b5459451161019f5780637362377b1161016e5780637362377b14610381578063772bf29b1461039657806377da37b3146103b65780637824c812146103cb5780637dc787fd146103e057610213565b80634b5459451461032257806353388f44146103375780635c975abb14610357578063711190301461036c57610213565b80632c387275116101e65780632c387275146102ac57806337179db8146102ce5780633d6a71e4146102e35780633f4ba83a146102f857806341398b151461030d57610213565b806311c9248f1461022c57806319cb7aa9146102575780631c9cef041461028457806321bbda0814610299575b600254600160a060020a0316331461022a57600080fd5b005b34801561023857600080fd5b506102416105f9565b60405161024e9190612638565b60405180910390f35b34801561026357600080fd5b506102776102723660046124cb565b6105ff565b60405161024e919061261c565b34801561029057600080fd5b50610241610614565b61022a6102a73660046123f6565b61061a565b3480156102b857600080fd5b506102c1610668565b60405161024e919061253a565b3480156102da57600080fd5b506102c1610677565b3480156102ef57600080fd5b50610241610686565b34801561030457600080fd5b5061022a61068c565b34801561031957600080fd5b506102c1610702565b34801561032e57600080fd5b506102c1610711565b34801561034357600080fd5b5061022a61035236600461238a565b610720565b34801561036357600080fd5b5061027761076e565b34801561037857600080fd5b5061024161077e565b34801561038d57600080fd5b5061022a610784565b3480156103a257600080fd5b5061022a6103b136600461227f565b6107cb565b3480156103c257600080fd5b506102416108b4565b3480156103d757600080fd5b506102416108ba565b3480156103ec57600080fd5b5061022a6103fb3660046121c7565b6108c0565b34801561040c57600080fd5b5061022a610902565b61022a6104233660046123f6565b61097d565b34801561043457600080fd5b506104486104433660046121a9565b6109c3565b60405161024e9291906125a6565b34801561046257600080fd5b5061022a61047136600461236c565b6109e8565b34801561048257600080fd5b50610241610b1b565b34801561049757600080fd5b5061022a6104a63660046121a9565b610b21565b3480156104b757600080fd5b5061022a6104c6366004612201565b610bb5565b3480156104d757600080fd5b5061022a6104e63660046122ef565b610c98565b3480156104f757600080fd5b5061022a610d1d565b34801561050c57600080fd5b50610515610d89565b60405161024e919061262a565b34801561052e57600080fd5b5061054261053d3660046123a9565b610d98565b60405161024e929190612646565b34801561055c57600080fd5b50610515610e59565b34801561057157600080fd5b506102416105803660046121a9565b610e68565b34801561059157600080fd5b50610241610e7a565b3480156105a657600080fd5b506102776105b53660046121a9565b610e80565b3480156105c657600080fd5b50610241610e95565b3480156105db57600080fd5b506102c1610e9b565b3480156105f057600080fd5b50610241610eaa565b600e5481565b60086020526000908152604090205460ff1681565b60105481565b600654421015801561062e57506007544211155b151561063957600080fd5b60005460a060020a900460ff161561065057600080fd5b6106608686868686338733610eb0565b505050505050565b600454600160a060020a031681565b600554600160a060020a031681565b60075481565b600054600160a060020a031633146106a357600080fd5b60005460a060020a900460ff1615156106bb57600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169339190a1565b600154600160a060020a031681565b601454600160a060020a031681565b600054600160a060020a0316331461073757600080fd5b806008600084600381111561074857fe5b60ff1681526020810191909152604001600020805460ff19169115159190911790555050565b60005460a060020a900460ff1681565b60115481565b600054600160a060020a0316331461079b57600080fd5b6040513390303180156108fc02916000818181858888f193505050501580156107c8573d6000803e3d6000fd5b50565b600054600160a060020a031633146107e257600080fd5b60005b838110156108ad578282828181106107f957fe5b9050602002013560126000878785818110151561081257fe5b60209081029290920135600160a060020a03168352508101919091526040016000205584848281811061084157fe5b90506020020135600160a060020a0316600160a060020a03167f60ad3b7a12751798871fd3f7ecd1572f445ce2fabab4e2672c9ca0e78fc6ba82848484818110151561088957fe5b9050602002013560405161089d9190612638565b60405180910390a26001016107e5565b5050505050565b600a5481565b600f5481565b600054600160a060020a031633146108d757600080fd5b600160a060020a03919091166000908152600960205260409020805460ff1916911515919091179055565b600054600160a060020a0316331461091957600080fd5b60005460a060020a900460ff161561093057600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b600654421015801561099157506007544211155b151561099c57600080fd5b60005460a060020a900460ff16156109b357600080fd5b6106608686868686333388610eb0565b60036020526000908152604090208054600190910154600160a060020a039091169082565b600054600160a060020a031633146109ff57600080fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0382169063a9059cbb90339083906370a0823190610a4e90309060040161253a565b60206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a9e919081019061247d565b6040518363ffffffff1660e060020a028152600401610abe929190612570565b602060405180830381600087803b158015610ad857600080fd5b505af1158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b10919081019061234e565b15156107c857600080fd5b600d5481565b600054600160a060020a03163314610b3857600080fd5b600160a060020a0381161515610b4d57600080fd5b60008054604051600160a060020a03808516939216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f91a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6006544210158015610bc957506007544211155b1515610bd457600080fd5b60005460a060020a900460ff1615610beb57600080fd5b33600160a060020a03841614610c0057600080fd5b60a43560c43560e435610104356101243560008080871515610c3b57610c2e8d600160a060020a03166111f6565b92508c9150839050610c79565b8760011415610c7457610c568d600160a060020a03166111f6565b9250839150610c6d8d600160a060020a03166111f6565b9050610c79565b600080fd5b610c8987878d8f89888888610eb0565b50505050505050505050505050565b600054600160a060020a03163314610caf57600080fd5b60005b8251811015610d1857610d108382815181101515610ccc57fe5b906020019060200201518383815181101515610ce457fe5b60209081029091010151518451859085908110610cfd57fe5b90602001906020020151602001516111f9565b600101610cb2565b505050565b600054600160a060020a03163314610d3457600080fd5b60008054604051600160a060020a03909116917fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f91a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600254600160a060020a031681565b6000806000610da88686866112a3565b600154909150600160a060020a03858116911614610e4c57600154610dd790600160a060020a03168286611392565b50600154909350610df49085908590600160a060020a03166113e7565b9250610e27905082610e1b836ec097ce7bc90715b34b9f100000000063ffffffff6114fb16565b9063ffffffff61152d16565b60018054919450610e4591600160a060020a0316908690869061155f565b9250610e50565b8092505b50935093915050565b601354600160a060020a031681565b60126020526000908152604090205481565b600c5481565b60096020526000908152604090205460ff1681565b60065481565b600054600160a060020a031681565b600b5481565b60086000896003811115610ec057fe5b60ff9081168252602082019290925260400160002054161515610ee257600080fd5b600160a060020a03861660009081526009602052604090205460ff161515610f0957600080fd5b600154600160a060020a03878116911614610f25573415610f2a565b843410155b1515610f3557600080fd5b6000610f428989896112a3565b90506000610f5082896115e1565b6001549091506000908190600160a060020a038b8116911614610f9457600154610f8a908b908b90600160a060020a0316878c8c30611640565b9092509050610fb2565b83891015610fa157600080fd5b8715610fac57600080fd5b50829050345b83811015610fbf57600080fd5b8381111561100057604051600160a060020a0388169085830380156108fc02916000818181858888f19350505050158015610ffe573d6000803e3d6000fd5b505b85600160a060020a03168a600160a060020a03168d600381111561102057fe5b7f8d3eed3c141dc3f6b103a145f67cf590db4214dd0aef765580d273fd0e669b808e8689898e604051611057959493929190612654565b60405180910390a4601354600160a060020a038b8116911614611122576013546014546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03928316926323b872dd926110c5929116908a90889060040161258b565b602060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611117919081019061234e565b151561112257600080fd5b61112b8a611848565b15156111e857600061115f612710611153611146898b611867565b889063ffffffff6114fb16565b9063ffffffff6118c416565b90506000811180156111935750604051600160a060020a0387169082156108fc029083906000818181858888f19350505050155b1561119c575060005b6000811115610c895785600160a060020a03167fe02a129f98418d04669038a9874f706689ba7726c0c0e82c67319ec8ca9001ea826040516111de9190612638565b60405180910390a2505b505050505050505050505050565b90565b6000811161120657600080fd5b604080518082018252600160a060020a03848116808352602080840186815288841660008181526003909352918690209451855473ffffffffffffffffffffffffffffffffffffffff19169416939093178455915160019093019290925591519091907f490cff0bf8cd6cf7f35e4cf75bccb7ceaacf4468027202ba40fc8cefb384eace90611296908590612638565b60405180910390a3505050565b6000808460038111156112b257fe5b14156112c15750600a54611314565b60018460038111156112cf57fe5b14156112de5750600b54611314565b60028460038111156112ec57fe5b14156112fb5750600c54611314565b600384600381111561130957fe5b1415610c745750600d545b611342836113366127106111536113296118e5565b869063ffffffff6114fb16565b9063ffffffff6114fb16565b601354909150600160a060020a038381169116141561138b57611388612710610e1b61137b60105461271061195a90919063ffffffff16565b849063ffffffff6114fb16565b90505b9392505050565b6000806000806113a38787876113e7565b90925090506113c487866113bd898663ffffffff6114fb16565b600061155f565b6113d988876113bd8a8663ffffffff6114fb16565b935093505050935093915050565b6000806001806113f687611848565b1561145357600160a060020a0396871660009081526003602052604090208054600182015498169761143d90670de0b6b3a764000090611153908a9063ffffffff6114fb16565b965080600101549250670de0b6b3a76400009150505b61145c85611848565b1561149c57600160a060020a039485166000908152600360205260409020805490951694600183141561149557670de0b6b3a764000092505b6001015490505b600160a060020a03878116908616146114c4576114ba87878761196f565b90945092506114d3565b670de0b6b3a764000092508293505b6114e781611153868563ffffffff6114fb16565b6113d982611153868663ffffffff6114fb16565b600082151561150c57506000611527565b5081810281838281151561151c57fe5b041461152757600080fd5b92915050565b600061138b61153c84846118c4565b60006115488686611a1c565b11611554576000611557565b60015b60ff16611a3d565b60008061156b86611a4d565b60120160ff169050600061157e86611a4d565b60ff169050808211156115c45783156115af576115a685828403600a0a63ffffffff61152d16565b925050506115d9565b6115a685828403600a0a63ffffffff6118c416565b6115a685838303600a0a63ffffffff6114fb16565b949350505050565b601354600090600160a060020a038381169116146115275760015460135460009161161a91600160a060020a0391821691879116611392565b509050611638612710611153601054846114fb90919063ffffffff16565b915050611527565b60008061164c89611848565b8061165b575061165b87611848565b1561182857600154600160a060020a038a811691161461167c573415611681565b873410155b151561168c57600080fd5b600160a060020a03831630146116a157600080fd5b60006116ae8a848a6113e7565b509050858110156116be57600080fd5b8892506116d68a896113bd868563ffffffff6114fb16565b91508682111561172057869150611712888b61170b84610e1b876ec097ce7bc90715b34b9f100000000063ffffffff6114fb16565b600161155f565b925088831115611720578892505b600154600160a060020a038b81169116146117e0576040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038b16906323b872dd9061177e90889030908890600401612548565b602060405180830381600087803b15801561179857600080fd5b505af11580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117d0919081019061234e565b15156117db57600080fd5b611822565b8234111561182257604051600160a060020a038616903485900380156108fc02916000818181858888f19350505050158015611820573d6000803e3d6000fd5b505b5061183c565b61183789898989898989611ae1565b915091505b97509795505050505050565b600160a060020a03166000908152600360205260408120600101541190565b600081600160a060020a031683600160a060020a0316141580156118935750600160a060020a03831615155b61189e57600061138b565b600160a060020a03831660009081526012602052604090205460115461138b9190611e96565b60008082116118d257600080fd5b81838115156118dd57fe5b049392505050565b600080611909620151806113366201518060065442036118c490919063ffffffff16565b9050611954611932600f5461115361192385600f54611ead565b600e549063ffffffff6114fb16565b600e54611948906127109063ffffffff61195a16565b9063ffffffff611a3d16565b91505090565b60008282111561196957600080fd5b50900390565b6002546040517f809a9e550000000000000000000000000000000000000000000000000000000081526000918291600160a060020a039091169063809a9e55906119c19088908790899060040161258b565b604080518083038186803b1580156119d857600080fd5b505afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a10919081019061249b565b91509150935093915050565b6000808211611a2a57600080fd5b8183811515611a3557fe5b069392505050565b8181018281101561152757600080fd5b600154600090600160a060020a0383811691161415611a6d576012611527565b81600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611aa957600080fd5b505afa158015611abd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152791908101906124e9565b600080600160a060020a038981169088161415611afd57600080fd5b600154600160a060020a038a8116911614611b19573415611b1e565b873410155b1515611b2957600080fd5b6000611b358a30611ebc565b600154909150600160a060020a038b8116911614611ca2576040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038b16906323b872dd90611b9690889030908e90600401612548565b602060405180830381600087803b158015611bb057600080fd5b505af1158015611bc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611be8919081019061234e565b1515611bf357600080fd5b6002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038c81169263095ea7b392611c4092909116908d906004016125a6565b602060405180830381600087803b158015611c5a57600080fd5b505af1158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c92919081019061234e565b1515611c9d57600080fd5b611cb5565b611cb2818a63ffffffff61195a16565b90505b600254600154600160a060020a039182169163cb3c28c7918d8216911614611cde576000611ce0565b8a5b8c8c8c898d8d60006040518963ffffffff1660e060020a028152600401611d0d97969594939291906125b4565b6020604051808303818588803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250611d5f919081019061247d565b91506000611d6d8b30611ebc565b905089935081811115611e8857818103611d8d858263ffffffff61195a16565b600154909550600160a060020a038d8116911614611e4e576040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038d169063a9059cbb90611dec908a908590600401612570565b602060405180830381600087803b158015611e0657600080fd5b505af1158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e3e919081019061234e565b1515611e4957600080fd5b611e86565b604051600160a060020a0388169082156108fc029083906000818181858888f19350505050158015611e84573d6000803e3d6000fd5b505b505b505097509795505050505050565b600081831015611ea6578161138b565b5090919050565b6000818310611ea6578161138b565b600154600090600160a060020a0384811691161415611ee55781600160a060020a03163161138b565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038416906370a0823190611f2a90859060040161253a565b60206040518083038186803b158015611f4257600080fd5b505afa158015611f56573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061138b919081019061247d565b600061138b82356126e8565b600080601f83018413611f9857600080fd5b50813567ffffffffffffffff811115611fb057600080fd5b602083019150836020820283011115611fc857600080fd5b9250929050565b6000601f82018313611fe057600080fd5b8135611ff3611fee826126c7565b6126a0565b9150818183526020840193506020810190508385602084028201111561201857600080fd5b60005b83811015612044578161202e8882611f7a565b845250602092830192919091019060010161201b565b5050505092915050565b6000601f8201831361205f57600080fd5b813561206d611fee826126c7565b9150818183526020840193506020810190508385604084028201111561209257600080fd5b60005b8381101561204457816120a88882612132565b84525060209092019160409190910190600101612095565b600061138b82356126f3565b600061138b82516126f3565b600080601f830184136120ea57600080fd5b50813567ffffffffffffffff81111561210257600080fd5b602083019150836001820283011115611fc857600080fd5b600061138b8235612704565b600061138b823561270f565b60006040828403121561214457600080fd5b61214e60406126a0565b9050600061215c8484611f7a565b825250602061216d84848301612179565b60208301525092915050565b600061138b82356111f6565b600061138b82516111f6565b600061138b8235612722565b600061138b8251612722565b6000602082840312156121bb57600080fd5b60006115d98484611f7a565b600080604083850312156121da57600080fd5b60006121e68585611f7a565b92505060206121f7858286016120c0565b9150509250929050565b60008060008060006080868803121561221957600080fd5b60006122258888611f7a565b955050602061223688828901612179565b945050604061224788828901611f7a565b935050606086013567ffffffffffffffff81111561226457600080fd5b612270888289016120d8565b92509250509295509295909350565b6000806000806040858703121561229557600080fd5b843567ffffffffffffffff8111156122ac57600080fd5b6122b887828801611f86565b9450945050602085013567ffffffffffffffff8111156122d757600080fd5b6122e387828801611f86565b95989497509550505050565b6000806040838503121561230257600080fd5b823567ffffffffffffffff81111561231957600080fd5b61232585828601611fcf565b925050602083013567ffffffffffffffff81111561234257600080fd5b6121f78582860161204e565b60006020828403121561236057600080fd5b60006115d984846120cc565b60006020828403121561237e57600080fd5b60006115d9848461211a565b6000806040838503121561239d57600080fd5b60006121e68585612126565b6000806000606084860312156123be57600080fd5b60006123ca8686612126565b93505060206123db86828701612179565b92505060406123ec86828701611f7a565b9150509250925092565b60008060008060008060c0878903121561240f57600080fd5b600061241b8989612126565b965050602061242c89828a01612179565b955050604061243d89828a01611f7a565b945050606061244e89828a01612179565b935050608061245f89828a01612179565b92505060a061247089828a01611f7a565b9150509295509295509295565b60006020828403121561248f57600080fd5b60006115d98484612185565b600080604083850312156124ae57600080fd5b60006124ba8585612185565b92505060206121f785828601612185565b6000602082840312156124dd57600080fd5b60006115d98484612191565b6000602082840312156124fb57600080fd5b60006115d9848461219d565b61251081612728565b82525050565b612510816126e8565b612510816126f3565b61251081612704565b612510816111f6565b602081016115278284612516565b606081016125568286612507565b6125636020830185612507565b6115d96040830184612531565b6040810161257e8285612507565b61138b6020830184612531565b606081016125998286612516565b6125636020830185612516565b6040810161257e8285612516565b60e081016125c2828a612516565b6125cf6020830189612531565b6125dc6040830188612516565b6125e96060830187612516565b6125f66080830186612531565b61260360a0830185612531565b61261060c0830184612507565b98975050505050505050565b60208101611527828461251f565b602081016115278284612528565b602081016115278284612531565b6040810161257e8285612531565b60a081016126628288612531565b61266f6020830187612531565b61267c6040830186612531565b6126896060830185612531565b6126966080830184612507565b9695505050505050565b60405181810167ffffffffffffffff811182821017156126bf57600080fd5b604052919050565b600067ffffffffffffffff8211156126de57600080fd5b5060209081020190565b6000611527826126f8565b151590565b600160a060020a031690565b6000611527826126e8565b60006004821061271e57600080fd5b5090565b60ff1690565b60006115278261270456fea265627a7a72305820ef225a7cbb7d3544b1565d48f1027870a8fb9a7ccb9e31ccdf5ebb69120c48606c6578706572696d656e74616cf50037

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000092bf969865c80eda082fd5d8b4e28da4d58e1c3a00000000000000000000000028fa65ab4a4a5f31e7958a00c1ce410a426e6fe8

-----Decoded View---------------
Arg [0] : _lunaContract (address): 0x92bF969865c80EDa082FD5D8b4E28da4d58e1C3a
Arg [1] : _lunaBankAddress (address): 0x28fA65Ab4a4A5f31E7958a00C1cE410a426E6FE8

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000092bf969865c80eda082fd5d8b4e28da4d58e1c3a
Arg [1] : 00000000000000000000000028fa65ab4a4a5f31e7958a00c1ce410a426e6fe8


Swarm Source

bzzr://ef225a7cbb7d3544b1565d48f1027870a8fb9a7ccb9e31ccdf5ebb69120c4860

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.