false
false
The Sokol Testnet is currently lacking validators. Please consider using Goerli or Mumbai for testing purposes.

Contract Address Details
contract

0x8E8dE8FE625c376f6D4FB2fc351337268a73388b

Contract Name
ArianeeEvent
Creator
0xd03ea8–89b117 at 0x8aa98d–6f0c7d
Balance
0 SPOA
Tokens
Fetching tokens...
Transactions
8 Transactions
Transfers
0 Transfers
Gas Used
216,982
Last Balance Update
27736955
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
ArianeeEvent




Optimization enabled
true
Compiler version
v0.5.6+commit.b259423e




Optimization runs
200
EVM Version
default




Verified at
2024-07-08T17:10:59.366139Z

Constructor Arguments

000000000000000000000000512c1fcf401133680f373a386f3f752b98070bc50000000000000000000000003579669219dc20aa79e74eefd5fb2ecb0ce5fe0d

Arg [0] (address) : 0x512c1fcf401133680f373a386f3f752b98070bc5
Arg [1] (address) : 0x3579669219dc20aa79e74eefd5fb2ecb0ce5fe0d

              

.sol

Sol2uml
new
// File: @0xcert/ethereum-utils-contracts/src/contracts/permission/ownable.sol

pragma solidity 0.5.6;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{
  
  /**
   * @dev Error constants.
   */
  string constant NOT_OWNER = "018001";
  string constant ZERO_ADDRESS = "018002";

  /**
   * @dev Address of the owner. 
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
    public
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
  
}

// File: @0xcert/ethereum-utils-contracts/src/contracts/math/safe-math.sol

pragma solidity 0.5.6;

/**
 * @dev Math operations with safety checks that throw on error. This contract is based on the 
 * source code at: 
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol.
 */
library SafeMath
{

  /**
   * @dev Error constants.
   */
  string constant OVERFLOW = "008001";
  string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002";
  string constant DIVISION_BY_ZERO = "008003";

  /**
   * @dev Multiplies two numbers, reverts on overflow.
   * @param _factor1 Factor number.
   * @param _factor2 Factor number.
   * @return The product of the two factors.
   */
  function mul(
    uint256 _factor1,
    uint256 _factor2
  )
    internal
    pure
    returns (uint256 product)
  {
    // 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 (_factor1 == 0)
    {
      return 0;
    }

    product = _factor1 * _factor2;
    require(product / _factor1 == _factor2, OVERFLOW);
  }

  /**
   * @dev Integer division of two numbers, truncating the quotient, reverts on division by zero.
   * @param _dividend Dividend number.
   * @param _divisor Divisor number.
   * @return The quotient.
   */
  function div(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 quotient)
  {
    // Solidity automatically asserts when dividing by 0, using all gas.
    require(_divisor > 0, DIVISION_BY_ZERO);
    quotient = _dividend / _divisor;
    // assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold.
  }

  /**
   * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
   * @param _minuend Minuend number.
   * @param _subtrahend Subtrahend number.
   * @return Difference.
   */
  function sub(
    uint256 _minuend,
    uint256 _subtrahend
  )
    internal
    pure
    returns (uint256 difference)
  {
    require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND);
    difference = _minuend - _subtrahend;
  }

  /**
   * @dev Adds two numbers, reverts on overflow.
   * @param _addend1 Number.
   * @param _addend2 Number.
   * @return Sum.
   */
  function add(
    uint256 _addend1,
    uint256 _addend2
  )
    internal
    pure
    returns (uint256 sum)
  {
    sum = _addend1 + _addend2;
    require(sum >= _addend1, OVERFLOW);
  }

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

}

// File: contracts/ArianeeEvent/Pausable.sol

pragma solidity 0.5.6;

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;

  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}

// File: contracts/ArianeeEvent/ArianeeEvent.sol

pragma solidity 0.5.6;



contract ERC721Interface {
    function canOperate(uint256 _tokenId, address _operator) public returns(bool);
    function isTokenValid(uint256 _tokenId, bytes32 _hash, uint256 _tokenType, bytes memory _signature) public view returns (bool);
    function issuerOf(uint256 _tokenId) external view returns(address _tokenIssuer);
    function tokenCreation(uint256 _tokenId) external view returns(uint256);
}

contract iArianeeWhitelist {
    function addWhitelistedAddress(uint256 _tokenId, address _address) public;
}

contract ArianeeEvent is
Ownable, Pausable{
    
    using SafeMath for uint256;
    
    address arianeeStoreAddress;
    iArianeeWhitelist arianeeWhitelist;
    ERC721Interface smartAsset;
    
    uint256 eventDestroyDelay = 7776000;
    
    /// Event ID per token
    mapping(uint256 => uint256[]) public tokenEventsList;
    
    mapping(uint256 => uint256) public idToTokenEventIndex;
    
    /// Mapping from tokenid to pending events
    mapping(uint256 => uint256[]) public pendingEvents;
    
    /// Mapping from event ID to its index in the pending events list
    mapping(uint256 => uint256) public idToPendingEvents;
    
    mapping(uint256 => uint256) public eventIdToToken;
    
    mapping(uint256 => uint256) public rewards;
    
    mapping(uint256 => bool) destroyRequest;
    
    /// Event list    
    mapping(uint256 => Event) internal events;
    //Event[] public events;
    
    struct Event{
        string URI;
        bytes32 imprint;
        address provider;
        uint destroyLimitTimestamp;
    }
    
    event EventCreated(uint256 indexed _tokenId, uint256 indexed _eventId, bytes32 indexed _imprint, string _uri, address _provider);
    event EventAccepted(uint256 indexed _eventId, address indexed _sender);
    event EventRefused(uint256 indexed _eventId, address indexed _sender);
    event EventDestroyed(uint256 indexed _eventId);
    event DestroyRequestUpdated(uint256 indexed _eventId, bool _active);
    event EventDestroyDelayUpdated(uint256 _newDelay);
    
    modifier onlyStore(){
        //require(msg.sender == arianeeStoreAddress);
        _;
    }
    
    modifier canOperate(uint256 _eventId,address _operator){
        //uint256 _tokenId = eventIdToToken[_eventId];
        //require(smartAsset.canOperate(_tokenId, _operator) || smartAsset.issuerOf(_tokenId) == _operator);
        _;
    }
    
    modifier isProvider(uint256 _eventId) {
        //require(msg.sender == events[_eventId].provider);
        _;
    }
    
    
    constructor(address _smartAssetAddress, address _arianeeWhitelistAddress) public{
        arianeeWhitelist = iArianeeWhitelist(address(_arianeeWhitelistAddress));
        smartAsset = ERC721Interface(address(_smartAssetAddress));
    }
    
    /**
     * @dev set a new store address
     * @notice can only be called by the contract owner.
     * @param _storeAddress new address of the store.
     */
    function setStoreAddress(address _storeAddress) public onlyOwner(){
        arianeeStoreAddress = _storeAddress;
    }
    
    /**
     * @dev create a new event linked to a nft
     * @notice can only be called through the store.
     * @param _tokenId id of the NFT
     * @param _imprint of the JSON.
     * @param _uri uri of the JSON of the service.
     * @param _reward total rewards of this event.
     * @param _provider address of the event provider.
     * @return the id of the service.
     */
    function create(uint256 _eventId, uint256 _tokenId, bytes32 _imprint, string calldata _uri, uint256 _reward, address _provider) external onlyStore() whenNotPaused() {
        require(smartAsset.tokenCreation(_tokenId)>0);
        require(events[_eventId].provider == address(0));
        
        Event memory _event = Event({
            URI : _uri,
            imprint : _imprint,
            provider : _provider,
            destroyLimitTimestamp : eventDestroyDelay.add(block.timestamp)
        });
        
        events[_eventId] = _event;
        
        uint256 length = pendingEvents[_tokenId].push(_eventId);
        idToPendingEvents[_eventId] = length - 1; 
        
        eventIdToToken[_eventId] = _tokenId;
        
        rewards[_eventId]= _reward;
        
        emit EventCreated(_tokenId, _eventId, _imprint, _uri, _provider);
    }
    
    /**
     * @dev Accept an event so it can be concidered as valid.
     * @notice can only be called through the store by an operator of the NFT.
     * @param _eventId id of the service.
     */
    function accept(uint256 _eventId, address _sender) external onlyStore() canOperate(_eventId, _sender) whenNotPaused() returns(uint256){
        
        uint256 _tokenId = eventIdToToken[_eventId];
        uint256 pendingEventToRemoveIndex = idToPendingEvents[_eventId];
        uint256 lastPendingIndex = pendingEvents[_tokenId].length - 1;
        
        if(lastPendingIndex != pendingEventToRemoveIndex){
            uint256 lastPendingEvent = pendingEvents[_tokenId][lastPendingIndex];
            pendingEvents[_tokenId][pendingEventToRemoveIndex]=lastPendingEvent;
            idToPendingEvents[lastPendingEvent] = pendingEventToRemoveIndex;
        }
        
        pendingEvents[_tokenId].length--;
        delete idToPendingEvents[_eventId];
        
        uint256 length = tokenEventsList[_tokenId].push(_eventId);
        idToTokenEventIndex[_eventId] = length - 1;
        
        arianeeWhitelist.addWhitelistedAddress(_tokenId, events[_eventId].provider);
        uint256 reward = rewards[_eventId];
        delete rewards[_eventId];
        
        emit EventAccepted(_eventId, _sender);
        return reward;
    }
    
    /**
     * @dev refuse an event so it can be concidered as valid.
     * @notice can only be called through the store by an operator of the NFT.
     * @param _eventId id of the service.
     */
    function refuse(uint256 _eventId, address _sender) external onlyStore() canOperate(_eventId, _sender) whenNotPaused() returns(uint256){
        _destroyPending(_eventId);
        uint256 reward = rewards[_eventId];
        delete rewards[_eventId];
        emit EventRefused(_eventId, _sender);
        
        return reward;
    }
    
    function destroy(uint256 _eventId) external isProvider(_eventId) whenNotPaused(){
        require(block.timestamp < events[_eventId].destroyLimitTimestamp);
        require(idToPendingEvents[_eventId] == 0);
        _destroy(_eventId);
    }
    
    function updateDestroyRequest(uint256 _eventId, bool _active) external isProvider(_eventId) whenNotPaused() {
        require(idToPendingEvents[_eventId] == 0);
        destroyRequest[_eventId] = _active;
        emit DestroyRequestUpdated(_eventId, _active);
    }

    function validDestroyRequest(uint256 _eventId) external onlyOwner() whenNotPaused() {
        require(destroyRequest[_eventId] == true);
        destroyRequest[_eventId] = false;
        _destroy(_eventId);
    }
    
    function updateEventDestroyDelay(uint256 _newDelay) external onlyOwner() whenNotPaused() {
        eventDestroyDelay = _newDelay;
        emit EventDestroyDelayUpdated(_newDelay);
    }
    
    function getEvent(uint256 _eventId) public view returns(string memory, bytes32, address, uint){
        require(events[_eventId].provider != address(0));
        return (events[_eventId].URI, events[_eventId].imprint, events[_eventId].provider, events[_eventId].destroyLimitTimestamp);
    }
    
    function _destroy(uint256 _eventId) internal{
        
        uint256 _tokenId = eventIdToToken[_eventId];
        
        uint256 eventIdToRemove = idToTokenEventIndex[_eventId];
        uint256 lastEventId = tokenEventsList[_tokenId].length - 1;
        
        if(eventIdToRemove != lastEventId){
            uint256 lastEvent = tokenEventsList[_tokenId][lastEventId];
            tokenEventsList[_tokenId][eventIdToRemove] = lastEvent;
            idToTokenEventIndex[lastEvent] = eventIdToRemove;
        }
        
        tokenEventsList[_tokenId].length--;
        delete idToTokenEventIndex[_eventId];
        delete eventIdToToken[_eventId];
        delete events[_eventId];
        
        emit EventDestroyed(_eventId);

    }
    
    function _destroyPending(uint256 _eventId) internal{
        
        uint256 _tokenId = eventIdToToken[_eventId];
        uint256 pendingEventToRemoveIndex = idToPendingEvents[_eventId];
        uint256 lastPendingIndex = pendingEvents[_tokenId].length - 1;
        
        if(lastPendingIndex != pendingEventToRemoveIndex){
            uint256 lastPendingEvent = pendingEvents[_tokenId][lastPendingIndex];
            pendingEvents[_tokenId][pendingEventToRemoveIndex]=lastPendingEvent;
            idToPendingEvents[lastPendingEvent] = pendingEventToRemoveIndex;
        }
        
        pendingEvents[_tokenId].length--;
        
        delete idToPendingEvents[_eventId];
        delete eventIdToToken[_eventId];
        delete events[_eventId];
        
        emit EventDestroyed(_eventId);

    }
    
    function pendingEventsLength(uint256 _tokenId) public view returns(uint256){
        return pendingEvents[_tokenId].length;
    }
    
    function eventsLength(uint256 _tokenId) public view returns(uint256){
        return tokenEventsList[_tokenId].length;
    }
    
}
        

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{".sol":{}}}
              

Contract ABI

[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"idToPendingEvents","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"tokenEventsList","inputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"create","inputs":[{"type":"uint256","name":"_eventId"},{"type":"uint256","name":"_tokenId"},{"type":"bytes32","name":"_imprint"},{"type":"string","name":"_uri"},{"type":"uint256","name":"_reward"},{"type":"address","name":"_provider"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"pendingEventsLength","inputs":[{"type":"uint256","name":"_tokenId"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"unpause","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"updateDestroyRequest","inputs":[{"type":"uint256","name":"_eventId"},{"type":"bool","name":"_active"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"accept","inputs":[{"type":"uint256","name":"_eventId"},{"type":"address","name":"_sender"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"paused","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setStoreAddress","inputs":[{"type":"address","name":"_storeAddress"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":""},{"type":"bytes32","name":""},{"type":"address","name":""},{"type":"uint256","name":""}],"name":"getEvent","inputs":[{"type":"uint256","name":"_eventId"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"eventsLength","inputs":[{"type":"uint256","name":"_tokenId"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"pause","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"destroy","inputs":[{"type":"uint256","name":"_eventId"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"eventIdToToken","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"idToTokenEventIndex","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"validDestroyRequest","inputs":[{"type":"uint256","name":"_eventId"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"refuse","inputs":[{"type":"uint256","name":"_eventId"},{"type":"address","name":"_sender"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"pendingEvents","inputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"updateEventDestroyDelay","inputs":[{"type":"uint256","name":"_newDelay"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"rewards","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"_smartAssetAddress"},{"type":"address","name":"_arianeeWhitelistAddress"}]},{"type":"event","name":"EventCreated","inputs":[{"type":"uint256","name":"_tokenId","indexed":true},{"type":"uint256","name":"_eventId","indexed":true},{"type":"bytes32","name":"_imprint","indexed":true},{"type":"string","name":"_uri","indexed":false},{"type":"address","name":"_provider","indexed":false}],"anonymous":false},{"type":"event","name":"EventAccepted","inputs":[{"type":"uint256","name":"_eventId","indexed":true},{"type":"address","name":"_sender","indexed":true}],"anonymous":false},{"type":"event","name":"EventRefused","inputs":[{"type":"uint256","name":"_eventId","indexed":true},{"type":"address","name":"_sender","indexed":true}],"anonymous":false},{"type":"event","name":"EventDestroyed","inputs":[{"type":"uint256","name":"_eventId","indexed":true}],"anonymous":false},{"type":"event","name":"DestroyRequestUpdated","inputs":[{"type":"uint256","name":"_eventId","indexed":true},{"type":"bool","name":"_active","indexed":false}],"anonymous":false},{"type":"event","name":"EventDestroyDelayUpdated","inputs":[{"type":"uint256","name":"_newDelay","indexed":false}],"anonymous":false},{"type":"event","name":"Pause","inputs":[],"anonymous":false},{"type":"event","name":"Unpause","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false}]
              

Contract Creation Code

0x608060405260008054600160a01b60ff02191690556276a70060045534801561002757600080fd5b506040516040806116758339810180604052604081101561004757600080fd5b508051602090910151600080546001600160a01b03199081163317909155600280546001600160a01b03938416908316179055600380549290931691161790556115df806100966000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638456cb59116100b8578063b215548e1161007c578063b215548e14610441578063c83ed88c1461045e578063df8edca01461048a578063e253981b146104ad578063f2fde38b146104ca578063f301af42146104f057610142565b80638456cb59146103be5780638da5cb5b146103c65780639d118770146103ea5780639f503b7514610407578063ac94e8131461042457610142565b80634d396a2a1161010a5780634d396a2a1461025257806350ace9c2146102775780635c975abb146102a35780636559e59a146102bf5780636d1884e0146102e55780637bf4c220146103a157610142565b80630185934b14610147578063042fe37b14610176578063078a5cfb14610199578063246cb2d51461022d5780633f4ba83a1461024a575b600080fd5b6101646004803603602081101561015d57600080fd5b503561050d565b60408051918252519081900360200190f35b6101646004803603604081101561018c57600080fd5b508035906020013561051f565b61022b600480360360c08110156101af57600080fd5b813591602081013591604082013591908101906080810160608201356401000000008111156101dd57600080fd5b8201836020820111156101ef57600080fd5b8035906020019184600183028401116401000000008311171561021157600080fd5b9193509150803590602001356001600160a01b031661054d565b005b6101646004803603602081101561024357600080fd5b50356107b6565b61022b6107c8565b61022b6004803603604081101561026857600080fd5b508035906020013515156108d2565b6101646004803603604081101561028d57600080fd5b50803590602001356001600160a01b031661095c565b6102ab610b37565b604080519115158252519081900360200190f35b61022b600480360360208110156102d557600080fd5b50356001600160a01b0316610b47565b610302600480360360208110156102fb57600080fd5b5035610be7565b6040518080602001858152602001846001600160a01b03166001600160a01b03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561036357818101518382015260200161034b565b50505050905090810190601f1680156103905780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b610164600480360360208110156103b757600080fd5b5035610cdd565b61022b610cef565b6103ce610dc3565b604080516001600160a01b039092168252519081900360200190f35b61022b6004803603602081101561040057600080fd5b5035610dd2565b6101646004803603602081101561041d57600080fd5b5035610e2e565b6101646004803603602081101561043a57600080fd5b5035610e40565b61022b6004803603602081101561045757600080fd5b5035610e52565b6101646004803603604081101561047457600080fd5b50803590602001356001600160a01b0316610f29565b610164600480360360408110156104a057600080fd5b5080359060200135610fa0565b61022b600480360360208110156104c357600080fd5b5035610fb9565b61022b600480360360208110156104e057600080fd5b50356001600160a01b0316611089565b6101646004803603602081101561050657600080fd5b50356111db565b60086020526000908152604090205481565b6005602052816000526040600020818154811061053857fe5b90600052602060002001600091509150505481565b600054600160a01b900460ff161561056457600080fd5b60035460408051600160e11b632fd65c410281526004810189905290516000926001600160a01b031691635facb882916024808301926020929190829003018186803b1580156105b357600080fd5b505afa1580156105c7573d6000803e3d6000fd5b505050506040513d60208110156105dd57600080fd5b5051116105e957600080fd5b6000878152600c60205260409020600201546001600160a01b03161561060e57600080fd5b610616611488565b604051806080016040528086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602081018890526001600160a01b0384166040820152600454606090910190610689904263ffffffff6111ed16565b90526000898152600c6020908152604090912082518051939450849391926106b6928492909101906114af565b506020828101516001838101919091556040808501516002850180546001600160a01b0319166001600160a01b0392831617905560609586015160039095019490945560008c815260078452818120805493840180825590825284822084018f90558e82526008855282822093909355600984528181208d9055600a84528190208890558051938716928401929092528183529082018790529188918b918b917f22812011facd690a74ddd930726d2c051f0b7ef3d0ea35ad9b0f0d89849cb0f2918b918b918a919081908101858580828437600083820152604051601f909101601f1916909201829003965090945050505050a4505050505050505050565b60009081526007602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461088257604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561084757818101518382015260200161082f565b50505050905090810190601f1680156108745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600054600160a01b900460ff1661089957600080fd5b60008054600160a01b60ff02191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b6000548290600160a01b900460ff16156108eb57600080fd5b6000838152600860205260409020541561090457600080fd5b6000838152600b6020908152604091829020805460ff19168515159081179091558251908152915185927f5f9ec800eb8dc135e488f393491e324d4662a45bad8759259d6b70a7f3edabc292908290030190a2505050565b6000805483908390600160a01b900460ff161561097857600080fd5b6000858152600960209081526040808320546008835281842054818552600790935292205460001901808214610a0e5760008381526007602052604081208054839081106109c257fe5b90600052602060002001549050806007600086815260200190815260200160002084815481106109ee57fe5b600091825260208083209091019290925591825260089052604090208290555b6000838152600760205260409020805490610a2d90600019830161152d565b5060008881526008602090815260408083208390558583526005825280832080546001810180835591855283852081018d90558c8552600684528285205560028054600c90945282852001548251600160e01b6387159d9b028152600481018990526001600160a01b039182166024820152925191949316926387159d9b926044808201939182900301818387803b158015610ac857600080fd5b505af1158015610adc573d6000803e3d6000fd5b50505060008a8152600a602052604080822080549083905590519092506001600160a01b038b16918c917f801d564d3920ab7f9d83def865765f310bf8d043086d5ba3e544bd6f2073ad8c9190a39998505050505050505050565b600054600160a01b900460ff1681565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610bc457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600c602052604081206002015460609190819081906001600160a01b0316610c1357600080fd5b6000858152600c60209081526040918290206001808201546002808401546003850154855488516101009682161596909602600019011692909204601f8101879004870285018701909752868452939591946001600160a01b03909416939092918691830182828015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b5050505050935093509350935093509193509193565b60009081526005602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610d6c57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610d8457600080fd5b60008054600160a01b60ff021916600160a01b1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b6000546001600160a01b031681565b6000548190600160a01b900460ff1615610deb57600080fd5b6000828152600c60205260409020600301544210610e0857600080fd5b60008281526008602052604090205415610e2157600080fd5b610e2a8261126a565b5050565b60096020526000908152604090205481565b60066020526000908152604090205481565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610ecf57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610ee757600080fd5b6000818152600b602052604090205460ff161515600114610f0757600080fd5b6000818152600b60205260409020805460ff19169055610f268161126a565b50565b6000805483908390600160a01b900460ff1615610f4557600080fd5b610f4e856113a2565b6000858152600a6020526040808220805490839055905190916001600160a01b0387169188917f7b63482061dff09283b6f74fe6316412dc2ecd1c506db6fd2e71587441de4a7891a395945050505050565b6007602052816000526040600020818154811061053857fe5b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461103657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff161561104e57600080fd5b60048190556040805182815290517f669d541b4334ab609b45df5fd2166d3307e17d6a4480a7b898b53d5d2944a4519181900360200190a150565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461110657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b506040805180820190915260068152600160d11b6518189c1818190260208201526001600160a01b03821661117f57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600a6020526000908152604090205481565b6040805180820190915260068152600160d01b65303038303031026020820152828201908382101561126357604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b5092915050565b60008181526009602090815260408083205460068352818420548185526005909352922054600019018082146113005760008381526005602052604081208054839081106112b457fe5b90600052602060002001549050806005600086815260200190815260200160002084815481106112e057fe5b600091825260208083209091019290925591825260069052604090208290555b600083815260056020526040902080549061131f90600019830161152d565b50600084815260066020908152604080832083905560098252808320839055600c9091528120906113508282611556565b506000600182018190556002820180546001600160a01b0319169055600390910181905560405185917f76cbc15b6b19cc4b9fe30092856bf54574239555e9f1b1b96647b2dccd23b4d891a250505050565b60008181526009602090815260408083205460088352818420548185526007909352922054600019018082146114385760008381526007602052604081208054839081106113ec57fe5b906000526020600020015490508060076000868152602001908152602001600020848154811061141857fe5b600091825260208083209091019290925591825260089052604090208290555b600083815260076020526040902080549061145790600019830161152d565b50600084815260086020908152604080832083905560098252808320839055600c9091528120906113508282611556565b60408051608081018252606080825260006020830181905292820183905281019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114f057805160ff191683800117855561151d565b8280016001018555821561151d579182015b8281111561151d578251825591602001919060010190611502565b50611529929150611596565b5090565b81548183558181111561155157600083815260209020611551918101908301611596565b505050565b50805460018160011615610100020316600290046000825580601f1061157c5750610f26565b601f016020900490600052602060002090810190610f2691905b6115b091905b80821115611529576000815560010161159c565b9056fea165627a7a723058209478b394e393c7a4e48002bb91d88028548e49a26cde03a8edfaaf534290b6fa0029000000000000000000000000512c1fcf401133680f373a386f3f752b98070bc50000000000000000000000003579669219dc20aa79e74eefd5fb2ecb0ce5fe0d

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638456cb59116100b8578063b215548e1161007c578063b215548e14610441578063c83ed88c1461045e578063df8edca01461048a578063e253981b146104ad578063f2fde38b146104ca578063f301af42146104f057610142565b80638456cb59146103be5780638da5cb5b146103c65780639d118770146103ea5780639f503b7514610407578063ac94e8131461042457610142565b80634d396a2a1161010a5780634d396a2a1461025257806350ace9c2146102775780635c975abb146102a35780636559e59a146102bf5780636d1884e0146102e55780637bf4c220146103a157610142565b80630185934b14610147578063042fe37b14610176578063078a5cfb14610199578063246cb2d51461022d5780633f4ba83a1461024a575b600080fd5b6101646004803603602081101561015d57600080fd5b503561050d565b60408051918252519081900360200190f35b6101646004803603604081101561018c57600080fd5b508035906020013561051f565b61022b600480360360c08110156101af57600080fd5b813591602081013591604082013591908101906080810160608201356401000000008111156101dd57600080fd5b8201836020820111156101ef57600080fd5b8035906020019184600183028401116401000000008311171561021157600080fd5b9193509150803590602001356001600160a01b031661054d565b005b6101646004803603602081101561024357600080fd5b50356107b6565b61022b6107c8565b61022b6004803603604081101561026857600080fd5b508035906020013515156108d2565b6101646004803603604081101561028d57600080fd5b50803590602001356001600160a01b031661095c565b6102ab610b37565b604080519115158252519081900360200190f35b61022b600480360360208110156102d557600080fd5b50356001600160a01b0316610b47565b610302600480360360208110156102fb57600080fd5b5035610be7565b6040518080602001858152602001846001600160a01b03166001600160a01b03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561036357818101518382015260200161034b565b50505050905090810190601f1680156103905780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b610164600480360360208110156103b757600080fd5b5035610cdd565b61022b610cef565b6103ce610dc3565b604080516001600160a01b039092168252519081900360200190f35b61022b6004803603602081101561040057600080fd5b5035610dd2565b6101646004803603602081101561041d57600080fd5b5035610e2e565b6101646004803603602081101561043a57600080fd5b5035610e40565b61022b6004803603602081101561045757600080fd5b5035610e52565b6101646004803603604081101561047457600080fd5b50803590602001356001600160a01b0316610f29565b610164600480360360408110156104a057600080fd5b5080359060200135610fa0565b61022b600480360360208110156104c357600080fd5b5035610fb9565b61022b600480360360208110156104e057600080fd5b50356001600160a01b0316611089565b6101646004803603602081101561050657600080fd5b50356111db565b60086020526000908152604090205481565b6005602052816000526040600020818154811061053857fe5b90600052602060002001600091509150505481565b600054600160a01b900460ff161561056457600080fd5b60035460408051600160e11b632fd65c410281526004810189905290516000926001600160a01b031691635facb882916024808301926020929190829003018186803b1580156105b357600080fd5b505afa1580156105c7573d6000803e3d6000fd5b505050506040513d60208110156105dd57600080fd5b5051116105e957600080fd5b6000878152600c60205260409020600201546001600160a01b03161561060e57600080fd5b610616611488565b604051806080016040528086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602081018890526001600160a01b0384166040820152600454606090910190610689904263ffffffff6111ed16565b90526000898152600c6020908152604090912082518051939450849391926106b6928492909101906114af565b506020828101516001838101919091556040808501516002850180546001600160a01b0319166001600160a01b0392831617905560609586015160039095019490945560008c815260078452818120805493840180825590825284822084018f90558e82526008855282822093909355600984528181208d9055600a84528190208890558051938716928401929092528183529082018790529188918b918b917f22812011facd690a74ddd930726d2c051f0b7ef3d0ea35ad9b0f0d89849cb0f2918b918b918a919081908101858580828437600083820152604051601f909101601f1916909201829003965090945050505050a4505050505050505050565b60009081526007602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461088257604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561084757818101518382015260200161082f565b50505050905090810190601f1680156108745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600054600160a01b900460ff1661089957600080fd5b60008054600160a01b60ff02191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b6000548290600160a01b900460ff16156108eb57600080fd5b6000838152600860205260409020541561090457600080fd5b6000838152600b6020908152604091829020805460ff19168515159081179091558251908152915185927f5f9ec800eb8dc135e488f393491e324d4662a45bad8759259d6b70a7f3edabc292908290030190a2505050565b6000805483908390600160a01b900460ff161561097857600080fd5b6000858152600960209081526040808320546008835281842054818552600790935292205460001901808214610a0e5760008381526007602052604081208054839081106109c257fe5b90600052602060002001549050806007600086815260200190815260200160002084815481106109ee57fe5b600091825260208083209091019290925591825260089052604090208290555b6000838152600760205260409020805490610a2d90600019830161152d565b5060008881526008602090815260408083208390558583526005825280832080546001810180835591855283852081018d90558c8552600684528285205560028054600c90945282852001548251600160e01b6387159d9b028152600481018990526001600160a01b039182166024820152925191949316926387159d9b926044808201939182900301818387803b158015610ac857600080fd5b505af1158015610adc573d6000803e3d6000fd5b50505060008a8152600a602052604080822080549083905590519092506001600160a01b038b16918c917f801d564d3920ab7f9d83def865765f310bf8d043086d5ba3e544bd6f2073ad8c9190a39998505050505050505050565b600054600160a01b900460ff1681565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610bc457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600c602052604081206002015460609190819081906001600160a01b0316610c1357600080fd5b6000858152600c60209081526040918290206001808201546002808401546003850154855488516101009682161596909602600019011692909204601f8101879004870285018701909752868452939591946001600160a01b03909416939092918691830182828015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b5050505050935093509350935093509193509193565b60009081526005602052604090205490565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610d6c57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610d8457600080fd5b60008054600160a01b60ff021916600160a01b1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b6000546001600160a01b031681565b6000548190600160a01b900460ff1615610deb57600080fd5b6000828152600c60205260409020600301544210610e0857600080fd5b60008281526008602052604090205415610e2157600080fd5b610e2a8261126a565b5050565b60096020526000908152604090205481565b60066020526000908152604090205481565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b03163314610ecf57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff1615610ee757600080fd5b6000818152600b602052604090205460ff161515600114610f0757600080fd5b6000818152600b60205260409020805460ff19169055610f268161126a565b50565b6000805483908390600160a01b900460ff1615610f4557600080fd5b610f4e856113a2565b6000858152600a6020526040808220805490839055905190916001600160a01b0387169188917f7b63482061dff09283b6f74fe6316412dc2ecd1c506db6fd2e71587441de4a7891a395945050505050565b6007602052816000526040600020818154811061053857fe5b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461103657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600054600160a01b900460ff161561104e57600080fd5b60048190556040805182815290517f669d541b4334ab609b45df5fd2166d3307e17d6a4480a7b898b53d5d2944a4519181900360200190a150565b6000546040805180820190915260068152600160d01b65303138303031026020820152906001600160a01b0316331461110657604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b506040805180820190915260068152600160d11b6518189c1818190260208201526001600160a01b03821661117f57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600a6020526000908152604090205481565b6040805180820190915260068152600160d01b65303038303031026020820152828201908382101561126357604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561084757818101518382015260200161082f565b5092915050565b60008181526009602090815260408083205460068352818420548185526005909352922054600019018082146113005760008381526005602052604081208054839081106112b457fe5b90600052602060002001549050806005600086815260200190815260200160002084815481106112e057fe5b600091825260208083209091019290925591825260069052604090208290555b600083815260056020526040902080549061131f90600019830161152d565b50600084815260066020908152604080832083905560098252808320839055600c9091528120906113508282611556565b506000600182018190556002820180546001600160a01b0319169055600390910181905560405185917f76cbc15b6b19cc4b9fe30092856bf54574239555e9f1b1b96647b2dccd23b4d891a250505050565b60008181526009602090815260408083205460088352818420548185526007909352922054600019018082146114385760008381526007602052604081208054839081106113ec57fe5b906000526020600020015490508060076000868152602001908152602001600020848154811061141857fe5b600091825260208083209091019290925591825260089052604090208290555b600083815260076020526040902080549061145790600019830161152d565b50600084815260086020908152604080832083905560098252808320839055600c9091528120906113508282611556565b60408051608081018252606080825260006020830181905292820183905281019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114f057805160ff191683800117855561151d565b8280016001018555821561151d579182015b8281111561151d578251825591602001919060010190611502565b50611529929150611596565b5090565b81548183558181111561155157600083815260209020611551918101908301611596565b505050565b50805460018160011615610100020316600290046000825580601f1061157c5750610f26565b601f016020900490600052602060002090810190610f2691905b6115b091905b80821115611529576000815560010161159c565b9056fea165627a7a723058209478b394e393c7a4e48002bb91d88028548e49a26cde03a8edfaaf534290b6fa0029