ETH Price: $2,850.14 (+2.52%)

Contract

0xB0717a429c2356d649BaBB251fBe4F6Af8Bddc00
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Admin_run Paymen...216326342025-01-15 21:40:4721 days ago1736977247IN
0xB0717a42...Af8Bddc00
0 ETH0.00369278.92967983
Admin_run Paymen...214358502024-12-19 10:04:1149 days ago1734602651IN
0xB0717a42...Af8Bddc00
0 ETH0.0056939514.36300375
Admin_remove Ben...212801672024-11-27 16:05:2370 days ago1732723523IN
0xB0717a42...Af8Bddc00
0 ETH0.0026438636.88062866
Admin_remove Ben...212800952024-11-27 15:50:5970 days ago1732722659IN
0xB0717a42...Af8Bddc00
0 ETH0.0018995425.94334587
Admin_remove Ben...212800902024-11-27 15:49:5970 days ago1732722599IN
0xB0717a42...Af8Bddc00
0 ETH0.0018574624.55433731
Admin_remove Ben...211373632024-11-07 17:48:4790 days ago1731001727IN
0xB0717a42...Af8Bddc00
0 ETH0.001817923.65425132
Admin_run Paymen...211372992024-11-07 17:35:5990 days ago1731000959IN
0xB0717a42...Af8Bddc00
0 ETH0.0115911221.12386013
Admin_add Benefi...209935542024-10-18 16:10:35110 days ago1729267835IN
0xB0717a42...Af8Bddc00
0 ETH0.0042048425.82655349
Admin_remove Ben...209934582024-10-18 15:51:11110 days ago1729266671IN
0xB0717a42...Af8Bddc00
0 ETH0.0022614729.47281305
Admin_run Paymen...209017702024-10-05 20:36:59123 days ago1728160619IN
0xB0717a42...Af8Bddc00
0 ETH0.002318234.19443133
Admin_run Paymen...207374742024-09-12 22:20:47146 days ago1726179647IN
0xB0717a42...Af8Bddc00
0 ETH0.001743733.2557029
Admin_remove Ben...205330522024-08-15 9:11:23175 days ago1723713083IN
0xB0717a42...Af8Bddc00
0 ETH0.000241843.06494381
Admin_run Paymen...205294102024-08-14 20:59:23175 days ago1723669163IN
0xB0717a42...Af8Bddc00
0 ETH0.001485022.37239839
Admin_run Paymen...202631222024-07-08 16:56:35212 days ago1720457795IN
0xB0717a42...Af8Bddc00
0 ETH0.005025067.61190484
Admin_remove Ben...201615232024-06-24 12:24:35226 days ago1719231875IN
0xB0717a42...Af8Bddc00
0 ETH0.000601527.29198869
Admin_remove Ben...201605902024-06-24 9:16:47227 days ago1719220607IN
0xB0717a42...Af8Bddc00
0 ETH0.000485845.83265291
Admin_run Paymen...201605802024-06-24 9:14:47227 days ago1719220487IN
0xB0717a42...Af8Bddc00
0 ETH0.004453475.89559596
Admin_run Paymen...198335182024-05-09 15:55:23272 days ago1715270123IN
0xB0717a42...Af8Bddc00
0 ETH0.004967516.12635623
Admin_remove Ben...198266582024-05-08 16:54:23273 days ago1715187263IN
0xB0717a42...Af8Bddc00
0 ETH0.000441465.18142058
Admin_remove Ben...198240752024-05-08 8:12:59274 days ago1715155979IN
0xB0717a42...Af8Bddc00
0 ETH0.000423684.84710372
Admin_run Paymen...195952712024-04-06 7:43:59306 days ago1712389439IN
0xB0717a42...Af8Bddc00
0 ETH0.0092638111.46867848
Admin_add Benefi...194759482024-03-20 12:36:11322 days ago1710938171IN
0xB0717a42...Af8Bddc00
0 ETH0.0056132634.47970546
Admin_add Benefi...194759422024-03-20 12:34:59322 days ago1710938099IN
0xB0717a42...Af8Bddc00
0 ETH0.0059607636.61423933
Admin_add Benefi...194759172024-03-20 12:29:59322 days ago1710937799IN
0xB0717a42...Af8Bddc00
0 ETH0.0057372235.23857069
Admin_add Benefi...194759162024-03-20 12:29:47322 days ago1710937787IN
0xB0717a42...Af8Bddc00
0 ETH0.0051236831.47015003
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:
StaffTokens

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : StaffTokens.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

// ERC20 methods required by this contract
interface ERC20 {
  function transfer(address, uint256) external returns (bool);
  function balanceOf(address) external view returns (uint256);
}

struct Date {
  uint256 day;
  uint256 month;
  uint256 year;
}

contract StaffTokens {

  uint256 constant private TIME_BETWEEN_PAYMENTS = 30 days;

  mapping(bytes32 => address) private TokenAddress;
  mapping(address => uint256) private Obligation;
  mapping(address => address[]) private TokenSubscribers;
  mapping(bytes32 => uint256) private NextPaymentDue;
  mapping(bytes32 => uint256) private NumPaymentsRemaining;
  mapping(bytes32 => uint256) private FirstPaymentAmount;
  mapping(bytes32 => uint256) private RegularPaymentAmount;
  mapping(address => bool) public isAdmin;

  string[] private TokenSymbols;
  address public owner;

  error AccountAlreadyExists();
  error AddressIsZero();
  error AmountIsZero();
  error InvalidDate();
  error NumPaymentsIsZero();
  error OwnerOnly();
  error OwnerOrAdminOnly();
  error TokenAlreadyAdded();
  error UnrecognisedToken();

  event AdminStatusUpdated(address indexed account, bool isAdmin);
  event BeneficiaryAdded(address indexed token, address indexed account, uint256 award, uint256 numPayments, uint256 startTimestamp);
  event BeneficiaryRemoved(address indexed token, address indexed account, uint256 awardRemainder, uint256 numPaymentsOutstanding);

  modifier ownerOnly {
    if (msg.sender != owner) revert OwnerOnly();
    _;
  }

  modifier ownerOrAdminOnly {
    if (msg.sender != owner && !isAdmin[msg.sender]) revert OwnerOrAdminOnly();
    _;
  }

  constructor() {
    owner = msg.sender;
  }

  /// @notice Add a new token
  /// @param token Ethereum address of the token contract
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @dev Required before any payments of this token can be made.
  function owner_registerToken(address token, string calldata symbol) external ownerOnly {
    bytes32 symbolHash = keccak256(abi.encode(symbol));
    if (TokenAddress[symbolHash] != address(0)) revert TokenAlreadyAdded();
    TokenAddress[symbolHash] = token;
    TokenSymbols.push(symbol);
  }

  /// @notice Remove an existing token
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @dev Prevents further payments for this token. Does not remove existing beneficiaries. Does not withdraw any token funds.
  function owner_revokeToken(string calldata symbol) external ownerOnly {
    bytes32 symbolHash = keccak256(abi.encode(symbol));

    if (TokenAddress[symbolHash] == address(0)) return;
    else {
      TokenAddress[symbolHash] = address(0);
      uint256 lastTokenIndex = TokenSymbols.length - 1;
      for (uint256 i; i < lastTokenIndex;) {
        if (keccak256(abi.encode(TokenSymbols[i])) == symbolHash) {
          TokenSymbols[i] = TokenSymbols[lastTokenIndex];
          break;
        }
        unchecked { i++; }
      }
      TokenSymbols.pop();
    }
  }

  /// @notice Set the admin status of an address
  /// @param account Ethereum address of the admin
  /// @param status true = grant admin rights, false = revoke admin rights
  /// @dev Accounts with admin status are permitted to call admin_ functions.
  function owner_setAdminStatus(address account, bool status) external ownerOnly {
    if (account == address(0)) revert AddressIsZero();
    emit AdminStatusUpdated(account, status);
    if (isAdmin[account] != status) isAdmin[account] = status;
  }

  /// @notice Change contract owner
  /// @param account Ethereum address of the new owner
  /// @dev The owner may call any owner_ or admin_ function.
  function owner_setOwner(address account) external ownerOnly {
    if (account == address(0)) revert AddressIsZero();
    owner = account;
  }

  /// @notice Withdraw an amount of the specified token from the contract
  /// @param token Ethereum address of the token contract
  /// @param destination Ethereum address of the withdrawal recipient
  /// @param amount Amount of funds to withdraw (in full decimals for the token)
  /// @dev Withdrawal does not depend on the token being registered with the contract at the time.
  function owner_withdrawFunds(address token, address destination, uint256 amount) external ownerOnly {
    if (destination == address(0)) revert AddressIsZero();
    assert(ERC20(token).transfer(destination, amount));
  }

  /// @notice Set up a new beneficiary for a token
  /// @param symbol 3 or 4 letter token 'ticker' (must be a registered token)
  /// @param account Ethereum address of the beneficiary
  /// @param totalAward Total amount being awarded (in full decimals for the token)
  /// @param numPayments Number of equal monthly payments to split the total award into (any excess from division is included in the first payment)
  /// @param startDate Date for the initial payment as a comma separated array, e.g.: 23rd July 2023 would be [23,7,2023]
  /// @dev Emits a BeneficiaryAdded log containing the input details for accounting.
  function admin_addBeneficiary(string calldata symbol, address account, uint256 totalAward, uint256 numPayments, Date calldata startDate) external ownerOrAdminOnly {
    if (account == address(0)) revert AddressIsZero();
    if (totalAward == 0) revert AmountIsZero();
    if (numPayments == 0) revert NumPaymentsIsZero();

    address token = getTokenAddress(symbol);
    bytes32 key = keccak256(abi.encode(token, account));

    if (NumPaymentsRemaining[key] != 0) revert AccountAlreadyExists();

    TokenSubscribers[token].push(account);
    uint256 startTimestamp = dateToTimestamp(startDate);

    NextPaymentDue[key] = startTimestamp;
    NumPaymentsRemaining[key] = numPayments;
    (FirstPaymentAmount[key], RegularPaymentAmount[key]) = calcPaymentAmounts(numPayments, totalAward);
    Obligation[token] += totalAward;
    emit BeneficiaryAdded(token, account, totalAward, numPayments, startTimestamp);
  }

  /// @notice Remove an existing beneficiary of a token
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @param account Ethereum address of the beneficiary being removed
  /// @dev Ends payments of this token to the beneficiary. Emits a BeneficiaryRemoved log containing the closing state for accounting.
  function admin_removeBeneficiary(string calldata symbol, address account) external ownerOrAdminOnly {
    address token = getTokenAddress(symbol);
    tokenUnsubscribe(token, account);

    bytes32 key = keccak256(abi.encode(token, account));
    uint256 numPaymentsOutstanding = NumPaymentsRemaining[key];
    uint256 awardRemainder = calcAmountDue(key, numPaymentsOutstanding);
    NextPaymentDue[key] = 0;
    NumPaymentsRemaining[key] = 0;
    FirstPaymentAmount[key] = 0;
    RegularPaymentAmount[key] = 0;
    Obligation[token] -= awardRemainder;
    emit BeneficiaryRemoved(token, account, awardRemainder, numPaymentsOutstanding);
  }

  /// @notice Pays all outstanding amounts due, across all tokens and beneficiaries
  /// @dev The contract must hold enough funds to make ALL the payments or the method will fail and no payments will be made.
  function admin_runPayments() external ownerOrAdminOnly {
    uint256 numTokens = TokenSymbols.length;

    for (uint256 i; i < numTokens;) {
      uint256 paid;
      address token = getTokenAddress(TokenSymbols[i]);
      address[] memory accounts = TokenSubscribers[token];
      uint256 accountsLength = accounts.length;

      for (uint256 j; j < accountsLength;) {
        paid += makePaymentIfRequired(token, accounts[j]);
        unchecked { j++; }
      }

      Obligation[token] -= paid;
      unchecked { i++; }
    }
  }

  /// @notice Pays anything due to a single beneficiary for a specific token
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @param account Ethereum address of the beneficiary
  function admin_runSinglePayment(string calldata symbol, address account) external ownerOrAdminOnly {
    address token = getTokenAddress(symbol);
    Obligation[token] -= makePaymentIfRequired(token, account);
  }

  /// @notice Allows a beneficiary to claim any unpaid funds due to date
  /// @dev Pays out for all tokens the beneficiary is entitled to.
  function claim() external {
    uint256 numTokens = TokenSymbols.length;

    for (uint256 i; i < numTokens;) {
      address token = getTokenAddress(TokenSymbols[i]);
      Obligation[token] -= makePaymentIfRequired(token, msg.sender);
      unchecked { i++; }
    }
  }

  /// @notice Query the next payment date of a token for a beneficiary
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @param account Ethereum address of the beneficiary
  /// @dev Returns the date as a comma separated array, e.g.: 23rd July 2023 would be [23,7,2023].
  function nextPaymentDate(string calldata symbol, address account) external view returns (Date memory) {
    bytes32 key = keccak256(abi.encode(getTokenAddress(symbol), account));
    return timestampToDate(NextPaymentDue[key]);
  }

  /// @notice Query the number of outstanding payments of a token for a beneficiary
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @param account Ethereum address of the beneficiary
  /// @dev Returns the number of monthly payments yet to be made.
  function paymentsRemaining(string calldata symbol, address account) external view returns (uint256) {
    bytes32 key = keccak256(abi.encode(getTokenAddress(symbol), account));
    return NumPaymentsRemaining[key];
  }

  /// @notice Query the monthly payment amount of a token for a beneficiary
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @param account Ethereum address of the beneficiary
  /// @dev Returns the monthly payment amount (in full decimals for the token).
  function amountPerPayment(string calldata symbol, address account) external view returns (uint256) {
    bytes32 key = keccak256(abi.encode(getTokenAddress(symbol), account));
    if (RegularPaymentAmount[key] > 0) return RegularPaymentAmount[key];
    else return FirstPaymentAmount[key];
  }

  /// @notice Get the current surplus/deficit for a token
  /// @param symbol 3 or 4 letter token 'ticker'
  /// @dev Returns the surplus (+) or deficit (-) in full decimals, accounting for all future payments.
  function tokenFundingStatus(string calldata symbol) external view returns (int256){
    address token = getTokenAddress(symbol);
    uint256 balance = ERC20(token).balanceOf(address(this));
    uint256 obligation = Obligation[token];
    if (balance > obligation) return int256(balance - obligation);
    else if (obligation > balance) return int256(obligation - balance) * - 1;
    else return 0;
  }

  /// @notice Returns the list of current beneficiary addresses for a token
  /// @param symbol 3 or 4 letter token 'ticker'
  function activeBeneficiaries(string calldata symbol) external view returns (address[] memory) {
    address token = getTokenAddress(symbol);
    return TokenSubscribers[token];
  }

  /// @notice Displays a list of all currently registered tokens
  function registeredTokens() external view returns (string[] memory) {
    return TokenSymbols;
  }

  /// ******* PRIVATE METHODS ******* ///

  function tokenUnsubscribe(address token, address account) private {
    address[] memory accounts = TokenSubscribers[token];
    uint256 accountsLength = accounts.length;
    bool found;
    uint256 i;

    for (i; i < accountsLength;) {
      if (accounts[i] == account) {
        found = true;
        break;
      }
      unchecked { i++; }
    }

    if (found) {
      if (i < accountsLength - 1) TokenSubscribers[token][i] = TokenSubscribers[token][accountsLength - 1];
      TokenSubscribers[token].pop();
    }
  }

  function makePaymentIfRequired(address token, address account) private returns (uint256 payment) {
    bytes32 key = keccak256(abi.encode(token, account));
    uint256 numPaymentsRemaining = NumPaymentsRemaining[key];

    if (numPaymentsRemaining > 0) {
      uint256 nextPaymentDue = NextPaymentDue[key];
      if (nextPaymentDue > block.timestamp) return payment = 0;
      uint256 numPaymentsToMake = 1 + (block.timestamp - nextPaymentDue) / TIME_BETWEEN_PAYMENTS;
      numPaymentsToMake = (numPaymentsToMake > numPaymentsRemaining) ? numPaymentsRemaining : numPaymentsToMake;
      numPaymentsRemaining -= numPaymentsToMake;
      NumPaymentsRemaining[key] = numPaymentsRemaining;
      NextPaymentDue[key] = nextPaymentDue + (numPaymentsToMake * TIME_BETWEEN_PAYMENTS);
      payment = calcAmountDue(key, numPaymentsToMake);
      assert(ERC20(token).transfer(account, payment));
    }

    if (numPaymentsRemaining == 0) {
      tokenUnsubscribe(token, account);
      NextPaymentDue[key] = 0;
      RegularPaymentAmount[key] = 0;
    }
  }

  function getTokenAddress(string memory symbol) private view returns (address token) {
    token = TokenAddress[keccak256(abi.encode(symbol))];
    if (token == address(0)) revert UnrecognisedToken();
  }

  function calcPaymentAmounts(uint256 numPayments, uint256 award) private pure returns (uint256 first, uint256 regular) {
    if (numPayments == 1) first = award;
    else {
      unchecked {
        regular = award / numPayments;
        first = award - (regular * (numPayments - 1));
      }
    }
    return (first, regular);
  }

  function calcAmountDue(bytes32 key, uint256 numPayments) private returns (uint256) {
    uint256 firstPaymentAmount = (FirstPaymentAmount[key]);

    unchecked {
      if (firstPaymentAmount == 0) {
        return RegularPaymentAmount[key] * numPayments;
      } else {
        FirstPaymentAmount[key] = 0;
        if (numPayments == 1 ) return firstPaymentAmount;
        else return firstPaymentAmount + (RegularPaymentAmount[key] * (numPayments - 1));
      }
    }
  }

  function dateToTimestamp(Date calldata date) private pure returns (uint256 timestamp) {
    if (date.day == 0 || date.day > 31 || date.month == 0 || date.month > 12 || date.year < 1970) revert InvalidDate();
    int256 d = int256(date.day);
    int256 y = int256(date.year);
    int256 m = int256(date.month);
    int256 _days = d-32075+(1461*(y+4800+(m-14)/12))/4+(367*(m-2-((m-14)/12)*12))/12-(3*((y+4900+(m-14)/12)/100))/4-2440588;
    timestamp = uint256(_days) * 1 days;
  }

  function timestampToDate(uint256 timestamp) private pure returns (Date memory date) {
    if (timestamp != 0) {
      unchecked {
        int256 L = int256(timestamp / 1 days) + 2509157;
        int256 N = (4 * L) / 146097;
        L = L - (146097 * N + 3) / 4;
        int256 y = (4000 * (L + 1)) / 1461001;
        L = L - (1461 * y) / 4 + 31;
        int256 m = (80 * L) / 2447;
        int256 d = L - (2447 * m) / 80;
        L = m / 11;
        m = m + 2 - 12 * L;
        y = 100 * (N - 49) + y + L;
        date.year = uint256(y);
        date.month = uint256(m);
        date.day = uint256(d);
      }
    }
  }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccountAlreadyExists","type":"error"},{"inputs":[],"name":"AddressIsZero","type":"error"},{"inputs":[],"name":"AmountIsZero","type":"error"},{"inputs":[],"name":"InvalidDate","type":"error"},{"inputs":[],"name":"NumPaymentsIsZero","type":"error"},{"inputs":[],"name":"OwnerOnly","type":"error"},{"inputs":[],"name":"OwnerOrAdminOnly","type":"error"},{"inputs":[],"name":"TokenAlreadyAdded","type":"error"},{"inputs":[],"name":"UnrecognisedToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdmin","type":"bool"}],"name":"AdminStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"award","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numPayments","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTimestamp","type":"uint256"}],"name":"BeneficiaryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"awardRemainder","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numPaymentsOutstanding","type":"uint256"}],"name":"BeneficiaryRemoved","type":"event"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"activeBeneficiaries","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"totalAward","type":"uint256"},{"internalType":"uint256","name":"numPayments","type":"uint256"},{"components":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"month","type":"uint256"},{"internalType":"uint256","name":"year","type":"uint256"}],"internalType":"struct Date","name":"startDate","type":"tuple"}],"name":"admin_addBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"admin_removeBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin_runPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"admin_runSinglePayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"amountPerPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"nextPaymentDate","outputs":[{"components":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"month","type":"uint256"},{"internalType":"uint256","name":"year","type":"uint256"}],"internalType":"struct Date","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"symbol","type":"string"}],"name":"owner_registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"owner_revokeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"owner_setAdminStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"owner_setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"owner_withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"paymentsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registeredTokens","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenFundingStatus","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613ad0806100616000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806384b413c9116100a2578063afcf5f4611610071578063afcf5f46146102a3578063b7fa88fb146102d3578063b9ad126714610303578063e512ef471461031f578063fa21dffc1461034f57610116565b806384b413c91461021d5780638da5cb5b146102395780638e126565146102575780638ecfcfb51461028757610116565b806346a48947116100e957806346a48947146101a15780634e71d92d146101bd5780635a4fa641146101c7578063765cfad8146101e357806376dbff651461021357610116565b806324d7806c1461011b5780633639ee041461014b5780633d0ff43d146101675780634546661614610183575b600080fd5b610135600480360381019061013091906129ca565b61036b565b6040516101429190612a12565b60405180910390f35b61016560048036038101906101609190612a92565b61038b565b005b610181600480360381019061017c9190612b28565b61056c565b005b61018b6106e9565b6040516101989190612ccd565b60405180910390f35b6101bb60048036038101906101b69190612d13565b6107c2565b005b6101c5610c2d565b005b6101e160048036038101906101dc9190612dd9565b610d66565b005b6101fd60048036038101906101f89190612e19565b610f54565b60405161020a9190612f24565b60405180910390f35b61021b611074565b005b610237600480360381019061023291906129ca565b61139f565b005b6102416114d0565b60405161024e9190612f55565b60405180910390f35b610271600480360381019061026c9190612e19565b6114f6565b60405161027e9190612f89565b60405180910390f35b6102a1600480360381019061029c9190612fa4565b61167f565b005b6102bd60048036038101906102b89190612fa4565b611814565b6040516102ca9190613013565b60405180910390f35b6102ed60048036038101906102e89190612fa4565b6118ac565b6040516102fa919061307f565b60405180910390f35b61031d60048036038101906103189190612e19565b611953565b005b61033960048036038101906103349190612fa4565b611bc3565b6040516103469190613013565b60405180910390f35b61036960048036038101906103649190612fa4565b611c94565b005b60076020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610412576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016104279291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f630b374b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008838390918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182610565929190613351565b5050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f3576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610659576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610694929190613421565b6020604051808303816000875af11580156106b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d7919061345f565b6106e4576106e361348c565b5b505050565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156107b957838290600052602060002001805461072c90613174565b80601f016020809104026020016040519081016040528092919081815260200182805461075890613174565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001906001019061070d565b50505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561086a5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156108a1576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610907576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303610941576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361097b576040517fd0828fc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109ca87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600081866040516020016109e19291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205414610a46576040517f69783db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000610af184612013565b9050806003600084815260200190815260200160002081905550846004600084815260200190815260200160002081905550610b2d85876121f6565b60056000858152602001908152602001600020600060066000878152602001908152602001600020600084919050558391905055505085600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb29190613513565b925050819055508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f57e5b17220bd5fcc437d0282ff1db6e09bea088aa3a1305a20d06d3d59fbb7e6888885604051610c1a93929190613547565b60405180910390a3505050505050505050565b6000600880549050905060005b81811015610d62576000610cf360088381548110610c5b57610c5a61357e565b5b906000526020600020018054610c7090613174565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90613174565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b5050505050611f4b565b9050610cff813361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d4d91906135ad565b92505081905550818060010192505050610c3a565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e53576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f73a6b146fc546254c55a26966ad3c389d945ab2aa613dcfee0457e243c93e25982604051610e999190612a12565b60405180910390a2801515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f505780600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b60606000610fa584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561106657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161101c575b505050505091505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561111c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611153576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600880549050905060005b8181101561139b5760008061121a600884815481106111825761118161357e565b5b90600052602060002001805461119790613174565b80601f01602080910402602001604051908101604052809291908181526020018280546111c390613174565b80156112105780601f106111e557610100808354040283529160200191611210565b820191906000526020600020905b8154815290600101906020018083116111f357829003601f168201915b5050505050611f4b565b90506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112dd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611293575b5050505050905060008151905060005b81811015611333576113198484838151811061130c5761130b61357e565b5b602002602001015161222e565b856113249190613513565b945080806001019150506112ed565b5083600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461138391906135ad565b92505081905550848060010195505050505050611160565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611426576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361148c576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061154684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115839190612f55565b602060405180830381865afa1580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c491906135f6565b90506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508082111561162857808261161e91906135ad565b9350505050611679565b81811115611671577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828261165d91906135ad565b6116679190613623565b9350505050611679565b600093505050505b92915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156117275750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561175e576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117ad84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b90506117b9818361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461180791906135ad565b9250508190555050505050565b60008061186485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016118769291906134bb565b60405160208183030381529060405280519060200120905060046000828152602001908152602001600020549150509392505050565b6118b46128e4565b600061190385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016119159291906134bb565b6040516020818303038152906040528051906020012090506119496003600083815260200190815260200160002054612423565b9150509392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119da576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016119ef9291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a735750611bbf565b600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001600880549050611ad991906135ad565b905060005b81811015611b8b578260088281548110611afb57611afa61357e565b5b90600052602060002001604051602001611b15919061371f565b6040516020818303038152906040528051906020012003611b7e5760088281548110611b4457611b4361357e565b5b9060005260206000200160088281548110611b6257611b6161357e565b5b906000526020600020019081611b78919061376c565b50611b8b565b8080600101915050611ade565b506008805480611b9e57611b9d613854565b5b600190038181906000526020600020016000611bba9190612905565b905550505b5050565b600080611c1385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b83604051602001611c259291906134bb565b604051602081830303815290604052805190602001209050600060066000838152602001908152602001600020541115611c75576006600082815260200190815260200160002054915050611c8d565b60056000828152602001908152602001600020549150505b9392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611d3c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d73576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dc284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050611dce8183612550565b60008183604051602001611de39291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205490506000611e1f8383612856565b90506000600360008581526020019081526020016000208190555060006004600085815260200190815260200160002081905550600060056000858152602001908152602001600020819055506000600660008581526020019081526020016000208190555080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed491906135ad565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4585bda87e16923f5ee484b56df9f15c89c764ddbd22491e477453163cc8cdce8385604051611f3a929190613883565b60405180910390a350505050505050565b600080600083604051602001611f6191906138e5565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361200e576040517f2d3140ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808260000135148061202b5750601f8260000135115b8061203a575060008260200135145b806120495750600c8260200135115b8061205957506107b28260400135105b15612090576040517f81bf7f6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082600001359050600083604001359050600084602001359050600062253d8c60046064600c600e866120c49190613907565b6120ce9190613979565b611324876120dc91906139e3565b6120e691906139e3565b6120f09190613979565b60036120fc9190613623565b6121069190613979565b600c80600c600e876121189190613907565b6121229190613979565b61212c9190613623565b6002866121399190613907565b6121439190613907565b61016f6121509190613623565b61215a9190613979565b6004600c600e8761216b9190613907565b6121759190613979565b6112c08861218391906139e3565b61218d91906139e3565b6105b561219a9190613623565b6121a49190613979565b617d4b886121b29190613907565b6121bc91906139e3565b6121c691906139e3565b6121d09190613907565b6121da9190613907565b905062015180816121eb9190613a27565b945050505050919050565b6000806001840361220957829150612227565b8383816122195761221861394a565b5b049050600184038102830391505b9250929050565b60008083836040516020016122449291906134bb565b60405160208183030381529060405280519060200120905060006004600083815260200190815260200160002054905060008111156123d557600060036000848152602001908152602001600020549050428111156122a9576000935050505061241d565b600062278d0082426122bb91906135ad565b6122c59190613a69565b60016122d19190613513565b90508281116122e057806122e2565b825b905080836122f091906135ad565b925082600460008681526020019081526020016000208190555062278d00816123199190613a27565b826123249190613513565b60036000868152602001908152602001600020819055506123458482612856565b94508673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401612382929190613421565b6020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c5919061345f565b6123d2576123d161348c565b5b50505b6000810361241a576123e78585612550565b60006003600084815260200190815260200160002081905550600060066000848152602001908152602001600020819055505b50505b92915050565b61242b6128e4565b6000821461254b5760006226496562015180848161244c5761244b61394a565b5b04019050600062023ab182600402816124685761246761394a565b5b059050600460038262023ab10201816124845761248361394a565b5b0582039150600062164b0960018401610fa002816124a5576124a461394a565b5b059050601f6004826105b502816124bf576124be61394a565b5b058403019250600061098f84605002816124dc576124db61394a565b5b059050600060508261098f02816124f6576124f561394a565b5b0585039050600b828161250c5761250b61394a565b5b05945084600c02600283010391508483603186036064020101925082866040018181525050818660200181815250508086600001818152505050505050505b919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125c7575b505050505090506000815190506000805b8281101561268d578473ffffffffffffffffffffffffffffffffffffffff168482815181106126545761265361357e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612680576001915061268d565b8080600101915050612622565b811561284e576001836126a091906135ad565b8110156127c957600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001846126f391906135ad565b815481106127045761270361357e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106127805761277f61357e565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061281857612817613854565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050505050565b600080600560008581526020019081526020016000205490506000810361289557826006600086815260200190815260200160002054029150506128de565b60006005600086815260200190815260200160002081905550600183036128bf57809150506128de565b6001830360066000868152602001908152602001600020540281019150505b92915050565b60405180606001604052806000815260200160008152602001600081525090565b50805461291190613174565b6000825580601f106129235750612942565b601f0160209004906000526020600020908101906129419190612945565b5b50565b5b8082111561295e576000816000905550600101612946565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129978261296c565b9050919050565b6129a78161298c565b81146129b257600080fd5b50565b6000813590506129c48161299e565b92915050565b6000602082840312156129e0576129df612962565b5b60006129ee848285016129b5565b91505092915050565b60008115159050919050565b612a0c816129f7565b82525050565b6000602082019050612a276000830184612a03565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a5257612a51612a2d565b5b8235905067ffffffffffffffff811115612a6f57612a6e612a32565b5b602083019150836001820283011115612a8b57612a8a612a37565b5b9250929050565b600080600060408486031215612aab57612aaa612962565b5b6000612ab9868287016129b5565b935050602084013567ffffffffffffffff811115612ada57612ad9612967565b5b612ae686828701612a3c565b92509250509250925092565b6000819050919050565b612b0581612af2565b8114612b1057600080fd5b50565b600081359050612b2281612afc565b92915050565b600080600060608486031215612b4157612b40612962565b5b6000612b4f868287016129b5565b9350506020612b60868287016129b5565b9250506040612b7186828701612b13565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be1578082015181840152602081019050612bc6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c0982612ba7565b612c138185612bb2565b9350612c23818560208601612bc3565b612c2c81612bed565b840191505092915050565b6000612c438383612bfe565b905092915050565b6000602082019050919050565b6000612c6382612b7b565b612c6d8185612b86565b935083602082028501612c7f85612b97565b8060005b85811015612cbb5784840389528151612c9c8582612c37565b9450612ca783612c4b565b925060208a01995050600181019050612c83565b50829750879550505050505092915050565b60006020820190508181036000830152612ce78184612c58565b905092915050565b600080fd5b600060608284031215612d0a57612d09612cef565b5b81905092915050565b60008060008060008060e08789031215612d3057612d2f612962565b5b600087013567ffffffffffffffff811115612d4e57612d4d612967565b5b612d5a89828a01612a3c565b96509650506020612d6d89828a016129b5565b9450506040612d7e89828a01612b13565b9350506060612d8f89828a01612b13565b9250506080612da089828a01612cf4565b9150509295509295509295565b612db6816129f7565b8114612dc157600080fd5b50565b600081359050612dd381612dad565b92915050565b60008060408385031215612df057612def612962565b5b6000612dfe858286016129b5565b9250506020612e0f85828601612dc4565b9150509250929050565b60008060208385031215612e3057612e2f612962565b5b600083013567ffffffffffffffff811115612e4e57612e4d612967565b5b612e5a85828601612a3c565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9b8161298c565b82525050565b6000612ead8383612e92565b60208301905092915050565b6000602082019050919050565b6000612ed182612e66565b612edb8185612e71565b9350612ee683612e82565b8060005b83811015612f17578151612efe8882612ea1565b9750612f0983612eb9565b925050600181019050612eea565b5085935050505092915050565b60006020820190508181036000830152612f3e8184612ec6565b905092915050565b612f4f8161298c565b82525050565b6000602082019050612f6a6000830184612f46565b92915050565b6000819050919050565b612f8381612f70565b82525050565b6000602082019050612f9e6000830184612f7a565b92915050565b600080600060408486031215612fbd57612fbc612962565b5b600084013567ffffffffffffffff811115612fdb57612fda612967565b5b612fe786828701612a3c565b93509350506020612ffa868287016129b5565b9150509250925092565b61300d81612af2565b82525050565b60006020820190506130286000830184613004565b92915050565b61303781612af2565b82525050565b606082016000820151613053600085018261302e565b506020820151613066602085018261302e565b506040820151613079604085018261302e565b50505050565b6000606082019050613094600083018461303d565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b60006130c6838561309a565b93506130d38385846130ab565b6130dc83612bed565b840190509392505050565b600060208201905081810360008301526131028184866130ba565b90509392505050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061318c57607f821691505b60208210810361319f5761319e613145565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826131ca565b61321186836131ca565b95508019841693508086168417925050509392505050565b6000819050919050565b600061324e61324961324484612af2565b613229565b612af2565b9050919050565b6000819050919050565b61326883613233565b61327c61327482613255565b8484546131d7565b825550505050565b600090565b613291613284565b61329c81848461325f565b505050565b5b818110156132c0576132b5600082613289565b6001810190506132a2565b5050565b601f821115613305576132d6816131a5565b6132df846131ba565b810160208510156132ee578190505b6133026132fa856131ba565b8301826132a1565b50505b505050565b600082821c905092915050565b60006133286000198460080261330a565b1980831691505092915050565b60006133418383613317565b9150826002028217905092915050565b61335b838361310b565b67ffffffffffffffff81111561337457613373613116565b5b61337e8254613174565b6133898282856132c4565b6000601f8311600181146133b857600084156133a6578287013590505b6133b08582613335565b865550613418565b601f1984166133c6866131a5565b60005b828110156133ee578489013582556001820191506020850194506020810190506133c9565b8683101561340b5784890135613407601f891682613317565b8355505b6001600288020188555050505b50505050505050565b60006040820190506134366000830185612f46565b6134436020830184613004565b9392505050565b60008151905061345981612dad565b92915050565b60006020828403121561347557613474612962565b5b60006134838482850161344a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60006040820190506134d06000830185612f46565b6134dd6020830184612f46565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351e82612af2565b915061352983612af2565b9250828201905080821115613541576135406134e4565b5b92915050565b600060608201905061355c6000830186613004565b6135696020830185613004565b6135766040830184613004565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135b882612af2565b91506135c383612af2565b92508282039050818111156135db576135da6134e4565b5b92915050565b6000815190506135f081612afc565b92915050565b60006020828403121561360c5761360b612962565b5b600061361a848285016135e1565b91505092915050565b600061362e82612f70565b915061363983612f70565b925082820261364781612f70565b91507f8000000000000000000000000000000000000000000000000000000000000000841460008412161561367f5761367e6134e4565b5b8282058414831517613694576136936134e4565b5b5092915050565b600081546136a881613174565b6136b2818661309a565b945060018216600081146136cd57600181146136e357613716565b60ff198316865281151560200286019350613716565b6136ec856131a5565b60005b8381101561370e578154818901526001820191506020810190506136ef565b808801955050505b50505092915050565b60006020820190508181036000830152613739818461369b565b905092915050565b60008154905061375081613174565b9050919050565b60008190508160005260206000209050919050565b81810361377a575050613852565b61378382613741565b67ffffffffffffffff81111561379c5761379b613116565b5b6137a68254613174565b6137b18282856132c4565b6000601f8311600181146137e057600084156137ce578287015490505b6137d88582613335565b86555061384b565b601f1984166137ee87613757565b96506137f9866131a5565b60005b82811015613821578489015482556001820191506001850194506020810190506137fc565b8683101561383e578489015461383a601f891682613317565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006040820190506138986000830185613004565b6138a56020830184613004565b9392505050565b60006138b782612ba7565b6138c1818561309a565b93506138d1818560208601612bc3565b6138da81612bed565b840191505092915050565b600060208201905081810360008301526138ff81846138ac565b905092915050565b600061391282612f70565b915061391d83612f70565b9250828203905081811260008412168282136000851215161715613944576139436134e4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061398482612f70565b915061398f83612f70565b92508261399f5761399e61394a565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156139d8576139d76134e4565b5b828205905092915050565b60006139ee82612f70565b91506139f983612f70565b925082820190508281121560008312168382126000841215161715613a2157613a206134e4565b5b92915050565b6000613a3282612af2565b9150613a3d83612af2565b9250828202613a4b81612af2565b91508282048414831517613a6257613a616134e4565b5b5092915050565b6000613a7482612af2565b9150613a7f83612af2565b925082613a8f57613a8e61394a565b5b82820490509291505056fea264697066735822122064287e733c98da2bca689f8dededcf7a2b4d3f75eff8e8c55c0aee153924ffc264736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c806384b413c9116100a2578063afcf5f4611610071578063afcf5f46146102a3578063b7fa88fb146102d3578063b9ad126714610303578063e512ef471461031f578063fa21dffc1461034f57610116565b806384b413c91461021d5780638da5cb5b146102395780638e126565146102575780638ecfcfb51461028757610116565b806346a48947116100e957806346a48947146101a15780634e71d92d146101bd5780635a4fa641146101c7578063765cfad8146101e357806376dbff651461021357610116565b806324d7806c1461011b5780633639ee041461014b5780633d0ff43d146101675780634546661614610183575b600080fd5b610135600480360381019061013091906129ca565b61036b565b6040516101429190612a12565b60405180910390f35b61016560048036038101906101609190612a92565b61038b565b005b610181600480360381019061017c9190612b28565b61056c565b005b61018b6106e9565b6040516101989190612ccd565b60405180910390f35b6101bb60048036038101906101b69190612d13565b6107c2565b005b6101c5610c2d565b005b6101e160048036038101906101dc9190612dd9565b610d66565b005b6101fd60048036038101906101f89190612e19565b610f54565b60405161020a9190612f24565b60405180910390f35b61021b611074565b005b610237600480360381019061023291906129ca565b61139f565b005b6102416114d0565b60405161024e9190612f55565b60405180910390f35b610271600480360381019061026c9190612e19565b6114f6565b60405161027e9190612f89565b60405180910390f35b6102a1600480360381019061029c9190612fa4565b61167f565b005b6102bd60048036038101906102b89190612fa4565b611814565b6040516102ca9190613013565b60405180910390f35b6102ed60048036038101906102e89190612fa4565b6118ac565b6040516102fa919061307f565b60405180910390f35b61031d60048036038101906103189190612e19565b611953565b005b61033960048036038101906103349190612fa4565b611bc3565b6040516103469190613013565b60405180910390f35b61036960048036038101906103649190612fa4565b611c94565b005b60076020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610412576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016104279291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f630b374b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008838390918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182610565929190613351565b5050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f3576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610659576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610694929190613421565b6020604051808303816000875af11580156106b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d7919061345f565b6106e4576106e361348c565b5b505050565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156107b957838290600052602060002001805461072c90613174565b80601f016020809104026020016040519081016040528092919081815260200182805461075890613174565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001906001019061070d565b50505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561086a5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156108a1576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610907576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303610941576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361097b576040517fd0828fc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109ca87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600081866040516020016109e19291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205414610a46576040517f69783db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000610af184612013565b9050806003600084815260200190815260200160002081905550846004600084815260200190815260200160002081905550610b2d85876121f6565b60056000858152602001908152602001600020600060066000878152602001908152602001600020600084919050558391905055505085600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb29190613513565b925050819055508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f57e5b17220bd5fcc437d0282ff1db6e09bea088aa3a1305a20d06d3d59fbb7e6888885604051610c1a93929190613547565b60405180910390a3505050505050505050565b6000600880549050905060005b81811015610d62576000610cf360088381548110610c5b57610c5a61357e565b5b906000526020600020018054610c7090613174565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90613174565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b5050505050611f4b565b9050610cff813361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d4d91906135ad565b92505081905550818060010192505050610c3a565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e53576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f73a6b146fc546254c55a26966ad3c389d945ab2aa613dcfee0457e243c93e25982604051610e999190612a12565b60405180910390a2801515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f505780600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b60606000610fa584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561106657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161101c575b505050505091505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561111c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611153576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600880549050905060005b8181101561139b5760008061121a600884815481106111825761118161357e565b5b90600052602060002001805461119790613174565b80601f01602080910402602001604051908101604052809291908181526020018280546111c390613174565b80156112105780601f106111e557610100808354040283529160200191611210565b820191906000526020600020905b8154815290600101906020018083116111f357829003601f168201915b5050505050611f4b565b90506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112dd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611293575b5050505050905060008151905060005b81811015611333576113198484838151811061130c5761130b61357e565b5b602002602001015161222e565b856113249190613513565b945080806001019150506112ed565b5083600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461138391906135ad565b92505081905550848060010195505050505050611160565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611426576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361148c576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061154684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115839190612f55565b602060405180830381865afa1580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c491906135f6565b90506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508082111561162857808261161e91906135ad565b9350505050611679565b81811115611671577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828261165d91906135ad565b6116679190613623565b9350505050611679565b600093505050505b92915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156117275750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561175e576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117ad84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b90506117b9818361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461180791906135ad565b9250508190555050505050565b60008061186485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016118769291906134bb565b60405160208183030381529060405280519060200120905060046000828152602001908152602001600020549150509392505050565b6118b46128e4565b600061190385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016119159291906134bb565b6040516020818303038152906040528051906020012090506119496003600083815260200190815260200160002054612423565b9150509392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119da576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016119ef9291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a735750611bbf565b600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001600880549050611ad991906135ad565b905060005b81811015611b8b578260088281548110611afb57611afa61357e565b5b90600052602060002001604051602001611b15919061371f565b6040516020818303038152906040528051906020012003611b7e5760088281548110611b4457611b4361357e565b5b9060005260206000200160088281548110611b6257611b6161357e565b5b906000526020600020019081611b78919061376c565b50611b8b565b8080600101915050611ade565b506008805480611b9e57611b9d613854565b5b600190038181906000526020600020016000611bba9190612905565b905550505b5050565b600080611c1385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b83604051602001611c259291906134bb565b604051602081830303815290604052805190602001209050600060066000838152602001908152602001600020541115611c75576006600082815260200190815260200160002054915050611c8d565b60056000828152602001908152602001600020549150505b9392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611d3c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d73576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dc284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050611dce8183612550565b60008183604051602001611de39291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205490506000611e1f8383612856565b90506000600360008581526020019081526020016000208190555060006004600085815260200190815260200160002081905550600060056000858152602001908152602001600020819055506000600660008581526020019081526020016000208190555080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed491906135ad565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4585bda87e16923f5ee484b56df9f15c89c764ddbd22491e477453163cc8cdce8385604051611f3a929190613883565b60405180910390a350505050505050565b600080600083604051602001611f6191906138e5565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361200e576040517f2d3140ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808260000135148061202b5750601f8260000135115b8061203a575060008260200135145b806120495750600c8260200135115b8061205957506107b28260400135105b15612090576040517f81bf7f6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082600001359050600083604001359050600084602001359050600062253d8c60046064600c600e866120c49190613907565b6120ce9190613979565b611324876120dc91906139e3565b6120e691906139e3565b6120f09190613979565b60036120fc9190613623565b6121069190613979565b600c80600c600e876121189190613907565b6121229190613979565b61212c9190613623565b6002866121399190613907565b6121439190613907565b61016f6121509190613623565b61215a9190613979565b6004600c600e8761216b9190613907565b6121759190613979565b6112c08861218391906139e3565b61218d91906139e3565b6105b561219a9190613623565b6121a49190613979565b617d4b886121b29190613907565b6121bc91906139e3565b6121c691906139e3565b6121d09190613907565b6121da9190613907565b905062015180816121eb9190613a27565b945050505050919050565b6000806001840361220957829150612227565b8383816122195761221861394a565b5b049050600184038102830391505b9250929050565b60008083836040516020016122449291906134bb565b60405160208183030381529060405280519060200120905060006004600083815260200190815260200160002054905060008111156123d557600060036000848152602001908152602001600020549050428111156122a9576000935050505061241d565b600062278d0082426122bb91906135ad565b6122c59190613a69565b60016122d19190613513565b90508281116122e057806122e2565b825b905080836122f091906135ad565b925082600460008681526020019081526020016000208190555062278d00816123199190613a27565b826123249190613513565b60036000868152602001908152602001600020819055506123458482612856565b94508673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401612382929190613421565b6020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c5919061345f565b6123d2576123d161348c565b5b50505b6000810361241a576123e78585612550565b60006003600084815260200190815260200160002081905550600060066000848152602001908152602001600020819055505b50505b92915050565b61242b6128e4565b6000821461254b5760006226496562015180848161244c5761244b61394a565b5b04019050600062023ab182600402816124685761246761394a565b5b059050600460038262023ab10201816124845761248361394a565b5b0582039150600062164b0960018401610fa002816124a5576124a461394a565b5b059050601f6004826105b502816124bf576124be61394a565b5b058403019250600061098f84605002816124dc576124db61394a565b5b059050600060508261098f02816124f6576124f561394a565b5b0585039050600b828161250c5761250b61394a565b5b05945084600c02600283010391508483603186036064020101925082866040018181525050818660200181815250508086600001818152505050505050505b919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125c7575b505050505090506000815190506000805b8281101561268d578473ffffffffffffffffffffffffffffffffffffffff168482815181106126545761265361357e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612680576001915061268d565b8080600101915050612622565b811561284e576001836126a091906135ad565b8110156127c957600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001846126f391906135ad565b815481106127045761270361357e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106127805761277f61357e565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061281857612817613854565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050505050565b600080600560008581526020019081526020016000205490506000810361289557826006600086815260200190815260200160002054029150506128de565b60006005600086815260200190815260200160002081905550600183036128bf57809150506128de565b6001830360066000868152602001908152602001600020540281019150505b92915050565b60405180606001604052806000815260200160008152602001600081525090565b50805461291190613174565b6000825580601f106129235750612942565b601f0160209004906000526020600020908101906129419190612945565b5b50565b5b8082111561295e576000816000905550600101612946565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129978261296c565b9050919050565b6129a78161298c565b81146129b257600080fd5b50565b6000813590506129c48161299e565b92915050565b6000602082840312156129e0576129df612962565b5b60006129ee848285016129b5565b91505092915050565b60008115159050919050565b612a0c816129f7565b82525050565b6000602082019050612a276000830184612a03565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a5257612a51612a2d565b5b8235905067ffffffffffffffff811115612a6f57612a6e612a32565b5b602083019150836001820283011115612a8b57612a8a612a37565b5b9250929050565b600080600060408486031215612aab57612aaa612962565b5b6000612ab9868287016129b5565b935050602084013567ffffffffffffffff811115612ada57612ad9612967565b5b612ae686828701612a3c565b92509250509250925092565b6000819050919050565b612b0581612af2565b8114612b1057600080fd5b50565b600081359050612b2281612afc565b92915050565b600080600060608486031215612b4157612b40612962565b5b6000612b4f868287016129b5565b9350506020612b60868287016129b5565b9250506040612b7186828701612b13565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be1578082015181840152602081019050612bc6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c0982612ba7565b612c138185612bb2565b9350612c23818560208601612bc3565b612c2c81612bed565b840191505092915050565b6000612c438383612bfe565b905092915050565b6000602082019050919050565b6000612c6382612b7b565b612c6d8185612b86565b935083602082028501612c7f85612b97565b8060005b85811015612cbb5784840389528151612c9c8582612c37565b9450612ca783612c4b565b925060208a01995050600181019050612c83565b50829750879550505050505092915050565b60006020820190508181036000830152612ce78184612c58565b905092915050565b600080fd5b600060608284031215612d0a57612d09612cef565b5b81905092915050565b60008060008060008060e08789031215612d3057612d2f612962565b5b600087013567ffffffffffffffff811115612d4e57612d4d612967565b5b612d5a89828a01612a3c565b96509650506020612d6d89828a016129b5565b9450506040612d7e89828a01612b13565b9350506060612d8f89828a01612b13565b9250506080612da089828a01612cf4565b9150509295509295509295565b612db6816129f7565b8114612dc157600080fd5b50565b600081359050612dd381612dad565b92915050565b60008060408385031215612df057612def612962565b5b6000612dfe858286016129b5565b9250506020612e0f85828601612dc4565b9150509250929050565b60008060208385031215612e3057612e2f612962565b5b600083013567ffffffffffffffff811115612e4e57612e4d612967565b5b612e5a85828601612a3c565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9b8161298c565b82525050565b6000612ead8383612e92565b60208301905092915050565b6000602082019050919050565b6000612ed182612e66565b612edb8185612e71565b9350612ee683612e82565b8060005b83811015612f17578151612efe8882612ea1565b9750612f0983612eb9565b925050600181019050612eea565b5085935050505092915050565b60006020820190508181036000830152612f3e8184612ec6565b905092915050565b612f4f8161298c565b82525050565b6000602082019050612f6a6000830184612f46565b92915050565b6000819050919050565b612f8381612f70565b82525050565b6000602082019050612f9e6000830184612f7a565b92915050565b600080600060408486031215612fbd57612fbc612962565b5b600084013567ffffffffffffffff811115612fdb57612fda612967565b5b612fe786828701612a3c565b93509350506020612ffa868287016129b5565b9150509250925092565b61300d81612af2565b82525050565b60006020820190506130286000830184613004565b92915050565b61303781612af2565b82525050565b606082016000820151613053600085018261302e565b506020820151613066602085018261302e565b506040820151613079604085018261302e565b50505050565b6000606082019050613094600083018461303d565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b60006130c6838561309a565b93506130d38385846130ab565b6130dc83612bed565b840190509392505050565b600060208201905081810360008301526131028184866130ba565b90509392505050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061318c57607f821691505b60208210810361319f5761319e613145565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826131ca565b61321186836131ca565b95508019841693508086168417925050509392505050565b6000819050919050565b600061324e61324961324484612af2565b613229565b612af2565b9050919050565b6000819050919050565b61326883613233565b61327c61327482613255565b8484546131d7565b825550505050565b600090565b613291613284565b61329c81848461325f565b505050565b5b818110156132c0576132b5600082613289565b6001810190506132a2565b5050565b601f821115613305576132d6816131a5565b6132df846131ba565b810160208510156132ee578190505b6133026132fa856131ba565b8301826132a1565b50505b505050565b600082821c905092915050565b60006133286000198460080261330a565b1980831691505092915050565b60006133418383613317565b9150826002028217905092915050565b61335b838361310b565b67ffffffffffffffff81111561337457613373613116565b5b61337e8254613174565b6133898282856132c4565b6000601f8311600181146133b857600084156133a6578287013590505b6133b08582613335565b865550613418565b601f1984166133c6866131a5565b60005b828110156133ee578489013582556001820191506020850194506020810190506133c9565b8683101561340b5784890135613407601f891682613317565b8355505b6001600288020188555050505b50505050505050565b60006040820190506134366000830185612f46565b6134436020830184613004565b9392505050565b60008151905061345981612dad565b92915050565b60006020828403121561347557613474612962565b5b60006134838482850161344a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60006040820190506134d06000830185612f46565b6134dd6020830184612f46565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351e82612af2565b915061352983612af2565b9250828201905080821115613541576135406134e4565b5b92915050565b600060608201905061355c6000830186613004565b6135696020830185613004565b6135766040830184613004565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135b882612af2565b91506135c383612af2565b92508282039050818111156135db576135da6134e4565b5b92915050565b6000815190506135f081612afc565b92915050565b60006020828403121561360c5761360b612962565b5b600061361a848285016135e1565b91505092915050565b600061362e82612f70565b915061363983612f70565b925082820261364781612f70565b91507f8000000000000000000000000000000000000000000000000000000000000000841460008412161561367f5761367e6134e4565b5b8282058414831517613694576136936134e4565b5b5092915050565b600081546136a881613174565b6136b2818661309a565b945060018216600081146136cd57600181146136e357613716565b60ff198316865281151560200286019350613716565b6136ec856131a5565b60005b8381101561370e578154818901526001820191506020810190506136ef565b808801955050505b50505092915050565b60006020820190508181036000830152613739818461369b565b905092915050565b60008154905061375081613174565b9050919050565b60008190508160005260206000209050919050565b81810361377a575050613852565b61378382613741565b67ffffffffffffffff81111561379c5761379b613116565b5b6137a68254613174565b6137b18282856132c4565b6000601f8311600181146137e057600084156137ce578287015490505b6137d88582613335565b86555061384b565b601f1984166137ee87613757565b96506137f9866131a5565b60005b82811015613821578489015482556001820191506001850194506020810190506137fc565b8683101561383e578489015461383a601f891682613317565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006040820190506138986000830185613004565b6138a56020830184613004565b9392505050565b60006138b782612ba7565b6138c1818561309a565b93506138d1818560208601612bc3565b6138da81612bed565b840191505092915050565b600060208201905081810360008301526138ff81846138ac565b905092915050565b600061391282612f70565b915061391d83612f70565b9250828203905081811260008412168282136000851215161715613944576139436134e4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061398482612f70565b915061398f83612f70565b92508261399f5761399e61394a565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156139d8576139d76134e4565b5b828205905092915050565b60006139ee82612f70565b91506139f983612f70565b925082820190508281121560008312168382126000841215161715613a2157613a206134e4565b5b92915050565b6000613a3282612af2565b9150613a3d83612af2565b9250828202613a4b81612af2565b91508282048414831517613a6257613a616134e4565b5b5092915050565b6000613a7482612af2565b9150613a7f83612af2565b925082613a8f57613a8e61394a565b5b82820490509291505056fea264697066735822122064287e733c98da2bca689f8dededcf7a2b4d3f75eff8e8c55c0aee153924ffc264736f6c63430008110033

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.