ETH Price: $3,927.61 (+5.59%)

Contract

0xbb486C6E9cF1faA86a6E3eAAFE2e5665C0507855
 
Transaction Hash
Method
Block
From
To
Withdraw161327112022-12-07 12:05:11729 days ago1670414711IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0006551414.84113348
Set Validation161327042022-12-07 12:03:47729 days ago1670414627IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0035871113.69335494
Withdraw161202602022-12-05 18:05:35730 days ago1670263535IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0006976315.80359326
Set Payment Per ...160426682022-11-24 21:56:59741 days ago1669327019IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0004528412.47376477
Set Validation139957072022-01-13 7:01:481057 days ago1642057308IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.03644266134.39643413
Set Validation139718052022-01-09 14:07:181060 days ago1641737238IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.019824873.13427856
Set Validation139181892022-01-01 7:32:101069 days ago1641022330IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0173487364
Set Validation139154092021-12-31 21:06:111069 days ago1640984771IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0234270586.43074994
Set Validation138887642021-12-27 18:06:121073 days ago1640628372IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.03063407113
Set Validation138846992021-12-27 2:50:531074 days ago1640573453IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0082672864.9
Set Validation138846932021-12-27 2:50:261074 days ago1640573426IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0215884279.62975677
Set Validation138803792021-12-26 10:57:511075 days ago1640516271IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0143201952.83697687
Set Validation138780722021-12-26 2:17:281075 days ago1640485048IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0193826471.5
Set Validation138535092021-12-22 7:02:041079 days ago1640156524IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.014265552.61190546
Set Validation138528632021-12-22 4:33:061079 days ago1640147586IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0074809758.72727764
Set Validation138528632021-12-22 4:33:061079 days ago1640147586IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0159215558.72727764
Set Validation138488802021-12-21 13:48:441079 days ago1640094524IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0132867449
Set Validation138365212021-12-19 15:48:501081 days ago1639928930IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0141172852.06984668
Set Validation137968252021-12-13 12:28:151088 days ago1639398495IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0104366938.48934421
Set Validation137883262021-12-12 5:05:421089 days ago1639285542IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0112014977.66248106
Set Validation137863852021-12-11 21:54:501089 days ago1639259690IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0079237462.19723517
Set Validation137863662021-12-11 21:49:231089 days ago1639259363IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0168308962.0786641
Set Validation137789062021-12-10 18:02:511090 days ago1639159371IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.03082916113.70958271
Set Validation137785252021-12-10 16:37:201090 days ago1639154240IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.03381025124.72704846
Set Validation137755132021-12-10 5:32:321091 days ago1639114352IN
Unstoppable Domains: Twitter Validation Operator
0 ETH0.0182569567.35044172
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TwitterValidationOperator

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-02
*/

// File: @openzeppelin/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: @openzeppelin/contracts/access/roles/WhitelistAdminRole.sol

pragma solidity ^0.5.0;


/**
 * @title WhitelistAdminRole
 * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
 */
contract WhitelistAdminRole {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    constructor () internal {
        _addWhitelistAdmin(msg.sender);
    }

    modifier onlyWhitelistAdmin() {
        require(isWhitelistAdmin(msg.sender), "WhitelistAdminRole: caller does not have the WhitelistAdmin role");
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(msg.sender);
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

// File: @openzeppelin/contracts/access/roles/WhitelistedRole.sol

pragma solidity ^0.5.0;



/**
 * @title WhitelistedRole
 * @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a
 * crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove
 * it), and not Whitelisteds themselves.
 */
contract WhitelistedRole is WhitelistAdminRole {
    using Roles for Roles.Role;

    event WhitelistedAdded(address indexed account);
    event WhitelistedRemoved(address indexed account);

    Roles.Role private _whitelisteds;

    modifier onlyWhitelisted() {
        require(isWhitelisted(msg.sender), "WhitelistedRole: caller does not have the Whitelisted role");
        _;
    }

    function isWhitelisted(address account) public view returns (bool) {
        return _whitelisteds.has(account);
    }

    function addWhitelisted(address account) public onlyWhitelistAdmin {
        _addWhitelisted(account);
    }

    function removeWhitelisted(address account) public onlyWhitelistAdmin {
        _removeWhitelisted(account);
    }

    function renounceWhitelisted() public {
        _removeWhitelisted(msg.sender);
    }

    function _addWhitelisted(address account) internal {
        _whitelisteds.add(account);
        emit WhitelistedAdded(account);
    }

    function _removeWhitelisted(address account) internal {
        _whitelisteds.remove(account);
        emit WhitelistedRemoved(account);
    }
}

// File: @openzeppelin/contracts/access/roles/CapperRole.sol

pragma solidity ^0.5.0;


contract CapperRole {
    using Roles for Roles.Role;

    event CapperAdded(address indexed account);
    event CapperRemoved(address indexed account);

    Roles.Role private _cappers;

    constructor () internal {
        _addCapper(msg.sender);
    }

    modifier onlyCapper() {
        require(isCapper(msg.sender), "CapperRole: caller does not have the Capper role");
        _;
    }

    function isCapper(address account) public view returns (bool) {
        return _cappers.has(account);
    }

    function addCapper(address account) public onlyCapper {
        _addCapper(account);
    }

    function renounceCapper() public {
        _removeCapper(msg.sender);
    }

    function _addCapper(address account) internal {
        _cappers.add(account);
        emit CapperAdded(account);
    }

    function _removeCapper(address account) internal {
        _cappers.remove(account);
        emit CapperRemoved(account);
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

// File: @chainlink/contracts/src/v0.5/interfaces/LinkTokenInterface.sol

pragma solidity ^0.5.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);
  function approve(address spender, uint256 value) external returns (bool success);
  function balanceOf(address owner) external view returns (uint256 balance);
  function decimals() external view returns (uint8 decimalPlaces);
  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);
  function increaseApproval(address spender, uint256 subtractedValue) external;
  function name() external view returns (string memory tokenName);
  function symbol() external view returns (string memory tokenSymbol);
  function totalSupply() external view returns (uint256 totalTokensIssued);
  function transfer(address to, uint256 value) external returns (bool success);
  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);
  function transferFrom(address from, address to, uint256 value) external returns (bool success);
}

// File: contracts/util/ERC677Receiver.sol

pragma solidity 0.5.12;

contract ERC677Receiver {
    /**
    * @dev Method invoked when tokens transferred via transferAndCall method
    * @param _sender Original token sender
    * @param _value Tokens amount
    * @param _data Additional data passed to contract
    */
    function onTokenTransfer(address _sender, uint256 _value, bytes calldata _data) external;
}

// File: @openzeppelin/contracts/introspection/IERC165.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * [EIP](https://eips.ethereum.org/EIPS/eip-165).
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others (`ERC165Checker`).
 *
 * For an implementation, see `ERC165`.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * 
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either `approve` or `setApproveForAll`.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either `approve` or `setApproveForAll`.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol

pragma solidity ^0.5.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/IRegistry.sol

pragma solidity 0.5.12;


contract IRegistry is IERC721Metadata {

    event NewURI(uint256 indexed tokenId, string uri);

    event NewURIPrefix(string prefix);

    event Resolve(uint256 indexed tokenId, address indexed to);

    event Sync(address indexed resolver, uint256 indexed updateId, uint256 indexed tokenId);

    /**
     * @dev Controlled function to set the token URI Prefix for all tokens.
     * @param prefix string URI to assign
     */
    function controlledSetTokenURIPrefix(string calldata prefix) external;

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool);

    /**
     * @dev Mints a new a child token.
     * Calculates child token ID using a namehash function.
     * Requires the msg.sender to be the owner, approved, or operator of tokenId.
     * Requires the token not exist.
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the parent token
     * @param label subdomain label of the child token ID
     */
    function mintChild(address to, uint256 tokenId, string calldata label) external;

    /**
     * @dev Controlled function to mint a given token ID.
     * Requires the msg.sender to be controller.
     * Requires the token ID to not exist.
     * @param to address the given token ID will be minted to
     * @param label string that is a subdomain
     * @param tokenId uint256 ID of the parent token
     */
    function controlledMintChild(address to, uint256 tokenId, string calldata label) external;

    /**
     * @dev Transfers the ownership of a child token ID to another address.
     * Calculates child token ID using a namehash function.
     * Requires the msg.sender to be the owner, approved, or operator of tokenId.
     * Requires the token already exist.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param label subdomain label of the child token ID
     */
    function transferFromChild(address from, address to, uint256 tokenId, string calldata label) external;

    /**
     * @dev Controlled function to transfers the ownership of a token ID to
     * another address.
     * Requires the msg.sender to be controller.
     * Requires the token already exist.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function controlledTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Safely transfers the ownership of a child token ID to another address.
     * Calculates child token ID using a namehash function.
     * Implements a ERC721Reciever check unlike transferFromChild.
     * Requires the msg.sender to be the owner, approved, or operator of tokenId.
     * Requires the token already exist.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 parent ID of the token to be transferred
     * @param label subdomain label of the child token ID
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label, bytes calldata _data) external;

    /// Shorthand for calling the above ^^^ safeTransferFromChild function with an empty _data parameter. Similar to ERC721.safeTransferFrom.
    function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label) external;

    /**
     * @dev Controlled frunction to safely transfers the ownership of a token ID
     * to another address.
     * Implements a ERC721Reciever check unlike controlledSafeTransferFrom.
     * Requires the msg.sender to be controller.
     * Requires the token already exist.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 parent ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function controlledSafeTransferFrom(address from, address to, uint256 tokenId, bytes calldata _data) external;

    /**
     * @dev Burns a child token ID.
     * Calculates child token ID using a namehash function.
     * Requires the msg.sender to be the owner, approved, or operator of tokenId.
     * Requires the token already exist.
     * @param tokenId uint256 ID of the token to be transferred
     * @param label subdomain label of the child token ID
     */
    function burnChild(uint256 tokenId, string calldata label) external;

    /**
     * @dev Controlled function to burn a given token ID.
     * Requires the msg.sender to be controller.
     * Requires the token already exist.
     * @param tokenId uint256 ID of the token to be burned
     */
    function controlledBurn(uint256 tokenId) external;

    /**
     * @dev Sets the resolver of a given token ID to another address.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param to address the given token ID will resolve to
     * @param tokenId uint256 ID of the token to be transferred
     */
    function resolveTo(address to, uint256 tokenId) external;

    /**
     * @dev Gets the resolver of the specified token ID.
     * @param tokenId uint256 ID of the token to query the resolver of
     * @return address currently marked as the resolver of the given token ID
     */
    function resolverOf(uint256 tokenId) external view returns (address);

    /**
     * @dev Controlled function to sets the resolver of a given token ID.
     * Requires the msg.sender to be controller.
     * @param to address the given token ID will resolve to
     * @param tokenId uint256 ID of the token to be transferred
     */
    function controlledResolveTo(address to, uint256 tokenId) external;

    /**
     * @dev Provides child token (subdomain) of provided tokenId.
     * @param tokenId uint256 ID of the token
     * @param label label of subdomain (for `aaa.bbb.crypto` it will be `aaa`)
     */
    function childIdOf(uint256 tokenId, string calldata label) external pure returns (uint256);

    /**
     * @dev Transfer domain ownership without resetting domain records.
     * @param to address of new domain owner
     * @param tokenId uint256 ID of the token to be transferred
     */
    function setOwner(address to, uint256 tokenId) external;
}

// File: contracts/IResolver.sol

pragma solidity 0.5.12;
pragma experimental ABIEncoderV2;

contract IResolver {
    /**
     * @dev Reset all domain records and set new ones
     * @param keys New record keys
     * @param values New record values
     * @param tokenId ERC-721 token id of the domain
     */
    function reconfigure(string[] memory keys, string[] memory values, uint256 tokenId) public;

    /**
     * @dev Set or update domain records
     * @param keys New record keys
     * @param values New record values
     * @param tokenId ERC-721 token id of the domain
     */
    function setMany(string[] memory keys, string[] memory values, uint256 tokenId) public;

    /**
     * @dev Function to set record.
     * @param key The key set the value of.
     * @param value The value to set key to.
     * @param tokenId ERC-721 token id to set.
     */
    function set(string calldata key, string calldata value, uint256 tokenId) external;

    /**
     * @dev Function to reset all existing records on a domain.
     * @param tokenId ERC-721 token id to set.
     */
    function reset(uint256 tokenId) external;
}

// File: contracts/operators/TwitterValidationOperator.sol

pragma solidity 0.5.12;
// pragma experimental ABIEncoderV2;








contract TwitterValidationOperator is WhitelistedRole, CapperRole, ERC677Receiver {
    string public constant NAME = 'Chainlink Twitter Validation Operator';
    string public constant VERSION = '0.2.0';

    using SafeMath for uint256;

    event Validation(uint256 indexed tokenId, uint256 requestId, uint256 paymentAmount);
    event ValidationRequest(uint256 indexed tokenId, address indexed owner, uint256 requestId, string code);
    event PaymentSet(uint256 operatorPaymentPerValidation, uint256 userPaymentPerValidation);

    uint256 public operatorPaymentPerValidation;
    uint256 public userPaymentPerValidation;
    uint256 public withdrawableTokens;

    uint256 private frozenTokens;
    uint256 private lastRequestId = 1;
    mapping(uint256 => uint256) private userRequests;
    IRegistry private registry;
    LinkTokenInterface private linkToken;

    /**
    * @notice Deploy with the address of the LINK token, domains registry and payment amount in LINK for one valiation
    * @dev Sets the LinkToken address, Registry address and payment in LINK tokens for one validation
    * @param _registry The address of the .crypto Registry
    * @param _linkToken The address of the LINK token
    * @param _paymentCappers Addresses allowed to update payment amount per validation
    */
    constructor (IRegistry _registry, LinkTokenInterface _linkToken, address[] memory _paymentCappers) public {
        require(address(_registry) != address(0), "TwitterValidationOperator: INVALID_REGISTRY_ADDRESS");
        require(address(_linkToken) != address(0), "TwitterValidationOperator: INVALID_LINK_TOKEN_ADDRESS");
        require(_paymentCappers.length > 0, "TwitterValidationOperator: NO_CAPPERS_PROVIDED");
        registry = _registry;
        linkToken = _linkToken;
        uint256 cappersCount = _paymentCappers.length;
        for (uint256 i = 0; i < cappersCount; i++) {
            addCapper(_paymentCappers[i]);
        }
        renounceCapper();
    }

    /**
    * @dev Reverts if amount requested is greater than withdrawable balance
    * @param _amount The given amount to compare to `withdrawableTokens`
    */
    modifier hasAvailableFunds(uint256 _amount) {
        require(withdrawableTokens >= _amount, "TwitterValidationOperator: TOO_MANY_TOKENS_REQUESTED");
        _;
    }

    /**
     * @dev Reverts if contract doesn not have enough LINK tokens to fulfil validation
     */
    modifier hasAvailableBalance() {
        require(
            availableBalance() >= withdrawableTokens.add(operatorPaymentPerValidation),
            "TwitterValidationOperator: NOT_ENOUGH_TOKENS_ON_CONTRACT_BALANCE"
        );
        _;
    }

    /**
     * @dev Reverts if method called not from LINK token contract
     */
    modifier linkTokenOnly() {
        require(msg.sender == address(linkToken), "TwitterValidationOperator: CAN_CALL_FROM_LINK_TOKEN_ONLY");
        _;
    }

    /**
     * @dev Reverts if user sent incorrect amount of LINK tokens
     */
    modifier correctTokensAmount(uint256 _value) {
        require(_value == userPaymentPerValidation, "TwitterValidationOperator: INCORRECT_TOKENS_AMOUNT");
        _;
    }

    /**
     * @notice Method will be called by Chainlink node in the end of the job. Provides user twitter name and validation signature
     * @dev Sets twitter username and signature to .crypto domain records
     * @param _username Twitter username
     * @param _signature Signed twitter username. Ensures the validity of twitter username
     * @param _tokenId Domain token ID
     * @param _requestId Request id for validations were requested from Smart Contract. If validation was requested from operator `_requestId` should be equals to zero.
     */
    function setValidation(string calldata _username, string calldata _signature, uint256 _tokenId, uint256 _requestId)
    external
    onlyWhitelisted
    hasAvailableBalance {
        uint256 _payment = calculatePaymentForValidation(_requestId);
        withdrawableTokens = withdrawableTokens.add(_payment);
        IResolver Resolver = IResolver(registry.resolverOf(_tokenId));
        Resolver.set("social.twitter.username", _username, _tokenId);
        Resolver.set("validation.social.twitter.username", _signature, _tokenId);
        emit Validation(_tokenId, _requestId, _payment);
    }

    /**
    * @notice Method returns true if Node Operator able to set validation
    * @dev Returns true or error
    */
    function canSetValidation() external view onlyWhitelisted hasAvailableBalance returns (bool) {
        return true;
    }

    /**
     * @notice Method allows to update payments per one validation in LINK tokens
     * @dev Sets operatorPaymentPerValidation and userPaymentPerValidation variables
     * @param _operatorPaymentPerValidation Payment amount in LINK tokens when verification initiated via Operator
     * @param _userPaymentPerValidation Payment amount in LINK tokens when verification initiated directly by user via Smart Contract call
     */
    function setPaymentPerValidation(uint256 _operatorPaymentPerValidation, uint256 _userPaymentPerValidation) external onlyCapper {
        operatorPaymentPerValidation = _operatorPaymentPerValidation;
        userPaymentPerValidation = _userPaymentPerValidation;
        emit PaymentSet(operatorPaymentPerValidation, userPaymentPerValidation);
    }

    /**
    * @notice Allows the node operator to withdraw earned LINK to a given address
    * @dev The owner of the contract can be another wallet and does not have to be a Chainlink node
    * @param _recipient The address to send the LINK token to
    * @param _amount The amount to send (specified in wei)
    */
    function withdraw(address _recipient, uint256 _amount) external onlyWhitelistAdmin hasAvailableFunds(_amount) {
        withdrawableTokens = withdrawableTokens.sub(_amount);
        assert(linkToken.transfer(_recipient, _amount));
    }

    /**
    * @notice Initiate Twitter validation
    * @dev Method invoked when LINK tokens transferred via transferAndCall method. Requires additional encoded data
    * @param _sender Original token sender
    * @param _value Tokens amount
    * @param _data Encoded additional data needed to initiate domain verification: `abi.encode(uint256 tokenId, string code)`
    */
    function onTokenTransfer(address _sender, uint256 _value, bytes calldata _data) external linkTokenOnly correctTokensAmount(_value) {
        (uint256 _tokenId, string memory _code) = abi.decode(_data, (uint256, string));
        require(registry.isApprovedOrOwner(_sender, _tokenId), "TwitterValidationOperator: SENDER_DOES_NOT_HAVE_ACCESS_TO_DOMAIN");
        require(bytes(_code).length > 0, "TwitterValidationOperator: CODE_IS_EMPTY");
        require(registry.isApprovedOrOwner(address(this), _tokenId), "TwitterValidationOperator: OPERATOR_SHOULD_BE_APPROVED");
        frozenTokens = frozenTokens.add(_value);
        userRequests[lastRequestId] = _value;

        emit ValidationRequest(_tokenId, registry.ownerOf(_tokenId), lastRequestId, _code);
        lastRequestId = lastRequestId.add(1);
    }

    /**
    * @notice Method returns available LINK tokens balance minus held tokens
    * @dev Returns tokens amount
    */
    function availableBalance() public view returns (uint256) {
        return linkToken.balanceOf(address(this)).sub(frozenTokens);
    }

    function calculatePaymentForValidation(uint256 _requestId) private returns (uint256 _paymentPerValidation) {
        if (_requestId > 0) {// Validation was requested from Smart Contract. We need to search for price in mapping
            _paymentPerValidation = userRequests[_requestId];
            frozenTokens = frozenTokens.sub(_paymentPerValidation);
            delete userRequests[_requestId];
        } else {
            _paymentPerValidation = operatorPaymentPerValidation;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IRegistry","name":"_registry","type":"address"},{"internalType":"contract LinkTokenInterface","name":"_linkToken","type":"address"},{"internalType":"address[]","name":"_paymentCappers","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"CapperAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"CapperRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"operatorPaymentPerValidation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userPaymentPerValidation","type":"uint256"}],"name":"PaymentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"}],"name":"Validation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"string","name":"code","type":"string"}],"name":"ValidationRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedRemoved","type":"event"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addCapper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"availableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canSetValidation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isCapper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operatorPaymentPerValidation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceCapper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_operatorPaymentPerValidation","type":"uint256"},{"internalType":"uint256","name":"_userPaymentPerValidation","type":"uint256"}],"name":"setPaymentPerValidation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_username","type":"string"},{"internalType":"string","name":"_signature","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"setValidation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"userPaymentPerValidation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"withdrawableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

608060405260016007553480156200001657600080fd5b50604051620031c9380380620031c983398181016040526200003c919081019062000733565b6200004d336200027060201b60201c565b6200005e33620002d160201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620000d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c89062000afe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000144576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013b9062000a76565b60405180910390fd5b60008151116200018b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001829062000aba565b60405180910390fd5b82600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008151905060008090505b818110156200025557620002478382815181106200023357fe5b60200260200101516200033260201b60201c565b808060010191505062000219565b50620002666200039960201b60201c565b5050505062000c54565b6200028b816000620003ac60201b6200142d1790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b620002ec816002620003ac60201b6200142d1790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167fa7555c95b69d4f5cc847881feb4ab2883a1921319e34fa2043747b793d65b36e60405160405180910390a250565b62000343336200045f60201b60201c565b62000385576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037c9062000b20565b60405180910390fd5b6200039681620002d160201b60201c565b50565b620003aa336200048360201b60201c565b565b620003be8282620004e460201b60201c565b1562000401576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f89062000a54565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006200047c826002620004e460201b620011451790919060201c565b9050919050565b6200049e816002620005af60201b620014d51790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f427400d279c506df610224b22ecce89b693fc1865864113f21c8d19c1f0c2a3b60405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000558576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200054f9062000adc565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620005c18282620004e460201b60201c565b62000603576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005fa9062000a98565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600081519050620006728162000c06565b92915050565b600082601f8301126200068a57600080fd5b8151620006a16200069b8262000b70565b62000b42565b91508181835260208401935060208101905083856020840282011115620006c757600080fd5b60005b83811015620006fb5781620006e0888262000661565b845260208401935060208301925050600181019050620006ca565b5050505092915050565b600081519050620007168162000c20565b92915050565b6000815190506200072d8162000c3a565b92915050565b6000806000606084860312156200074957600080fd5b6000620007598682870162000705565b93505060206200076c868287016200071c565b925050604084015167ffffffffffffffff8111156200078a57600080fd5b620007988682870162000678565b9150509250925092565b6000620007b1601f8362000b99565b91507f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006000830152602082019050919050565b6000620007f360358362000b99565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20494e56414c60008301527f49445f4c494e4b5f544f4b454e5f4144445245535300000000000000000000006020830152604082019050919050565b60006200085b60218362000b99565b91507f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000620008c3602e8362000b99565b91507f5477697474657256616c69646174696f6e4f70657261746f723a204e4f5f434160008301527f50504552535f50524f56494445440000000000000000000000000000000000006020830152604082019050919050565b60006200092b60228362000b99565b91507f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006200099360338362000b99565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20494e56414c60008301527f49445f52454749535452595f41444452455353000000000000000000000000006020830152604082019050919050565b6000620009fb60308362000b99565b91507f436170706572526f6c653a2063616c6c657220646f6573206e6f74206861766560008301527f207468652043617070657220726f6c65000000000000000000000000000000006020830152604082019050919050565b6000602082019050818103600083015262000a6f81620007a2565b9050919050565b6000602082019050818103600083015262000a9181620007e4565b9050919050565b6000602082019050818103600083015262000ab3816200084c565b9050919050565b6000602082019050818103600083015262000ad581620008b4565b9050919050565b6000602082019050818103600083015262000af7816200091c565b9050919050565b6000602082019050818103600083015262000b198162000984565b9050919050565b6000602082019050818103600083015262000b3b81620009ec565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000b6657600080fd5b8060405250919050565b600067ffffffffffffffff82111562000b8857600080fd5b602082029050602081019050919050565b600082825260208201905092915050565b600062000bb78262000be6565b9050919050565b600062000bcb8262000baa565b9050919050565b600062000bdf8262000baa565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b62000c118162000baa565b811462000c1d57600080fd5b50565b62000c2b8162000bbe565b811462000c3757600080fd5b50565b62000c458162000bd2565b811462000c5157600080fd5b50565b6125658062000c646000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80638dfbcf36116100b8578063c22739381161007c578063c227393814610300578063cb793ca21461031e578063d6cd94731461033c578063f3fef3a314610346578063f615dcd814610362578063ffa1ad741461037e57610137565b80638dfbcf361461025c578063a3f4df7e14610278578063a4c0ed3614610296578063ab2f0e51146102b2578063bb5f747b146102d057610137565b80634c5a628c116100ff5780634c5a628c146101f25780635d5576f8146101fc57806367a63119146102065780637362d9c8146102225780637fe0a6341461023e57610137565b806310154bad1461013c578063291d95491461015857806337cedfe51461017457806339564561146101925780633af32abf146101c2575b600080fd5b610156600480360361015191908101906116cd565b61039c565b005b610172600480360361016d91908101906116cd565b6103f0565b005b61017c610444565b6040516101899190612082565b60405180910390f35b6101ac60048036036101a791908101906116cd565b6104f5565b6040516101b99190612082565b60405180910390f35b6101dc60048036036101d791908101906116cd565b610512565b6040516101e99190612082565b60405180910390f35b6101fa61052f565b005b61020461053a565b005b610220600480360361021b9190810190611908565b610545565b005b61023c600480360361023791908101906116cd565b6105dc565b005b610246610630565b6040516102539190612329565b60405180910390f35b610276600480360361027191908101906116cd565b610636565b005b61028061068a565b60405161028d919061209d565b60405180910390f35b6102b060048036036102ab919081019061175b565b6106a6565b005b6102ba610b05565b6040516102c79190612329565b60405180910390f35b6102ea60048036036102e591908101906116cd565b610bcb565b6040516102f79190612082565b60405180910390f35b610308610be8565b6040516103159190612329565b60405180910390f35b610326610bee565b6040516103339190612329565b60405180910390f35b610344610bf4565b005b610360600480360361035b919081019061171f565b610bff565b005b61037c600480360361037791908101906117f0565b610d62565b005b610386611003565b604051610393919061209d565b60405180910390f35b6103a533610bcb565b6103e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103db90612269565b60405180910390fd5b6103ed8161103c565b50565b6103f933610bcb565b610438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042f90612269565b60405180910390fd5b61044181611096565b50565b600061044f33610512565b61048e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610485906122a9565b60405180910390fd5b6104a56003546005546110f090919063ffffffff16565b6104ad610b05565b10156104ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e590612229565b60405180910390fd5b6001905090565b600061050b82600261114590919063ffffffff16565b9050919050565b600061052882600161114590919063ffffffff16565b9050919050565b6105383361120d565b565b61054333611267565b565b61054e336104f5565b61058d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610584906122e9565b60405180910390fd5b81600381905550806004819055507f769ee4ccac1531bdb9405bbbafe6505e85c1a11f7d1e758cfcb9768651bcf9b56003546004546040516105d0929190612374565b60405180910390a15050565b6105e533610bcb565b610624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061b90612269565b60405180910390fd5b61062d816112c1565b50565b60055481565b61063f336104f5565b61067e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610675906122e9565b60405180910390fd5b6106878161131b565b50565b6040518060600160405280602581526020016124fe6025913981565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d90612289565b60405180910390fd5b82600454811461077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077290612164565b60405180910390fd5b60006060848461078e91908101906118b4565b91509150600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663430c208188846040518363ffffffff1660e01b81526004016107ef929190612059565b60206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061083f91908101906117c7565b61087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612309565b60405180910390fd5b60008151116108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b9906121a4565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663430c208130846040518363ffffffff1660e01b815260040161091f929190612059565b60206040518083038186803b15801561093757600080fd5b505afa15801561094b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061096f91908101906117c7565b6109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a5906122c9565b60405180910390fd5b6109c3866006546110f090919063ffffffff16565b6006819055508560086000600754815260200190815260200160002081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610a3e9190612329565b60206040518083038186803b158015610a5657600080fd5b505afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a8e91908101906116f6565b73ffffffffffffffffffffffffffffffffffffffff16827fc3394c5f6e735c734448afa55eefbce7fa2c55449859aa3f9ab1f6cc6f1922eb60075484604051610ad8929190612344565b60405180910390a3610af660016007546110f090919063ffffffff16565b60078190555050505050505050565b6000610bc6600654600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b68919061203e565b60206040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bb8919081019061188b565b61137590919063ffffffff16565b905090565b6000610be182600061114590919063ffffffff16565b9050919050565b60035481565b60045481565b610bfd33611096565b565b610c0833610bcb565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90612269565b60405180910390fd5b80806005541015610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490612144565b60405180910390fd5b610ca28260055461137590919063ffffffff16565b600581905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401610d05929190612059565b602060405180830381600087803b158015610d1f57600080fd5b505af1158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d5791908101906117c7565b610d5d57fe5b505050565b610d6b33610512565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da1906122a9565b60405180910390fd5b610dc16003546005546110f090919063ffffffff16565b610dc9610b05565b1015610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190612229565b60405180910390fd5b6000610e15826113cb565b9050610e2c816005546110f090919063ffffffff16565b6005819055506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3f9e4cb856040518263ffffffff1660e01b8152600401610e8f9190612329565b60206040518083038186803b158015610ea757600080fd5b505afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610edf91908101906116f6565b90508073ffffffffffffffffffffffffffffffffffffffff166347c816998989876040518463ffffffff1660e01b8152600401610f1e939291906120df565b600060405180830381600087803b158015610f3857600080fd5b505af1158015610f4c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166347c816998787876040518463ffffffff1660e01b8152600401610f8d939291906121e4565b600060405180830381600087803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b50505050837f64308d1f172ca5d2a008c997998c974d7bc7143d883024b4611ad01d01f424608484604051610ff1929190612374565b60405180910390a25050505050505050565b6040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b61105081600161142d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f60405160405180910390a250565b6110aa8160016114d590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b660405160405180910390a250565b60008082840190508381101561113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290612124565b60405180910390fd5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90612249565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112218160006114d590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b61127b8160026114d590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f427400d279c506df610224b22ecce89b693fc1865864113f21c8d19c1f0c2a3b60405160405180910390a250565b6112d581600061142d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b61132f81600261142d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa7555c95b69d4f5cc847881feb4ab2883a1921319e34fa2043747b793d65b36e60405160405180910390a250565b6000828211156113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190612184565b60405180910390fd5b600082840390508091505092915050565b60008082111561142257600860008381526020019081526020016000205490506114008160065461137590919063ffffffff16565b6006819055506008600083815260200190815260200160002060009055611428565b60035490505b919050565b6114378282611145565b15611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906120bf565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6114df8282611145565b61151e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611515906121c4565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008135905061158b816124b8565b92915050565b6000815190506115a0816124b8565b92915050565b6000815190506115b5816124cf565b92915050565b60008083601f8401126115cd57600080fd5b8235905067ffffffffffffffff8111156115e657600080fd5b6020830191508360018202830111156115fe57600080fd5b9250929050565b60008083601f84011261161757600080fd5b8235905067ffffffffffffffff81111561163057600080fd5b60208301915083600182028301111561164857600080fd5b9250929050565b600082601f83011261166057600080fd5b813561167361166e826123ca565b61239d565b9150808252602083016020830185838301111561168f57600080fd5b61169a838284612465565b50505092915050565b6000813590506116b2816124e6565b92915050565b6000815190506116c7816124e6565b92915050565b6000602082840312156116df57600080fd5b60006116ed8482850161157c565b91505092915050565b60006020828403121561170857600080fd5b600061171684828501611591565b91505092915050565b6000806040838503121561173257600080fd5b60006117408582860161157c565b9250506020611751858286016116a3565b9150509250929050565b6000806000806060858703121561177157600080fd5b600061177f8782880161157c565b9450506020611790878288016116a3565b935050604085013567ffffffffffffffff8111156117ad57600080fd5b6117b9878288016115bb565b925092505092959194509250565b6000602082840312156117d957600080fd5b60006117e7848285016115a6565b91505092915050565b6000806000806000806080878903121561180957600080fd5b600087013567ffffffffffffffff81111561182357600080fd5b61182f89828a01611605565b9650965050602087013567ffffffffffffffff81111561184e57600080fd5b61185a89828a01611605565b9450945050604061186d89828a016116a3565b925050606061187e89828a016116a3565b9150509295509295509295565b60006020828403121561189d57600080fd5b60006118ab848285016116b8565b91505092915050565b600080604083850312156118c757600080fd5b60006118d5858286016116a3565b925050602083013567ffffffffffffffff8111156118f257600080fd5b6118fe8582860161164f565b9150509250929050565b6000806040838503121561191b57600080fd5b6000611929858286016116a3565b925050602061193a858286016116a3565b9150509250929050565b61194d8161241d565b82525050565b61195c8161242f565b82525050565b600061196e838561240c565b935061197b838584612465565b611984836124a7565b840190509392505050565b600061199a82612401565b6119a4818561240c565b93506119b4818560208601612474565b6119bd816124a7565b840191505092915050565b60006119d3826123f6565b6119dd818561240c565b93506119ed818560208601612474565b6119f6816124a7565b840191505092915050565b6000611a0e601f8361240c565b91507f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006000830152602082019050919050565b6000611a4e60178361240c565b91507f736f6369616c2e747769747465722e757365726e616d650000000000000000006000830152602082019050919050565b6000611a8e601b8361240c565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000611ace60348361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20544f4f5f4d60008301527f414e595f544f4b454e535f5245515545535445440000000000000000000000006020830152604082019050919050565b6000611b3460328361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20494e434f5260008301527f524543545f544f4b454e535f414d4f554e5400000000000000000000000000006020830152604082019050919050565b6000611b9a601e8361240c565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000611bda60288361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20434f44455f60008301527f49535f454d5054590000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611c4060218361240c565b91507f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611ca660228361240c565b91507f76616c69646174696f6e2e736f6369616c2e747769747465722e757365726e6160008301527f6d650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d0c60408361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a204e4f545f4560008301527f4e4f5547485f544f4b454e535f4f4e5f434f4e54524143545f42414c414e43456020830152604082019050919050565b6000611d7260228361240c565b91507f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611dd860408361240c565b91507f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008301527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c656020830152604082019050919050565b6000611e3e60388361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a2043414e5f4360008301527f414c4c5f46524f4d5f4c494e4b5f544f4b454e5f4f4e4c5900000000000000006020830152604082019050919050565b6000611ea4603a8361240c565b91507f57686974656c6973746564526f6c653a2063616c6c657220646f6573206e6f7460008301527f2068617665207468652057686974656c697374656420726f6c650000000000006020830152604082019050919050565b6000611f0a60368361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a204f5045524160008301527f544f525f53484f554c445f42455f415050524f564544000000000000000000006020830152604082019050919050565b6000611f7060308361240c565b91507f436170706572526f6c653a2063616c6c657220646f6573206e6f74206861766560008301527f207468652043617070657220726f6c65000000000000000000000000000000006020830152604082019050919050565b6000611fd660408361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a2053454e444560008301527f525f444f45535f4e4f545f484156455f4143434553535f544f5f444f4d41494e6020830152604082019050919050565b6120388161245b565b82525050565b60006020820190506120536000830184611944565b92915050565b600060408201905061206e6000830185611944565b61207b602083018461202f565b9392505050565b60006020820190506120976000830184611953565b92915050565b600060208201905081810360008301526120b781846119c8565b905092915050565b600060208201905081810360008301526120d881611a01565b9050919050565b600060608201905081810360008301526120f881611a41565b9050818103602083015261210d818587611962565b905061211c604083018461202f565b949350505050565b6000602082019050818103600083015261213d81611a81565b9050919050565b6000602082019050818103600083015261215d81611ac1565b9050919050565b6000602082019050818103600083015261217d81611b27565b9050919050565b6000602082019050818103600083015261219d81611b8d565b9050919050565b600060208201905081810360008301526121bd81611bcd565b9050919050565b600060208201905081810360008301526121dd81611c33565b9050919050565b600060608201905081810360008301526121fd81611c99565b90508181036020830152612212818587611962565b9050612221604083018461202f565b949350505050565b6000602082019050818103600083015261224281611cff565b9050919050565b6000602082019050818103600083015261226281611d65565b9050919050565b6000602082019050818103600083015261228281611dcb565b9050919050565b600060208201905081810360008301526122a281611e31565b9050919050565b600060208201905081810360008301526122c281611e97565b9050919050565b600060208201905081810360008301526122e281611efd565b9050919050565b6000602082019050818103600083015261230281611f63565b9050919050565b6000602082019050818103600083015261232281611fc9565b9050919050565b600060208201905061233e600083018461202f565b92915050565b6000604082019050612359600083018561202f565b818103602083015261236b818461198f565b90509392505050565b6000604082019050612389600083018561202f565b612396602083018461202f565b9392505050565b6000604051905081810181811067ffffffffffffffff821117156123c057600080fd5b8060405250919050565b600067ffffffffffffffff8211156123e157600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b60006124288261243b565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612492578082015181840152602081019050612477565b838111156124a1576000848401525b50505050565b6000601f19601f8301169050919050565b6124c18161241d565b81146124cc57600080fd5b50565b6124d88161242f565b81146124e357600080fd5b50565b6124ef8161245b565b81146124fa57600080fd5b5056fe436861696e6c696e6b20547769747465722056616c69646174696f6e204f70657261746f72a365627a7a723158206dc5865dec1e85cab5d34bc96037f289720ae15bb37b90f483e4b4b6f0839ef26c6578706572696d656e74616cf564736f6c634300050c0040000000000000000000000000d1e5b0ff1287aa9f9a268759062e4ab08b9dacbe000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d67a6512c5fce7830629e1f3d067115b57fdb333000000000000000000000000c2cc046e7f4f7a3e9715a853fc54907c12364b6b

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c80638dfbcf36116100b8578063c22739381161007c578063c227393814610300578063cb793ca21461031e578063d6cd94731461033c578063f3fef3a314610346578063f615dcd814610362578063ffa1ad741461037e57610137565b80638dfbcf361461025c578063a3f4df7e14610278578063a4c0ed3614610296578063ab2f0e51146102b2578063bb5f747b146102d057610137565b80634c5a628c116100ff5780634c5a628c146101f25780635d5576f8146101fc57806367a63119146102065780637362d9c8146102225780637fe0a6341461023e57610137565b806310154bad1461013c578063291d95491461015857806337cedfe51461017457806339564561146101925780633af32abf146101c2575b600080fd5b610156600480360361015191908101906116cd565b61039c565b005b610172600480360361016d91908101906116cd565b6103f0565b005b61017c610444565b6040516101899190612082565b60405180910390f35b6101ac60048036036101a791908101906116cd565b6104f5565b6040516101b99190612082565b60405180910390f35b6101dc60048036036101d791908101906116cd565b610512565b6040516101e99190612082565b60405180910390f35b6101fa61052f565b005b61020461053a565b005b610220600480360361021b9190810190611908565b610545565b005b61023c600480360361023791908101906116cd565b6105dc565b005b610246610630565b6040516102539190612329565b60405180910390f35b610276600480360361027191908101906116cd565b610636565b005b61028061068a565b60405161028d919061209d565b60405180910390f35b6102b060048036036102ab919081019061175b565b6106a6565b005b6102ba610b05565b6040516102c79190612329565b60405180910390f35b6102ea60048036036102e591908101906116cd565b610bcb565b6040516102f79190612082565b60405180910390f35b610308610be8565b6040516103159190612329565b60405180910390f35b610326610bee565b6040516103339190612329565b60405180910390f35b610344610bf4565b005b610360600480360361035b919081019061171f565b610bff565b005b61037c600480360361037791908101906117f0565b610d62565b005b610386611003565b604051610393919061209d565b60405180910390f35b6103a533610bcb565b6103e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103db90612269565b60405180910390fd5b6103ed8161103c565b50565b6103f933610bcb565b610438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042f90612269565b60405180910390fd5b61044181611096565b50565b600061044f33610512565b61048e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610485906122a9565b60405180910390fd5b6104a56003546005546110f090919063ffffffff16565b6104ad610b05565b10156104ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e590612229565b60405180910390fd5b6001905090565b600061050b82600261114590919063ffffffff16565b9050919050565b600061052882600161114590919063ffffffff16565b9050919050565b6105383361120d565b565b61054333611267565b565b61054e336104f5565b61058d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610584906122e9565b60405180910390fd5b81600381905550806004819055507f769ee4ccac1531bdb9405bbbafe6505e85c1a11f7d1e758cfcb9768651bcf9b56003546004546040516105d0929190612374565b60405180910390a15050565b6105e533610bcb565b610624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061b90612269565b60405180910390fd5b61062d816112c1565b50565b60055481565b61063f336104f5565b61067e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610675906122e9565b60405180910390fd5b6106878161131b565b50565b6040518060600160405280602581526020016124fe6025913981565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d90612289565b60405180910390fd5b82600454811461077b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077290612164565b60405180910390fd5b60006060848461078e91908101906118b4565b91509150600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663430c208188846040518363ffffffff1660e01b81526004016107ef929190612059565b60206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061083f91908101906117c7565b61087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612309565b60405180910390fd5b60008151116108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b9906121a4565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663430c208130846040518363ffffffff1660e01b815260040161091f929190612059565b60206040518083038186803b15801561093757600080fd5b505afa15801561094b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061096f91908101906117c7565b6109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a5906122c9565b60405180910390fd5b6109c3866006546110f090919063ffffffff16565b6006819055508560086000600754815260200190815260200160002081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610a3e9190612329565b60206040518083038186803b158015610a5657600080fd5b505afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a8e91908101906116f6565b73ffffffffffffffffffffffffffffffffffffffff16827fc3394c5f6e735c734448afa55eefbce7fa2c55449859aa3f9ab1f6cc6f1922eb60075484604051610ad8929190612344565b60405180910390a3610af660016007546110f090919063ffffffff16565b60078190555050505050505050565b6000610bc6600654600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b68919061203e565b60206040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bb8919081019061188b565b61137590919063ffffffff16565b905090565b6000610be182600061114590919063ffffffff16565b9050919050565b60035481565b60045481565b610bfd33611096565b565b610c0833610bcb565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90612269565b60405180910390fd5b80806005541015610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490612144565b60405180910390fd5b610ca28260055461137590919063ffffffff16565b600581905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401610d05929190612059565b602060405180830381600087803b158015610d1f57600080fd5b505af1158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d5791908101906117c7565b610d5d57fe5b505050565b610d6b33610512565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da1906122a9565b60405180910390fd5b610dc16003546005546110f090919063ffffffff16565b610dc9610b05565b1015610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190612229565b60405180910390fd5b6000610e15826113cb565b9050610e2c816005546110f090919063ffffffff16565b6005819055506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3f9e4cb856040518263ffffffff1660e01b8152600401610e8f9190612329565b60206040518083038186803b158015610ea757600080fd5b505afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610edf91908101906116f6565b90508073ffffffffffffffffffffffffffffffffffffffff166347c816998989876040518463ffffffff1660e01b8152600401610f1e939291906120df565b600060405180830381600087803b158015610f3857600080fd5b505af1158015610f4c573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166347c816998787876040518463ffffffff1660e01b8152600401610f8d939291906121e4565b600060405180830381600087803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b50505050837f64308d1f172ca5d2a008c997998c974d7bc7143d883024b4611ad01d01f424608484604051610ff1929190612374565b60405180910390a25050505050505050565b6040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b61105081600161142d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f60405160405180910390a250565b6110aa8160016114d590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b660405160405180910390a250565b60008082840190508381101561113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290612124565b60405180910390fd5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90612249565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112218160006114d590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b61127b8160026114d590919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f427400d279c506df610224b22ecce89b693fc1865864113f21c8d19c1f0c2a3b60405160405180910390a250565b6112d581600061142d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b61132f81600261142d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa7555c95b69d4f5cc847881feb4ab2883a1921319e34fa2043747b793d65b36e60405160405180910390a250565b6000828211156113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190612184565b60405180910390fd5b600082840390508091505092915050565b60008082111561142257600860008381526020019081526020016000205490506114008160065461137590919063ffffffff16565b6006819055506008600083815260200190815260200160002060009055611428565b60035490505b919050565b6114378282611145565b15611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906120bf565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6114df8282611145565b61151e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611515906121c4565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008135905061158b816124b8565b92915050565b6000815190506115a0816124b8565b92915050565b6000815190506115b5816124cf565b92915050565b60008083601f8401126115cd57600080fd5b8235905067ffffffffffffffff8111156115e657600080fd5b6020830191508360018202830111156115fe57600080fd5b9250929050565b60008083601f84011261161757600080fd5b8235905067ffffffffffffffff81111561163057600080fd5b60208301915083600182028301111561164857600080fd5b9250929050565b600082601f83011261166057600080fd5b813561167361166e826123ca565b61239d565b9150808252602083016020830185838301111561168f57600080fd5b61169a838284612465565b50505092915050565b6000813590506116b2816124e6565b92915050565b6000815190506116c7816124e6565b92915050565b6000602082840312156116df57600080fd5b60006116ed8482850161157c565b91505092915050565b60006020828403121561170857600080fd5b600061171684828501611591565b91505092915050565b6000806040838503121561173257600080fd5b60006117408582860161157c565b9250506020611751858286016116a3565b9150509250929050565b6000806000806060858703121561177157600080fd5b600061177f8782880161157c565b9450506020611790878288016116a3565b935050604085013567ffffffffffffffff8111156117ad57600080fd5b6117b9878288016115bb565b925092505092959194509250565b6000602082840312156117d957600080fd5b60006117e7848285016115a6565b91505092915050565b6000806000806000806080878903121561180957600080fd5b600087013567ffffffffffffffff81111561182357600080fd5b61182f89828a01611605565b9650965050602087013567ffffffffffffffff81111561184e57600080fd5b61185a89828a01611605565b9450945050604061186d89828a016116a3565b925050606061187e89828a016116a3565b9150509295509295509295565b60006020828403121561189d57600080fd5b60006118ab848285016116b8565b91505092915050565b600080604083850312156118c757600080fd5b60006118d5858286016116a3565b925050602083013567ffffffffffffffff8111156118f257600080fd5b6118fe8582860161164f565b9150509250929050565b6000806040838503121561191b57600080fd5b6000611929858286016116a3565b925050602061193a858286016116a3565b9150509250929050565b61194d8161241d565b82525050565b61195c8161242f565b82525050565b600061196e838561240c565b935061197b838584612465565b611984836124a7565b840190509392505050565b600061199a82612401565b6119a4818561240c565b93506119b4818560208601612474565b6119bd816124a7565b840191505092915050565b60006119d3826123f6565b6119dd818561240c565b93506119ed818560208601612474565b6119f6816124a7565b840191505092915050565b6000611a0e601f8361240c565b91507f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006000830152602082019050919050565b6000611a4e60178361240c565b91507f736f6369616c2e747769747465722e757365726e616d650000000000000000006000830152602082019050919050565b6000611a8e601b8361240c565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000611ace60348361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20544f4f5f4d60008301527f414e595f544f4b454e535f5245515545535445440000000000000000000000006020830152604082019050919050565b6000611b3460328361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20494e434f5260008301527f524543545f544f4b454e535f414d4f554e5400000000000000000000000000006020830152604082019050919050565b6000611b9a601e8361240c565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b6000611bda60288361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a20434f44455f60008301527f49535f454d5054590000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611c4060218361240c565b91507f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611ca660228361240c565b91507f76616c69646174696f6e2e736f6369616c2e747769747465722e757365726e6160008301527f6d650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611d0c60408361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a204e4f545f4560008301527f4e4f5547485f544f4b454e535f4f4e5f434f4e54524143545f42414c414e43456020830152604082019050919050565b6000611d7260228361240c565b91507f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611dd860408361240c565b91507f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008301527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c656020830152604082019050919050565b6000611e3e60388361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a2043414e5f4360008301527f414c4c5f46524f4d5f4c494e4b5f544f4b454e5f4f4e4c5900000000000000006020830152604082019050919050565b6000611ea4603a8361240c565b91507f57686974656c6973746564526f6c653a2063616c6c657220646f6573206e6f7460008301527f2068617665207468652057686974656c697374656420726f6c650000000000006020830152604082019050919050565b6000611f0a60368361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a204f5045524160008301527f544f525f53484f554c445f42455f415050524f564544000000000000000000006020830152604082019050919050565b6000611f7060308361240c565b91507f436170706572526f6c653a2063616c6c657220646f6573206e6f74206861766560008301527f207468652043617070657220726f6c65000000000000000000000000000000006020830152604082019050919050565b6000611fd660408361240c565b91507f5477697474657256616c69646174696f6e4f70657261746f723a2053454e444560008301527f525f444f45535f4e4f545f484156455f4143434553535f544f5f444f4d41494e6020830152604082019050919050565b6120388161245b565b82525050565b60006020820190506120536000830184611944565b92915050565b600060408201905061206e6000830185611944565b61207b602083018461202f565b9392505050565b60006020820190506120976000830184611953565b92915050565b600060208201905081810360008301526120b781846119c8565b905092915050565b600060208201905081810360008301526120d881611a01565b9050919050565b600060608201905081810360008301526120f881611a41565b9050818103602083015261210d818587611962565b905061211c604083018461202f565b949350505050565b6000602082019050818103600083015261213d81611a81565b9050919050565b6000602082019050818103600083015261215d81611ac1565b9050919050565b6000602082019050818103600083015261217d81611b27565b9050919050565b6000602082019050818103600083015261219d81611b8d565b9050919050565b600060208201905081810360008301526121bd81611bcd565b9050919050565b600060208201905081810360008301526121dd81611c33565b9050919050565b600060608201905081810360008301526121fd81611c99565b90508181036020830152612212818587611962565b9050612221604083018461202f565b949350505050565b6000602082019050818103600083015261224281611cff565b9050919050565b6000602082019050818103600083015261226281611d65565b9050919050565b6000602082019050818103600083015261228281611dcb565b9050919050565b600060208201905081810360008301526122a281611e31565b9050919050565b600060208201905081810360008301526122c281611e97565b9050919050565b600060208201905081810360008301526122e281611efd565b9050919050565b6000602082019050818103600083015261230281611f63565b9050919050565b6000602082019050818103600083015261232281611fc9565b9050919050565b600060208201905061233e600083018461202f565b92915050565b6000604082019050612359600083018561202f565b818103602083015261236b818461198f565b90509392505050565b6000604082019050612389600083018561202f565b612396602083018461202f565b9392505050565b6000604051905081810181811067ffffffffffffffff821117156123c057600080fd5b8060405250919050565b600067ffffffffffffffff8211156123e157600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b60006124288261243b565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612492578082015181840152602081019050612477565b838111156124a1576000848401525b50505050565b6000601f19601f8301169050919050565b6124c18161241d565b81146124cc57600080fd5b50565b6124d88161242f565b81146124e357600080fd5b50565b6124ef8161245b565b81146124fa57600080fd5b5056fe436861696e6c696e6b20547769747465722056616c69646174696f6e204f70657261746f72a365627a7a723158206dc5865dec1e85cab5d34bc96037f289720ae15bb37b90f483e4b4b6f0839ef26c6578706572696d656e74616cf564736f6c634300050c0040

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

000000000000000000000000d1e5b0ff1287aa9f9a268759062e4ab08b9dacbe000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d67a6512c5fce7830629e1f3d067115b57fdb333000000000000000000000000c2cc046e7f4f7a3e9715a853fc54907c12364b6b

-----Decoded View---------------
Arg [0] : _registry (address): 0xD1E5b0FF1287aA9f9A268759062E4Ab08b9Dacbe
Arg [1] : _linkToken (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [2] : _paymentCappers (address[]): 0xd67a6512C5FCE7830629e1F3D067115B57fDB333,0xc2cC046e7F4f7A3e9715A853Fc54907c12364b6B

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000d1e5b0ff1287aa9f9a268759062e4ab08b9dacbe
Arg [1] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000d67a6512c5fce7830629e1f3d067115b57fdb333
Arg [5] : 000000000000000000000000c2cc046e7f4f7a3e9715a853fc54907c12364b6b


Deployed Bytecode Sourcemap

22255:8049:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22255:8049:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3413:110;;;;;;;;;;;;;;;;:::i;:::-;;3531:116;;;;;;;;;;;;;;;;:::i;:::-;;26810:123;;;:::i;:::-;;;;;;;;;;;;;;;;4555:109;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3286:119;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2048:93;;;:::i;:::-;;4772:77;;;:::i;:::-;;27384:351;;;;;;;;;;;;;;;;:::i;:::-;;1924:116;;;;;;;;;;;;;;;;:::i;:::-;;22897:33;;;:::i;:::-;;;;;;;;;;;;;;;;4672:92;;;;;;;;;;;;;;;;:::i;:::-;;22344:69;;;:::i;:::-;;;;;;;;;;;;;;;;28697:816;;;;;;;;;;;;;;;;:::i;:::-;;29650:136;;;:::i;:::-;;;;;;;;;;;;;;;;1791:125;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22801:43;;;:::i;:::-;;;;;;;;;;;;;;;;22851:39;;;:::i;:::-;;;;;;;;;;;;;;;;3655:87;;;:::i;:::-;;28067:239;;;;;;;;;;;;;;;;:::i;:::-;;26073:603;;;;;;;;;;;;;;;;:::i;:::-;;22420:40;;;:::i;:::-;;;;;;;;;;;;;;;;3413:110;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;;;;;;;;;;;;;;;;;;;3491:24;3507:7;3491:15;:24::i;:::-;3413:110;:::o;3531:116::-;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;;;;;;;;;;;;;;;;;;;3612:27;3631:7;3612:18;:27::i;:::-;3531:116;:::o;26810:123::-;26897:4;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;;;;;;;;;;;;;;;;;;;24818:52;24841:28;;24818:18;;:22;;:52;;;;:::i;:::-;24796:18;:16;:18::i;:::-;:74;;24774:188;;;;;;;;;;;;;;;;;;;;;;26921:4;26914:11;;26810:123;:::o;4555:109::-;4611:4;4635:21;4648:7;4635:8;:12;;:21;;;;:::i;:::-;4628:28;;4555:109;;;:::o;3286:119::-;3347:4;3371:26;3389:7;3371:13;:17;;:26;;;;:::i;:::-;3364:33;;3286:119;;;:::o;2048:93::-;2100:33;2122:10;2100:21;:33::i;:::-;2048:93::o;4772:77::-;4816:25;4830:10;4816:13;:25::i;:::-;4772:77::o;27384:351::-;4454:20;4463:10;4454:8;:20::i;:::-;4446:81;;;;;;;;;;;;;;;;;;;;;;27553:29;27522:28;:60;;;;27620:25;27593:24;:52;;;;27661:66;27672:28;;27702:24;;27661:66;;;;;;;;;;;;;;;;27384:351;;:::o;1924:116::-;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;;;;;;;;;;;;;;;;;;;2005:27;2024:7;2005:18;:27::i;:::-;1924:116;:::o;22897:33::-;;;;:::o;4672:92::-;4454:20;4463:10;4454:8;:20::i;:::-;4446:81;;;;;;;;;;;;;;;;;;;;;;4737:19;4748:7;4737:10;:19::i;:::-;4672:92;:::o;22344:69::-;;;;;;;;;;;;;;;;;;;:::o;28697:816::-;25141:9;;;;;;;;;;;25119:32;;:10;:32;;;25111:101;;;;;;;;;;;;;;;;;;;;;;28820:6;25398:24;;25388:6;:34;25380:97;;;;;;;;;;;;;;;;;;;;;;28840:16;28858:19;28892:5;;28881:36;;;;;;;;;28839:78;;;;28936:8;;;;;;;;;;;:26;;;28963:7;28972:8;28936:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28936:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28936:45: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;28936:45:0;;;;;;;;;28928:122;;;;;;;;;;;;;;;;;;;;;;29091:1;29075:5;29069:19;:23;29061:76;;;;;;;;;;;;;;;;;;;;;;29156:8;;;;;;;;;;;:26;;;29191:4;29198:8;29156:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29156:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29156:51: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;29156:51:0;;;;;;;;;29148:118;;;;;;;;;;;;;;;;;;;;;;29292:24;29309:6;29292:12;;:16;;:24;;;;:::i;:::-;29277:12;:39;;;;29357:6;29327:12;:27;29340:13;;29327:27;;;;;;;;;;;:36;;;;29409:8;;;;;;;;;;;:16;;;29426:8;29409:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29409:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29409:26: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;29409:26:0;;;;;;;;;29381:77;;29399:8;29381:77;29437:13;;29452:5;29381:77;;;;;;;;;;;;;;;;29485:20;29503:1;29485:13;;:17;;:20;;;;:::i;:::-;29469:13;:36;;;;25488:1;;25223;28697:816;;;;:::o;29650:136::-;29699:7;29726:52;29765:12;;29726:9;;;;;;;;;;;:19;;;29754:4;29726:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29726:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29726:34: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;29726:34:0;;;;;;;;;:38;;:52;;;;:::i;:::-;29719:59;;29650:136;:::o;1791:125::-;1855:4;1879:29;1900:7;1879:16;:20;;:29;;;;:::i;:::-;1872:36;;1791:125;;;:::o;22801:43::-;;;;:::o;22851:39::-;;;;:::o;3655:87::-;3704:30;3723:10;3704:18;:30::i;:::-;3655:87::o;28067:239::-;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;;;;;;;;;;;;;;;;;;;28168:7;24534;24512:18;;:29;;24504:94;;;;;;;;;;;;;;;;;;;;;;28209:31;28232:7;28209:18;;:22;;:31;;;;:::i;:::-;28188:18;:52;;;;28258:9;;;;;;;;;;;:18;;;28277:10;28289:7;28258:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28258:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28258:39: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;28258:39:0;;;;;;;;;28251:47;;;;1774:1;28067:239;;:::o;26073:603::-;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;;;;;;;;;;;;;;;;;;;24818:52;24841:28;;24818:18;;:22;;:52;;;;:::i;:::-;24796:18;:16;:18::i;:::-;:74;;24774:188;;;;;;;;;;;;;;;;;;;;;;26260:16;26279:41;26309:10;26279:29;:41::i;:::-;26260:60;;26352:32;26375:8;26352:18;;:22;;:32;;;;:::i;:::-;26331:18;:53;;;;26395:18;26426:8;;;;;;;;;;;:19;;;26446:8;26426:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26426:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26426:29: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;26426:29:0;;;;;;;;;26395:61;;26467:8;:12;;;26507:9;;26518:8;26467:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26467:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26467:60:0;;;;26538:8;:12;;;26589:10;;26601:8;26538:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26538:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26538:72:0;;;;26637:8;26626:42;26647:10;26659:8;26626:42;;;;;;;;;;;;;;;;24973:1;;26073:603;;;;;;:::o;22420:40::-;;;;;;;;;;;;;;;;;;;:::o;3750:137::-;3812:26;3830:7;3812:13;:17;;:26;;;;:::i;:::-;3871:7;3854:25;;;;;;;;;;;;3750:137;:::o;3895:145::-;3960:29;3981:7;3960:13;:20;;:29;;;;:::i;:::-;4024:7;4005:27;;;;;;;;;;;;3895:145;:::o;6037:181::-;6095:7;6115:9;6131:1;6127;:5;6115:17;;6156:1;6151;:6;;6143:46;;;;;;;;;;;;;;;;;;;;;;6209:1;6202:8;;;6037:181;;;;:::o;863:203::-;935:4;979:1;960:21;;:7;:21;;;;952:68;;;;;;;;;;;;;;;;;;;;;;1038:4;:11;;:20;1050:7;1038:20;;;;;;;;;;;;;;;;;;;;;;;;;1031:27;;863:203;;;;:::o;2303:154::-;2371:32;2395:7;2371:16;:23;;:32;;;;:::i;:::-;2441:7;2419:30;;;;;;;;;;;;2303:154;:::o;4987:130::-;5047:24;5063:7;5047:8;:15;;:24;;;;:::i;:::-;5101:7;5087:22;;;;;;;;;;;;4987:130;:::o;2149:146::-;2214:29;2235:7;2214:16;:20;;:29;;;;:::i;:::-;2279:7;2259:28;;;;;;;;;;;;2149:146;:::o;4857:122::-;4914:21;4927:7;4914:8;:12;;:21;;;;:::i;:::-;4963:7;4951:20;;;;;;;;;;;;4857:122;:::o;6493:184::-;6551:7;6584:1;6579;:6;;6571:49;;;;;;;;;;;;;;;;;;;;;;6631:9;6647:1;6643;:5;6631:17;;6668:1;6661:8;;;6493:184;;;;:::o;29794:507::-;29870:29;29929:1;29916:10;:14;29912:382;;;30058:12;:24;30071:10;30058:24;;;;;;;;;;;;30034:48;;30112:39;30129:21;30112:12;;:16;;:39;;;;:::i;:::-;30097:12;:54;;;;30173:12;:24;30186:10;30173:24;;;;;;;;;;;30166:31;;;29912:382;;;30254:28;;30230:52;;29912:382;29794:507;;;:::o;327:178::-;405:18;409:4;415:7;405:3;:18::i;:::-;404:19;396:63;;;;;;;;;;;;;;;;;;;;;;493:4;470;:11;;:20;482:7;470:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;327:178;;:::o;585:183::-;665:18;669:4;675:7;665:3;:18::i;:::-;657:64;;;;;;;;;;;;;;;;;;;;;;755:5;732:4;:11;;:20;744:7;732:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;585:183;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;283:128;;364:6;358:13;349:22;;376:30;400:5;376:30;;;343:68;;;;;432:335;;;546:3;539:4;531:6;527:17;523:27;513:2;;564:1;561;554:12;513:2;597:6;584:20;574:30;;624:18;616:6;613:30;610:2;;;656:1;653;646:12;610:2;690:4;682:6;678:17;666:29;;740:3;733;725:6;721:16;711:8;707:31;704:40;701:2;;;757:1;754;747:12;701:2;506:261;;;;;;790:336;;;905:3;898:4;890:6;886:17;882:27;872:2;;923:1;920;913:12;872:2;956:6;943:20;933:30;;983:18;975:6;972:30;969:2;;;1015:1;1012;1005:12;969:2;1049:4;1041:6;1037:17;1025:29;;1099:3;1092;1084:6;1080:16;1070:8;1066:31;1063:40;1060:2;;;1116:1;1113;1106:12;1060:2;865:261;;;;;;1135:434;;1233:3;1226:4;1218:6;1214:17;1210:27;1200:2;;1251:1;1248;1241:12;1200:2;1288:6;1275:20;1310:61;1325:45;1363:6;1325:45;;;1310:61;;;1301:70;;1391:6;1384:5;1377:21;1427:4;1419:6;1415:17;1460:4;1453:5;1449:16;1495:3;1486:6;1481:3;1477:16;1474:25;1471:2;;;1512:1;1509;1502:12;1471:2;1522:41;1556:6;1551:3;1546;1522:41;;;1193:376;;;;;;;;1577:130;;1657:6;1644:20;1635:29;;1669:33;1696:5;1669:33;;;1629:78;;;;;1714:134;;1798:6;1792:13;1783:22;;1810:33;1837:5;1810:33;;;1777:71;;;;;1855:241;;1959:2;1947:9;1938:7;1934:23;1930:32;1927:2;;;1975:1;1972;1965:12;1927:2;2010:1;2027:53;2072:7;2063:6;2052:9;2048:22;2027:53;;;2017:63;;1989:97;1921:175;;;;;2103:263;;2218:2;2206:9;2197:7;2193:23;2189:32;2186:2;;;2234:1;2231;2224:12;2186:2;2269:1;2286:64;2342:7;2333:6;2322:9;2318:22;2286:64;;;2276:74;;2248:108;2180:186;;;;;2373:366;;;2494:2;2482:9;2473:7;2469:23;2465:32;2462:2;;;2510:1;2507;2500:12;2462:2;2545:1;2562:53;2607:7;2598:6;2587:9;2583:22;2562:53;;;2552:63;;2524:97;2652:2;2670:53;2715:7;2706:6;2695:9;2691:22;2670:53;;;2660:63;;2631:98;2456:283;;;;;;2746:615;;;;;2903:2;2891:9;2882:7;2878:23;2874:32;2871:2;;;2919:1;2916;2909:12;2871:2;2954:1;2971:53;3016:7;3007:6;2996:9;2992:22;2971:53;;;2961:63;;2933:97;3061:2;3079:53;3124:7;3115:6;3104:9;3100:22;3079:53;;;3069:63;;3040:98;3197:2;3186:9;3182:18;3169:32;3221:18;3213:6;3210:30;3207:2;;;3253:1;3250;3243:12;3207:2;3281:64;3337:7;3328:6;3317:9;3313:22;3281:64;;;3271:74;;;;3148:203;2865:496;;;;;;;;3368:257;;3480:2;3468:9;3459:7;3455:23;3451:32;3448:2;;;3496:1;3493;3486:12;3448:2;3531:1;3548:61;3601:7;3592:6;3581:9;3577:22;3548:61;;;3538:71;;3510:105;3442:183;;;;;3632:869;;;;;;;3827:3;3815:9;3806:7;3802:23;3798:33;3795:2;;;3844:1;3841;3834:12;3795:2;3907:1;3896:9;3892:17;3879:31;3930:18;3922:6;3919:30;3916:2;;;3962:1;3959;3952:12;3916:2;3990:65;4047:7;4038:6;4027:9;4023:22;3990:65;;;3980:75;;;;3858:203;4120:2;4109:9;4105:18;4092:32;4144:18;4136:6;4133:30;4130:2;;;4176:1;4173;4166:12;4130:2;4204:65;4261:7;4252:6;4241:9;4237:22;4204:65;;;4194:75;;;;4071:204;4306:2;4324:53;4369:7;4360:6;4349:9;4345:22;4324:53;;;4314:63;;4285:98;4414:2;4432:53;4477:7;4468:6;4457:9;4453:22;4432:53;;;4422:63;;4393:98;3789:712;;;;;;;;;4508:263;;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4674:1;4691:64;4747:7;4738:6;4727:9;4723:22;4691:64;;;4681:74;;4653:108;4585:186;;;;;4778:464;;;4905:2;4893:9;4884:7;4880:23;4876:32;4873:2;;;4921:1;4918;4911:12;4873:2;4956:1;4973:53;5018:7;5009:6;4998:9;4994:22;4973:53;;;4963:63;;4935:97;5091:2;5080:9;5076:18;5063:32;5115:18;5107:6;5104:30;5101:2;;;5147:1;5144;5137:12;5101:2;5167:59;5218:7;5209:6;5198:9;5194:22;5167:59;;;5157:69;;5042:190;4867:375;;;;;;5249:366;;;5370:2;5358:9;5349:7;5345:23;5341:32;5338:2;;;5386:1;5383;5376:12;5338:2;5421:1;5438:53;5483:7;5474:6;5463:9;5459:22;5438:53;;;5428:63;;5400:97;5528:2;5546:53;5591:7;5582:6;5571:9;5567:22;5546:53;;;5536:63;;5507:98;5332:283;;;;;;5622:113;5705:24;5723:5;5705:24;;;5700:3;5693:37;5687:48;;;5742:104;5819:21;5834:5;5819:21;;;5814:3;5807:34;5801:45;;;5878:300;;5994:71;6058:6;6053:3;5994:71;;;5987:78;;6077:43;6113:6;6108:3;6101:5;6077:43;;;6142:29;6164:6;6142:29;;;6137:3;6133:39;6126:46;;5980:198;;;;;;6186:347;;6298:39;6331:5;6298:39;;;6349:71;6413:6;6408:3;6349:71;;;6342:78;;6425:52;6470:6;6465:3;6458:4;6451:5;6447:16;6425:52;;;6498:29;6520:6;6498:29;;;6493:3;6489:39;6482:46;;6278:255;;;;;;6540:339;;6648:35;6677:5;6648:35;;;6695:71;6759:6;6754:3;6695:71;;;6688:78;;6771:52;6816:6;6811:3;6804:4;6797:5;6793:16;6771:52;;;6844:29;6866:6;6844:29;;;6839:3;6835:39;6828:46;;6628:251;;;;;;6887:364;;7047:67;7111:2;7106:3;7047:67;;;7040:74;;7147:66;7143:1;7138:3;7134:11;7127:87;7242:2;7237:3;7233:12;7226:19;;7033:218;;;;7260:364;;7420:67;7484:2;7479:3;7420:67;;;7413:74;;7520:66;7516:1;7511:3;7507:11;7500:87;7615:2;7610:3;7606:12;7599:19;;7406:218;;;;7633:364;;7793:67;7857:2;7852:3;7793:67;;;7786:74;;7893:66;7889:1;7884:3;7880:11;7873:87;7988:2;7983:3;7979:12;7972:19;;7779:218;;;;8006:465;;8166:67;8230:2;8225:3;8166:67;;;8159:74;;8266:66;8262:1;8257:3;8253:11;8246:87;8367:66;8362:2;8357:3;8353:12;8346:88;8462:2;8457:3;8453:12;8446:19;;8152:319;;;;8480:465;;8640:67;8704:2;8699:3;8640:67;;;8633:74;;8740:66;8736:1;8731:3;8727:11;8720:87;8841:66;8836:2;8831:3;8827:12;8820:88;8936:2;8931:3;8927:12;8920:19;;8626:319;;;;8954:364;;9114:67;9178:2;9173:3;9114:67;;;9107:74;;9214:66;9210:1;9205:3;9201:11;9194:87;9309:2;9304:3;9300:12;9293:19;;9100:218;;;;9327:465;;9487:67;9551:2;9546:3;9487:67;;;9480:74;;9587:66;9583:1;9578:3;9574:11;9567:87;9688:66;9683:2;9678:3;9674:12;9667:88;9783:2;9778:3;9774:12;9767:19;;9473:319;;;;9801:465;;9961:67;10025:2;10020:3;9961:67;;;9954:74;;10061:66;10057:1;10052:3;10048:11;10041:87;10162:66;10157:2;10152:3;10148:12;10141:88;10257:2;10252:3;10248:12;10241:19;;9947:319;;;;10275:465;;10435:67;10499:2;10494:3;10435:67;;;10428:74;;10535:66;10531:1;10526:3;10522:11;10515:87;10636:66;10631:2;10626:3;10622:12;10615:88;10731:2;10726:3;10722:12;10715:19;;10421:319;;;;10749:465;;10909:67;10973:2;10968:3;10909:67;;;10902:74;;11009:66;11005:1;11000:3;10996:11;10989:87;11110:66;11105:2;11100:3;11096:12;11089:88;11205:2;11200:3;11196:12;11189:19;;10895:319;;;;11223:465;;11383:67;11447:2;11442:3;11383:67;;;11376:74;;11483:66;11479:1;11474:3;11470:11;11463:87;11584:66;11579:2;11574:3;11570:12;11563:88;11679:2;11674:3;11670:12;11663:19;;11369:319;;;;11697:465;;11857:67;11921:2;11916:3;11857:67;;;11850:74;;11957:66;11953:1;11948:3;11944:11;11937:87;12058:66;12053:2;12048:3;12044:12;12037:88;12153:2;12148:3;12144:12;12137:19;;11843:319;;;;12171:465;;12331:67;12395:2;12390:3;12331:67;;;12324:74;;12431:66;12427:1;12422:3;12418:11;12411:87;12532:66;12527:2;12522:3;12518:12;12511:88;12627:2;12622:3;12618:12;12611:19;;12317:319;;;;12645:465;;12805:67;12869:2;12864:3;12805:67;;;12798:74;;12905:66;12901:1;12896:3;12892:11;12885:87;13006:66;13001:2;12996:3;12992:12;12985:88;13101:2;13096:3;13092:12;13085:19;;12791:319;;;;13119:465;;13279:67;13343:2;13338:3;13279:67;;;13272:74;;13379:66;13375:1;13370:3;13366:11;13359:87;13480:66;13475:2;13470:3;13466:12;13459:88;13575:2;13570:3;13566:12;13559:19;;13265:319;;;;13593:465;;13753:67;13817:2;13812:3;13753:67;;;13746:74;;13853:66;13849:1;13844:3;13840:11;13833:87;13954:66;13949:2;13944:3;13940:12;13933:88;14049:2;14044:3;14040:12;14033:19;;13739:319;;;;14067:465;;14227:67;14291:2;14286:3;14227:67;;;14220:74;;14327:66;14323:1;14318:3;14314:11;14307:87;14428:66;14423:2;14418:3;14414:12;14407:88;14523:2;14518:3;14514:12;14507:19;;14213:319;;;;14540:113;14623:24;14641:5;14623:24;;;14618:3;14611:37;14605:48;;;14660:213;;14778:2;14767:9;14763:18;14755:26;;14792:71;14860:1;14849:9;14845:17;14836:6;14792:71;;;14749:124;;;;;14880:324;;15026:2;15015:9;15011:18;15003:26;;15040:71;15108:1;15097:9;15093:17;15084:6;15040:71;;;15122:72;15190:2;15179:9;15175:18;15166:6;15122:72;;;14997:207;;;;;;15211:201;;15323:2;15312:9;15308:18;15300:26;;15337:65;15399:1;15388:9;15384:17;15375:6;15337:65;;;15294:118;;;;;15419:293;;15553:2;15542:9;15538:18;15530:26;;15603:9;15597:4;15593:20;15589:1;15578:9;15574:17;15567:47;15628:74;15697:4;15688:6;15628:74;;;15620:82;;15524:188;;;;;15719:407;;15910:2;15899:9;15895:18;15887:26;;15960:9;15954:4;15950:20;15946:1;15935:9;15931:17;15924:47;15985:131;16111:4;15985:131;;;15977:139;;15881:245;;;;16133:737;;16410:2;16399:9;16395:18;16387:26;;16460:9;16454:4;16450:20;16446:1;16435:9;16431:17;16424:47;16485:131;16611:4;16485:131;;;16477:139;;16664:9;16658:4;16654:20;16649:2;16638:9;16634:18;16627:48;16689:88;16772:4;16763:6;16755;16689:88;;;16681:96;;16788:72;16856:2;16845:9;16841:18;16832:6;16788:72;;;16381:489;;;;;;;16877:407;;17068:2;17057:9;17053:18;17045:26;;17118:9;17112:4;17108:20;17104:1;17093:9;17089:17;17082:47;17143:131;17269:4;17143:131;;;17135:139;;17039:245;;;;17291:407;;17482:2;17471:9;17467:18;17459:26;;17532:9;17526:4;17522:20;17518:1;17507:9;17503:17;17496:47;17557:131;17683:4;17557:131;;;17549:139;;17453:245;;;;17705:407;;17896:2;17885:9;17881:18;17873:26;;17946:9;17940:4;17936:20;17932:1;17921:9;17917:17;17910:47;17971:131;18097:4;17971:131;;;17963:139;;17867:245;;;;18119:407;;18310:2;18299:9;18295:18;18287:26;;18360:9;18354:4;18350:20;18346:1;18335:9;18331:17;18324:47;18385:131;18511:4;18385:131;;;18377:139;;18281:245;;;;18533:407;;18724:2;18713:9;18709:18;18701:26;;18774:9;18768:4;18764:20;18760:1;18749:9;18745:17;18738:47;18799:131;18925:4;18799:131;;;18791:139;;18695:245;;;;18947:407;;19138:2;19127:9;19123:18;19115:26;;19188:9;19182:4;19178:20;19174:1;19163:9;19159:17;19152:47;19213:131;19339:4;19213:131;;;19205:139;;19109:245;;;;19361:737;;19638:2;19627:9;19623:18;19615:26;;19688:9;19682:4;19678:20;19674:1;19663:9;19659:17;19652:47;19713:131;19839:4;19713:131;;;19705:139;;19892:9;19886:4;19882:20;19877:2;19866:9;19862:18;19855:48;19917:88;20000:4;19991:6;19983;19917:88;;;19909:96;;20016:72;20084:2;20073:9;20069:18;20060:6;20016:72;;;19609:489;;;;;;;20105:407;;20296:2;20285:9;20281:18;20273:26;;20346:9;20340:4;20336:20;20332:1;20321:9;20317:17;20310:47;20371:131;20497:4;20371:131;;;20363:139;;20267:245;;;;20519:407;;20710:2;20699:9;20695:18;20687:26;;20760:9;20754:4;20750:20;20746:1;20735:9;20731:17;20724:47;20785:131;20911:4;20785:131;;;20777:139;;20681:245;;;;20933:407;;21124:2;21113:9;21109:18;21101:26;;21174:9;21168:4;21164:20;21160:1;21149:9;21145:17;21138:47;21199:131;21325:4;21199:131;;;21191:139;;21095:245;;;;21347:407;;21538:2;21527:9;21523:18;21515:26;;21588:9;21582:4;21578:20;21574:1;21563:9;21559:17;21552:47;21613:131;21739:4;21613:131;;;21605:139;;21509:245;;;;21761:407;;21952:2;21941:9;21937:18;21929:26;;22002:9;21996:4;21992:20;21988:1;21977:9;21973:17;21966:47;22027:131;22153:4;22027:131;;;22019:139;;21923:245;;;;22175:407;;22366:2;22355:9;22351:18;22343:26;;22416:9;22410:4;22406:20;22402:1;22391:9;22387:17;22380:47;22441:131;22567:4;22441:131;;;22433:139;;22337:245;;;;22589:407;;22780:2;22769:9;22765:18;22757:26;;22830:9;22824:4;22820:20;22816:1;22805:9;22801:17;22794:47;22855:131;22981:4;22855:131;;;22847:139;;22751:245;;;;23003:407;;23194:2;23183:9;23179:18;23171:26;;23244:9;23238:4;23234:20;23230:1;23219:9;23215:17;23208:47;23269:131;23395:4;23269:131;;;23261:139;;23165:245;;;;23417:213;;23535:2;23524:9;23520:18;23512:26;;23549:71;23617:1;23606:9;23602:17;23593:6;23549:71;;;23506:124;;;;;23637:412;;23803:2;23792:9;23788:18;23780:26;;23817:71;23885:1;23874:9;23870:17;23861:6;23817:71;;;23936:9;23930:4;23926:20;23921:2;23910:9;23906:18;23899:48;23961:78;24034:4;24025:6;23961:78;;;23953:86;;23774:275;;;;;;24056:324;;24202:2;24191:9;24187:18;24179:26;;24216:71;24284:1;24273:9;24269:17;24260:6;24216:71;;;24298:72;24366:2;24355:9;24351:18;24342:6;24298:72;;;24173:207;;;;;;24387:256;;24449:2;24443:9;24433:19;;24487:4;24479:6;24475:17;24586:6;24574:10;24571:22;24550:18;24538:10;24535:34;24532:62;24529:2;;;24607:1;24604;24597:12;24529:2;24627:10;24623:2;24616:22;24427:216;;;;;24650:318;;24790:18;24782:6;24779:30;24776:2;;;24822:1;24819;24812:12;24776:2;24889:4;24885:9;24878:4;24870:6;24866:17;24862:33;24854:41;;24953:4;24947;24943:15;24935:23;;24713:255;;;;24975:118;;25065:5;25059:12;25049:22;;25030:63;;;;25100:122;;25194:5;25188:12;25178:22;;25159:63;;;;25230:163;;25345:6;25340:3;25333:19;25382:4;25377:3;25373:14;25358:29;;25326:67;;;;;25401:91;;25463:24;25481:5;25463:24;;;25452:35;;25446:46;;;;25499:85;;25572:5;25565:13;25558:21;25547:32;;25541:43;;;;25591:121;;25664:42;25657:5;25653:54;25642:65;;25636:76;;;;25719:72;;25781:5;25770:16;;25764:27;;;;25799:145;25880:6;25875:3;25870;25857:30;25936:1;25927:6;25922:3;25918:16;25911:27;25850:94;;;;25953:268;26018:1;26025:101;26039:6;26036:1;26033:13;26025:101;;;26115:1;26110:3;26106:11;26100:18;26096:1;26091:3;26087:11;26080:39;26061:2;26058:1;26054:10;26049:15;;26025:101;;;26141:6;26138:1;26135:13;26132:2;;;26206:1;26197:6;26192:3;26188:16;26181:27;26132:2;26002:219;;;;;26229:97;;26317:2;26313:7;26308:2;26301:5;26297:14;26293:28;26283:38;;26277:49;;;;26334:117;26403:24;26421:5;26403:24;;;26396:5;26393:35;26383:2;;26442:1;26439;26432:12;26383:2;26377:74;;26458:111;26524:21;26539:5;26524:21;;;26517:5;26514:32;26504:2;;26560:1;26557;26550:12;26504:2;26498:71;;26576:117;26645:24;26663:5;26645:24;;;26638:5;26635:35;26625:2;;26684:1;26681;26674:12;26625:2;26619:74;

Swarm Source

bzzr://6dc5865dec1e85cab5d34bc96037f289720ae15bb37b90f483e4b4b6f0839ef2

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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