ETH Price: $3,263.40 (-0.56%)
Gas: 3 Gwei

Token

Bridged Echelon (bECH)
 

Overview

Max Total Supply

2,044,522.421744642798349058 bECH

Holders

142

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 bECH

Value
$0.00
0x10f041ef362a6ccb517d5c12f49dc358d6d3cd38
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BridgedEchelon

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-27
*/

// File: SignatureUtils.sol

pragma solidity ^0.4.24;

/// @title A library of utilities for (multi)signatures
/// @author Alexander Kern <[email protected]>
/// @dev This library can be linked to another Solidity contract to expose signature manipulation functions.
contract SignatureUtils {

    /// @notice Converts a bytes32 to an signed message hash.
    /// @param _msg The bytes32 message (i.e. keccak256 result) to encrypt
    function toEthBytes32SignedMessageHash(
        bytes32 _msg
    )
        pure
        public
        returns (bytes32 signHash)
    {
        signHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _msg));
    }

    /// @notice Converts a byte array to a personal signed message hash (result of `web3.personal.sign(...)`) by concatenating its length.
    /// @param _msg The bytes array to encrypt
    function toEthPersonalSignedMessageHash(
        bytes _msg
    )
        pure
        public
        returns (bytes32 signHash)
    {
        signHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", uintToString(_msg.length), _msg));
    }

    /// @notice Converts a uint to its decimal string representation.
    /// @param v The uint to convert
    function uintToString(
        uint v
    )
        pure
        public
        returns (string)
    {
        uint w = v;
        bytes32 x;
        if (v == 0) {
            x = "0";
        } else {
            while (w > 0) {
                x = bytes32(uint(x) / (2 ** 8));
                x |= bytes32(((w % 10) + 48) * 2 ** (8 * 31));
                w /= 10;
            }
        }

        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory resultBytes = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            resultBytes[j] = bytesString[j];
        }

        return string(resultBytes);
    }

    /// @notice Extracts the r, s, and v parameters to `ecrecover(...)` from the signature at position `_pos` in a densely packed signatures bytes array.
    /// @dev Based on [OpenZeppelin's ECRecovery](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ECRecovery.sol)
    /// @param _signatures The signatures bytes array
    /// @param _pos The position of the signature in the bytes array (0 indexed)
    function parseSignature(
        bytes _signatures,
        uint _pos
    )
        pure
        public
        returns (uint8 v, bytes32 r, bytes32 s)
    {
        uint offset = _pos * 65;
        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        assembly { // solium-disable-line security/no-inline-assembly
            r := mload(add(_signatures, add(32, offset)))
            s := mload(add(_signatures, add(64, offset)))
            // Here we are loading the last 32 bytes, including 31 bytes
            // of 's'. There is no 'mload8' to do this.
            //
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            v := and(mload(add(_signatures, add(65, offset))), 0xff)
        }

        if (v < 27) v += 27;

        require(v == 27 || v == 28);
    }

    /// @notice Counts the number of signatures in a signatures bytes array. Returns 0 if the length is invalid.
    /// @param _signatures The signatures bytes array
    /// @dev Signatures are 65 bytes long and are densely packed.
    function countSignatures(
        bytes _signatures
    )
        pure
        public
        returns (uint)
    {
        return _signatures.length % 65 == 0 ? _signatures.length / 65 : 0;
    }

    /// @notice Recovers an address using a message hash and a signature in a bytes array.
    /// @param _hash The signed message hash
    /// @param _signatures The signatures bytes array
    /// @param _pos The signature's position in the bytes array (0 indexed)
    function recoverAddress(
        bytes32 _hash,
        bytes _signatures,
        uint _pos
    )
        pure
        public
        returns (address)
    {
        uint8 v;
        bytes32 r;
        bytes32 s;
        (v, r, s) = parseSignature(_signatures, _pos);
        return ecrecover(_hash, v, r, s);
    }

    /// @notice Recovers an array of addresses using a message hash and a signatures bytes array.
    /// @param _hash The signed message hash
    /// @param _signatures The signatures bytes array
    function recoverAddresses(
        bytes32 _hash,
        bytes _signatures
    )
        pure
        public
        returns (address[] addresses)
    {
        uint8 v;
        bytes32 r;
        bytes32 s;
        uint count = countSignatures(_signatures);
        addresses = new address[](count);
        for (uint i = 0; i < count; i++) {
            (v, r, s) = parseSignature(_signatures, i);
            addresses[i] = ecrecover(_hash, v, r, s);
        }
    }

}

// File: ERC20.sol

pragma solidity ^0.4.24;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
  function totalSupply() external view returns (uint256);

  function balanceOf(address who) external view returns (uint256);

  function allowance(address owner, address spender)
    external view returns (uint256);

  function transfer(address to, uint256 value) external returns (bool);

  function approve(address spender, uint256 value)
    external returns (bool);

  function transferFrom(address from, address to, uint256 value)
    external returns (bool);

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
  );

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}


/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on 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-solidity/pull/522
    if (a == 0) {
      return 0;
    }

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

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
 * Originally based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract ERC20 is IERC20 {
  using SafeMath for uint256;

  mapping (address => uint256) private _balances;

  mapping (address => mapping (address => uint256)) private _allowed;

  uint256 private _totalSupply;

  /**
  * @dev Total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return _totalSupply;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param owner The address to query the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address owner) public view returns (uint256) {
    return _balances[owner];
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param owner address The address which owns the funds.
   * @param spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address owner,
    address spender
   )
    public
    view
    returns (uint256)
  {
    return _allowed[owner][spender];
  }

  /**
  * @dev Transfer token for a specified address
  * @param to The address to transfer to.
  * @param value The amount to be transferred.
  */
  function transfer(address to, uint256 value) public returns (bool) {
    _transfer(msg.sender, to, value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param spender The address which will spend the funds.
   * @param value The amount of tokens to be spent.
   */
  function approve(address spender, uint256 value) public returns (bool) {
    require(spender != address(0));

    _allowed[msg.sender][spender] = value;
    emit Approval(msg.sender, spender, value);
    return true;
  }

  /**
   * @dev Transfer tokens from one address to another
   * @param from address The address which you want to send tokens from
   * @param to address The address which you want to transfer to
   * @param value uint256 the amount of tokens to be transferred
   */
  function transferFrom(
    address from,
    address to,
    uint256 value
  )
    public
    returns (bool)
  {
    require(value <= _allowed[from][msg.sender]);

    _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
    _transfer(from, to, value);
    return true;
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed_[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param spender The address which will spend the funds.
   * @param addedValue The amount of tokens to increase the allowance by.
   */
  function increaseAllowance(
    address spender,
    uint256 addedValue
  )
    public
    returns (bool)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].add(addedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed_[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param spender The address which will spend the funds.
   * @param subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseAllowance(
    address spender,
    uint256 subtractedValue
  )
    public
    returns (bool)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].sub(subtractedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    return true;
  }

  /**
  * @dev Transfer token for a specified addresses
  * @param from The address to transfer from.
  * @param to The address to transfer to.
  * @param value The amount to be transferred.
  */
  function _transfer(address from, address to, uint256 value) internal {
    require(value <= _balances[from]);
    require(to != address(0));

    _balances[from] = _balances[from].sub(value);
    _balances[to] = _balances[to].add(value);
    emit Transfer(from, to, value);
  }

  /**
   * @dev Internal function that mints an amount of the token and assigns it to
   * an account. This encapsulates the modification of balances such that the
   * proper events are emitted.
   * @param account The account that will receive the created tokens.
   * @param value The amount that will be created.
   */
  function _mint(address account, uint256 value) internal {
    require(account != 0);
    _totalSupply = _totalSupply.add(value);
    _balances[account] = _balances[account].add(value);
    emit Transfer(address(0), account, value);
  }

  /**
   * @dev Internal function that burns an amount of the token of a given
   * account.
   * @param account The account whose tokens will be burnt.
   * @param value The amount that will be burnt.
   */
  function _burn(address account, uint256 value) internal {
    require(account != 0);
    require(value <= _balances[account]);

    _totalSupply = _totalSupply.sub(value);
    _balances[account] = _balances[account].sub(value);
    emit Transfer(account, address(0), value);
  }

  /**
   * @dev Internal function that burns an amount of the token of a given
   * account, deducting from the sender's allowance for said account. Uses the
   * internal burn function.
   * @param account The account whose tokens will be burnt.
   * @param value The amount that will be burnt.
   */
  function _burnFrom(address account, uint256 value) internal {
    require(value <= _allowed[account][msg.sender]);

    // Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted,
    // this function needs to emit an event with the updated approval.
    _allowed[account][msg.sender] = _allowed[account][msg.sender].sub(
      value);
    _burn(account, value);
  }
}
// File: Bridgeable.sol

pragma solidity ^0.4.24;


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;

  function Ownable() {
    owner = msg.sender;
  }

  modifier onlyOwner() {
    if (msg.sender != owner) {
      throw;
    }
    _;
  }

  function transferOwnership(address newOwner) onlyOwner {
    if (newOwner != address(0)) {
      owner = newOwner;
    }
  }
}


contract Bridgeable is ERC20, SignatureUtils, Ownable {
	address[] public validators;
	address public foreignContract;
	mapping (bytes32 => bool) foreignTransactions;

	event EnterBridgeEvent(address indexed from, uint256 amount);
  event ExitBridgeEvent(address indexed sender, uint256 amount);
  event Mint(address indexed to, uint256 amount);
	event Burn(address indexed burner, uint256 value);

    function addValidator(address _validator) public onlyOwner {
        validators.push(_validator);
    }

    function pair(address _foreignContract) public onlyOwner {
    	foreignContract = _foreignContract;
    }
        
    function enter(uint256 _amount) public {
        emit EnterBridgeEvent(msg.sender, _amount);
        burn(_amount);
    }
    
    function exit(bytes32 _txnHash, address _foreignContract, uint256 _amount, bytes _signatures) public {
    	require(contains(_txnHash) == false, 'Foreign transaction has already been processed');
        bytes32 hash = toEthBytes32SignedMessageHash(entranceHash(_txnHash,_foreignContract, _amount));
        address[] memory recovered = recoverAddresses(hash, _signatures);
        require(verifyValidators(recovered), "Validator verification failed.");
        require(_foreignContract == foreignContract, "Invalid contract target.");
        mint(msg.sender, _amount);
        foreignTransactions[_txnHash] = true;
        emit ExitBridgeEvent(msg.sender, _amount);      
    }

    function contains(bytes32 _txnHash) internal view returns (bool){
        return foreignTransactions[_txnHash];
    }

    function verifyValidators(address[] recovered) internal view returns (bool) {
        require(recovered.length == validators.length, "Invalid number of signatures");
        for(uint i = 0 ; i < validators.length; i++) {
            if(validators[i] != recovered[i]) {
                return false;
            }
        }
        return true;
    }

    function mint( address _to, uint256 _amount )
	    internal returns (bool) {
      _mint(_to, _amount);
	    // emit Mint(_to, _amount);
	    return true;
	  }

    /**
    * @dev Burns a specific amount of tokens.
    * @param _value The amount of token to be burned.
    */
    function burn(uint256 _value) internal {
      _burn(msg.sender, _value);
    }
	    
    /**
     * @notice Hash (keccak256) of the payload used by deposit
     * @param _contractAddress the target ERC20 address
     * @param _amount the original minter
     */
    function entranceHash(bytes32 txnHash, address _contractAddress, uint256 _amount) public view returns (bytes32) {
        // "0x8177cf3c": entranceHash(bytes32, address,uint256)
        return keccak256(abi.encode( bytes4(0x8177cf3c), msg.sender, txnHash, _contractAddress, _amount));
    }

}
// File: bECH.sol

pragma solidity ^0.4.25;


contract BridgedEchelon is Bridgeable {
    string public name = "Bridged Echelon"; 
    string public symbol = "bECH";
    uint public decimals = 18;

    constructor() public {
        // totalSupply = INITIAL_SUPPLY / 2;
        // balanceOf[msg.sender] = totalSupply;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"},{"name":"_signatures","type":"bytes"},{"name":"_pos","type":"uint256"}],"name":"recoverAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_signatures","type":"bytes"}],"name":"countSignatures","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"validators","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_validator","type":"address"}],"name":"addValidator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_foreignContract","type":"address"}],"name":"pair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"txnHash","type":"bytes32"},{"name":"_contractAddress","type":"address"},{"name":"_amount","type":"uint256"}],"name":"entranceHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"enter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"foreignContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_signatures","type":"bytes"},{"name":"_pos","type":"uint256"}],"name":"parseSignature","outputs":[{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_msg","type":"bytes"}],"name":"toEthPersonalSignedMessageHash","outputs":[{"name":"signHash","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_msg","type":"bytes32"}],"name":"toEthBytes32SignedMessageHash","outputs":[{"name":"signHash","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_txnHash","type":"bytes32"},{"name":"_foreignContract","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_signatures","type":"bytes"}],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"v","type":"uint256"}],"name":"uintToString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"},{"name":"_signatures","type":"bytes"}],"name":"recoverAddresses","outputs":[{"name":"addresses","type":"address[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"EnterBridgeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"ExitBridgeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60c0604052600f60808190527f4272696467656420456368656c6f6e000000000000000000000000000000000060a0908152620000409160079190620000b3565b506040805180820190915260048082527f624543480000000000000000000000000000000000000000000000000000000060209092019182526200008791600891620000b3565b5060126009553480156200009a57600080fd5b5060038054600160a060020a0319163317905562000158565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f657805160ff191683800117855562000126565b8280016001018555821562000126579182015b828111156200012657825182559160200191906001019062000109565b506200013492915062000138565b5090565b6200015591905b808211156200013457600081556001016200013f565b90565b61181e80620001686000396000f30060806040526004361061015e5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610163578063095ea7b3146101ed57806318160ddd146102255780631c2a15b81461024c57806323b872dd146102c8578063313ce567146102f257806333ae3ad01461030757806335aa2e441461036057806339509351146103785780634d238c8e1461039c57806370a08231146103bf5780637fb992f7146103e05780638177cf3c146104015780638da5cb5b1461042857806395d89b411461043d578063a457c2d714610452578063a59f3e0c14610476578063a9059cbb1461048e578063abd4d716146104b2578063b31d63cc146104c7578063d8a40f6b14610544578063dd62ed3e1461059d578063e5990d20146105c4578063e6bce1ae146105dc578063e93956791461064b578063f0c8e96914610663578063f2fde38b14610711575b600080fd5b34801561016f57600080fd5b50610178610732565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101b257818101518382015260200161019a565b50505050905090810190601f1680156101df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101f957600080fd5b50610211600160a060020a03600435166024356107c0565b604080519115158252519081900360200190f35b34801561023157600080fd5b5061023a61083e565b60408051918252519081900360200190f35b34801561025857600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526102ac95833595369560449491939091019190819084018382808284375094975050933594506108449350505050565b60408051600160a060020a039092168252519081900360200190f35b3480156102d457600080fd5b50610211600160a060020a03600435811690602435166044356108cd565b3480156102fe57600080fd5b5061023a61096a565b34801561031357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261023a9436949293602493928401919081908401838280828437509497506109709650505050505050565b34801561036c57600080fd5b506102ac600435610992565b34801561038457600080fd5b50610211600160a060020a03600435166024356109ba565b3480156103a857600080fd5b506103bd600160a060020a0360043516610a6a565b005b3480156103cb57600080fd5b5061023a600160a060020a0360043516610ae0565b3480156103ec57600080fd5b506103bd600160a060020a0360043516610afb565b34801561040d57600080fd5b5061023a600435600160a060020a0360243516604435610b41565b34801561043457600080fd5b506102ac610c08565b34801561044957600080fd5b50610178610c17565b34801561045e57600080fd5b50610211600160a060020a0360043516602435610c72565b34801561048257600080fd5b506103bd600435610cbd565b34801561049a57600080fd5b50610211600160a060020a0360043516602435610cff565b3480156104be57600080fd5b506102ac610d15565b3480156104d357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526105229436949293602493928401919081908401838280828437509497505093359450610d249350505050565b6040805160ff9094168452602084019290925282820152519081900360600190f35b34801561055057600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261023a943694929360249392840191908190840183828082843750949750610d789650505050505050565b3480156105a957600080fd5b5061023a600160a060020a0360043581169060243516610ebd565b3480156105d057600080fd5b5061023a600435610ee8565b3480156105e857600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103bd94803594600160a060020a036024803591909116956044359536956084949301918190840183828082843750949750610f5f9650505050505050565b34801561065757600080fd5b5061017860043561112e565b34801561066f57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526106c19583359536956044949193909101919081908401838280828437509497506113099650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106fd5781810151838201526020016106e5565b505050509050019250505060405180910390f35b34801561071d57600080fd5b506103bd600160a060020a0360043516611407565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b505050505081565b6000600160a060020a03831615156107d757600080fd5b336000818152600160209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60025490565b6000806000806108548686610d24565b60408051600080825260208083018085528e905260ff8716838501526060830186905260808301859052925195985093965091945060019360a0808401949293601f19830193908390039091019190865af11580156108b7573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b600160a060020a03831660009081526001602090815260408083203384529091528120548211156108fd57600080fd5b600160a060020a0384166000908152600160209081526040808320338452909152902054610931908363ffffffff61145a16565b600160a060020a0385166000908152600160209081526040808320338452909152902055610960848484611471565b5060019392505050565b60095481565b8051600090604190061561098557600061098c565b8151604190045b92915050565b60048054829081106109a057fe5b600091825260209091200154600160a060020a0316905081565b6000600160a060020a03831615156109d157600080fd5b336000908152600160209081526040808320600160a060020a0387168452909152902054610a05908363ffffffff61156316565b336000818152600160209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600354600160a060020a03163314610a8157600080fd5b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a031660009081526020819052604090205490565b600354600160a060020a03163314610b1257600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080517f8177cf3c00000000000000000000000000000000000000000000000000000000602080830191909152338284015260608201869052600160a060020a038516608083015260a08083018590528351808403909101815260c0909201928390528151600093918291908401908083835b60208310610bd45780518252601f199092019160209182019101610bb5565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120979650505050505050565b600354600160a060020a031681565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107b85780601f1061078d576101008083540402835291602001916107b8565b6000600160a060020a0383161515610c8957600080fd5b336000908152600160209081526040808320600160a060020a0387168452909152902054610a05908363ffffffff61145a16565b60408051828152905133917fc6b9e46d1489b207d3057f60c8ac6b283467391239ee8e388c1583c20418f36d919081900360200190a2610cfc8161157c565b50565b6000610d0c338484611471565b50600192915050565b600554600160a060020a031681565b604180820283810160208101516040820151919093015160ff169291601b841015610d5057601b840193505b8360ff16601b1480610d6557508360ff16601c145b1515610d7057600080fd5b509250925092565b6000610d84825161112e565b8260405160200180807f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250601a0183805190602001908083835b60208310610ddf5780518252601f199092019160209182019101610dc0565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610e275780518252601f199092019160209182019101610e08565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040526040518082805190602001908083835b60208310610e8b5780518252601f199092019160209182019101610e6c565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c9092019283905281516000939182919084019080838360208310610e8b5780518252601f199092019160209182019101610e6c565b60006060610f6c86611586565b15610fe7576040805160e560020a62461bcd02815260206004820152602e60248201527f466f726569676e207472616e73616374696f6e2068617320616c72656164792060448201527f6265656e2070726f636573736564000000000000000000000000000000000000606482015290519081900360840190fd5b610ffa610ff5878787610b41565b610ee8565b91506110068284611309565b90506110118161159b565b1515611067576040805160e560020a62461bcd02815260206004820152601e60248201527f56616c696461746f7220766572696669636174696f6e206661696c65642e0000604482015290519081900360640190fd5b600554600160a060020a038681169116146110cc576040805160e560020a62461bcd02815260206004820152601860248201527f496e76616c696420636f6e7472616374207461726765742e0000000000000000604482015290519081900360640190fd5b6110d6338561166e565b50600086815260066020908152604091829020805460ff191660011790558151868152915133927f8fc406a425362a34b826c493c710d249c4006ec0fde54cebe73112447567b1a192908290030190a2505050505050565b60608160008281808083861515611167577f3000000000000000000000000000000000000000000000000000000000000000955061119f565b600087111561119f5761010086049550600a870660300160f860020a0260010286179550600a8781151561119757fe5b049650611167565b604080516020808252818301909252908082016104008038833901905050945060009350600092505b6020831015611255576008830260020a860291507fff0000000000000000000000000000000000000000000000000000000000000082161561124a5781858581518110151561121357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916111c8565b836040519080825280601f01601f191660200182016040528015611283578160200160208202803883390190505b509050600092505b838310156112fd5784838151811015156112a157fe5b90602001015160f860020a900460f860020a0281848151811015156112c257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161128b565b98975050505050505050565b6060600080600080600061131c87610970565b915081604051908082528060200260200182016040528015611348578160200160208202803883390190505b509550600090505b818110156113fc576113628782610d24565b60408051600080825260208083018085528f905260ff87168385015260608301869052608083018590529251959a5093985091965060019360a0808401949293601f19830193908390039091019190865af11580156113c5573d6000803e3d6000fd5b5050506020604051035186828151811015156113dd57fe5b600160a060020a03909216602092830290910190910152600101611350565b505050505092915050565b600354600160a060020a0316331461141e57600080fd5b600160a060020a03811615610cfc5760038054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b6000808383111561146a57600080fd5b5050900390565b600160a060020a03831660009081526020819052604090205481111561149657600080fd5b600160a060020a03821615156114ab57600080fd5b600160a060020a0383166000908152602081905260409020546114d4908263ffffffff61145a16565b600160a060020a038085166000908152602081905260408082209390935590841681522054611509908263ffffffff61156316565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008282018381101561157557600080fd5b9392505050565b610cfc338261167a565b60009081526006602052604090205460ff1690565b60045481516000918291146115fa576040805160e560020a62461bcd02815260206004820152601c60248201527f496e76616c6964206e756d626572206f66207369676e61747572657300000000604482015290519081900360640190fd5b5060005b60045481101561166357828181518110151561161657fe5b90602001906020020151600160a060020a031660048281548110151561163857fe5b600091825260209091200154600160a060020a03161461165b5760009150611668565b6001016115fe565b600191505b50919050565b6000610d0c8383611748565b600160a060020a038216151561168f57600080fd5b600160a060020a0382166000908152602081905260409020548111156116b457600080fd5b6002546116c7908263ffffffff61145a16565b600255600160a060020a0382166000908152602081905260409020546116f3908263ffffffff61145a16565b600160a060020a038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600160a060020a038216151561175d57600080fd5b600254611770908263ffffffff61156316565b600255600160a060020a03821660009081526020819052604090205461179c908263ffffffff61156316565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350505600a165627a7a7230582051b885ea5dad6d195b2470bcf87015e8af5b5b52c0057dbd08409c54b62edd850029

Deployed Bytecode

0x60806040526004361061015e5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610163578063095ea7b3146101ed57806318160ddd146102255780631c2a15b81461024c57806323b872dd146102c8578063313ce567146102f257806333ae3ad01461030757806335aa2e441461036057806339509351146103785780634d238c8e1461039c57806370a08231146103bf5780637fb992f7146103e05780638177cf3c146104015780638da5cb5b1461042857806395d89b411461043d578063a457c2d714610452578063a59f3e0c14610476578063a9059cbb1461048e578063abd4d716146104b2578063b31d63cc146104c7578063d8a40f6b14610544578063dd62ed3e1461059d578063e5990d20146105c4578063e6bce1ae146105dc578063e93956791461064b578063f0c8e96914610663578063f2fde38b14610711575b600080fd5b34801561016f57600080fd5b50610178610732565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101b257818101518382015260200161019a565b50505050905090810190601f1680156101df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101f957600080fd5b50610211600160a060020a03600435166024356107c0565b604080519115158252519081900360200190f35b34801561023157600080fd5b5061023a61083e565b60408051918252519081900360200190f35b34801561025857600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526102ac95833595369560449491939091019190819084018382808284375094975050933594506108449350505050565b60408051600160a060020a039092168252519081900360200190f35b3480156102d457600080fd5b50610211600160a060020a03600435811690602435166044356108cd565b3480156102fe57600080fd5b5061023a61096a565b34801561031357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261023a9436949293602493928401919081908401838280828437509497506109709650505050505050565b34801561036c57600080fd5b506102ac600435610992565b34801561038457600080fd5b50610211600160a060020a03600435166024356109ba565b3480156103a857600080fd5b506103bd600160a060020a0360043516610a6a565b005b3480156103cb57600080fd5b5061023a600160a060020a0360043516610ae0565b3480156103ec57600080fd5b506103bd600160a060020a0360043516610afb565b34801561040d57600080fd5b5061023a600435600160a060020a0360243516604435610b41565b34801561043457600080fd5b506102ac610c08565b34801561044957600080fd5b50610178610c17565b34801561045e57600080fd5b50610211600160a060020a0360043516602435610c72565b34801561048257600080fd5b506103bd600435610cbd565b34801561049a57600080fd5b50610211600160a060020a0360043516602435610cff565b3480156104be57600080fd5b506102ac610d15565b3480156104d357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526105229436949293602493928401919081908401838280828437509497505093359450610d249350505050565b6040805160ff9094168452602084019290925282820152519081900360600190f35b34801561055057600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261023a943694929360249392840191908190840183828082843750949750610d789650505050505050565b3480156105a957600080fd5b5061023a600160a060020a0360043581169060243516610ebd565b3480156105d057600080fd5b5061023a600435610ee8565b3480156105e857600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103bd94803594600160a060020a036024803591909116956044359536956084949301918190840183828082843750949750610f5f9650505050505050565b34801561065757600080fd5b5061017860043561112e565b34801561066f57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526106c19583359536956044949193909101919081908401838280828437509497506113099650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106fd5781810151838201526020016106e5565b505050509050019250505060405180910390f35b34801561071d57600080fd5b506103bd600160a060020a0360043516611407565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b505050505081565b6000600160a060020a03831615156107d757600080fd5b336000818152600160209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60025490565b6000806000806108548686610d24565b60408051600080825260208083018085528e905260ff8716838501526060830186905260808301859052925195985093965091945060019360a0808401949293601f19830193908390039091019190865af11580156108b7573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b600160a060020a03831660009081526001602090815260408083203384529091528120548211156108fd57600080fd5b600160a060020a0384166000908152600160209081526040808320338452909152902054610931908363ffffffff61145a16565b600160a060020a0385166000908152600160209081526040808320338452909152902055610960848484611471565b5060019392505050565b60095481565b8051600090604190061561098557600061098c565b8151604190045b92915050565b60048054829081106109a057fe5b600091825260209091200154600160a060020a0316905081565b6000600160a060020a03831615156109d157600080fd5b336000908152600160209081526040808320600160a060020a0387168452909152902054610a05908363ffffffff61156316565b336000818152600160209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600354600160a060020a03163314610a8157600080fd5b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a031660009081526020819052604090205490565b600354600160a060020a03163314610b1257600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080517f8177cf3c00000000000000000000000000000000000000000000000000000000602080830191909152338284015260608201869052600160a060020a038516608083015260a08083018590528351808403909101815260c0909201928390528151600093918291908401908083835b60208310610bd45780518252601f199092019160209182019101610bb5565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120979650505050505050565b600354600160a060020a031681565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107b85780601f1061078d576101008083540402835291602001916107b8565b6000600160a060020a0383161515610c8957600080fd5b336000908152600160209081526040808320600160a060020a0387168452909152902054610a05908363ffffffff61145a16565b60408051828152905133917fc6b9e46d1489b207d3057f60c8ac6b283467391239ee8e388c1583c20418f36d919081900360200190a2610cfc8161157c565b50565b6000610d0c338484611471565b50600192915050565b600554600160a060020a031681565b604180820283810160208101516040820151919093015160ff169291601b841015610d5057601b840193505b8360ff16601b1480610d6557508360ff16601c145b1515610d7057600080fd5b509250925092565b6000610d84825161112e565b8260405160200180807f19457468657265756d205369676e6564204d6573736167653a0a000000000000815250601a0183805190602001908083835b60208310610ddf5780518252601f199092019160209182019101610dc0565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610e275780518252601f199092019160209182019101610e08565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040526040518082805190602001908083835b60208310610e8b5780518252601f199092019160209182019101610e6c565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c9092019283905281516000939182919084019080838360208310610e8b5780518252601f199092019160209182019101610e6c565b60006060610f6c86611586565b15610fe7576040805160e560020a62461bcd02815260206004820152602e60248201527f466f726569676e207472616e73616374696f6e2068617320616c72656164792060448201527f6265656e2070726f636573736564000000000000000000000000000000000000606482015290519081900360840190fd5b610ffa610ff5878787610b41565b610ee8565b91506110068284611309565b90506110118161159b565b1515611067576040805160e560020a62461bcd02815260206004820152601e60248201527f56616c696461746f7220766572696669636174696f6e206661696c65642e0000604482015290519081900360640190fd5b600554600160a060020a038681169116146110cc576040805160e560020a62461bcd02815260206004820152601860248201527f496e76616c696420636f6e7472616374207461726765742e0000000000000000604482015290519081900360640190fd5b6110d6338561166e565b50600086815260066020908152604091829020805460ff191660011790558151868152915133927f8fc406a425362a34b826c493c710d249c4006ec0fde54cebe73112447567b1a192908290030190a2505050505050565b60608160008281808083861515611167577f3000000000000000000000000000000000000000000000000000000000000000955061119f565b600087111561119f5761010086049550600a870660300160f860020a0260010286179550600a8781151561119757fe5b049650611167565b604080516020808252818301909252908082016104008038833901905050945060009350600092505b6020831015611255576008830260020a860291507fff0000000000000000000000000000000000000000000000000000000000000082161561124a5781858581518110151561121357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916111c8565b836040519080825280601f01601f191660200182016040528015611283578160200160208202803883390190505b509050600092505b838310156112fd5784838151811015156112a157fe5b90602001015160f860020a900460f860020a0281848151811015156112c257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161128b565b98975050505050505050565b6060600080600080600061131c87610970565b915081604051908082528060200260200182016040528015611348578160200160208202803883390190505b509550600090505b818110156113fc576113628782610d24565b60408051600080825260208083018085528f905260ff87168385015260608301869052608083018590529251959a5093985091965060019360a0808401949293601f19830193908390039091019190865af11580156113c5573d6000803e3d6000fd5b5050506020604051035186828151811015156113dd57fe5b600160a060020a03909216602092830290910190910152600101611350565b505050505092915050565b600354600160a060020a0316331461141e57600080fd5b600160a060020a03811615610cfc5760038054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b6000808383111561146a57600080fd5b5050900390565b600160a060020a03831660009081526020819052604090205481111561149657600080fd5b600160a060020a03821615156114ab57600080fd5b600160a060020a0383166000908152602081905260409020546114d4908263ffffffff61145a16565b600160a060020a038085166000908152602081905260408082209390935590841681522054611509908263ffffffff61156316565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008282018381101561157557600080fd5b9392505050565b610cfc338261167a565b60009081526006602052604090205460ff1690565b60045481516000918291146115fa576040805160e560020a62461bcd02815260206004820152601c60248201527f496e76616c6964206e756d626572206f66207369676e61747572657300000000604482015290519081900360640190fd5b5060005b60045481101561166357828181518110151561161657fe5b90602001906020020151600160a060020a031660048281548110151561163857fe5b600091825260209091200154600160a060020a03161461165b5760009150611668565b6001016115fe565b600191505b50919050565b6000610d0c8383611748565b600160a060020a038216151561168f57600080fd5b600160a060020a0382166000908152602081905260409020548111156116b457600080fd5b6002546116c7908263ffffffff61145a16565b600255600160a060020a0382166000908152602081905260409020546116f3908263ffffffff61145a16565b600160a060020a038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600160a060020a038216151561175d57600080fd5b600254611770908263ffffffff61156316565b600255600160a060020a03821660009081526020819052604090205461179c908263ffffffff61156316565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350505600a165627a7a7230582051b885ea5dad6d195b2470bcf87015e8af5b5b52c0057dbd08409c54b62edd850029

Deployed Bytecode Sourcemap

18482:288:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18527:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18527:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;18527:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10280:226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10280:226:0;-1:-1:-1;;;;;10280:226:0;;;;;;;;;;;;;;;;;;;;;;;;;8491:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8491:85:0;;;;;;;;;;;;;;;;;;;;4342:330;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4342:330:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4342:330:0;;-1:-1:-1;;4342:330:0;;;-1:-1:-1;4342:330:0;;-1:-1:-1;;;;4342:330:0;;;;;-1:-1:-1;;;;;4342:330:0;;;;;;;;;;;;;;10786:301;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10786:301:0;-1:-1:-1;;;;;10786:301:0;;;;;;;;;;;;18609:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18609:25:0;;;;3861:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3861:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3861:203:0;;-1:-1:-1;3861:203:0;;-1:-1:-1;;;;;;;3861:203:0;15649:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15649:27:0;;;;;11549:343;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11549:343:0;-1:-1:-1;;;;;11549:343:0;;;;;;;16004:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16004:105:0;-1:-1:-1;;;;;16004:105:0;;;;;;;8780:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8780:100:0;-1:-1:-1;;;;;8780:100:0;;;;;16117:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16117:107:0;-1:-1:-1;;;;;16117:107:0;;;;;18131:293;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18131:293:0;;;-1:-1:-1;;;;;18131:293:0;;;;;;;15277:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15277:20:0;;;;18573:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18573:29:0;;;;12359:353;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12359:353:0;-1:-1:-1;;;;;12359:353:0;;;;;;;16240:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16240:124:0;;;;;9523:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9523:130:0;-1:-1:-1;;;;;9523:130:0;;;;;;;15680:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15680:30:0;;;;2638:979;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2638:979:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2638:979:0;;-1:-1:-1;;2638:979:0;;;-1:-1:-1;2638:979:0;;-1:-1:-1;;;;2638:979:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;883:263;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;883:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;883:263:0;;-1:-1:-1;883:263:0;;-1:-1:-1;;;;;;;883:263:0;9205:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9205:159:0;-1:-1:-1;;;;;9205:159:0;;;;;;;;;;448:239;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;448:239:0;;;;;16376:688;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16376:688:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16376:688:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16376:688:0;;-1:-1:-1;16376:688:0;;-1:-1:-1;;;;;;;16376:688:0;1263:932;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1263:932:0;;;;;4880:487;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4880:487:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4880:487:0;;-1:-1:-1;4880:487:0;;-1:-1:-1;;;;;;;4880:487:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4880:487:0;;;;;;;;;;;;;;;;;15454:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15454:128:0;-1:-1:-1;;;;;15454:128:0;;;;;18527:38;;;;;;;;;;;;;;;-1:-1:-1;;18527:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10280:226::-;10345:4;-1:-1:-1;;;;;10366:21:0;;;;10358:30;;;;;;10406:10;10397:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;10397:29:0;;;;;;;;;;;;:37;;;10446:36;;;;;;;10397:29;;10406:10;10446:36;;;;;;;;;;;-1:-1:-1;10496:4:0;10280:226;;;;:::o;8491:85::-;8558:12;;8491:85;:::o;4342:330::-;4493:7;4518;4536:9;4556;4588:33;4603:11;4616:4;4588:14;:33::i;:::-;4639:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4576:45;;-1:-1:-1;4576:45:0;;-1:-1:-1;4576:45:0;;-1:-1:-1;4639:25:0;;;;;;;;;-1:-1:-1;;4639:25:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4639:25:0;;-1:-1:-1;;4639:25:0;;;4342:330;-1:-1:-1;;;;;;;;4342:330:0:o;10786:301::-;-1:-1:-1;;;;;10928:14:0;;10895:4;10928:14;;;:8;:14;;;;;;;;10943:10;10928:26;;;;;;;;10919:35;;;10911:44;;;;;;-1:-1:-1;;;;;10993:14:0;;;;;;:8;:14;;;;;;;;11008:10;10993:26;;;;;;;;:37;;11024:5;10993:37;:30;:37;:::i;:::-;-1:-1:-1;;;;;10964:14:0;;;;;;:8;:14;;;;;;;;10979:10;10964:26;;;;;;;:66;11037:26;10973:4;11053:2;11057:5;11037:9;:26::i;:::-;-1:-1:-1;11077:4:0;10786:301;;;;;:::o;18609:25::-;;;;:::o;3861:203::-;3998:18;;3969:4;;4019:2;;3998:23;:28;:58;;4055:1;3998:58;;;4029:18;;4050:2;;4029:23;3998:58;3991:65;3861:203;-1:-1:-1;;3861:203:0:o;15649:27::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15649:27:0;;-1:-1:-1;15649:27:0;:::o;11549:343::-;11654:4;-1:-1:-1;;;;;11678:21:0;;;;11670:30;;;;;;11759:10;11750:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;11750:29:0;;;;;;;;;;:45;;11784:10;11750:45;:33;:45;:::i;:::-;11718:10;11709:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;11709:29:0;;;;;;;;;;;;:87;;;11808:60;;;;;;11709:29;;11808:60;;;;;;;;;;;-1:-1:-1;11882:4:0;11549:343;;;;:::o;16004:105::-;15406:5;;-1:-1:-1;;;;;15406:5:0;15392:10;:19;15388:47;;15422:5;;;15388:47;16074:10;27::-1;;39:1;23:18;;45:23;;-1:-1;16074:27:0;;;;;;;;-1:-1:-1;;16074:27:0;-1:-1:-1;;;;;16074:27:0;;;;;;;;;;16004:105::o;8780:100::-;-1:-1:-1;;;;;8858:16:0;8835:7;8858:16;;;;;;;;;;;;8780:100::o;16117:107::-;15406:5;;-1:-1:-1;;;;;15406:5:0;15392:10;:19;15388:47;;15422:5;;;15388:47;16182:15;:34;;-1:-1:-1;;16182:34:0;-1:-1:-1;;;;;16182:34:0;;;;;;;;;;16117:107::o;18131:293::-;18336:79;;;18348:18;18336:79;;;;;;;;18368:10;18336:79;;;;;;;;;;-1:-1:-1;;;;;18336:79:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18336:79:0;;;;;;;;18326:90;;18234:7;;18336:79;;;18326:90;;;;;18336:79;18326:90;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;18326:90:0;;;;;;;;;;;;-1:-1:-1;;;;;;;18131:293:0:o;15277:20::-;;;-1:-1:-1;;;;;15277:20:0;;:::o;18573:29::-;;;;;;;;;;;;;;;-1:-1:-1;;18573:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12359:353;12469:4;-1:-1:-1;;;;;12493:21:0;;;;12485:30;;;;;;12574:10;12565:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;12565:29:0;;;;;;;;;;:50;;12599:15;12565:50;:33;:50;:::i;16240:124::-;16295:37;;;;;;;;16312:10;;16295:37;;;;;;;;;;16343:13;16348:7;16343:4;:13::i;:::-;16240:124;:::o;9523:130::-;9584:4;9597:32;9607:10;9619:2;9623:5;9597:9;:32::i;:::-;-1:-1:-1;9643:4:0;9523:130;;;;:::o;15680:30::-;;;-1:-1:-1;;;;;15680:30:0;;:::o;2638:979::-;2833:2;2826:9;;;3093:33;;;3114:2;3093:33;;3087:40;3173:2;3152:33;;3146:40;3486:33;;;;3480:40;3522:4;3476:51;;3087:40;3558:2;3554:6;;3550:19;;;3567:2;3562:7;;;;3550:19;3590:1;:7;;3595:2;3590:7;:18;;;;3601:1;:7;;3606:2;3601:7;3590:18;3582:27;;;;;;;;2638:979;;;;;;:::o;883:263::-;999:16;1105:25;1118:4;:11;1105:12;:25::i;:::-;1132:4;1054:83;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1054:83:0;;;;;;;;;;-1:-1:-1;1054:83:0;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1054:83:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1054:83:0;;;1044:94;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;1044:94:0;;;;;;;;;;;;-1:-1:-1;;;;;883:263:0:o;9205:159::-;-1:-1:-1;;;;;9334:15:0;;;9308:7;9334:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;9205:159::o;448:239::-;620:58;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;620:58:0;;;;;;;;610:69;;565:16;;620:58;;;610:69;;;;;620:58;610:69;66:2:-1;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;16376:688:0;16582:12;16687:26;16493:18;16502:8;16493;:18::i;:::-;:27;16485:86;;;;;-1:-1:-1;;;;;16485:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16597:79;16627:48;16640:8;16649:16;16667:7;16627:12;:48::i;:::-;16597:29;:79::i;:::-;16582:94;;16716:35;16733:4;16739:11;16716:16;:35::i;:::-;16687:64;;16770:27;16787:9;16770:16;:27::i;:::-;16762:70;;;;;;;-1:-1:-1;;;;;16762:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16871:15;;-1:-1:-1;;;;;16851:35:0;;;16871:15;;16851:35;16843:72;;;;;-1:-1:-1;;;;;16843:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16926:25;16931:10;16943:7;16926:4;:25::i;:::-;-1:-1:-1;16962:29:0;;;;:19;:29;;;;;;;;;:36;;-1:-1:-1;;16962:36:0;16994:4;16962:36;;;17014;;;;;;;17030:10;;17014:36;;;;;;;;;16376:688;;;;;;:::o;1263:932::-;1357:6;1390:1;1381:6;1357;1381;;;1357;1426;;1422:248;;;1449:7;;;1422:248;;;1500:1;1496;:5;1489:170;;;1545:6;1539:1;1534:18;;-1:-1:-1;1591:2:0;1587:1;:6;1597:2;1586:13;-1:-1:-1;;;1585:31:0;1577:40;;1572:45;;;;1641:2;1636:7;;;;;;;;;;;1489:170;;;1709:13;;;1719:2;1709:13;;;;;;;;;;;;;17:15:-1;;105:10;1709:13:0;88:34:-1;136:17;;-1:-1;1709:13:0;1682:40;;1750:1;1733:18;;1776:1;1767:10;;1762:229;1783:2;1779:1;:6;1762:229;;;1848:1;:5;;1842:1;:12;1832:22;;;-1:-1:-1;1875:9:0;;;;1871:109;;1930:4;1905:11;1917:9;1905:22;;;;;;;;;;;;;;:29;;;;;;;;;;-1:-1:-1;1953:11:0;;;;;1871:109;1787:3;;;;;1762:229;;;2038:9;2028:20;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;2028:20:0;;2001:47;;2068:1;2064:5;;2059:90;2075:9;2071:1;:13;2059:90;;;2123:11;2135:1;2123:14;;;;;;;;;;;;;;;-1:-1:-1;;;2123:14:0;;-1:-1:-1;;;2123:14:0;2106:11;2118:1;2106:14;;;;;;;;;;;;;;:31;;;;;;;;;;-1:-1:-1;2086:3:0;;;;;2059:90;;;2175:11;1263:932;-1:-1:-1;;;;;;;;1263:932:0:o;4880:487::-;5013:19;5050:7;5068:9;5088;5108:10;5208:6;5121:28;5137:11;5121:15;:28::i;:::-;5108:41;;5186:5;5172:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;5172:20:0;;5160:32;;5217:1;5208:10;;5203:157;5224:5;5220:1;:9;5203:157;;;5263:30;5278:11;5291:1;5263:14;:30::i;:::-;5323:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5251:42;;-1:-1:-1;5251:42:0;;-1:-1:-1;5251:42:0;;-1:-1:-1;5323:25:0;;;;;;;;;-1:-1:-1;;5323:25:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5323:25:0;;;;;;;;5308:9;5318:1;5308:12;;;;;;;;;;-1:-1:-1;;;;;5308:40:0;;;:12;;;;;;;;;;:40;5231:3;;5203:157;;;4880:487;;;;;;;;;:::o;15454:128::-;15406:5;;-1:-1:-1;;;;;15406:5:0;15392:10;:19;15388:47;;15422:5;;;15388:47;-1:-1:-1;;;;;15520:22:0;;;15516:61;;15553:5;:16;;-1:-1:-1;;;;;15553:16:0;;-1:-1:-1;;15553:16:0;;;;;;15454:128;:::o;7317:136::-;7375:7;;7399:6;;;;7391:15;;;;;;-1:-1:-1;;7425:5:0;;;7317:136::o;12920:284::-;-1:-1:-1;;;;;13013:15:0;;:9;:15;;;;;;;;;;;13004:24;;;12996:33;;;;;;-1:-1:-1;;;;;13044:16:0;;;;13036:25;;;;;;-1:-1:-1;;;;;13088:15:0;;:9;:15;;;;;;;;;;;:26;;13108:5;13088:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;13070:15:0;;;:9;:15;;;;;;;;;;;:44;;;;13137:13;;;;;;;:24;;13155:5;13137:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;13121:13:0;;;:9;:13;;;;;;;;;;;;:40;;;;13173:25;;;;;;;13121:13;;13173:25;;;;;;;;;;;;;12920:284;;;:::o;7521:136::-;7579:7;7607:5;;;7627:6;;;;7619:15;;;;;;7650:1;7521:136;-1:-1:-1;;;7521:136:0:o;17855:81::-;17903:25;17909:10;17921:6;17903:5;:25::i;17072:119::-;17131:4;17154:29;;;:19;:29;;;;;;;;;17072:119::o;17199:357::-;17314:10;:17;17294:16;;17269:4;;;;17294:37;17286:78;;;;;-1:-1:-1;;;;;17286:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17388:1:0;17375:152;17396:10;:17;17392:21;;17375:152;;;17455:9;17465:1;17455:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17438:29:0;:10;17449:1;17438:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17438:13:0;:29;17435:81;;17495:5;17488:12;;;;17435:81;17415:3;;17375:152;;;17544:4;17537:11;;17199:357;;;;;:::o;17564:164::-;17634:4;17649:19;17655:3;17660:7;17649:5;:19::i;14000:285::-;-1:-1:-1;;;;;14071:12:0;;;;14063:21;;;;;;-1:-1:-1;;;;;14108:18:0;;:9;:18;;;;;;;;;;;14099:27;;;14091:36;;;;;;14151:12;;:23;;14168:5;14151:23;:16;:23;:::i;:::-;14136:12;:38;-1:-1:-1;;;;;14202:18:0;;:9;:18;;;;;;;;;;;:29;;14225:5;14202:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;14181:18:0;;:9;:18;;;;;;;;;;;:50;;;;14243:36;;;;;;;14181:9;;14243:36;;;;;;;;;;;14000:285;;:::o;13540:240::-;-1:-1:-1;;;;;13611:12:0;;;;13603:21;;;;;;13646:12;;:23;;13663:5;13646:23;:16;:23;:::i;:::-;13631:12;:38;-1:-1:-1;;;;;13697:18:0;;:9;:18;;;;;;;;;;;:29;;13720:5;13697:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;13676:18:0;;:9;:18;;;;;;;;;;;:50;;;;13738:36;;;;;;;13676:18;;:9;;13738:36;;;;;;;;;;13540:240;;:::o

Swarm Source

bzzr://51b885ea5dad6d195b2470bcf87015e8af5b5b52c0057dbd08409c54b62edd85
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.