ETH Price: $2,980.97 (+1.19%)
Gas: 5 Gwei

Contract

0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828
 
Transaction Hash
Method
Block
From
To
Value
0x2027971f9a333d86551a23907e08cedce6c8d7e78f6f4fac0a7c807996c2cecfTransfer(pending)2024-05-03 0:17:1421 mins ago1714695434IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0xf890d651b159359bbc0caa9fe381dc3fcc2ffc71c143477707f5ab28479dde05Transfer(pending)2024-05-02 23:36:291 hr ago1714692989IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0x547cc835fbf482a3e889d8f1180af9c854251b0bf78804ebe8a6a7a2b6a424a0Transfer(pending)2024-05-02 22:34:032 hrs ago1714689243IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0x46701f1549275317a882cbe1e00de13b1346b96aaa805415930c21fb07f05059Transfer(pending)2024-05-01 22:38:0326 hrs ago1714603083IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0x96c0740425a1de5ae1d5312cd960d3e09c8029835dabbef17ca36b516f434d87Transfer(pending)2024-04-29 16:45:143 days ago1714409114IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0xb9c23414ec2946f8a731429c9a313cc580ba2cfac5674160403f1c5014952037Transfer(pending)2024-04-29 14:57:263 days ago1714402646IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0xef3dba6d6614c695048f7b4680df41227fc261ce4785d55dc4658cbcb07e09f3Transfer(pending)2024-04-29 14:52:433 days ago1714402363IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0xa5a11e661229dd032980af604b9d046d2a81fe03fa62090595fe252b0833c99eTransfer(pending)2024-04-29 12:30:153 days ago1714393815IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0x5eae27a9b75379598f6583502f788f1435d998b9d6ffd10ed761b3d06ce9bb0dTransfer(pending)2024-04-29 7:42:263 days ago1714376546IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0xb4687550b2087bd3c8f62381cf06e3de73a300371802fc4ffba85327adb5310fTransfer(pending)2024-04-29 6:04:493 days ago1714370689IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0x7d8cab229c234e0835a499693c8e180479ad9822c9ba3f6f618a284f5ff6ba46Transfer(pending)2024-04-29 5:42:033 days ago1714369323IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0x605a8ddd462691f1c18b7d2364d78ae03e999a857731127184e1002a9d4e268cTransfer(pending)2024-04-26 17:10:536 days ago1714151453IN
UMA: UMA Token
0 ETH(Pending)(Pending)
0x0a99ca1254770edd94fba56b149be0a67cc3bd804f2b76049a8a35a813ebcd93Transfer(pending)2024-04-21 4:00:5511 days ago1713672055IN
UMA: UMA Token
0 ETH(Pending)(Pending)
Transfer197857522024-05-02 23:36:351 hr ago1714692995IN
UMA: UMA Token
0 ETH0.001042618.11051476
Transfer197852062024-05-02 21:46:112 hrs ago1714686371IN
UMA: UMA Token
0 ETH0.000410038.71274733
Transfer197851222024-05-02 21:29:233 hrs ago1714685363IN
UMA: UMA Token
0 ETH0.000659655.32945933
Transfer197850362024-05-02 21:12:113 hrs ago1714684331IN
UMA: UMA Token
0 ETH0.000315247.45518832
Transfer197849472024-05-02 20:54:233 hrs ago1714683263IN
UMA: UMA Token
0 ETH0.000443429.42241311
Transfer197848532024-05-02 20:35:354 hrs ago1714682135IN
UMA: UMA Token
0 ETH0.00054378.47089732
Transfer197847122024-05-02 20:06:474 hrs ago1714680407IN
UMA: UMA Token
0 ETH0.0013579310.56243412
Transfer197846792024-05-02 20:00:114 hrs ago1714680011IN
UMA: UMA Token
0 ETH0.000421689.97248495
Transfer197845512024-05-02 19:34:115 hrs ago1714678451IN
UMA: UMA Token
0 ETH0.000563168.77402577
Transfer197844492024-05-02 19:13:235 hrs ago1714677203IN
UMA: UMA Token
0 ETH0.000632956.68220706
Transfer197842582024-05-02 18:34:356 hrs ago1714674875IN
UMA: UMA Token
0 ETH0.001091327.41159579
Transfer197842382024-05-02 18:30:356 hrs ago1714674635IN
UMA: UMA Token
0 ETH0.000430349.14678241
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:
VotingToken

Compiler Version
v0.5.13+commit.5b0b510c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-01-13
*/

pragma solidity ^0.5.0;


/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}


/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
   /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}


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

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

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


/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20Mintable}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

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

     /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}


/**
 * @title ERC20 token with snapshots.
 * @dev Inspired by Jordi Baylina's
 * https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol[MiniMeToken]
 * to record historical balances.
 *
 * When a snapshot is made, the balances and total supply at the time of the snapshot are recorded for later
 * access.
 *
 * To make a snapshot, call the {snapshot} function, which will emit the {Snapshot} event and return a snapshot id.
 * To get the total supply from a snapshot, call the function {totalSupplyAt} with the snapshot id.
 * To get the balance of an account from a snapshot, call the {balanceOfAt} function with the snapshot id and the
 * account address.
 * @author Validity Labs AG <[email protected]>
 */
contract ERC20Snapshot is ERC20 {
    using SafeMath for uint256;
    using Arrays for uint256[];
    using Counters for Counters.Counter;

    // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
    // Snapshot struct, but that would impede usage of functions that work on an array.
    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    mapping (address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;

    // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
    Counters.Counter private _currentSnapshotId;

    event Snapshot(uint256 id);

    // Creates a new snapshot id. Balances are only stored in snapshots on demand: unless a snapshot was taken, a
    // balance change will not be recorded. This means the extra added cost of storing snapshotted balances is only paid
    // when required, but is also flexible enough that it allows for e.g. daily snapshots.
    function snapshot() public returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _currentSnapshotId.current();
        emit Snapshot(currentId);
        return currentId;
    }

    function balanceOfAt(address account, uint256 snapshotId) public view returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);

        return snapshotted ? value : balanceOf(account);
    }

    function totalSupplyAt(uint256 snapshotId) public view returns(uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);

        return snapshotted ? value : totalSupply();
    }

    // _transfer, _mint and _burn are the only functions where the balances are modified, so it is there that the
    // snapshots are updated. Note that the update happens _before_ the balance change, with the pre-modified value.
    // The same is true for the total supply and _mint and _burn.
    function _transfer(address from, address to, uint256 value) internal {
        _updateAccountSnapshot(from);
        _updateAccountSnapshot(to);

        super._transfer(from, to, value);
    }

    function _mint(address account, uint256 value) internal {
        _updateAccountSnapshot(account);
        _updateTotalSupplySnapshot();

        super._mint(account, value);
    }

    function _burn(address account, uint256 value) internal {
        _updateAccountSnapshot(account);
        _updateTotalSupplySnapshot();

        super._burn(account, value);
    }

    // When a valid snapshot is queried, there are three possibilities:
    //  a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
    //  created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
    //  to this id is the current one.
    //  b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
    //  requested id, and its value is the one to return.
    //  c) More snapshots were created after the requested one, and the queried value was later modified. There will be
    //  no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
    //  larger than the requested one.
    //
    // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
    // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
    // exactly this.
    function _valueAt(uint256 snapshotId, Snapshots storage snapshots)
        private view returns (bool, uint256)
    {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        // solhint-disable-next-line max-line-length
        require(snapshotId <= _currentSnapshotId.current(), "ERC20Snapshot: nonexistent id");

        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
        uint256 currentId = _currentSnapshotId.current();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}

/**
 * @title ERC20 interface that includes burn and mint methods.
 */
contract ExpandedIERC20 is IERC20 {
    /**
     * @notice Burns a specific amount of the caller's tokens.
     * @dev Only burns the caller's tokens, so it is safe to leave this method permissionless.
     */
    function burn(uint value) external;

    /**
     * @notice Mints tokens and adds them to the balance of the `to` address.
     * @dev This method should be permissioned to only allow designated parties to mint tokens.
     */
    function mint(address to, uint value) external returns (bool);
}


library Exclusive {
    struct RoleMembership {
        address member;
    }

    function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) {
        return roleMembership.member == memberToCheck;
    }

    function resetMember(RoleMembership storage roleMembership, address newMember) internal {
        require(newMember != address(0x0), "Cannot set an exclusive role to 0x0");
        roleMembership.member = newMember;
    }

    function getMember(RoleMembership storage roleMembership) internal view returns (address) {
        return roleMembership.member;
    }

    function init(RoleMembership storage roleMembership, address initialMember) internal {
        resetMember(roleMembership, initialMember);
    }
}


library Shared {
    struct RoleMembership {
        mapping(address => bool) members;
    }

    function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) {
        return roleMembership.members[memberToCheck];
    }

    function addMember(RoleMembership storage roleMembership, address memberToAdd) internal {
        roleMembership.members[memberToAdd] = true;
    }

    function removeMember(RoleMembership storage roleMembership, address memberToRemove) internal {
        roleMembership.members[memberToRemove] = false;
    }

    function init(RoleMembership storage roleMembership, address[] memory initialMembers) internal {
        for (uint i = 0; i < initialMembers.length; i++) {
            addMember(roleMembership, initialMembers[i]);
        }
    }
}


/**
 * @title Base class to manage permissions for the derived class.
 */
contract MultiRole {
    using Exclusive for Exclusive.RoleMembership;
    using Shared for Shared.RoleMembership;

    enum RoleType { Invalid, Exclusive, Shared }

    struct Role {
        uint managingRole;
        RoleType roleType;
        Exclusive.RoleMembership exclusiveRoleMembership;
        Shared.RoleMembership sharedRoleMembership;
    }

    mapping(uint => Role) private roles;

    /**
     * @notice Reverts unless the caller is a member of the specified roleId.
     */
    modifier onlyRoleHolder(uint roleId) {
        require(holdsRole(roleId, msg.sender), "Sender does not hold required role");
        _;
    }

    /**
     * @notice Reverts unless the caller is a member of the manager role for the specified roleId.
     */
    modifier onlyRoleManager(uint roleId) {
        require(holdsRole(roles[roleId].managingRole, msg.sender), "Can only be called by a role manager");
        _;
    }

    /**
     * @notice Reverts unless the roleId represents an initialized, exclusive roleId.
     */
    modifier onlyExclusive(uint roleId) {
        require(roles[roleId].roleType == RoleType.Exclusive, "Must be called on an initialized Exclusive role");
        _;
    }

    /**
     * @notice Reverts unless the roleId represents an initialized, shared roleId.
     */
    modifier onlyShared(uint roleId) {
        require(roles[roleId].roleType == RoleType.Shared, "Must be called on an initialized Shared role");
        _;
    }

    /**
     * @notice Whether `memberToCheck` is a member of roleId.
     * @dev Reverts if roleId does not correspond to an initialized role.
     */
    function holdsRole(uint roleId, address memberToCheck) public view returns (bool) {
        Role storage role = roles[roleId];
        if (role.roleType == RoleType.Exclusive) {
            return role.exclusiveRoleMembership.isMember(memberToCheck);
        } else if (role.roleType == RoleType.Shared) {
            return role.sharedRoleMembership.isMember(memberToCheck);
        }
        require(false, "Invalid roleId");
    }

    /**
     * @notice Changes the exclusive role holder of `roleId` to `newMember`.
     * @dev Reverts if the caller is not a member of the managing role for `roleId` or if `roleId` is not an
     * initialized, exclusive role.
     */
    function resetMember(uint roleId, address newMember) public onlyExclusive(roleId) onlyRoleManager(roleId) {
        roles[roleId].exclusiveRoleMembership.resetMember(newMember);
    }

    /**
     * @notice Gets the current holder of the exclusive role, `roleId`.
     * @dev Reverts if `roleId` does not represent an initialized, exclusive role.
     */
    function getMember(uint roleId) public view onlyExclusive(roleId) returns (address) {
        return roles[roleId].exclusiveRoleMembership.getMember();
    }

    /**
     * @notice Adds `newMember` to the shared role, `roleId`.
     * @dev Reverts if `roleId` does not represent an initialized, shared role or if the caller is not a member of the
     * managing role for `roleId`.
     */
    function addMember(uint roleId, address newMember) public onlyShared(roleId) onlyRoleManager(roleId) {
        roles[roleId].sharedRoleMembership.addMember(newMember);
    }

    /**
     * @notice Removes `memberToRemove` from the shared role, `roleId`.
     * @dev Reverts if `roleId` does not represent an initialized, shared role or if the caller is not a member of the
     * managing role for `roleId`.
     */
    function removeMember(uint roleId, address memberToRemove) public onlyShared(roleId) onlyRoleManager(roleId) {
        roles[roleId].sharedRoleMembership.removeMember(memberToRemove);
    }

    /**
     * @notice Reverts if `roleId` is not initialized.
     */
    modifier onlyValidRole(uint roleId) {
        require(roles[roleId].roleType != RoleType.Invalid, "Attempted to use an invalid roleId");
        _;
    }

    /**
     * @notice Reverts if `roleId` is initialized.
     */
    modifier onlyInvalidRole(uint roleId) {
        require(roles[roleId].roleType == RoleType.Invalid, "Cannot use a pre-existing role");
        _;
    }

    /**
     * @notice Internal method to initialize a shared role, `roleId`, which will be managed by `managingRoleId`.
     * `initialMembers` will be immediately added to the role.
     * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already
     * initialized.
     */
    function _createSharedRole(uint roleId, uint managingRoleId, address[] memory initialMembers)
        internal
        onlyInvalidRole(roleId)
    {
        Role storage role = roles[roleId];
        role.roleType = RoleType.Shared;
        role.managingRole = managingRoleId;
        role.sharedRoleMembership.init(initialMembers);
        require(roles[managingRoleId].roleType != RoleType.Invalid,
            "Attempted to use an invalid role to manage a shared role");
    }

    /**
     * @notice Internal method to initialize a exclusive role, `roleId`, which will be managed by `managingRoleId`.
     * `initialMembers` will be immediately added to the role.
     * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already
     * initialized.
     */
    function _createExclusiveRole(uint roleId, uint managingRoleId, address initialMember)
        internal
        onlyInvalidRole(roleId)
    {
        Role storage role = roles[roleId];
        role.roleType = RoleType.Exclusive;
        role.managingRole = managingRoleId;
        role.exclusiveRoleMembership.init(initialMember);
        require(roles[managingRoleId].roleType != RoleType.Invalid,
            "Attempted to use an invalid role to manage an exclusive role");
    }
}


/**
 * @title Ownership of this token allows a voter to respond to price requests.
 * @dev Supports snapshotting and allows the Oracle to mint new tokens as rewards.
 */
contract VotingToken is ExpandedIERC20, ERC20Snapshot, MultiRole {

    enum Roles {
        // Can set the minter and burner.
        Owner,
        // Addresses that can mint new tokens.
        Minter,
        // Addresses that can burn tokens that address owns.
        Burner
    }

    // Standard ERC20 metadata.
    string public constant name = "UMA Voting Token v1"; // solhint-disable-line const-name-snakecase
    string public constant symbol = "UMA"; // solhint-disable-line const-name-snakecase
    uint8 public constant decimals = 18; // solhint-disable-line const-name-snakecase

    constructor() public {
        _createExclusiveRole(uint(Roles.Owner), uint(Roles.Owner), msg.sender);
        _createSharedRole(uint(Roles.Minter), uint(Roles.Owner), new address[](0));
        _createSharedRole(uint(Roles.Burner), uint(Roles.Owner), new address[](0));
    }

    /**
     * @dev Mints `value` tokens to `recipient`, returning true on success.
     */
    function mint(address recipient, uint value) external onlyRoleHolder(uint(Roles.Minter)) returns (bool) {
        _mint(recipient, value);
        return true;
    }

    /**
     * @dev Burns `value` tokens owned by `msg.sender`.
     */
    function burn(uint value) external onlyRoleHolder(uint(Roles.Burner)) {
        _burn(msg.sender, value);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"addMember","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"getMember","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToCheck","type":"address"}],"name":"holdsRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToRemove","type":"address"}],"name":"removeMember","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"resetMember","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"snapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","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":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506200003f600060028111156200002457fe5b600060028111156200003257fe5b336200010060201b60201c565b6200009d600160028111156200005157fe5b600060028111156200005f57fe5b6000604051908082528060200260200182016040528015620000905781602001602082028038833980820191505090505b50620002b560201b60201c565b620000fa600280811115620000ae57fe5b60006002811115620000bc57fe5b6000604051908082528060200260200182016040528015620000ed5781602001602082028038833980820191505090505b50620002b560201b60201c565b620005f6565b82600060028111156200010f57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff1660028111156200013f57fe5b14620001b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f43616e6e6f74207573652061207072652d6578697374696e6720726f6c65000081525060200191505060405180910390fd5b600060076000868152602001908152602001600020905060018160010160006101000a81548160ff02191690836002811115620001ec57fe5b02179055508381600001819055506200021783826002016200046a60201b620024101790919060201c565b600060028111156200022557fe5b6007600086815260200190815260200160002060010160009054906101000a900460ff1660028111156200025557fe5b1415620002ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018062002c9f603c913960400191505060405180910390fd5b5050505050565b8260006002811115620002c457fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff166002811115620002f457fe5b1462000368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f43616e6e6f74207573652061207072652d6578697374696e6720726f6c65000081525060200191505060405180910390fd5b600060076000868152602001908152602001600020905060028160010160006101000a81548160ff02191690836002811115620003a157fe5b0217905550838160000181905550620003cc83826003016200048060201b6200241e1790919060201c565b60006002811115620003da57fe5b6007600086815260200190815260200160002060010160009054906101000a900460ff1660028111156200040a57fe5b141562000463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018062002cfe6038913960400191505060405180910390fd5b5050505050565b6200047c8282620004c960201b60201c565b5050565b60008090505b8151811015620004c457620004b683838381518110620004a257fe5b60200260200101516200059860201b60201c565b808060010191505062000486565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018062002cdb6023913960400191505060405180910390fd5b808260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61269980620006066000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063981b24d01161007c578063981b24d014610644578063a457c2d714610686578063a9059cbb146106ec578063ab3545e514610752578063d97c05be146107c0578063dd62ed3e1461080e57610137565b806370a082311461049757806374d0a676146104ef5780637cdc1cb91461053d57806395d89b41146105a35780639711715a1461062657610137565b806339509351116100ff57806339509351146102ed57806340c10f191461035357806342966c68146103b95780634ee2cd7e146103e75780636be7658b1461044957610137565b806306fdde031461013c578063095ea7b3146101bf57806318160ddd1461022557806323b872dd14610243578063313ce567146102c9575b600080fd5b610144610886565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610184578082015181840152602081019050610169565b50505050905090810190601f1680156101b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61020b600480360360408110156101d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108bf565b604051808215151515815260200191505060405180910390f35b61022d6108dd565b6040518082815260200191505060405180910390f35b6102af6004803603606081101561025957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108e7565b604051808215151515815260200191505060405180910390f35b6102d16109c0565b604051808260ff1660ff16815260200191505060405180910390f35b6103396004803603604081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109c5565b604051808215151515815260200191505060405180910390f35b61039f6004803603604081101561036957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a78565b604051808215151515815260200191505060405180910390f35b6103e5600480360360208110156103cf57600080fd5b8101908080359060200190929190505050610afb565b005b610433600480360360408110156103fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b74565b6040518082815260200191505060405180910390f35b6104956004803603604081101561045f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610be4565b005b6104d9600480360360208110156104ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d1a565b6040518082815260200191505060405180910390f35b61053b6004803603604081101561050557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d62565b005b6105896004803603604081101561055357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e98565b604051808215151515815260200191505060405180910390f35b6105ab610fc7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105eb5780820151818401526020810190506105d0565b50505050905090810190601f1680156106185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61062e611000565b6040518082815260200191505060405180910390f35b6106706004803603602081101561065a57600080fd5b8101908080359060200190929190505050611058565b6040518082815260200191505060405180910390f35b6106d26004803603604081101561069c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611089565b604051808215151515815260200191505060405180910390f35b6107386004803603604081101561070257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611156565b604051808215151515815260200191505060405180910390f35b61077e6004803603602081101561076857600080fd5b8101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61080c600480360360408110156107d657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061122f565b005b6108706004803603604081101561082457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611366565b6040518082815260200191505060405180910390f35b6040518060400160405280601381526020017f554d4120566f74696e6720546f6b656e2076310000000000000000000000000081525081565b60006108d36108cc6113ed565b84846113f5565b6001905092915050565b6000600254905090565b60006108f48484846115ec565b6109b5846109006113ed565b6109b08560405180606001604052806028815260200161256760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109666113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6113f5565b600190509392505050565b601281565b6000610a6e6109d26113ed565b84610a6985600160006109e36113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce90919063ffffffff16565b6113f5565b6001905092915050565b600060016002811115610a8757fe5b610a918133610e98565b610ae6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806125456022913960400191505060405180910390fd5b610af08484611756565b600191505092915050565b600280811115610b0757fe5b610b118133610e98565b610b66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806125456022913960400191505060405180910390fd5b610b703383611775565b5050565b6000806000610bc184600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611794565b9150915081610bd857610bd385610d1a565b610bda565b805b9250505092915050565b81600280811115610bf157fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff166002811115610c2057fe5b14610c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b82610c97600760008381526020019081526020016000206000015433610e98565b610cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061261c6024913960400191505060405180910390fd5b610d1483600760008781526020019081526020016000206003016118ee90919063ffffffff16565b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b81600280811115610d6f57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff166002811115610d9e57fe5b14610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b82610e15600760008381526020019081526020016000206000015433610e98565b610e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061261c6024913960400191505060405180910390fd5b610e92836007600087815260200190815260200160002060030161194c90919063ffffffff16565b50505050565b60008060076000858152602001908152602001600020905060016002811115610ebd57fe5b8160010160009054906101000a900460ff166002811115610eda57fe5b1415610efe57610ef683826002016119aa90919063ffffffff16565b915050610fc1565b600280811115610f0a57fe5b8160010160009054906101000a900460ff166002811115610f2757fe5b1415610f4b57610f438382600301611a0790919063ffffffff16565b915050610fc1565b6000610fbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420726f6c65496400000000000000000000000000000000000081525060200191505060405180910390fd5b505b92915050565b6040518060400160405280600381526020017f554d41000000000000000000000000000000000000000000000000000000000081525081565b600061100c6006611a60565b60006110186006611a76565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67816040518082815260200191505060405180910390a18091505090565b6000806000611068846004611794565b915091508161107e576110796108dd565b611080565b805b92505050919050565b600061114c6110966113ed565b846111478560405180606001604052806025815260200161264060259139600160006110c06113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6113f5565b6001905092915050565b600061116a6111636113ed565b84846115ec565b6001905092915050565b6000816001600281111561118457fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff1660028111156111b357fe5b14611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806124ea602f913960400191505060405180910390fd5b61122760076000858152602001908152602001600020600201611a84565b915050919050565b816001600281111561123d57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600281111561126c57fe5b146112c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806124ea602f913960400191505060405180910390fd5b826112e3600760008381526020019081526020016000206000015433610e98565b611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061261c6024913960400191505060405180910390fd5b6113608360076000878152602001908152602001600020600201611ab290919063ffffffff16565b50505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561147b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806125f86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806124a26022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6115f583611b7f565b6115fe82611b7f565b611609838383611bd2565b505050565b60008383111582906116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611680578082015181840152602081019050611665565b50505050905090810190601f1680156116ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008082840190508381101561174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61175f82611b7f565b611767611e88565b6117718282611e9c565b5050565b61177e82611b7f565b611786611e88565b6117908282612057565b5050565b6000806000841161180d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4552433230536e617073686f743a20696420697320300000000000000000000081525060200191505060405180910390fd5b6118176006611a76565b84111561188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4552433230536e617073686f743a206e6f6e6578697374656e7420696400000081525060200191505060405180910390fd5b60006118a4858560000161220f90919063ffffffff16565b905083600001805490508114156118c55760008080905092509250506118e7565b60018460010182815481106118d657fe5b906000526020600020015492509250505b9250929050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008173ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806125b06023913960400191505060405180910390fd5b808260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611bcf600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611bca83610d1a565b6122c4565b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806125d36025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061245d6023913960400191505060405180910390fd5b611d49816040518060600160405280602681526020016124c4602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ddc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b611e9a6004611e956108dd565b6122c4565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b611f54816002546116ce90919063ffffffff16565b600281905550611fab816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061258f6021913960400191505060405180910390fd5b61214881604051806060016040528060228152602001612480602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061219f8160025461234790919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000808380549050141561222657600090506122be565b60008090506000848054905090505b8082101561227e5760006122498383612391565b90508486828154811061225857fe5b9060005260206000200154111561227157809150612278565b6001810192505b50612235565b6000821180156122a657508385600184038154811061229957fe5b9060005260206000200154145b156122b85760018203925050506122be565b81925050505b92915050565b60006122d06006611a76565b9050806122df846000016123d3565b10156123425782600001819080600181540180825580915050906001820390600052602060002001600090919290919091505550826001018290806001815401808255809150509060018203906000526020600020016000909192909190915055505b505050565b600061238983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061160e565b905092915050565b6000600280838161239e57fe5b06600285816123a957fe5b0601816123b257fe5b04600283816123bd57fe5b04600285816123c857fe5b040101905092915050565b600080828054905014156123ea576000905061240b565b816001838054905003815481106123fd57fe5b906000526020600020015490505b919050565b61241a8282611ab2565b5050565b60008090505b81518110156124575761244a8383838151811061243d57fe5b602002602001015161194c565b8080600101915050612424565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d7573742062652063616c6c6564206f6e20616e20696e697469616c697a6564204578636c757369766520726f6c654d7573742062652063616c6c6564206f6e20616e20696e697469616c697a65642053686172656420726f6c6553656e64657220646f6573206e6f7420686f6c6420726571756972656420726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737343616e6e6f742073657420616e206578636c757369766520726f6c6520746f2030783045524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e6167657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582046ba38f584b678623c2cc125d1cc056488aee4f20cac4ec2a41229f3f5a16b4164736f6c634300050d0032417474656d7074656420746f2075736520616e20696e76616c696420726f6c6520746f206d616e61676520616e206578636c757369766520726f6c6543616e6e6f742073657420616e206578636c757369766520726f6c6520746f20307830417474656d7074656420746f2075736520616e20696e76616c696420726f6c6520746f206d616e61676520612073686172656420726f6c65

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063981b24d01161007c578063981b24d014610644578063a457c2d714610686578063a9059cbb146106ec578063ab3545e514610752578063d97c05be146107c0578063dd62ed3e1461080e57610137565b806370a082311461049757806374d0a676146104ef5780637cdc1cb91461053d57806395d89b41146105a35780639711715a1461062657610137565b806339509351116100ff57806339509351146102ed57806340c10f191461035357806342966c68146103b95780634ee2cd7e146103e75780636be7658b1461044957610137565b806306fdde031461013c578063095ea7b3146101bf57806318160ddd1461022557806323b872dd14610243578063313ce567146102c9575b600080fd5b610144610886565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610184578082015181840152602081019050610169565b50505050905090810190601f1680156101b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61020b600480360360408110156101d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108bf565b604051808215151515815260200191505060405180910390f35b61022d6108dd565b6040518082815260200191505060405180910390f35b6102af6004803603606081101561025957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108e7565b604051808215151515815260200191505060405180910390f35b6102d16109c0565b604051808260ff1660ff16815260200191505060405180910390f35b6103396004803603604081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109c5565b604051808215151515815260200191505060405180910390f35b61039f6004803603604081101561036957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a78565b604051808215151515815260200191505060405180910390f35b6103e5600480360360208110156103cf57600080fd5b8101908080359060200190929190505050610afb565b005b610433600480360360408110156103fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b74565b6040518082815260200191505060405180910390f35b6104956004803603604081101561045f57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610be4565b005b6104d9600480360360208110156104ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d1a565b6040518082815260200191505060405180910390f35b61053b6004803603604081101561050557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d62565b005b6105896004803603604081101561055357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e98565b604051808215151515815260200191505060405180910390f35b6105ab610fc7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105eb5780820151818401526020810190506105d0565b50505050905090810190601f1680156106185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61062e611000565b6040518082815260200191505060405180910390f35b6106706004803603602081101561065a57600080fd5b8101908080359060200190929190505050611058565b6040518082815260200191505060405180910390f35b6106d26004803603604081101561069c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611089565b604051808215151515815260200191505060405180910390f35b6107386004803603604081101561070257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611156565b604051808215151515815260200191505060405180910390f35b61077e6004803603602081101561076857600080fd5b8101908080359060200190929190505050611174565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61080c600480360360408110156107d657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061122f565b005b6108706004803603604081101561082457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611366565b6040518082815260200191505060405180910390f35b6040518060400160405280601381526020017f554d4120566f74696e6720546f6b656e2076310000000000000000000000000081525081565b60006108d36108cc6113ed565b84846113f5565b6001905092915050565b6000600254905090565b60006108f48484846115ec565b6109b5846109006113ed565b6109b08560405180606001604052806028815260200161256760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109666113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6113f5565b600190509392505050565b601281565b6000610a6e6109d26113ed565b84610a6985600160006109e36113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce90919063ffffffff16565b6113f5565b6001905092915050565b600060016002811115610a8757fe5b610a918133610e98565b610ae6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806125456022913960400191505060405180910390fd5b610af08484611756565b600191505092915050565b600280811115610b0757fe5b610b118133610e98565b610b66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806125456022913960400191505060405180910390fd5b610b703383611775565b5050565b6000806000610bc184600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611794565b9150915081610bd857610bd385610d1a565b610bda565b805b9250505092915050565b81600280811115610bf157fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff166002811115610c2057fe5b14610c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b82610c97600760008381526020019081526020016000206000015433610e98565b610cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061261c6024913960400191505060405180910390fd5b610d1483600760008781526020019081526020016000206003016118ee90919063ffffffff16565b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b81600280811115610d6f57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff166002811115610d9e57fe5b14610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b82610e15600760008381526020019081526020016000206000015433610e98565b610e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061261c6024913960400191505060405180910390fd5b610e92836007600087815260200190815260200160002060030161194c90919063ffffffff16565b50505050565b60008060076000858152602001908152602001600020905060016002811115610ebd57fe5b8160010160009054906101000a900460ff166002811115610eda57fe5b1415610efe57610ef683826002016119aa90919063ffffffff16565b915050610fc1565b600280811115610f0a57fe5b8160010160009054906101000a900460ff166002811115610f2757fe5b1415610f4b57610f438382600301611a0790919063ffffffff16565b915050610fc1565b6000610fbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c696420726f6c65496400000000000000000000000000000000000081525060200191505060405180910390fd5b505b92915050565b6040518060400160405280600381526020017f554d41000000000000000000000000000000000000000000000000000000000081525081565b600061100c6006611a60565b60006110186006611a76565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67816040518082815260200191505060405180910390a18091505090565b6000806000611068846004611794565b915091508161107e576110796108dd565b611080565b805b92505050919050565b600061114c6110966113ed565b846111478560405180606001604052806025815260200161264060259139600160006110c06113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6113f5565b6001905092915050565b600061116a6111636113ed565b84846115ec565b6001905092915050565b6000816001600281111561118457fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff1660028111156111b357fe5b14611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806124ea602f913960400191505060405180910390fd5b61122760076000858152602001908152602001600020600201611a84565b915050919050565b816001600281111561123d57fe5b6007600083815260200190815260200160002060010160009054906101000a900460ff16600281111561126c57fe5b146112c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806124ea602f913960400191505060405180910390fd5b826112e3600760008381526020019081526020016000206000015433610e98565b611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061261c6024913960400191505060405180910390fd5b6113608360076000878152602001908152602001600020600201611ab290919063ffffffff16565b50505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561147b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806125f86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806124a26022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6115f583611b7f565b6115fe82611b7f565b611609838383611bd2565b505050565b60008383111582906116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611680578082015181840152602081019050611665565b50505050905090810190601f1680156116ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008082840190508381101561174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61175f82611b7f565b611767611e88565b6117718282611e9c565b5050565b61177e82611b7f565b611786611e88565b6117908282612057565b5050565b6000806000841161180d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4552433230536e617073686f743a20696420697320300000000000000000000081525060200191505060405180910390fd5b6118176006611a76565b84111561188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4552433230536e617073686f743a206e6f6e6578697374656e7420696400000081525060200191505060405180910390fd5b60006118a4858560000161220f90919063ffffffff16565b905083600001805490508114156118c55760008080905092509250506118e7565b60018460010182815481106118d657fe5b906000526020600020015492509250505b9250929050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008173ffffffffffffffffffffffffffffffffffffffff168360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806125b06023913960400191505060405180910390fd5b808260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611bcf600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611bca83610d1a565b6122c4565b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806125d36025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061245d6023913960400191505060405180910390fd5b611d49816040518060600160405280602681526020016124c4602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ddc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b611e9a6004611e956108dd565b6122c4565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b611f54816002546116ce90919063ffffffff16565b600281905550611fab816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ce90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061258f6021913960400191505060405180910390fd5b61214881604051806060016040528060228152602001612480602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461160e9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061219f8160025461234790919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000808380549050141561222657600090506122be565b60008090506000848054905090505b8082101561227e5760006122498383612391565b90508486828154811061225857fe5b9060005260206000200154111561227157809150612278565b6001810192505b50612235565b6000821180156122a657508385600184038154811061229957fe5b9060005260206000200154145b156122b85760018203925050506122be565b81925050505b92915050565b60006122d06006611a76565b9050806122df846000016123d3565b10156123425782600001819080600181540180825580915050906001820390600052602060002001600090919290919091505550826001018290806001815401808255809150509060018203906000526020600020016000909192909190915055505b505050565b600061238983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061160e565b905092915050565b6000600280838161239e57fe5b06600285816123a957fe5b0601816123b257fe5b04600283816123bd57fe5b04600285816123c857fe5b040101905092915050565b600080828054905014156123ea576000905061240b565b816001838054905003815481106123fd57fe5b906000526020600020015490505b919050565b61241a8282611ab2565b5050565b60008090505b81518110156124575761244a8383838151811061243d57fe5b602002602001015161194c565b8080600101915050612424565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d7573742062652063616c6c6564206f6e20616e20696e697469616c697a6564204578636c757369766520726f6c654d7573742062652063616c6c6564206f6e20616e20696e697469616c697a65642053686172656420726f6c6553656e64657220646f6573206e6f7420686f6c6420726571756972656420726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737343616e6e6f742073657420616e206578636c757369766520726f6c6520746f2030783045524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e6167657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582046ba38f584b678623c2cc125d1cc056488aee4f20cac4ec2a41229f3f5a16b4164736f6c634300050d0032

Deployed Bytecode Sourcemap

35494:1367:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35494:1367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35830:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35830:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15411:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15411:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14432:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16035:304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16035:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36022:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16748:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16748:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36494:168;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36494:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36745:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36745:113:0;;;;;;;;;;;;;;;;;:::i;:::-;;23232:258;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23232:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32983:191;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32983:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14586:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14586:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32553:175;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32553:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31089:441;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31089:441:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35933:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35933:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23007:217;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23498:225;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23498:225:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17461:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17461:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14909:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14909:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32149:159;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32149:159:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31781:185;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31781:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15130:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15130:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35830:51;;;;;;;;;;;;;;;;;;;:::o;15411:152::-;15477:4;15494:39;15503:12;:10;:12::i;:::-;15517:7;15526:6;15494:8;:39::i;:::-;15551:4;15544:11;;15411:152;;;;:::o;14432:91::-;14476:7;14503:12;;14496:19;;14432:91;:::o;16035:304::-;16124:4;16141:36;16151:6;16159:9;16170:6;16141:9;:36::i;:::-;16188:121;16197:6;16205:12;:10;:12::i;:::-;16219:89;16257:6;16219:89;;;;;;;;;;;;;;;;;:11;:19;16231:6;16219:19;;;;;;;;;;;;;;;:33;16239:12;:10;:12::i;:::-;16219:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;16188:8;:121::i;:::-;16327:4;16320:11;;16035:304;;;;;:::o;36022:35::-;36055:2;36022:35;:::o;16748:210::-;16828:4;16845:83;16854:12;:10;:12::i;:::-;16868:7;16877:50;16916:10;16877:11;:25;16889:12;:10;:12::i;:::-;16877:25;;;;;;;;;;;;;;;:34;16903:7;16877:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;16845:8;:83::i;:::-;16946:4;16939:11;;16748:210;;;;:::o;36494:168::-;36592:4;36568:12;36563:18;;;;;;;;29988:29;29998:6;30006:10;29988:9;:29::i;:::-;29980:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36609:23;36615:9;36626:5;36609;:23::i;:::-;36650:4;36643:11;;36494:168;;;;;:::o;36745:113::-;36800:12;36795:18;;;;;;;;29988:29;29998:6;30006:10;29988:9;:29::i;:::-;29980:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36826:24;36832:10;36844:5;36826;:24::i;:::-;36745:113;;:::o;23232:258::-;23311:7;23332:16;23350:13;23367:55;23376:10;23388:24;:33;23413:7;23388:33;;;;;;;;;;;;;;;23367:8;:55::i;:::-;23331:91;;;;23442:11;:40;;23464:18;23474:7;23464:9;:18::i;:::-;23442:40;;;23456:5;23442:40;23435:47;;;;23232:258;;;;:::o;32983:191::-;33060:6;30841:15;30815:41;;;;;;;;:5;:13;30821:6;30815:13;;;;;;;;;;;:22;;;;;;;;;;;;:41;;;;;;;;;30807:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33084:6;30259:49;30269:5;:13;30275:6;30269:13;;;;;;;;;;;:26;;;30297:10;30259:9;:49::i;:::-;30251:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33103:63;33151:14;33103:5;:13;33109:6;33103:13;;;;;;;;;;;:34;;:47;;:63;;;;:::i;:::-;30916:1;32983:191;;;:::o;14586:110::-;14643:7;14670:9;:18;14680:7;14670:18;;;;;;;;;;;;;;;;14663:25;;14586:110;;;:::o;32553:175::-;32622:6;30841:15;30815:41;;;;;;;;:5;:13;30821:6;30815:13;;;;;;;;;;;:22;;;;;;;;;;;;:41;;;;;;;;;30807:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32646:6;30259:49;30269:5;:13;30275:6;30269:13;;;;;;;;;;;:26;;;30297:10;30259:9;:49::i;:::-;30251:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32665:55;32710:9;32665:5;:13;32671:6;32665:13;;;;;;;;;;;:34;;:44;;:55;;;;:::i;:::-;30916:1;32553:175;;;:::o;31089:441::-;31165:4;31182:17;31202:5;:13;31208:6;31202:13;;;;;;;;;;;31182:33;;31247:18;31230:35;;;;;;;;:4;:13;;;;;;;;;;;;:35;;;;;;;;;31226:254;;;31289:52;31327:13;31289:4;:28;;:37;;:52;;;;:::i;:::-;31282:59;;;;;31226:254;31380:15;31363:32;;;;;;;;:4;:13;;;;;;;;;;;;:32;;;;;;;;;31359:121;;;31419:49;31454:13;31419:4;:25;;:34;;:49;;;;:::i;:::-;31412:56;;;;;31359:121;31498:5;31490:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31089:441;;;;;;:::o;35933:37::-;;;;;;;;;;;;;;;;;;;:::o;23007:217::-;23043:7;23063:30;:18;:28;:30::i;:::-;23106:17;23126:28;:18;:26;:28::i;:::-;23106:48;;23170:19;23179:9;23170:19;;;;;;;;;;;;;;;;;;23207:9;23200:16;;;23007:217;:::o;23498:225::-;23561:7;23582:16;23600:13;23617:43;23626:10;23638:21;23617:8;:43::i;:::-;23581:79;;;;23680:11;:35;;23702:13;:11;:13::i;:::-;23680:35;;;23694:5;23680:35;23673:42;;;;23498:225;;;:::o;17461:261::-;17546:4;17563:129;17572:12;:10;:12::i;:::-;17586:7;17595:96;17634:15;17595:96;;;;;;;;;;;;;;;;;:11;:25;17607:12;:10;:12::i;:::-;17595:25;;;;;;;;;;;;;;;:34;17621:7;17595:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;17563:8;:129::i;:::-;17710:4;17703:11;;17461:261;;;;:::o;14909:158::-;14978:4;14995:42;15005:12;:10;:12::i;:::-;15019:9;15030:6;14995:9;:42::i;:::-;15055:4;15048:11;;14909:158;;;;:::o;32149:159::-;32224:7;32207:6;30563:18;30537:44;;;;;;;;:5;:13;30543:6;30537:13;;;;;;;;;;;:22;;;;;;;;;;;;:44;;;;;;;;;30529:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32251:49;:5;:13;32257:6;32251:13;;;;;;;;;;;:37;;:47;:49::i;:::-;32244:56;;32149:159;;;;:::o;31781:185::-;31855:6;30563:18;30537:44;;;;;;;;:5;:13;30543:6;30537:13;;;;;;;;;;;:22;;;;;;;;;;;;:44;;;;;;;;;30529:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31879:6;30259:49;30269:5;:13;30275:6;30269:13;;;;;;;;;;;:26;;;30297:10;30259:9;:49::i;:::-;30251:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31898:60;31948:9;31898:5;:13;31904:6;31898:13;;;;;;;;;;;:37;;:49;;:60;;;;:::i;:::-;30644:1;31781:185;;;:::o;15130:134::-;15202:7;15229:11;:18;15241:5;15229:18;;;;;;;;;;;;;;;:27;15248:7;15229:27;;;;;;;;;;;;;;;;15222:34;;15130:134;;;;:::o;12612:98::-;12657:15;12692:10;12685:17;;12612:98;:::o;20393:338::-;20504:1;20487:19;;:5;:19;;;;20479:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20585:1;20566:21;;:7;:21;;;;20558:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20669:6;20639:11;:18;20651:5;20639:18;;;;;;;;;;;;;;;:27;20658:7;20639:27;;;;;;;;;;;;;;;:36;;;;20707:7;20691:32;;20700:5;20691:32;;;20716:6;20691:32;;;;;;;;;;;;;;;;;;20393:338;;;:::o;24031:198::-;24111:28;24134:4;24111:22;:28::i;:::-;24150:26;24173:2;24150:22;:26::i;:::-;24189:32;24205:4;24211:2;24215:5;24189:15;:32::i;:::-;24031:198;;;:::o;4584:192::-;4670:7;4703:1;4698;:6;;4706:12;4690:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4690:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4730:9;4746:1;4742;:5;4730:17;;4767:1;4760:8;;;4584:192;;;;;:::o;3655:181::-;3713:7;3733:9;3749:1;3745;:5;3733:17;;3774:1;3769;:6;;3761:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3827:1;3820:8;;;3655:181;;;;:::o;24237:185::-;24304:31;24327:7;24304:22;:31::i;:::-;24346:28;:26;:28::i;:::-;24387:27;24399:7;24408:5;24387:11;:27::i;:::-;24237:185;;:::o;24430:::-;24497:31;24520:7;24497:22;:31::i;:::-;24539:28;:26;:28::i;:::-;24580:27;24592:7;24601:5;24580:11;:27::i;:::-;24430:185;;:::o;25695:566::-;25793:4;25799:7;25845:1;25832:10;:14;25824:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25960:28;:18;:26;:28::i;:::-;25946:10;:42;;25938:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26035:13;26051:40;26080:10;26051:9;:13;;:28;;:40;;;;:::i;:::-;26035:56;;26117:9;:13;;:20;;;;26108:5;:29;26104:150;;;26162:5;26169:1;26154:17;;;;;;;;;;26104:150;26212:4;26218:9;:16;;26235:5;26218:23;;;;;;;;;;;;;;;;26204:38;;;;;25695:566;;;;;;:::o;28933:159::-;29079:5;29038:14;:22;;:38;29061:14;29038:38;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;28933:159;;:::o;28776:149::-;28913:4;28875:14;:22;;:35;28898:11;28875:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;28776:149;;:::o;27780:173::-;27883:4;27932:13;27907:38;;:14;:21;;;;;;;;;;;;:38;;;27900:45;;27780:173;;;;:::o;28596:172::-;28699:4;28723:14;:22;;:37;28746:13;28723:37;;;;;;;;;;;;;;;;;;;;;;;;;28716:44;;28596:172;;;;:::o;11615:91::-;11697:1;11679:7;:14;;;:19;;;;;;;;;;;11615:91;:::o;11493:114::-;11558:7;11585;:14;;;11578:21;;11493:114;;;:::o;28193:137::-;28274:7;28301:14;:21;;;;;;;;;;;;28294:28;;28193:137;;;:::o;27961:224::-;28089:3;28068:25;;:9;:25;;;;28060:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28168:9;28144:14;:21;;;:33;;;;;;;;;;;;;;;;;;27961:224;;:::o;26269:146::-;26337:70;26353:24;:33;26378:7;26353:33;;;;;;;;;;;;;;;26388:18;26398:7;26388:9;:18::i;:::-;26337:15;:70::i;:::-;26269:146;:::o;18212:471::-;18328:1;18310:20;;:6;:20;;;;18302:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18412:1;18391:23;;:9;:23;;;;18383:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18487;18509:6;18487:71;;;;;;;;;;;;;;;;;:9;:17;18497:6;18487:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;18467:9;:17;18477:6;18467:17;;;;;;;;;;;;;;;:91;;;;18592:32;18617:6;18592:9;:20;18602:9;18592:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;18569:9;:20;18579:9;18569:20;;;;;;;;;;;;;;;:55;;;;18657:9;18640:35;;18649:6;18640:35;;;18668:6;18640:35;;;;;;;;;;;;;;;;;;18212:471;;;:::o;26423:118::-;26480:53;26496:21;26519:13;:11;:13::i;:::-;26480:15;:53::i;:::-;26423:118::o;18964:308::-;19059:1;19040:21;;:7;:21;;;;19032:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19125:24;19142:6;19125:12;;:16;;:24;;;;:::i;:::-;19110:12;:39;;;;19181:30;19204:6;19181:9;:18;19191:7;19181:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;19160:9;:18;19170:7;19160:18;;;;;;;;;;;;;;;:51;;;;19248:7;19227:37;;19244:1;19227:37;;;19257:6;19227:37;;;;;;;;;;;;;;;;;;18964:308;;:::o;19605:348::-;19700:1;19681:21;;:7;:21;;;;19673:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19774:68;19797:6;19774:68;;;;;;;;;;;;;;;;;:9;:18;19784:7;19774:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;19753:9;:18;19763:7;19753:18;;;;;;;;;;;;;;;:89;;;;19868:24;19885:6;19868:12;;:16;;:24;;;;:::i;:::-;19853:12;:39;;;;19934:1;19908:37;;19917:7;19908:37;;;19938:6;19908:37;;;;;;;;;;;;;;;;;;19605:348;;:::o;9537:918::-;9626:7;9666:1;9650:5;:12;;;;:17;9646:58;;;9691:1;9684:8;;;;9646:58;9716:11;9730:1;9716:15;;9742:12;9757:5;:12;;;;9742:27;;9782:424;9795:4;9789:3;:10;9782:424;;;9816:11;9830:23;9843:3;9848:4;9830:12;:23::i;:::-;9816:37;;10087:7;10074:5;10080:3;10074:10;;;;;;;;;;;;;;;;:20;10070:125;;;10122:3;10115:10;;10070:125;;;10178:1;10172:3;:7;10166:13;;10070:125;9782:424;;;;10332:1;10326:3;:7;:36;;;;;10355:7;10337:5;10349:1;10343:3;:7;10337:14;;;;;;;;;;;;;;;;:25;10326:36;10322:126;;;10392:1;10386:3;:7;10379:14;;;;;;10322:126;10433:3;10426:10;;;;9537:918;;;;;:::o;26549:315::-;26644:17;26664:28;:18;:26;:28::i;:::-;26644:48;;26740:9;26707:30;26723:9;:13;;26707:15;:30::i;:::-;:42;26703:154;;;26766:9;:13;;26785:9;26766:29;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;26766:29:0;;;;;;;;;;;;;;;;;;;;;;26810:9;:16;;26832:12;26810:35;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;26810:35:0;;;;;;;;;;;;;;;;;;;;;;26703:154;26549:315;;;:::o;4111:136::-;4169:7;4196:43;4200:1;4203;4196:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4189:50;;4111:136;;;;:::o;8826:193::-;8888:7;9009:1;9004;9000;:5;;;;;;8996:1;8992;:5;;;;;;:13;8991:19;;;;;;8985:1;8981;:5;;;;;;8975:1;8971;:5;;;;;;8970:17;:41;8963:48;;8826:193;;;;:::o;26872:212::-;26942:7;26980:1;26966:3;:10;;;;:15;26962:115;;;27005:1;26998:8;;;;26962:115;27046:3;27063:1;27050:3;:10;;;;:14;27046:19;;;;;;;;;;;;;;;;27039:26;;26872:212;;;;:::o;28338:146::-;28434:42;28446:14;28462:13;28434:11;:42::i;:::-;28338:146;;:::o;29100:233::-;29211:6;29220:1;29211:10;;29206:120;29227:14;:21;29223:1;:25;29206:120;;;29270:44;29280:14;29296;29311:1;29296:17;;;;;;;;;;;;;;29270:9;:44::i;:::-;29250:3;;;;;;;29206:120;;;;29100:233;;:::o

Swarm Source

bzzr://46ba38f584b678623c2cc125d1cc056488aee4f20cac4ec2a41229f3f5a16b41

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

UMA's Voting Token v1

UMA is a decentralized financial contracts platform built to enable Universal Market Access.

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.