ETH Price: $2,061.71 (+5.13%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer122448032021-04-15 13:01:171783 days ago1618491677IN
0x9b4FA5A1...6Fa82c2a7
1 wei0.0042927585
Deposit For109055332020-09-21 11:41:071989 days ago1600688467IN
0x9b4FA5A1...6Fa82c2a7
2 ETH0.0067157263
Deposit For108941402020-09-19 17:52:561991 days ago1600537976IN
0x9b4FA5A1...6Fa82c2a7
0.06 ETH0.01183258230
Deposit For108886212020-09-18 21:36:341992 days ago1600464994IN
0x9b4FA5A1...6Fa82c2a7
0.49 ETH0.00449416176
Deposit For108683552020-09-15 18:43:461995 days ago1600195426IN
0x9b4FA5A1...6Fa82c2a7
1 ETH0.0024768997
Deposit For108342952020-09-10 13:33:242000 days ago1599744804IN
0x9b4FA5A1...6Fa82c2a7
0.125 ETH0.00372811146
Deposit For108285502020-09-09 16:23:322001 days ago1599668612IN
0x9b4FA5A1...6Fa82c2a7
0.29 ETH0.00457076179
Deposit For108157812020-09-07 17:07:412003 days ago1599498461IN
0x9b4FA5A1...6Fa82c2a7
0.854 ETH0.00342169134
Deposit For108156362020-09-07 16:33:222003 days ago1599496402IN
0x9b4FA5A1...6Fa82c2a7
1 ETH0.00668798130
Deposit For108140742020-09-07 10:52:222004 days ago1599475942IN
0x9b4FA5A1...6Fa82c2a7
0.563 ETH0.002042880
Deposit For108137172020-09-07 9:35:352004 days ago1599471335IN
0x9b4FA5A1...6Fa82c2a7
0.25 ETH0.0046815891
Deposit For107908812020-09-03 21:53:382007 days ago1599170018IN
0x9b4FA5A1...6Fa82c2a7
0.5 ETH0.00460651180.4
Deposit For107904332020-09-03 20:20:432007 days ago1599164443IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.01419909276
Deposit For107903412020-09-03 20:02:312007 days ago1599163351IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.00702212275
Deposit For107902572020-09-03 19:45:362007 days ago1599162336IN
0x9b4FA5A1...6Fa82c2a7
0.3 ETH0.00704766276
Deposit For107901362020-09-03 19:15:282007 days ago1599160528IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.00955009374
Deposit For107900892020-09-03 19:04:512007 days ago1599159891IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.01100558431
Deposit For107846512020-09-02 22:55:452008 days ago1599087345IN
0x9b4FA5A1...6Fa82c2a7
0.3 ETH0.00577091226
Deposit For107805822020-09-02 7:56:402009 days ago1599033400IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.01202698471
Deposit For107679072020-08-31 9:37:172011 days ago1598866637IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.00477504187
Deposit For107677742020-08-31 9:08:032011 days ago1598864883IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.0045963180
Deposit For107677252020-08-31 8:57:482011 days ago1598864268IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.00472397185
Deposit For107639102020-08-30 18:51:302011 days ago1598813490IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.00423881166
Deposit For107626042020-08-30 14:07:032011 days ago1598796423IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.005107200
Deposit For107624392020-08-30 13:28:572011 days ago1598794137IN
0x9b4FA5A1...6Fa82c2a7
0.1 ETH0.00439202172
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-122448192021-04-15 13:06:121783 days ago1618491972
0x9b4FA5A1...6Fa82c2a7
8.56794584 ETH
-107919242020-09-04 1:49:242007 days ago1599184164
0x9b4FA5A1...6Fa82c2a7
0.08729805 ETH
-107913432020-09-03 23:44:462007 days ago1599176686
0x9b4FA5A1...6Fa82c2a7
0.12640603 ETH
-107913372020-09-03 23:43:222007 days ago1599176602
0x9b4FA5A1...6Fa82c2a7
0.07086113 ETH
-107910812020-09-03 22:39:502007 days ago1599172790
0x9b4FA5A1...6Fa82c2a7
0.24789482 ETH
-107905892020-09-03 20:51:162007 days ago1599166276
0x9b4FA5A1...6Fa82c2a7
0.03020755 ETH
-107905752020-09-03 20:46:412007 days ago1599166001
0x9b4FA5A1...6Fa82c2a7
0.42142262 ETH
-107881772020-09-03 11:56:422007 days ago1599134202
0x9b4FA5A1...6Fa82c2a7
0.11563821 ETH
-107873342020-09-03 8:49:122008 days ago1599122952
0x9b4FA5A1...6Fa82c2a7
0.7210691 ETH
-107593392020-08-30 1:55:272012 days ago1598752527
0x9b4FA5A1...6Fa82c2a7
0.10267178 ETH
-107585862020-08-29 23:10:082012 days ago1598742608
0x9b4FA5A1...6Fa82c2a7
0.83002733 ETH
-107497772020-08-28 14:38:522013 days ago1598625532
0x9b4FA5A1...6Fa82c2a7
0.03139251 ETH
-107489322020-08-28 11:45:382013 days ago1598615138
0x9b4FA5A1...6Fa82c2a7
0.01510591 ETH
-107488492020-08-28 11:24:242014 days ago1598613864
0x9b4FA5A1...6Fa82c2a7
0.52358424 ETH
-105376132020-07-26 21:55:582046 days ago1595800558
0x9b4FA5A1...6Fa82c2a7
0.01559505 ETH
-105316292020-07-25 23:44:522047 days ago1595720692
0x9b4FA5A1...6Fa82c2a7
0.01791288 ETH
-105161412020-07-23 14:09:092049 days ago1595513349
0x9b4FA5A1...6Fa82c2a7
0.00918015 ETH
-105160382020-07-23 13:49:082049 days ago1595512148
0x9b4FA5A1...6Fa82c2a7
0.00917852 ETH
-105160252020-07-23 13:46:132049 days ago1595511973
0x9b4FA5A1...6Fa82c2a7
0.00906245 ETH
-105159812020-07-23 13:36:052049 days ago1595511365
0x9b4FA5A1...6Fa82c2a7
0.01310616 ETH
-105118182020-07-22 22:12:452050 days ago1595455965
0x9b4FA5A1...6Fa82c2a7
0.0043121 ETH
-105117132020-07-22 21:48:482050 days ago1595454528
0x9b4FA5A1...6Fa82c2a7
0.0091773 ETH
-104477102020-07-12 23:31:212060 days ago1594596681
0x9b4FA5A1...6Fa82c2a7
0.01866141 ETH
-104470042020-07-12 20:55:052060 days ago1594587305
0x9b4FA5A1...6Fa82c2a7
0.04660541 ETH
-104445842020-07-12 11:57:072060 days ago1594555027
0x9b4FA5A1...6Fa82c2a7
0.00344544 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
Relay

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-06-08
*/

pragma solidity 0.6.2;
pragma experimental ABIEncoderV2;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }

    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal virtual {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// This contract is taken from openzepplin-sdk
// https://github.com/OpenZeppelin/openzeppelin-sdk/blob/master/packages/lib/contracts/Initializable.sol

/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// @author Patrick McCorry
// @title DataShard
// @notice Stores data for a given epoch / interval.
// @dev Storage contract.
//      Associates msg.sender with a list of bytes32 (hash) -> uint (timestamp).
contract DataShard is Initializable, Ownable {
   uint public creationBlock;

   // Smart Contract Address => ID-based data storage
   mapping (bytes32 => uint) records;

   // @param _blockNo Provided by the DataRegistry
   function initialize(address _newOwner) initializer onlyOwner public {
       creationBlock = block.number;
       _transferOwnership(_newOwner);
   }

   // @dev Destory contract (and all its entries)
   function kill() public onlyOwner {
       selfdestruct(payable(owner()));
   }

   // @returns Creation time (blocknumber) for this dataShard
   function getCreationBlock() public view returns (uint) {
       return creationBlock;
   }

   // @param _sc Smart contract address
   // @param _id Unique identifier for record
   // @returns A record (timestamp) or "0" if no record was found.
   function fetchRecord(bytes32 _id) public view returns (uint) {
       return records[_id];
   }

   // @param _sc Smart contract address
   // @param _id Unique identifier for record
   // @param _timestamp A timestamp
   // @dev Only stores a record if it is NOT set. e.g. does not replace/update.
   function setRecord(bytes32 _id, uint _timestamp) external onlyOwner {
      // No need to re-set it if it already exists. We only want the lowest timestamp.
      // e.g. if job is sent twice, we keep the earliest timestamp.
      if(records[_id] == 0) {
         records[_id] = _timestamp;
      }
   }
}
// @author Patrick McCorry
// @title DataShard
// @notice Manages the creation and destruction of data shards. Helps us be Ethereum Enviromentally Friendly.
// @dev In practice, we only need 2 dataShards for it to work well.
contract DataRegistry is Initializable {

   // Shard ID => Address for DataShard
   mapping (uint => address) public dataShards;
   uint public interval; // Approximately 6000 blocks a day
   uint constant TOTAL_SHARDS = 2; // Total number of data shards in rotation

   // @returns Number of blocks for an interval.
   function getInterval() public view returns (uint) {
      return interval;
   }

   // @returns Number of shards in rotation.
   function getTotalShards() public pure returns (uint) {
      return TOTAL_SHARDS;
   }

   // @dev Values for interval and total_shards is hard-coded in the contract. Can be passed as constructor, but not big deal.
   function initialize(uint _interval) initializer internal {
      interval = _interval;

      // We must initialize ALL shards to ensure we have a .kill() function when
      // calling resetDataShard(). Otherwise it will always fail due to a revert.
      for(uint i=0; i<TOTAL_SHARDS; i++) {
         DataShard ds = new DataShard();
         ds.initialize(address(this));
         dataShards[i] = address(ds);
      }
   }

   // @returns Instance of the DataShard
   // @dev Call this function periodically to delete/create data shards.
   function resetDataShard() public returns (DataShard) {
      // We need to do full loop before deleting an old shard!
      if(block.number - DataShard(dataShards[0]).getCreationBlock() >= interval) {
          address toDelete = dataShards[1];
          dataShards[1] = dataShards[0];
          DataShard ds = new DataShard();
          ds.initialize(address(this));
          dataShards[0] = address(ds);
          DataShard(toDelete).kill();
      }
   }

   // @dev Returns the latest / most recently created data shard.
   function getLatestDataShard() public view returns (address) {
      return dataShards[0];
   }

   // @param _dataShard Index of data shard
   // @param _sc Smart contract that recorded the log
   // @param _id Unique identifier for the record
   // @returns Record data (timestamp)
   function fetchRecord(uint _dataShard, bytes32 _id) public view returns (uint) {
       // Confirm the data shard exists so we can fetch data
      if(dataShards[_dataShard] != address(0)) {
          DataShard rc = DataShard(dataShards[_dataShard]);
          return rc.fetchRecord(_id);
      }
   }
   // @param _id Unique identifier for the record
   // @param _timestamp A timestamp
   // @dev We have integrated with the relay contract; so only relay can call it.
   function setRecord(bytes32 _id, uint _timestamp) internal  {
      // Fetch Index
      address dataShardAddr = getLatestDataShard();
      // Fetch the DataShard for this day. (It may reset it under the hood)
      DataShard rc = DataShard(dataShardAddr);
      // Update record!
      rc.setRecord(_id, _timestamp);
   }
}

// @author Patrick McCorry & Chris Buckland (anydot)
// @title Relay
// @notice Relay tx data structure
contract RelayTxStruct {

    // @dev The relay transaction
    struct RelayTx {
        address to; // Address for external contract
        address payable from; // Address for the user who hired the relayer
        bytes data; // Call data that we need to send. Includes function call name, etc.
        uint deadline; // Expiry block number for appointment
        uint compensation; // How much should the operator compensation the user by?
        uint gasLimit; // How much gas is allocated to this function call?
        uint chainId; // ChainID
        address relay; // The relay contract!
    }

    // @return Relay tx hash (bytes32)
    // @dev Pack the encoding when computing the ID.
    function computeRelayTxId(RelayTx memory self) public pure returns (bytes32) {
      return keccak256(abi.encode(self.to, self.from, self.data, self.deadline, self.compensation, self.gasLimit, self.chainId, self.relay));
    }
}

// @author anydot (Patrick & Chris)
// @title Payment Deposit: Accept payments from customers
contract PaymentDeposit is Initializable, Ownable {

    mapping(address => uint) public depositors;
    uint public uniqueDepositors; 

    // We index the sender so that it's easy to look up all deposits
    // from a given sender.
    event Deposit(address indexed sender, uint amount, uint indexed index);

    // We index the sender so that it's easy to look up all withdraws
    // from a given sender.
    event Withdraw(address indexed sender, uint amount);
    
    // Two-step deployment process. 
    function initialize(address _newOwner) internal initializer onlyOwner {
        _transferOwnership(_newOwner);
    }

    /**
     * Supply a deposit for a specified recipient.
     * Caution: The recipient must be an externally owned account as all jobs sent to 
     * any.sender must be signed and associated with a positive balance in this contract. 
     */
    function depositFor(address recipient) public payable { 
        require(msg.value > 0, "No value provided to depositFor.");
        uint index = getDepositorIndex(recipient);
        emit Deposit(recipient, msg.value, index);
    }

    /** 
     * Sets the depositors index if necessary.
     */
    function getDepositorIndex(address _depositor) internal returns(uint) {
        if(depositors[_depositor] == 0) {
            uniqueDepositors = uniqueDepositors + 1;
            depositors[_depositor] = uniqueDepositors;
        }

        return depositors[_depositor];
    }

    /*
     * It is only intended for external users who want to deposit via a wallet.
     */ 
    receive() external payable {
        require(msg.value > 0, "No value provided to fallback.");
        require(tx.origin == msg.sender, "Only EOA can deposit directly.");
        uint index = getDepositorIndex(msg.sender);
        emit Deposit(msg.sender, msg.value, index);
    }

    /**
     * Move funds out of the contract
     */
    function withdraw(address payable recipient, uint amount) onlyOwner public {
        recipient.transfer(amount);
        emit Withdraw(recipient, amount);
    }

    /**
     * Move funds out of the contract
     * Depositor is the OWNER of the funds being withdrawn. 
     * Recipient is the RECEIVER of the funds. 
     */
    function withdrawFor(address payable depositor, address payable recipient, uint amount) onlyOwner public {
        require(depositors[depositor]>0, "Depositor has never deposited funds.");
        recipient.transfer(amount);
        emit Withdraw(depositor, amount);
    }

    /**
     * Use admin privileges to migrate a user's deposits to another deposit contract
     */
    function migrate(address payable recipient, uint amount, PaymentDeposit otherDeposit) onlyOwner public {
        require(address(this).balance >= amount, "Not enough balance to migrate.");
        otherDeposit.depositFor.value(amount)(recipient);
        emit Withdraw(recipient, amount);
    }
}

// @author PISA Research (Patrick & Chris)
// @title Relay: Executing relay transactions
// @notice This contract only handles executing relay transactions.
//         It does not have logic to handle the security deposit or proving fraud.
// @dev The operator must supply gast refund this contract as it ms relayers the cost of submitting jobs.
contract Relay is DataRegistry, RelayTxStruct, PaymentDeposit {
    mapping(address => bool) public relayers;

    event RelayExecuted(bytes32 indexed relayTxId, bool success, address indexed from, address indexed to, uint gasUsed, uint gasPrice);
    event RelayerInstalled(address relayer);
    event RelayerUninstalled(address relayer);
    event OutOfCoins();

    // @param _newOwner Owner can install relayers
    // @dev Behind the scenes, the DataRegistry is creating two shards via an internal constructor.
    function initialize(address _newOwner, uint _shardInterval) public initializer onlyOwner {
        PaymentDeposit.initialize(_newOwner);
        DataRegistry.initialize(_shardInterval);
    }

    // @param _relayTx A relay tx containing the job to execute
    // @param _gasRefund Whether the relayer requires a gas refund
    // @dev Only authorised relayer can execute relay jobs and they are refunded gas at the end of the call.
    //      Critically, if the relay job fails, we can simply catch exception and continue to record the log.
    function execute(RelayTx memory _relayTx, bool _gasRefund) public {
        uint gasStarted = gasleft();

        // The msg.sender check protects against two problems:
        // - Replay attacks across chains (chainid in transaction)
        // - Re-entrancy attacks back into .execute() (signer required)
        require(relayers[msg.sender], "Relayer must call this function.");
        require(_relayTx.relay == address(this), "Relay tx MUST be for this relay contract.");

        bytes32 relayTxId = computeRelayTxId(_relayTx);

        // Only record log if a compensation is required
        if(_relayTx.compensation != 0) {
            // Record a log of executing the job, Each shard only records the first job since the first job has the
            // earliest timestamp.
            setRecord(relayTxId, block.number);
        }

        // We do not require the customer to sign the relay tx.
        // Why? If relayer submits wrong relay tx, it wont have the correct RelayTxId.
        // So the RelayTxId won't be recorded and the customer can easily prove
        // the correct relay tx was never submitted for execution.

        // In the worst case, the contract will only send 63/64 of the transaction's
        // remaining gas due to https://eips.ethereum.org/EIPS/eip-150
        // But this is problematic as outlined in https://eips.ethereum.org/EIPS/eip-1930
        // so to fix... we need to make sure we supply 64/63 * gasLimit.
        // Assumption: Underlying contract called did not have a minimum gas required check
        // We add 1000 to cover the cost of calculating new gas limit - this should be a lot more than
        // is required - measuring shows cost of 58
        require(gasleft() > (_relayTx.gasLimit + _relayTx.gasLimit / 63) + 1000, "Not enough gas supplied.");

        // execute the actual call
        (bool success,) = _relayTx.to.call.gas(_relayTx.gasLimit)(_relayTx.data);

        // we add some gas using hard coded opcode pricing for computation that we could measure
        uint gasUsed = gasStarted - gasleft() + // execute cost
                            (msg.data.length * 16) + // data input cost (add 1 for gasRefund bool)
                            2355 + // cost of RelayExecuted event - 375 + 375 + 375 + (160 * 8)
                            21000; // transaction cost

        if(_gasRefund) {
            gasUsed += (9000 + 1000); // refund cost, send + change for calculations
            if(!msg.sender.send(gasUsed*tx.gasprice)) {
                // Notify admin we need to provide more refund to this contract
                emit OutOfCoins();
            }
        }

        emit RelayExecuted(relayTxId, success, _relayTx.from, _relayTx.to, gasUsed, tx.gasprice);
    }

    // @param _relayer New relayer address
    // @dev Only the owner can install a new relayer
    function installRelayer(address _relayer) onlyOwner public {
        require(!relayers[_relayer], "Relayer is already installed.");
        require(_relayer != address(this), "The relay contract cannot be installed as a relayer.");

        relayers[_relayer] = true;
        emit RelayerInstalled(_relayer);
    }

    // @param _relayer New relayer address
    // @dev Only the owner can uninstall a new relayer
    function uninstallRelayer(address _relayer) onlyOwner public {
        require(relayers[_relayer], "Relayer must be installed.");

        relayers[_relayer] = false;
        emit RelayerUninstalled(_relayer);
    }
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[],"name":"OutOfCoins","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"relayTxId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasPrice","type":"uint256"}],"name":"RelayExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"relayer","type":"address"}],"name":"RelayerInstalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"relayer","type":"address"}],"name":"RelayerUninstalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address payable","name":"from","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"compensation","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"relay","type":"address"}],"internalType":"struct RelayTxStruct.RelayTx","name":"self","type":"tuple"}],"name":"computeRelayTxId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dataShards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"depositFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address payable","name":"from","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"compensation","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"relay","type":"address"}],"internalType":"struct RelayTxStruct.RelayTx","name":"_relayTx","type":"tuple"},{"internalType":"bool","name":"_gasRefund","type":"bool"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dataShard","type":"uint256"},{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"fetchRecord","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestDataShard","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalShards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"uint256","name":"_shardInterval","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"installRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"contract PaymentDeposit","name":"otherDeposit","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"relayers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetDataShard","outputs":[{"internalType":"contract DataShard","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"uninstallRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniqueDepositors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"depositor","type":"address"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006100176001600160e01b0361006a16565b603580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b61215a8061007d6000396000f3fe6080604052600436106101445760003560e01c806391ad27b4116100b6578063e345f8d11161006f578063e345f8d1146103d5578063e539a027146103f5578063e775716214610415578063eed75f6d1461042a578063f2fde38b1461044a578063f3fef3a31461046a576101e3565b806391ad27b414610343578063947a36fb146103585780639f1d92671461036d578063a63d6e441461038d578063aa67c919146103a2578063cd6dc687146103b5576101e3565b80635300f841116101085780635300f841146102a2578063715018a6146102cf5780637fd99437146102e457806386f31f2e146102f95780638da5cb5b146103195780638f32d59b1461032e576101e3565b80630c74dc6c146101e857806327a82be51461021e5780632e2d00eb1461024057806334ee6476146102625780633b9ca2d014610282576101e3565b366101e357600034116101725760405162461bcd60e51b815260040161016990611892565b60405180910390fd5b3233146101915760405162461bcd60e51b815260040161016990611755565b600061019c3361048a565b905080336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15346040516101d89190611709565b60405180910390a350005b600080fd5b3480156101f457600080fd5b50610208610203366004611560565b6104e8565b6040516102159190611709565b60405180910390f35b34801561022a57600080fd5b5061023361053f565b604051610215919061165c565b34801561024c57600080fd5b5061026061025b36600461159b565b61074f565b005b34801561026e57600080fd5b5061023361027d3660046115ef565b610947565b34801561028e57600080fd5b5061026061029d36600461151f565b610962565b3480156102ae57600080fd5b506102c26102bd366004611491565b610a4c565b60405161021591906116e6565b3480156102db57600080fd5b50610260610a61565b3480156102f057600080fd5b50610233610acf565b34801561030557600080fd5b50610260610314366004611491565b610af4565b34801561032557600080fd5b50610233610bab565b34801561033a57600080fd5b506102c2610bba565b34801561034f57600080fd5b50610208610be0565b34801561036457600080fd5b50610208610be6565b34801561037957600080fd5b506102606103883660046114b4565b610bec565b34801561039957600080fd5b50610208610cb5565b6102606103b0366004611491565b610cba565b3480156103c157600080fd5b506102606103d03660046114f4565b610d2d565b3480156103e157600080fd5b506102086103f036600461161f565b610de8565b34801561040157600080fd5b50610260610410366004611491565b610e9e565b34801561042157600080fd5b50610208610f77565b34801561043657600080fd5b50610208610445366004611491565b610f7d565b34801561045657600080fd5b50610260610465366004611491565b610f8f565b34801561047657600080fd5b506102606104853660046114f4565b610fbf565b6001600160a01b0381166000908152603660205260408120546104cc5760378054600101908190556001600160a01b0383166000908152603660205260409020555b506001600160a01b031660009081526036602052604090205490565b80516020808301516040808501516060860151608087015160a088015160c089015160e08a01519551600099610522999098979101611670565b604051602081830303815290604052805190602001209050919050565b60345460008080526033602090815260008051602061210583398151915254604080516320ffd56d60e01b815290519394936001600160a01b03909216926320ffd56d92600480840193829003018186803b15801561059d57600080fd5b505afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105d59190810190611607565b43031061074c5760336020527f10f6f77027d502f219862b0303542eb5dd005b06fa23ff4d1775aaa45bbf9477805460008051602061210583398151915254600160009081526001600160a01b031983166001600160a01b03928316179093556040519116919061064590611367565b604051809103906000f080158015610661573d6000803e3d6000fd5b5060405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de89061069190309060040161165c565b600060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b50506000808052603360205260008051602061210583398151915280546001600160a01b0319166001600160a01b0386811691909117909155604080516341c0e1b560e01b8152905191871694506341c0e1b59350600480820193929182900301818387803b15801561073157600080fd5b505af1158015610745573d6000803e3d6000fd5b5050505050505b90565b60005a3360009081526038602052604090205490915060ff166107845760405162461bcd60e51b815260040161016990611809565b60e08301516001600160a01b031630146107b05760405162461bcd60e51b8152600401610169906119ba565b60006107bb846104e8565b905083608001516000146107d3576107d3814361105f565b603f8460a00151816107e157fe5b048460a00151016103e8015a1161080a5760405162461bcd60e51b8152600401610169906117d2565b600084600001516001600160a01b03168560a0015186604001516040516108319190611640565b60006040518083038160008787f1925050503d806000811461086f576040519150601f19603f3d011682016040523d82523d6000602084013e610874565b606091505b5090915060009050601036025a8503016109330161520801905084156108e757604051612710919091019033903a830280156108fc02916000818181858888f193505050506108e7576040517fbf3f3724ef99c8fe84317065fe5f9cc66d0c3dd306d1e3a876b3ec97951a3f4790600090a15b85600001516001600160a01b031686602001516001600160a01b0316847f9da746664b5b3b1008960a15062f8f7ce0b9b8e584cf045b1d615997ece65f0d85853a604051610937939291906116f1565b60405180910390a4505050505050565b6033602052600090815260409020546001600160a01b031681565b61096a610bba565b6109865760405162461bcd60e51b815260040161016990611900565b814710156109a65760405162461bcd60e51b815260040161016990611a47565b60405163aa67c91960e01b81526001600160a01b0382169063aa67c9199084906109d490879060040161165c565b6000604051808303818588803b1580156109ed57600080fd5b505af1158015610a01573d6000803e3d6000fd5b5050505050826001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a3f9190611709565b60405180910390a2505050565b60386020526000908152604090205460ff1681565b610a69610bba565b610a855760405162461bcd60e51b815260040161016990611900565b6035546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603580546001600160a01b0319169055565b600080526033602052600080516020612105833981519152546001600160a01b031690565b610afc610bba565b610b185760405162461bcd60e51b815260040161016990611900565b6001600160a01b03811660009081526038602052604090205460ff16610b505760405162461bcd60e51b8152600401610169906118c9565b6001600160a01b03811660009081526038602052604090819020805460ff19169055517fbf71a2e72339c706ee003aec232ad0e38d32bda19a6d513193425047a33c7dde90610ba090839061165c565b60405180910390a150565b6035546001600160a01b031690565b6035546000906001600160a01b0316610bd16110d4565b6001600160a01b031614905090565b60345490565b60345481565b610bf4610bba565b610c105760405162461bcd60e51b815260040161016990611900565b6001600160a01b038316600090815260366020526040902054610c455760405162461bcd60e51b815260040161016990611a03565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610c7b573d6000803e3d6000fd5b50826001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436482604051610a3f9190611709565b600290565b60003411610cda5760405162461bcd60e51b815260040161016990611720565b6000610ce58261048a565b905080826001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1534604051610d219190611709565b60405180910390a35050565b600054610100900460ff1680610d465750610d466110d8565b80610d54575060005460ff16155b610d705760405162461bcd60e51b81526004016101699061196c565b600054610100900460ff16158015610d9b576000805460ff1961ff0019909116610100171660011790555b610da3610bba565b610dbf5760405162461bcd60e51b815260040161016990611900565b610dc8836110de565b610dd18261118f565b8015610de3576000805461ff00191690555b505050565b6000828152603360205260408120546001600160a01b031615610e9857600083815260336020526040908190205490516313bf242360e31b81526001600160a01b03909116908190639df9211890610e44908690600401611709565b60206040518083038186803b158015610e5c57600080fd5b505afa158015610e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e949190810190611607565b9150505b92915050565b610ea6610bba565b610ec25760405162461bcd60e51b815260040161016990611900565b6001600160a01b03811660009081526038602052604090205460ff1615610efb5760405162461bcd60e51b815260040161016990611935565b6001600160a01b038116301415610f245760405162461bcd60e51b81526004016101699061183e565b6001600160a01b03811660009081526038602052604090819020805460ff19166001179055517f4b25d4880707e035ab47f6b15a868abe2d90dd17251c8a5c81673eea42e2be5790610ba090839061165c565b60375481565b60366020526000908152604090205481565b610f97610bba565b610fb35760405162461bcd60e51b815260040161016990611900565b610fbc816112e5565b50565b610fc7610bba565b610fe35760405162461bcd60e51b815260040161016990611900565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611019573d6000803e3d6000fd5b50816001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516110539190611709565b60405180910390a25050565b6000611069610acf565b6040516308fc698560e11b815290915081906001600160a01b038216906311f8d30a9061109c9087908790600401611712565b600060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b5050505050505050565b3390565b303b1590565b600054610100900460ff16806110f757506110f76110d8565b80611105575060005460ff16155b6111215760405162461bcd60e51b81526004016101699061196c565b600054610100900460ff1615801561114c576000805460ff1961ff0019909116610100171660011790555b611154610bba565b6111705760405162461bcd60e51b815260040161016990611900565b611179826112e5565b801561118b576000805461ff00191690555b5050565b600054610100900460ff16806111a857506111a86110d8565b806111b6575060005460ff16155b6111d25760405162461bcd60e51b81526004016101699061196c565b600054610100900460ff161580156111fd576000805460ff1961ff0019909116610100171660011790555b603482905560005b60028110156112cf57600060405161121c90611367565b604051809103906000f080158015611238573d6000803e3d6000fd5b5060405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de89061126890309060040161165c565b600060405180830381600087803b15801561128257600080fd5b505af1158015611296573d6000803e3d6000fd5b505050600083815260336020526040902080546001600160a01b0319166001600160a01b03939093169290921790915550600101611205565b50801561118b576000805461ff00191690555050565b6001600160a01b03811661130b5760405162461bcd60e51b81526004016101699061178c565b6035546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603580546001600160a01b0319166001600160a01b0392909216919091179055565b61061a80611aeb83390190565b8035610e9881611ad5565b600082601f83011261138f578081fd5b813567ffffffffffffffff8111156113a5578182fd5b6113b8601f8201601f1916602001611a7e565b91508082528360208285010111156113cf57600080fd5b8060208401602084013760009082016020015292915050565b60006101008083850312156113fb578182fd5b61140481611a7e565b9150506114118383611374565b81526114208360208401611374565b6020820152604082013567ffffffffffffffff81111561143f57600080fd5b61144b8482850161137f565b604083015250606082013560608201526080820135608082015260a082013560a082015260c082013560c08201526114868360e08401611374565b60e082015292915050565b6000602082840312156114a2578081fd5b81356114ad81611ad5565b9392505050565b6000806000606084860312156114c8578182fd5b83356114d381611ad5565b925060208401356114e381611ad5565b929592945050506040919091013590565b60008060408385031215611506578182fd5b823561151181611ad5565b946020939093013593505050565b600080600060608486031215611533578283fd5b833561153e81611ad5565b925060208401359150604084013561155581611ad5565b809150509250925092565b600060208284031215611571578081fd5b813567ffffffffffffffff811115611587578182fd5b611593848285016113e8565b949350505050565b600080604083850312156115ad578182fd5b823567ffffffffffffffff8111156115c3578283fd5b6115cf858286016113e8565b925050602083013580151581146115e4578182fd5b809150509250929050565b600060208284031215611600578081fd5b5035919050565b600060208284031215611618578081fd5b5051919050565b60008060408385031215611631578182fd5b50508035926020909101359150565b60008251611652818460208701611aa5565b9190910192915050565b6001600160a01b0391909116815260200190565b600061010060018060a01b03808c168452808b1660208501528160408501528951808386015261012092506116ab8184870160208e01611aa5565b6060850199909952608084019790975260a08301959095525060c081019290925290921660e0830152601f909201601f191601019392505050565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b918252602082015260400190565b6020808252818101527f4e6f2076616c75652070726f766964656420746f206465706f736974466f722e604082015260600190565b6020808252601e908201527f4f6e6c7920454f412063616e206465706f736974206469726563746c792e0000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526018908201527f4e6f7420656e6f7567682067617320737570706c6965642e0000000000000000604082015260600190565b6020808252818101527f52656c61796572206d7573742063616c6c20746869732066756e6374696f6e2e604082015260600190565b60208082526034908201527f5468652072656c617920636f6e74726163742063616e6e6f7420626520696e736040820152733a30b63632b21030b99030903932b630bcb2b91760611b606082015260800190565b6020808252601e908201527f4e6f2076616c75652070726f766964656420746f2066616c6c6261636b2e0000604082015260600190565b6020808252601a908201527f52656c61796572206d75737420626520696e7374616c6c65642e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f52656c6179657220697320616c726561647920696e7374616c6c65642e000000604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526029908201527f52656c6179207478204d55535420626520666f7220746869732072656c61792060408201526831b7b73a3930b1ba1760b91b606082015260800190565b60208082526024908201527f4465706f7369746f7220686173206e65766572206465706f73697465642066756040820152633732399760e11b606082015260800190565b6020808252601e908201527f4e6f7420656e6f7567682062616c616e636520746f206d6967726174652e0000604082015260600190565b60405181810167ffffffffffffffff81118282101715611a9d57600080fd5b604052919050565b60005b83811015611ac0578181015183820152602001611aa8565b83811115611acf576000848401525b50505050565b6001600160a01b0381168114610fbc57600080fdfe608060405260006100176001600160e01b0361006a16565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b61059d8061007d6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b146100ee5780638f32d59b146101035780639df9211814610118578063c4d66de81461012b578063f2fde38b1461013e5761009e565b806311f8d30a146100a357806317634514146100b857806320ffd56d146100d657806341c0e1b5146100de578063715018a6146100e6575b600080fd5b6100b66100b1366004610455565b610151565b005b6100c06101a7565b6040516100cd919061055e565b60405180910390f35b6100c06101ad565b6100b66101b3565b6100b66101ea565b6100f6610258565b6040516100cd9190610476565b61010b610267565b6040516100cd919061048a565b6100c061012636600461043d565b61028d565b6100b661013936600461040f565b61029f565b6100b661014c36600461040f565b610353565b610159610267565b61017e5760405162461bcd60e51b8152600401610175906104db565b60405180910390fd5b6000828152603560205260409020546101a35760008281526035602052604090208190555b5050565b60345481565b60345490565b6101bb610267565b6101d75760405162461bcd60e51b8152600401610175906104db565b6101df610258565b6001600160a01b0316ff5b6101f2610267565b61020e5760405162461bcd60e51b8152600401610175906104db565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b6033546000906001600160a01b031661027e610383565b6001600160a01b031614905090565b60009081526035602052604090205490565b600054610100900460ff16806102b857506102b8610387565b806102c6575060005460ff16155b6102e25760405162461bcd60e51b815260040161017590610510565b600054610100900460ff1615801561030d576000805460ff1961ff0019909116610100171660011790555b610315610267565b6103315760405162461bcd60e51b8152600401610175906104db565b4360345561033e8261038d565b80156101a3576000805461ff00191690555050565b61035b610267565b6103775760405162461bcd60e51b8152600401610175906104db565b6103808161038d565b50565b3390565b303b1590565b6001600160a01b0381166103b35760405162461bcd60e51b815260040161017590610495565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600060208284031215610420578081fd5b81356001600160a01b0381168114610436578182fd5b9392505050565b60006020828403121561044e578081fd5b5035919050565b60008060408385031215610467578081fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b901515815260200190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b9081526020019056fea2646970667358221220c3a1944e96b5b39558436742e100bedc806ba385b6484ef80b9beac3786d2d6a64736f6c6343000602003344496df070da3f045064f6d6f394484a8de10d5710290d619b67d975ec89320fa26469706673582212208f3869b928adfa627e3d3d43ad5f9d15bba906945fc21b2651dc7cd4e68a3be464736f6c63430006020033

Deployed Bytecode

0x6080604052600436106101445760003560e01c806391ad27b4116100b6578063e345f8d11161006f578063e345f8d1146103d5578063e539a027146103f5578063e775716214610415578063eed75f6d1461042a578063f2fde38b1461044a578063f3fef3a31461046a576101e3565b806391ad27b414610343578063947a36fb146103585780639f1d92671461036d578063a63d6e441461038d578063aa67c919146103a2578063cd6dc687146103b5576101e3565b80635300f841116101085780635300f841146102a2578063715018a6146102cf5780637fd99437146102e457806386f31f2e146102f95780638da5cb5b146103195780638f32d59b1461032e576101e3565b80630c74dc6c146101e857806327a82be51461021e5780632e2d00eb1461024057806334ee6476146102625780633b9ca2d014610282576101e3565b366101e357600034116101725760405162461bcd60e51b815260040161016990611892565b60405180910390fd5b3233146101915760405162461bcd60e51b815260040161016990611755565b600061019c3361048a565b905080336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15346040516101d89190611709565b60405180910390a350005b600080fd5b3480156101f457600080fd5b50610208610203366004611560565b6104e8565b6040516102159190611709565b60405180910390f35b34801561022a57600080fd5b5061023361053f565b604051610215919061165c565b34801561024c57600080fd5b5061026061025b36600461159b565b61074f565b005b34801561026e57600080fd5b5061023361027d3660046115ef565b610947565b34801561028e57600080fd5b5061026061029d36600461151f565b610962565b3480156102ae57600080fd5b506102c26102bd366004611491565b610a4c565b60405161021591906116e6565b3480156102db57600080fd5b50610260610a61565b3480156102f057600080fd5b50610233610acf565b34801561030557600080fd5b50610260610314366004611491565b610af4565b34801561032557600080fd5b50610233610bab565b34801561033a57600080fd5b506102c2610bba565b34801561034f57600080fd5b50610208610be0565b34801561036457600080fd5b50610208610be6565b34801561037957600080fd5b506102606103883660046114b4565b610bec565b34801561039957600080fd5b50610208610cb5565b6102606103b0366004611491565b610cba565b3480156103c157600080fd5b506102606103d03660046114f4565b610d2d565b3480156103e157600080fd5b506102086103f036600461161f565b610de8565b34801561040157600080fd5b50610260610410366004611491565b610e9e565b34801561042157600080fd5b50610208610f77565b34801561043657600080fd5b50610208610445366004611491565b610f7d565b34801561045657600080fd5b50610260610465366004611491565b610f8f565b34801561047657600080fd5b506102606104853660046114f4565b610fbf565b6001600160a01b0381166000908152603660205260408120546104cc5760378054600101908190556001600160a01b0383166000908152603660205260409020555b506001600160a01b031660009081526036602052604090205490565b80516020808301516040808501516060860151608087015160a088015160c089015160e08a01519551600099610522999098979101611670565b604051602081830303815290604052805190602001209050919050565b60345460008080526033602090815260008051602061210583398151915254604080516320ffd56d60e01b815290519394936001600160a01b03909216926320ffd56d92600480840193829003018186803b15801561059d57600080fd5b505afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105d59190810190611607565b43031061074c5760336020527f10f6f77027d502f219862b0303542eb5dd005b06fa23ff4d1775aaa45bbf9477805460008051602061210583398151915254600160009081526001600160a01b031983166001600160a01b03928316179093556040519116919061064590611367565b604051809103906000f080158015610661573d6000803e3d6000fd5b5060405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de89061069190309060040161165c565b600060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b50506000808052603360205260008051602061210583398151915280546001600160a01b0319166001600160a01b0386811691909117909155604080516341c0e1b560e01b8152905191871694506341c0e1b59350600480820193929182900301818387803b15801561073157600080fd5b505af1158015610745573d6000803e3d6000fd5b5050505050505b90565b60005a3360009081526038602052604090205490915060ff166107845760405162461bcd60e51b815260040161016990611809565b60e08301516001600160a01b031630146107b05760405162461bcd60e51b8152600401610169906119ba565b60006107bb846104e8565b905083608001516000146107d3576107d3814361105f565b603f8460a00151816107e157fe5b048460a00151016103e8015a1161080a5760405162461bcd60e51b8152600401610169906117d2565b600084600001516001600160a01b03168560a0015186604001516040516108319190611640565b60006040518083038160008787f1925050503d806000811461086f576040519150601f19603f3d011682016040523d82523d6000602084013e610874565b606091505b5090915060009050601036025a8503016109330161520801905084156108e757604051612710919091019033903a830280156108fc02916000818181858888f193505050506108e7576040517fbf3f3724ef99c8fe84317065fe5f9cc66d0c3dd306d1e3a876b3ec97951a3f4790600090a15b85600001516001600160a01b031686602001516001600160a01b0316847f9da746664b5b3b1008960a15062f8f7ce0b9b8e584cf045b1d615997ece65f0d85853a604051610937939291906116f1565b60405180910390a4505050505050565b6033602052600090815260409020546001600160a01b031681565b61096a610bba565b6109865760405162461bcd60e51b815260040161016990611900565b814710156109a65760405162461bcd60e51b815260040161016990611a47565b60405163aa67c91960e01b81526001600160a01b0382169063aa67c9199084906109d490879060040161165c565b6000604051808303818588803b1580156109ed57600080fd5b505af1158015610a01573d6000803e3d6000fd5b5050505050826001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a3f9190611709565b60405180910390a2505050565b60386020526000908152604090205460ff1681565b610a69610bba565b610a855760405162461bcd60e51b815260040161016990611900565b6035546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603580546001600160a01b0319169055565b600080526033602052600080516020612105833981519152546001600160a01b031690565b610afc610bba565b610b185760405162461bcd60e51b815260040161016990611900565b6001600160a01b03811660009081526038602052604090205460ff16610b505760405162461bcd60e51b8152600401610169906118c9565b6001600160a01b03811660009081526038602052604090819020805460ff19169055517fbf71a2e72339c706ee003aec232ad0e38d32bda19a6d513193425047a33c7dde90610ba090839061165c565b60405180910390a150565b6035546001600160a01b031690565b6035546000906001600160a01b0316610bd16110d4565b6001600160a01b031614905090565b60345490565b60345481565b610bf4610bba565b610c105760405162461bcd60e51b815260040161016990611900565b6001600160a01b038316600090815260366020526040902054610c455760405162461bcd60e51b815260040161016990611a03565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610c7b573d6000803e3d6000fd5b50826001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436482604051610a3f9190611709565b600290565b60003411610cda5760405162461bcd60e51b815260040161016990611720565b6000610ce58261048a565b905080826001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1534604051610d219190611709565b60405180910390a35050565b600054610100900460ff1680610d465750610d466110d8565b80610d54575060005460ff16155b610d705760405162461bcd60e51b81526004016101699061196c565b600054610100900460ff16158015610d9b576000805460ff1961ff0019909116610100171660011790555b610da3610bba565b610dbf5760405162461bcd60e51b815260040161016990611900565b610dc8836110de565b610dd18261118f565b8015610de3576000805461ff00191690555b505050565b6000828152603360205260408120546001600160a01b031615610e9857600083815260336020526040908190205490516313bf242360e31b81526001600160a01b03909116908190639df9211890610e44908690600401611709565b60206040518083038186803b158015610e5c57600080fd5b505afa158015610e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e949190810190611607565b9150505b92915050565b610ea6610bba565b610ec25760405162461bcd60e51b815260040161016990611900565b6001600160a01b03811660009081526038602052604090205460ff1615610efb5760405162461bcd60e51b815260040161016990611935565b6001600160a01b038116301415610f245760405162461bcd60e51b81526004016101699061183e565b6001600160a01b03811660009081526038602052604090819020805460ff19166001179055517f4b25d4880707e035ab47f6b15a868abe2d90dd17251c8a5c81673eea42e2be5790610ba090839061165c565b60375481565b60366020526000908152604090205481565b610f97610bba565b610fb35760405162461bcd60e51b815260040161016990611900565b610fbc816112e5565b50565b610fc7610bba565b610fe35760405162461bcd60e51b815260040161016990611900565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611019573d6000803e3d6000fd5b50816001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040516110539190611709565b60405180910390a25050565b6000611069610acf565b6040516308fc698560e11b815290915081906001600160a01b038216906311f8d30a9061109c9087908790600401611712565b600060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b5050505050505050565b3390565b303b1590565b600054610100900460ff16806110f757506110f76110d8565b80611105575060005460ff16155b6111215760405162461bcd60e51b81526004016101699061196c565b600054610100900460ff1615801561114c576000805460ff1961ff0019909116610100171660011790555b611154610bba565b6111705760405162461bcd60e51b815260040161016990611900565b611179826112e5565b801561118b576000805461ff00191690555b5050565b600054610100900460ff16806111a857506111a86110d8565b806111b6575060005460ff16155b6111d25760405162461bcd60e51b81526004016101699061196c565b600054610100900460ff161580156111fd576000805460ff1961ff0019909116610100171660011790555b603482905560005b60028110156112cf57600060405161121c90611367565b604051809103906000f080158015611238573d6000803e3d6000fd5b5060405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de89061126890309060040161165c565b600060405180830381600087803b15801561128257600080fd5b505af1158015611296573d6000803e3d6000fd5b505050600083815260336020526040902080546001600160a01b0319166001600160a01b03939093169290921790915550600101611205565b50801561118b576000805461ff00191690555050565b6001600160a01b03811661130b5760405162461bcd60e51b81526004016101699061178c565b6035546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603580546001600160a01b0319166001600160a01b0392909216919091179055565b61061a80611aeb83390190565b8035610e9881611ad5565b600082601f83011261138f578081fd5b813567ffffffffffffffff8111156113a5578182fd5b6113b8601f8201601f1916602001611a7e565b91508082528360208285010111156113cf57600080fd5b8060208401602084013760009082016020015292915050565b60006101008083850312156113fb578182fd5b61140481611a7e565b9150506114118383611374565b81526114208360208401611374565b6020820152604082013567ffffffffffffffff81111561143f57600080fd5b61144b8482850161137f565b604083015250606082013560608201526080820135608082015260a082013560a082015260c082013560c08201526114868360e08401611374565b60e082015292915050565b6000602082840312156114a2578081fd5b81356114ad81611ad5565b9392505050565b6000806000606084860312156114c8578182fd5b83356114d381611ad5565b925060208401356114e381611ad5565b929592945050506040919091013590565b60008060408385031215611506578182fd5b823561151181611ad5565b946020939093013593505050565b600080600060608486031215611533578283fd5b833561153e81611ad5565b925060208401359150604084013561155581611ad5565b809150509250925092565b600060208284031215611571578081fd5b813567ffffffffffffffff811115611587578182fd5b611593848285016113e8565b949350505050565b600080604083850312156115ad578182fd5b823567ffffffffffffffff8111156115c3578283fd5b6115cf858286016113e8565b925050602083013580151581146115e4578182fd5b809150509250929050565b600060208284031215611600578081fd5b5035919050565b600060208284031215611618578081fd5b5051919050565b60008060408385031215611631578182fd5b50508035926020909101359150565b60008251611652818460208701611aa5565b9190910192915050565b6001600160a01b0391909116815260200190565b600061010060018060a01b03808c168452808b1660208501528160408501528951808386015261012092506116ab8184870160208e01611aa5565b6060850199909952608084019790975260a08301959095525060c081019290925290921660e0830152601f909201601f191601019392505050565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b918252602082015260400190565b6020808252818101527f4e6f2076616c75652070726f766964656420746f206465706f736974466f722e604082015260600190565b6020808252601e908201527f4f6e6c7920454f412063616e206465706f736974206469726563746c792e0000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526018908201527f4e6f7420656e6f7567682067617320737570706c6965642e0000000000000000604082015260600190565b6020808252818101527f52656c61796572206d7573742063616c6c20746869732066756e6374696f6e2e604082015260600190565b60208082526034908201527f5468652072656c617920636f6e74726163742063616e6e6f7420626520696e736040820152733a30b63632b21030b99030903932b630bcb2b91760611b606082015260800190565b6020808252601e908201527f4e6f2076616c75652070726f766964656420746f2066616c6c6261636b2e0000604082015260600190565b6020808252601a908201527f52656c61796572206d75737420626520696e7374616c6c65642e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f52656c6179657220697320616c726561647920696e7374616c6c65642e000000604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526029908201527f52656c6179207478204d55535420626520666f7220746869732072656c61792060408201526831b7b73a3930b1ba1760b91b606082015260800190565b60208082526024908201527f4465706f7369746f7220686173206e65766572206465706f73697465642066756040820152633732399760e11b606082015260800190565b6020808252601e908201527f4e6f7420656e6f7567682062616c616e636520746f206d6967726174652e0000604082015260600190565b60405181810167ffffffffffffffff81118282101715611a9d57600080fd5b604052919050565b60005b83811015611ac0578181015183820152602001611aa8565b83811115611acf576000848401525b50505050565b6001600160a01b0381168114610fbc57600080fdfe608060405260006100176001600160e01b0361006a16565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b61059d8061007d6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b146100ee5780638f32d59b146101035780639df9211814610118578063c4d66de81461012b578063f2fde38b1461013e5761009e565b806311f8d30a146100a357806317634514146100b857806320ffd56d146100d657806341c0e1b5146100de578063715018a6146100e6575b600080fd5b6100b66100b1366004610455565b610151565b005b6100c06101a7565b6040516100cd919061055e565b60405180910390f35b6100c06101ad565b6100b66101b3565b6100b66101ea565b6100f6610258565b6040516100cd9190610476565b61010b610267565b6040516100cd919061048a565b6100c061012636600461043d565b61028d565b6100b661013936600461040f565b61029f565b6100b661014c36600461040f565b610353565b610159610267565b61017e5760405162461bcd60e51b8152600401610175906104db565b60405180910390fd5b6000828152603560205260409020546101a35760008281526035602052604090208190555b5050565b60345481565b60345490565b6101bb610267565b6101d75760405162461bcd60e51b8152600401610175906104db565b6101df610258565b6001600160a01b0316ff5b6101f2610267565b61020e5760405162461bcd60e51b8152600401610175906104db565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b6033546000906001600160a01b031661027e610383565b6001600160a01b031614905090565b60009081526035602052604090205490565b600054610100900460ff16806102b857506102b8610387565b806102c6575060005460ff16155b6102e25760405162461bcd60e51b815260040161017590610510565b600054610100900460ff1615801561030d576000805460ff1961ff0019909116610100171660011790555b610315610267565b6103315760405162461bcd60e51b8152600401610175906104db565b4360345561033e8261038d565b80156101a3576000805461ff00191690555050565b61035b610267565b6103775760405162461bcd60e51b8152600401610175906104db565b6103808161038d565b50565b3390565b303b1590565b6001600160a01b0381166103b35760405162461bcd60e51b815260040161017590610495565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600060208284031215610420578081fd5b81356001600160a01b0381168114610436578182fd5b9392505050565b60006020828403121561044e578081fd5b5035919050565b60008060408385031215610467578081fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b901515815260200190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b9081526020019056fea2646970667358221220c3a1944e96b5b39558436742e100bedc806ba385b6484ef80b9beac3786d2d6a64736f6c6343000602003344496df070da3f045064f6d6f394484a8de10d5710290d619b67d975ec89320fa26469706673582212208f3869b928adfa627e3d3d43ad5f9d15bba906945fc21b2651dc7cd4e68a3be464736f6c63430006020033

Deployed Bytecode Sourcemap

15095:4652:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13420:1;13408:9;:13;13400:56;;;;-1:-1:-1;;;13400:56:0;;;;;;;;;;;;;;;;;13475:9;13488:10;13475:23;13467:66;;;;-1:-1:-1;;;13467:66:0;;;;;;;;;13544:10;13557:29;13575:10;13557:17;:29::i;:::-;13544:42;;13633:5;13610:10;-1:-1:-1;;;;;13602:37:0;;13622:9;13602:37;;;;;;;;;;;;;;;13362:285;15095:4652;;;;;11427:228;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11427:228:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8948:467;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8948:467:0;;;:::i;:::-;;;;;;;;16181:2809;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16181:2809:0;;;;;;;;:::i;:::-;;7793:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7793:43:0;;;;;;;;:::i;14439:298::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14439:298:0;;;;;;;;:::i;15164:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15164:40:0;;;;;;;;:::i;:::-;;;;;;;;2824:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2824:148:0;;;:::i;9489:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9489:96:0;;;:::i;19524:220::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19524:220:0;;;;;;;;:::i;2013:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2013:79:0;;;:::i;2379:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2379:94:0;;;:::i;8034:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8034:81:0;;;:::i;7842:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7842:20:0;;;:::i;14051:276::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14051:276:0;;;;;;;;:::i;8168:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8168:88:0;;;:::i;12660:236::-;;;;;;;;;:::i;15625:194::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15625:194:0;;;;;;;;:::i;9783:306::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9783:306:0;;;;;;;;:::i;19096:320::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19096:320:0;;;;;;;;:::i;11866:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11866:28:0;;;:::i;11817:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11817:42:0;;;;;;;;:::i;3127:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3127:117:0;;;;;;;;:::i;13712:163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13712:163:0;;;;;;;;:::i;12971:284::-;-1:-1:-1;;;;;13055:22:0;;13035:4;13055:22;;;:10;:22;;;;;;13052:154;;13118:16;;;13137:1;13118:20;13099:39;;;;-1:-1:-1;;;;;13153:22:0;;-1:-1:-1;13153:22:0;;;:10;:22;;;;;:41;13052:154;-1:-1:-1;;;;;;13225:22:0;;;;;:10;:22;;;;;;;12971:284::o;11427:228::-;11541:7;;11550:9;;;;;11561;;;;;11572:13;;;;11587:17;;;;11606:13;;;;11621:12;;;;11635:10;;;;11530:116;;11495:7;;11530:116;;11541:7;;11550:9;11635:10;11530:116;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11530:116:0;;;11520:127;;;;;;11513:134;;11427:228;;;:::o;8948:467::-;9139:8;;8990:9;9102:13;;;:10;:13;;;;-1:-1:-1;;;;;;;;;;;9102:13:0;;9092:43;;-1:-1:-1;;;9092:43:0;;;;8990:9;;9139:8;-1:-1:-1;;;;;9102:13:0;;;;9092:41;;:43;;;;;;;;;;9102:13;9092:43;;;5:2:-1;;;;30:1;27;20:12;5:2;9092:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9092:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;9092:43:0;;;;;;;;;9077:12;:58;:70;9074:335;;9181:10;:13;;;;;-1:-1:-1;;;;;;;;;;;9223:13:0;9192:1;9162:16;9207:13;;;-1:-1:-1;;;;;;9207:29:0;;-1:-1:-1;;;;;9223:13:0;;;9207:29;;;;9181:13;9264:15;9181:13;;;9162:16;9264:15;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;9292:28:0;;-1:-1:-1;;;9292:28:0;;9249:30;;-1:-1:-1;;;;;;9292:13:0;;;;;:28;;9314:4;;9292:28;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9292:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;9333:13:0;;;;:10;:13;;-1:-1:-1;;;;;;;;;;;9333:27:0;;-1:-1:-1;;;;;;9333:27:0;-1:-1:-1;;;;;9333:27:0;;;;;;;;;;:13;9373:26;;-1:-1:-1;;;9373:26:0;;;;:24;;;;-1:-1:-1;9373:24:0;;-1:-1:-1;9373:26:0;;;;;9333:13;9373:26;;;;;;9333:13;9373:24;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;9373:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9373:26:0;;;;9074:335;;;8948:467;:::o;16181:2809::-;16258:15;16276:9;16520:10;16511:20;;;;:8;:20;;;;;;16258:27;;-1:-1:-1;16511:20:0;;16503:65;;;;-1:-1:-1;;;16503:65:0;;;;;;;;;16587:14;;;;-1:-1:-1;;;;;16587:31:0;16613:4;16587:31;16579:85;;;;-1:-1:-1;;;16579:85:0;;;;;;;;;16677:17;16697:26;16714:8;16697:16;:26::i;:::-;16677:46;;16797:8;:21;;;16822:1;16797:26;16794:245;;16993:34;17003:9;17014:12;16993:9;:34::i;:::-;17989:2;17969:8;:17;;;:22;;;;;;17949:8;:17;;;:42;17995:4;17948:51;17936:9;:63;17928:100;;;;-1:-1:-1;;;17928:100:0;;;;;;;;;18078:12;18095:8;:11;;;-1:-1:-1;;;;;18095:16:0;18116:8;:17;;;18135:8;:13;;;18095:54;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;-1:-1;18077:72:0;;-1:-1:-1;18260:12:0;;-1:-1:-1;18364:2:0;18346:8;:20;18288:9;18275:10;:22;:92;18445:4;18275:174;18542:5;18275:272;18260:287;;18583:10;18580:302;;;18700:36;;18622:11;18610:24;;;;;18700:10;;18724:11;18716:19;;18700:36;;;;;;;;;18716:19;18700:10;:36;;;;;;;18696:175;;18843:12;;;;;;;18696:175;18948:8;:11;;;-1:-1:-1;;;;;18899:83:0;18933:8;:13;;;-1:-1:-1;;;;;18899:83:0;18913:9;18899:83;18924:7;18961;18970:11;18899:83;;;;;;;;;;;;;;;;;16181:2809;;;;;;:::o;7793:43::-;;;;;;;;;;;;-1:-1:-1;;;;;7793:43:0;;:::o;14439:298::-;2225:9;:7;:9::i;:::-;2217:54;;;;-1:-1:-1;;;2217:54:0;;;;;;;;;14586:6:::1;14561:21;:31;;14553:74;;;;-1:-1:-1::0;;;14553:74:0::1;;;;;;;;;14638:48;::::0;-1:-1:-1;;;14638:48:0;;-1:-1:-1;;;;;14638:23:0;::::1;::::0;::::1;::::0;14668:6;;14638:48:::1;::::0;14676:9;;14638:48:::1;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;14638:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;14638:48:0;;;;;14711:9;-1:-1:-1::0;;;;;14702:27:0::1;;14722:6;14702:27;;;;;;;;;;;;;;;14439:298:::0;;;:::o;15164:40::-;;;;;;;;;;;;;;;:::o;2824:148::-;2225:9;:7;:9::i;:::-;2217:54;;;;-1:-1:-1;;;2217:54:0;;;;;;;;;2915:6:::1;::::0;2894:40:::1;::::0;2931:1:::1;::::0;-1:-1:-1;;;;;2915:6:0::1;::::0;2894:40:::1;::::0;2931:1;;2894:40:::1;2945:6;:19:::0;;-1:-1:-1;;;;;;2945:19:0::1;::::0;;2824:148::o;9489:96::-;9540:7;9565:13;;:10;:13;;-1:-1:-1;;;;;;;;;;;9565:13:0;-1:-1:-1;;;;;9565:13:0;9489:96;:::o;19524:220::-;2225:9;:7;:9::i;:::-;2217:54;;;;-1:-1:-1;;;2217:54:0;;;;;;;;;-1:-1:-1;;;;;19604:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;19596:57;;;;-1:-1:-1::0;;;19596:57:0::1;;;;;;;;;-1:-1:-1::0;;;;;19666:18:0;::::1;19687:5;19666:18:::0;;;:8:::1;:18;::::0;;;;;;:26;;-1:-1:-1;;19666:26:0::1;::::0;;19708:28;::::1;::::0;::::1;::::0;19675:8;;19708:28:::1;;;;;;;;;;19524:220:::0;:::o;2013:79::-;2078:6;;-1:-1:-1;;;;;2078:6:0;2013:79;:::o;2379:94::-;2459:6;;2419:4;;-1:-1:-1;;;;;2459:6:0;2443:12;:10;:12::i;:::-;-1:-1:-1;;;;;2443:22:0;;2436:29;;2379:94;:::o;8034:81::-;8100:8;;8034:81;:::o;7842:20::-;;;;:::o;14051:276::-;2225:9;:7;:9::i;:::-;2217:54;;;;-1:-1:-1;;;2217:54:0;;;;;;;;;-1:-1:-1;;;;;14175:21:0;::::1;14197:1;14175:21:::0;;;:10:::1;:21;::::0;;;;;14167:72:::1;;;;-1:-1:-1::0;;;14167:72:0::1;;;;;;;;;14250:26;::::0;-1:-1:-1;;;;;14250:18:0;::::1;::::0;:26;::::1;;;::::0;14269:6;;14250:26:::1;::::0;;;14269:6;14250:18;:26;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;14250:26:0;14301:9;-1:-1:-1::0;;;;;14292:27:0::1;;14312:6;14292:27;;;;;;;8168:88:::0;7932:1;8168:88;:::o;12660:236::-;12746:1;12734:9;:13;12726:58;;;;-1:-1:-1;;;12726:58:0;;;;;;;;;12795:10;12808:28;12826:9;12808:17;:28::i;:::-;12795:41;;12882:5;12860:9;-1:-1:-1;;;;;12852:36:0;;12871:9;12852:36;;;;;;;;;;;;;;;12660:236;;:::o;15625:194::-;4769:12;;;;;;;;:31;;;4785:15;:13;:15::i;:::-;4769:47;;;-1:-1:-1;4805:11:0;;;;4804:12;4769:47;4761:106;;;;-1:-1:-1;;;4761:106:0;;;;;;;;;4876:19;4899:12;;;;;;4898:13;4918:83;;;;4947:12;:19;;-1:-1:-1;;;;4947:19:0;;;;;4975:18;4962:4;4975:18;;;4918:83;2225:9:::1;:7;:9::i;:::-;2217:54;;;;-1:-1:-1::0;;;2217:54:0::1;;;;;;;;;15725:36:::2;15751:9;15725:25;:36::i;:::-;15772:39;15796:14;15772:23;:39::i;:::-;5023:14:::0;5019:57;;;5063:5;5048:20;;-1:-1:-1;;5048:20:0;;;5019:57;15625:194;;;:::o;9783:306::-;9855:4;9935:22;;;:10;:22;;;;;;-1:-1:-1;;;;;9935:22:0;:36;9932:151;;9986:12;10011:22;;;:10;:22;;;;;;;;10054:19;;-1:-1:-1;;;10054:19:0;;-1:-1:-1;;;;;10011:22:0;;;;;;10054:14;;:19;;10069:3;;10054:19;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10054:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10054:19:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;10054:19:0;;;;;;;;;10047:26;;;9932:151;9783:306;;;;:::o;19096:320::-;2225:9;:7;:9::i;:::-;2217:54;;;;-1:-1:-1;;;2217:54:0;;;;;;;;;-1:-1:-1;;;;;19175:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;19174:19;19166:61;;;;-1:-1:-1::0;;;19166:61:0::1;;;;;;;;;-1:-1:-1::0;;;;;19246:25:0;::::1;19266:4;19246:25;;19238:90;;;;-1:-1:-1::0;;;19238:90:0::1;;;;;;;;;-1:-1:-1::0;;;;;19341:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;:25;;-1:-1:-1;;19341:25:0::1;19362:4;19341:25;::::0;;19382:26;::::1;::::0;::::1;::::0;19350:8;;19382:26:::1;;11866:28:::0;;;;:::o;11817:42::-;;;;;;;;;;;;;:::o;3127:117::-;2225:9;:7;:9::i;:::-;2217:54;;;;-1:-1:-1;;;2217:54:0;;;;;;;;;3208:28:::1;3227:8;3208:18;:28::i;:::-;3127:117:::0;:::o;13712:163::-;2225:9;:7;:9::i;:::-;2217:54;;;;-1:-1:-1;;;2217:54:0;;;;;;;;;13798:26:::1;::::0;-1:-1:-1;;;;;13798:18:0;::::1;::::0;:26;::::1;;;::::0;13817:6;;13798:26:::1;::::0;;;13817:6;13798:18;:26;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;13798:26:0;13849:9;-1:-1:-1::0;;;;;13840:27:0::1;;13860:6;13840:27;;;;;;;;;;;;;;;13712:163:::0;;:::o;10265:329::-;10355:21;10379:20;:18;:20::i;:::-;10558:29;;-1:-1:-1;;;10558:29:0;;10355:44;;-1:-1:-1;10355:44:0;;-1:-1:-1;;;;;10558:12:0;;;;;:29;;10571:3;;10576:10;;10558:29;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10558:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10558:29:0;;;;10265:329;;;;:::o;786:106::-;874:10;786:106;:::o;5170:508::-;5587:4;5633:17;5665:7;5170:508;:::o;12284:118::-;4769:12;;;;;;;;:31;;;4785:15;:13;:15::i;:::-;4769:47;;;-1:-1:-1;4805:11:0;;;;4804:12;4769:47;4761:106;;;;-1:-1:-1;;;4761:106:0;;;;;;;;;4876:19;4899:12;;;;;;4898:13;4918:83;;;;4947:12;:19;;-1:-1:-1;;;;4947:19:0;;;;;4975:18;4962:4;4975:18;;;4918:83;2225:9:::1;:7;:9::i;:::-;2217:54;;;;-1:-1:-1::0;;;2217:54:0::1;;;;;;;;;12365:29:::2;12384:9;12365:18;:29::i;:::-;5023:14:::0;5019:57;;;5063:5;5048:20;;-1:-1:-1;;5048:20:0;;;5019:57;12284:118;;:::o;8391:434::-;4769:12;;;;;;;;:31;;;4785:15;:13;:15::i;:::-;4769:47;;;-1:-1:-1;4805:11:0;;;;4804:12;4769:47;4761:106;;;;-1:-1:-1;;;4761:106:0;;;;;;;;;4876:19;4899:12;;;;;;4898:13;4918:83;;;;4947:12;:19;;-1:-1:-1;;;;4947:19:0;;;;;4975:18;4962:4;4975:18;;;4918:83;8457:8:::1;:20:::0;;;8657:6:::1;8653:166;7932:1;8667;:14;8653:166;;;8700:12;8715:15;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;8742:28:0::1;::::0;-1:-1:-1;;;8742:28:0;;8700:30;;-1:-1:-1;;;;;;8742:13:0;::::1;::::0;::::1;::::0;:28:::1;::::0;8764:4:::1;::::0;8742:28:::1;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;8742:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;;8782:13:0::1;::::0;;;:10:::1;:13;::::0;;;;:27;;-1:-1:-1;;;;;;8782:27:0::1;-1:-1:-1::0;;;;;8782:27:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;8683:3:0::1;8653:166;;;;5023:14:::0;5019:57;;;5063:5;5048:20;;-1:-1:-1;;5048:20:0;;;8391:434;;:::o;3350:237::-;-1:-1:-1;;;;;3432:22:0;;3424:73;;;;-1:-1:-1;;;3424:73:0;;;;;;;;;3534:6;;3513:38;;-1:-1:-1;;;;;3513:38:0;;;;3534:6;;3513:38;;3534:6;;3513:38;3562:6;:17;;-1:-1:-1;;;;;;3562:17:0;-1:-1:-1;;;;;3562:17:0;;;;;;;;;;3350:237::o;15095:4652::-;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;564:432;;661:3;654:4;646:6;642:17;638:27;628:2;;-1:-1;;669:12;628:2;716:6;703:20;23137:18;23129:6;23126:30;23123:2;;;-1:-1;;23159:12;23123:2;738:60;23232:9;23213:17;;-1:-1;;23209:33;23300:4;23290:15;738:60;;;729:69;;818:6;811:5;804:21;922:3;23300:4;913:6;846;904:16;;901:25;898:2;;;939:1;;929:12;898:2;25407:6;23300:4;846:6;842:17;23300:4;880:5;876:16;25384:30;25463:1;25445:16;;;23300:4;25445:16;25438:27;880:5;621:375;-1:-1;;621:375;1220:1455;;1333:6;;1321:9;1316:3;1312:19;1308:32;1305:2;;;-1:-1;;1343:12;1305:2;1371:22;1333:6;1371:22;;;1362:31;;;1473:49;1518:3;1494:22;1473:49;;;1455:16;1448:75;1617:57;1670:3;1584:2;1650:9;1646:22;1617:57;;;1584:2;1603:5;1599:16;1592:83;1764:2;1753:9;1749:18;1736:32;1788:18;1780:6;1777:30;1774:2;;;1441:1;;1810:12;1774:2;1855:54;1905:3;1896:6;1885:9;1881:22;1855:54;;;1764:2;1841:5;1837:16;1830:80;;1975:2;2033:9;2029:22;2749:20;1975:2;1994:5;1990:16;1983:75;2127:3;2186:9;2182:22;2749:20;2127:3;2147:5;2143:16;2136:75;2276:3;2335:9;2331:22;2749:20;2276:3;2296:5;2292:16;2285:75;2424:3;2483:9;2479:22;2749:20;2424:3;2444:5;2440:16;2433:75;2604:49;2649:3;2570;2629:9;2625:22;2604:49;;;2570:3;2590:5;2586:16;2579:75;1299:1376;;;;;2960:241;;3064:2;3052:9;3043:7;3039:23;3035:32;3032:2;;;-1:-1;;3070:12;3032:2;85:6;72:20;97:33;124:5;97:33;;;3122:63;3026:175;-1:-1;;;3026:175;3208:523;;;;3362:2;3350:9;3341:7;3337:23;3333:32;3330:2;;;-1:-1;;3368:12;3330:2;230:6;217:20;242:41;277:5;242:41;;;3420:71;-1:-1;3528:2;3575:22;;217:20;242:41;217:20;242:41;;;3324:407;;3536:71;;-1:-1;;;3644:2;3683:22;;;;2749:20;;3324:407;3738:382;;;3867:2;3855:9;3846:7;3842:23;3838:32;3835:2;;;-1:-1;;3873:12;3835:2;230:6;217:20;242:41;277:5;242:41;;;3925:71;4033:2;4072:22;;;;2749:20;;-1:-1;;;3829:291;4127:551;;;;4295:2;4283:9;4274:7;4270:23;4266:32;4263:2;;;-1:-1;;4301:12;4263:2;230:6;217:20;242:41;277:5;242:41;;;4353:71;-1:-1;4461:2;4500:22;;2749:20;;-1:-1;4569:2;4630:22;;1093:20;1118:55;1093:20;1118:55;;;4577:85;;;;4257:421;;;;;;5058:375;;5186:2;5174:9;5165:7;5161:23;5157:32;5154:2;;;-1:-1;;5192:12;5154:2;5250:17;5237:31;5288:18;5280:6;5277:30;5274:2;;;-1:-1;;5310:12;5274:2;5340:77;5409:7;5400:6;5389:9;5385:22;5340:77;;;5330:87;5148:285;-1:-1;;;;5148:285;5440:494;;;5582:2;5570:9;5561:7;5557:23;5553:32;5550:2;;;-1:-1;;5588:12;5550:2;5646:17;5633:31;5684:18;5676:6;5673:30;5670:2;;;-1:-1;;5706:12;5670:2;5736:77;5805:7;5796:6;5785:9;5781:22;5736:77;;;5726:87;;;5850:2;5890:9;5886:22;359:20;26206:5;24212:13;24205:21;26184:5;26181:32;26171:2;;-1:-1;;26217:12;26171:2;5858:60;;;;5544:390;;;;;;5941:241;;6045:2;6033:9;6024:7;6020:23;6016:32;6013:2;;;-1:-1;;6051:12;6013:2;-1:-1;2749:20;;6007:175;-1:-1;6007:175;6189:263;;6304:2;6292:9;6283:7;6279:23;6275:32;6272:2;;;-1:-1;;6310:12;6272:2;-1:-1;2897:13;;6266:186;-1:-1;6266:186;6459:366;;;6580:2;6568:9;6559:7;6555:23;6551:32;6548:2;;;-1:-1;;6586:12;6548:2;-1:-1;;2749:20;;;6738:2;6777:22;;;493:20;;-1:-1;6542:283;13449:254;;7970:5;23405:12;8081:52;8126:6;8121:3;8114:4;8107:5;8103:16;8081:52;;;8145:16;;;;;13570:133;-1:-1;;13570:133;13710:213;-1:-1;;;;;24507:54;;;;7068:45;;13828:2;13813:18;;13799:124;14166:1103;;14510:3;23137:18;;24518:42;;;;7106:5;24507:54;7075:3;7068:45;24518:42;7106:5;24507:54;14691:2;14680:9;14676:18;7068:45;14510:3;14728:2;14717:9;14713:18;14706:48;7610:5;23405:12;23561:6;14510:3;14499:9;14495:19;23549;23589:14;;;7703:52;7748:6;23589:14;14499:9;23589:14;14691:2;7729:5;7725:16;7703:52;;;14919:2;14904:18;;7427:37;;;;15002:3;14987:19;;7427:37;;;;15086:3;15071:19;;7427:37;;;;-1:-1;15170:3;15155:19;;7427:37;;;;24507:54;;;15254:3;15239:19;;7068:45;23232:9;25824:14;;;-1:-1;;25820:28;7767:39;;;;-1:-1;;;14481:788;15276:201;24212:13;;24205:21;7310:34;;15388:2;15373:18;;15359:118;15484:423;24212:13;;24205:21;7310:34;;15810:2;15795:18;;7427:37;;;;15893:2;15878:18;;7427:37;15652:2;15637:18;;15623:284;15914:213;7427:37;;;16032:2;16017:18;;16003:124;16134:324;7427:37;;;16444:2;16429:18;;7427:37;16280:2;16265:18;;16251:207;16719:407;16910:2;16924:47;;;16895:18;;;23549:19;8601:34;23589:14;;;8581:55;8655:12;;;16881:245;17133:407;17324:2;17338:47;;;8906:2;17309:18;;;23549:19;8942:32;23589:14;;;8922:53;8994:12;;;17295:245;17547:407;17738:2;17752:47;;;9245:2;17723:18;;;23549:19;9281:34;23589:14;;;9261:55;-1:-1;;;9336:12;;;9329:30;9378:12;;;17709:245;17961:407;18152:2;18166:47;;;9629:2;18137:18;;;23549:19;9665:26;23589:14;;;9645:47;9711:12;;;18123:245;18375:407;18566:2;18580:47;;;18551:18;;;23549:19;9998:34;23589:14;;;9978:55;10052:12;;;18537:245;18789:407;18980:2;18994:47;;;10303:2;18965:18;;;23549:19;10339:34;23589:14;;;10319:55;-1:-1;;;10394:12;;;10387:44;10450:12;;;18951:245;19203:407;19394:2;19408:47;;;10701:2;19379:18;;;23549:19;10737:32;23589:14;;;10717:53;10789:12;;;19365:245;19617:407;19808:2;19822:47;;;11040:2;19793:18;;;23549:19;11076:28;23589:14;;;11056:49;11124:12;;;19779:245;20031:407;20222:2;20236:47;;;20207:18;;;23549:19;11411:34;23589:14;;;11391:55;11465:12;;;20193:245;20445:407;20636:2;20650:47;;;11716:2;20621:18;;;23549:19;11752:31;23589:14;;;11732:52;11803:12;;;20607:245;20859:407;21050:2;21064:47;;;12054:2;21035:18;;;23549:19;12090:34;23589:14;;;12070:55;-1:-1;;;12145:12;;;12138:38;12195:12;;;21021:245;21273:407;21464:2;21478:47;;;12446:2;21449:18;;;23549:19;12482:34;23589:14;;;12462:55;-1:-1;;;12537:12;;;12530:33;12582:12;;;21435:245;21687:407;21878:2;21892:47;;;12833:2;21863:18;;;23549:19;12869:34;23589:14;;;12849:55;-1:-1;;;12924:12;;;12917:28;12964:12;;;21849:245;22101:407;22292:2;22306:47;;;13215:2;22277:18;;;23549:19;13251:32;23589:14;;;13231:53;13303:12;;;22263:245;22735:256;22797:2;22791:9;22823:17;;;22898:18;22883:34;;22919:22;;;22880:62;22877:2;;;22955:1;;22945:12;22877:2;22797;22964:22;22775:216;;-1:-1;22775:216;25480:268;25545:1;25552:101;25566:6;25563:1;25560:13;25552:101;;;25633:11;;;25627:18;25614:11;;;25607:39;25588:2;25581:10;25552:101;;;25668:6;25665:1;25662:13;25659:2;;;25545:1;25724:6;25719:3;25715:16;25708:27;25659:2;;25529:219;;;;25861:117;-1:-1;;;;;24507:54;;25920:35;;25910:2;;25969:1;;25959:12

Swarm Source

ipfs://8f3869b928adfa627e3d3d43ad5f9d15bba906945fc21b2651dc7cd4e68a3be4

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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