Contract 0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828 11

 
 
Txn Hash
Method
Block
From
To
Value
0x82796060b04668649ebcfea9193b92439557541783970fb764e8043a8c7cc96cApprove(pending)2022-08-08 10:58:552 days 12 hrs ago0x726038e3f7557bdcbfe1f05ff6b1e87c067899dd IN UMA: UMA Token0 Ether(Pending)(Pending)
0x58b73069d599ab09bce4b5b096a14b505fbd6853b5a1a8080ec50c0b252b3886Transfer(pending)2022-08-08 10:58:522 days 12 hrs ago0x6449d728d3e81c2f51c1b19adb5970cbceb50668 IN UMA: UMA Token0 Ether(Pending)(Pending)
0xb4687550b2087bd3c8f62381cf06e3de73a300371802fc4ffba85327adb5310fTransfer(pending)2022-08-07 3:10:093 days 20 hrs ago0x74cb8863feb44026c33806affe0edafc747229ec IN UMA: UMA Token0 Ether(Pending)(Pending)
0x6cea454dbd74fc86109a6a1da48e09c94bc6c69109a827459185bb15c64e2c30Transfer(pending)2022-08-07 3:09:543 days 20 hrs ago0x76136eedb3219c12784436b90d2ffbaa5e0992c4 IN UMA: UMA Token0 Ether(Pending)(Pending)
0x5eae27a9b75379598f6583502f788f1435d998b9d6ffd10ed761b3d06ce9bb0dTransfer(pending)2022-08-07 3:02:243 days 20 hrs ago0xf1ccbd9644f19307c7c89ce3a8253913e366c9b4 IN UMA: UMA Token0 Ether(Pending)(Pending)
0x7d8d688207e0593c44405acedc941900a45ad9fd0e0e147794720fb3f9fa9305Approve(pending)2022-08-07 2:51:423 days 20 hrs ago0x92122e5b29d093a359144e0df1a62091827fa02f IN UMA: UMA Token0 Ether(Pending)(Pending)
0xb9c23414ec2946f8a731429c9a313cc580ba2cfac5674160403f1c5014952037Transfer(pending)2022-08-07 2:34:343 days 20 hrs ago0x00c00684794514f367baee184ee41ae47c10a1fd IN UMA: UMA Token0 Ether(Pending)(Pending)
0xdd72c61343e07999a036336c20b0337c34212ef8283f074d9ea8216e594c7f0bTransfer(pending)2022-08-07 2:08:203 days 21 hrs ago0x459d317833e5e351e416eb58c50a41f160315869 IN UMA: UMA Token0 Ether(Pending)(Pending)
0xf1cb07629b072a513f39b485620533ae5dfb4f9fff43aae93dd2987fab54838cTransfer153171792022-08-10 23:00:3726 mins ago0x8561ae9aa871e245b24a1a716e3bb0bd5ce369a6 IN  UMA: UMA Token0 Ether0.00110843 26.22829313
0xfbe028c0790813d9b1f38cee9c942d355af7f7f7e00691206ba910fe023c98b4Transfer153171422022-08-10 22:53:2233 mins agoKuCoin 9 IN  UMA: UMA Token0 Ether0.00239204 37.28186818
0x8b53917aac4300f4e2001993d7eea983d1edadcb6685401cbf0694931baf790eTransfer153170882022-08-10 22:43:0043 mins agoMEXC: Mexc.com IN  UMA: UMA Token0 Ether0.0022589248
0x24ddac05d32792e2d3b4064330524dd45a5789300ad9b63af77f438379401519Transfer153170832022-08-10 22:41:5044 mins ago0x6f01c6ac94f2a1551dd25ef76987609a6712144a IN  UMA: UMA Token0 Ether0.0020285248
0xfcdf73f77bec92f85a476dfa1c03724330b3e8e1572ac73a60548c91d7a7767bTransfer153170652022-08-10 22:38:2648 mins agoBinance 15 IN  UMA: UMA Token0 Ether0.003038 47.34967408
0x81efa3313ce6893a26231006fc2391b27645b5b86312bb0baefaa76b531ff585Transfer153170042022-08-10 22:24:341 hr 2 mins agoMEXC: Mexc.com IN  UMA: UMA Token0 Ether0.0038818639
0x03392176920a91dd7e7299012c8db8b05323f88bddd62ed93a2c96fdc4b69c34Approve153169292022-08-10 22:11:011 hr 15 mins ago0xa60d5a657946c10cebc8364c55d156aec5bc8cfa IN  UMA: UMA Token0 Ether0.00262561 56.33270798
0x81e5e3deeb80da5e37fb79bc5f8f71de0fd69b40b73ecc4e9039b85f967b1a94Transfer153168932022-08-10 22:00:171 hr 26 mins ago0x6767526a362ec6c6b1df185478e4f01506b73ff3 IN  UMA: UMA Token0 Ether0.00102212 24.1861188
0xd8c96678e5d5bf8671c2a26545cafc2ed41a9171deb3f8005dfebc0a4c664a88Transfer153168352022-08-10 21:46:511 hr 39 mins ago0xa740025a271bbbc74f7586258f0e92943f627b77 IN  UMA: UMA Token0 Ether0.00109878 26
0xe976e2580691827a5ea92cfec1e81287fd610de20273b51232e9d8938444f14cTransfer153165572022-08-10 20:45:482 hrs 40 mins ago0xa26f72285dba01b058efb5634c0593c8455bcf0c IN  UMA: UMA Token0 Ether0.00558287
0x67eba6496d2346355f739a717b7871d48b2cd9fe71ba3441f4879f812b23778fTransfer153164892022-08-10 20:32:282 hrs 54 mins agoBinance 14 IN  UMA: UMA Token0 Ether0.00097371 20.68514564
0x2ae44148ff46cfa40f33df69e29e0dafa4779811a2055d29b5ebf38bd5e7f6bbApprove153163762022-08-10 20:07:203 hrs 19 mins agoENS Name ericbal.eth IN  UMA: UMA Token0 Ether0.00133582 28.66022943
0x414d992dc1ed8f6398ffb329f241dda2e7004907df7e42a2678efa4cdd8ae265Transfer153160732022-08-10 19:00:204 hrs 26 mins ago0x3b59a023d74aceca4b10b134fd218f887fa0ec1b IN  UMA: UMA Token0 Ether0.00197279 46.66794621
0xff9aaed1a7a10fb79bebe8f85f0bf299c7b2f2c9b9df02bc46596885142d7177Transfer153158002022-08-10 17:55:135 hrs 31 mins ago0x82bdff92b259d83382c28a2d0cf3229e0d8b0b98 IN  UMA: UMA Token0 Ether0.0018759 39.8509291
0xcfc24bb5d38553df5d3dab6c92a4a7fb268eddd22298821515e42b6c104ef858Transfer153152892022-08-10 16:05:387 hrs 21 mins ago0x1c17622cfa9b6fd2043a76dfc39a5b5a109aa708 IN  UMA: UMA Token0 Ether0.00272755 42.50309187
0xa742c3972f4a6711670d0b1738916d61fe2be79897b7e34975bcb72cfae29eefTransfer153151612022-08-10 15:36:077 hrs 50 mins ago0x74dec05e5b894b0efec69cdf6316971802a2f9a1 IN  UMA: UMA Token0 Ether0.00229762 48.82232527
0x81a7f031653da5dc92467b50db560c1953f0923cb2562daeed99d9def30ef70cTransfer153150872022-08-10 15:16:038 hrs 10 mins ago0x74dec05e5b894b0efec69cdf6316971802a2f9a1 IN  UMA: UMA Token0 Ether0.00441627 34.35746254
[ Download CSV Export 

OVERVIEW

UMA's Voting Token v1

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

View more zero value Internal Transactions in Advanced View mode
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 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
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.