ETH Price: $3,388.38 (+1.26%)

Token

DeFiat (DFT)
 

Overview

Max Total Supply

471,406.213879288935451919 DFT

Holders

1,454 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
test.zerion.eth
Balance
3.929442312336505883 DFT

Value
$0.00
0x42b9df65b219b3dd36ff330a4dd8f327a6ada990
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

DeFiat (DFT) is a fully-governed, deflationary ERC-20 token with a multi-tiered loyalty reward system. Every time DFT is transacted, an amount from the transaction is taken for fees and another amount is permanently burned; naturally reducing supply over time.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DeFiat_Token

Compiler Version
v0.6.0+commit.26b70077

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-28
*/

// SPDX-License-Identifier: DeFiat 2020

/*
* Copyright (c) 2020 DeFiat.net
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/


/*
* DISCLAIMER:
* DeFiat (the “Token”) is a utility token experiment using the ERC20 standard on 
* the Ethereum Blockchain (The “Blockchain"). The DeFiat website and White Paper (the “WP”) 
* are for illustration only and do not make the Team liable for any of their content. 
* The DeFiat website may evolve over time, including but not limited to, a change of URL, 
* change of content, adding or removing functionalities. 
* THERE IS NO GUARANTEE THAT THE UTILITY OF THE TOKENS OR THE PROJECT DESCRIBED IN THE 
* AVAILABLE INFORMATION (AS DEFINED BELOW) WILL BE DELIVERED. REGARDLESS OF THE ACQUISITION 
* METHOD, BY ACQUIRING THE TOKEN YOU ARE AGREEING TO HAVE NO RECOURSE, CLAIM, ACTION, 
* JUDGEMENT OR REMEDY AGAINST THE TEAM IF THE UTILITY OF THE TOKENS OR IF THE PROJECT 
* DESCRIBED IN THE AVAILABLE INFORMATION IS NOT DELIVERED OR REALISED.
*/


/*
* Below are the 3 DeFiat ecosystem contracts:
* Defiat_Points, the loyalty token: 0x8c9d8f5cc3427f460e20f63b36992f74aa19e27d
* Defiat_Gov, the governance contract: 0x3aa3303877a0d1c360a9fe2693ae9f31087a1381
* Defiat_Token, the actual contract managing the DeFiat DFT token.
* Any questions regarding the code, please reach out to the team.
*/

//Libraries,  Interfaces and ERC20 baseline contract. SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
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.
     */
    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.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        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.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
        
    //max and min from Zeppelin math.   

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}          //Zeppelin's SafeMath
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
} //don't use
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

contract _ERC20 is Context, IERC20 { 
    using SafeMath for uint256;
    //using Address for address;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    function _constructor(string memory name, string memory symbol) internal {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

//Public Functions
    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override 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 virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override 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 virtual override 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 virtual 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 virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }


//Internal Functions
    /**
     * @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 virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

    /** @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 virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _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 virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _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 virtual {
        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 Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
} 


//DeFiat Points - 2020 AUG 27
pragma solidity ^0.6.0;
contract DeFiat_Points is _ERC20{
    
    //global variables
    address public deFiat_Token;                        //1 DeFiat token address 
    mapping(address => bool) public deFiat_Gov;         //multiple governing addresses
    
    uint256 public txThreshold; //min tansfer to generate points
    mapping (uint => uint256) public _discountTranches;
    mapping (address => uint256) private _discounts; //current discount (base100)


//== modifiers ==
    modifier onlyGovernors {
        require(deFiat_Gov[msg.sender] == true, "Only governing contract");
        _;
    }
    modifier onlyToken {
        require(msg.sender == deFiat_Token, "Only token");
        _;
    }
    
    constructor() public { //token and governing contract
        deFiat_Gov[msg.sender] = true; //msg.sender is the 1st governor
        _constructor("DeFiat Points", "DFTP"); //calls the ERC20 "_constructor" to update token name
        txThreshold = 1e18*100;//
        setAll10DiscountTranches(
             1e18*10,  1e18*50,  1e18*100,  1e18*500,  1e18*1000, 
             1e18*1e10,  1e18*1e10+1,  1e18*1e10+2, 1e18*1e10+3); //60% and abovse closed at launch.
        _discounts[msg.sender]=100;
        //no minting. _totalSupply = 0
    }

//== VIEW ==
    function viewDiscountOf(address _address) public view returns (uint256) {
        return _discounts[_address];
    }
    function viewEligibilityOf(address _address) public view returns (uint256 tranche) {
        uint256 _tranche = 0;
        for(uint256 i=0; i<=9; i++){
           if(balanceOf(_address) >= _discountTranches[i]) { 
             _tranche = i;}
           else{break;}
        }
        return _tranche;
    }
    function discountPointsNeeded(uint _tranche) public view returns (uint256 pointsNeeded) {
        return( _discountTranches[_tranche]); //check the nb of points needed to access discount tranche
    }

//== SET ==
    function updateMyDiscountOf() public returns (bool) {
        uint256 _tranche = viewEligibilityOf(msg.sender);
        _discounts[msg.sender] =  SafeMath.mul(10, _tranche); //update of discount base100
        return true;
    }  //users execute this function to upgrade a status level to the max tranche

//== SET onlyGovernor ==
    function setDeFiatToken(address _token) external onlyGovernors returns(address){
        return deFiat_Token = _token;
    }
    function setGovernor(address _address, bool _rights) external onlyGovernors {
        require(msg.sender != _address); //prevents self stripping of rights
        deFiat_Gov[_address] = _rights;
    }
    
    function setTxTreshold(uint _amount) external onlyGovernors {
      txThreshold = _amount;  //base 1e18
    } //minimum amount of tokens to generate points per transaction
    function overrideDiscount(address _address, uint256 _newDiscount) external onlyGovernors {
      require(_newDiscount <= 100); //100 = 100% discount
      _discounts[_address]  = _newDiscount;
    }
    function overrideLoyaltyPoints(address _address, uint256 _newPoints) external onlyGovernors {
        _burn(_address, balanceOf(_address)); //burn all points
        _mint(_address, _newPoints); //mint new points
    }
    
    function setDiscountTranches(uint _tranche, uint256 _pointsNeeded) external onlyGovernors {
        require(_tranche <10, "max tranche is 9"); //tranche 9 = 90% discount
        _discountTranches[_tranche] = _pointsNeeded;
    }
    
    function setAll10DiscountTranches(
            uint256 _pointsNeeded1, uint256 _pointsNeeded2, uint256 _pointsNeeded3, uint256 _pointsNeeded4, 
            uint256 _pointsNeeded5, uint256 _pointsNeeded6, uint256 _pointsNeeded7, uint256 _pointsNeeded8, 
            uint256 _pointsNeeded9) public onlyGovernors {
        _discountTranches[0] = 0;
        _discountTranches[1] = _pointsNeeded1; //10%
        _discountTranches[2] = _pointsNeeded2; //20%
        _discountTranches[3] = _pointsNeeded3; //30%
        _discountTranches[4] = _pointsNeeded4; //40%
        _discountTranches[5] = _pointsNeeded5; //50%
        _discountTranches[6] = _pointsNeeded6; //60%
        _discountTranches[7] = _pointsNeeded7; //70%
        _discountTranches[8] = _pointsNeeded8; //80%
        _discountTranches[9] = _pointsNeeded9; //90%
    }
    
//== MINT points: onlyToken ==  
    function addPoints(address _address, uint256 _txSize, uint256 _points) external onlyToken {
       if(_txSize >= txThreshold){ _mint(_address, _points);}
    }
    
    function _transfer(address sender, address recipient, uint256 amount) internal override virtual {
        _ERC20._transfer(sender, recipient, amount);
        //force update discount
        uint256 _tranche = viewEligibilityOf(msg.sender);
        _discounts[msg.sender] =  SafeMath.mul(10, _tranche);
        
    }  //overriden to update discount at every points Transfer. Avoids passing tokens to get discounts.
    
    function burn(uint256 _amount) public returns(bool) {
        _ERC20._burn(msg.sender,_amount);
    }
} 


//DeFiat Governance v0.1 - 2020 AUG 27
pragma solidity ^0.6.0;
contract DeFiat_Gov{
//Governance contract for DeFiat Token.
    address public mastermind;
    mapping (address => uint256) private actorLevel; //governance = multi-tier level
    
    mapping (address => uint256) private override _balances; 
     mapping (address => uint256) private override _allowances; 
     
    uint256 private burnRate; // %rate of burn at each transaction
    uint256 private feeRate;  // %rate of fee taken at each transaction
    address private feeDestination; //target address for fees (to support staking contracts)

    event stdEvent(address _txOrigin, uint256 _number, bytes32 _signature, string _desc);

//== CONSTRUCTOR
constructor() public {
    mastermind = msg.sender;
    actorLevel[mastermind] = 3;
    feeDestination = mastermind;
    emit stdEvent(msg.sender, 3, sha256(abi.encodePacked(mastermind)), "constructor");
}

//== MODIFIERS ==
    modifier onlyMastermind {
    require(msg.sender == mastermind, " only Mastermind");
    _;
    }
    modifier onlyGovernor {
    require(actorLevel[msg.sender] >= 2,"only Governors");
    _;
    }
    modifier onlyPartner {
    require(actorLevel[msg.sender] >= 1,"only Partners");
    _;
    }  //future use
    
//== VIEW ==    
    function viewActorLevelOf(address _address) public view returns (uint256) {
        return actorLevel[_address]; //address lvl (3, 2, 1 or 0)
    }  
    function viewBurnRate() public view returns (uint256)  {
        return burnRate;
    }
    function viewFeeRate() public view returns (uint256)  {
        return feeRate;
    }
    function viewFeeDestination() public view returns (address)  {
        return feeDestination;
    }
    
//== SET INTERNAL VARIABLES==

    function setActorLevel(address _address, uint256 _newLevel) public {
      require(_newLevel < actorLevel[msg.sender], "Can only give rights below you");
      actorLevel[_address] = _newLevel; //updates level -> adds or removes rights
      emit stdEvent(_address, _newLevel, sha256(abi.encodePacked(msg.sender, _newLevel)), "Level changed");
    }
    
    //MasterMind specific 
    function removeAllRights(address _address) public onlyMastermind {
      require(_address != mastermind);
      actorLevel[_address] = 0; //removes all rights
      emit stdEvent(address(_address), 0, sha256(abi.encodePacked(_address)), "Rights Revoked");
    }
    function killContract() public onlyMastermind {
        selfdestruct(msg.sender); //destroys the contract if replacement needed
    } //only Mastermind can kill contract
    function setMastermind(address _mastermind) public onlyMastermind {
      mastermind = _mastermind;     //Only one mastermind
      actorLevel[_mastermind] = 3; 
      actorLevel[msg.sender] = 2;  //new level for previous mastermind
      emit stdEvent(tx.origin, 0, sha256(abi.encodePacked(_mastermind, mastermind)), "MasterMind Changed");
    }     //only Mastermind can transfer his own rights
     
    //Governors specific
    function changeBurnRate(uint _burnRate) public onlyGovernor {
      require(_burnRate <=200, "20% limit"); //cannot burn more than 20%/tx
      burnRate = _burnRate; 
      emit stdEvent(address(msg.sender), _burnRate, sha256(abi.encodePacked(msg.sender, _burnRate)), "BurnRate Changed");
    }     //only governors can change burnRate/tx
    function changeFeeRate(uint _feeRate) public onlyGovernor {
      require(_feeRate <=200, "20% limit"); //cannot take more than 20% fees/tx
      feeRate = _feeRate;
      emit stdEvent(address(msg.sender), _feeRate, sha256(abi.encodePacked(msg.sender, _feeRate)), "FeeRate Changed");
    }    //only governors can change feeRate/tx
    function setFeeDestination(address _nextDest) public onlyGovernor {
         feeDestination = _nextDest;
    }

}


//DeFiat Token - 2020 AUG 27
pragma solidity ^0.6.0;
contract DeFiat_Token is _ERC20 {  //overrides the _transfer function and adds burn capabilities

    using SafeMath for uint;

//== Variables ==
    address private mastermind;     // token creator.
    address public DeFiat_gov;      // contract governing the Token
    address public DeFiat_points;   // ERC20 loyalty TOKEN

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    uint8 private _decimals;
    
    struct Transaction {
        address sender;
        address recipient;
        uint256 burnRate;
        uint256 feeRate;
        address feeDestination;
        uint256 senderDiscount;
        uint256 recipientDiscount;
        uint256 actualDiscount;
    }
    Transaction private transaction;
        
//== Modifiers ==
    modifier onlyMastermind {
    require(msg.sender == mastermind, "only Mastermind");
    _;
    }
    modifier onlyGovernor {
    require(msg.sender == mastermind || msg.sender == DeFiat_gov, "only Governance contract");
    _;
    } //only Governance managing contract
    modifier onlyPoints {
    require(msg.sender == mastermind || msg.sender == DeFiat_points, " only Points contract");
    _;
    }   //only Points managing contract


    
//== Events ==
    event stdEvent(address _address, uint256 _number, bytes32 _signature, string _desc);
 
//== Token generation ==
    constructor (address _gov, address _points) public {  //token requires that governance and points are up and running
        mastermind = msg.sender;
        _constructor("DeFiat","DFT"); //calls the ERC20 _constructor
        _mint(mastermind, 1e18 * 500000); //mint 300,000 tokens
        
        DeFiat_gov = _gov;      // contract governing the Token
        DeFiat_points = _points;   // ERC20 loyalty TOKEN
    }
    
//== mastermind ==
    function widthdrawAnyToken(address _recipient, address _ERC20address, uint256 _amount) public onlyGovernor returns (bool) {
        IERC20(_ERC20address).transfer(_recipient, _amount); //use of the _ERC20 traditional transfer
        return true;
    } //get tokens sent by error to contract
    function setGovernorContract(address _gov) external onlyGovernor {
        DeFiat_gov = _gov;
    }    // -> governance transfer
    function setPointsContract(address _pts) external onlyGovernor {
        DeFiat_points = _pts;
    }      // -> new points management contract
    function setMastermind(address _mastermind) external onlyMastermind {
        mastermind = _mastermind; //use the 0x0 address to resign
    } // transfered to go contract OCT 2020

//== View variables from external contracts ==
    function _viewFeeRate() public view returns(uint256){
       return DeFiat_Gov(DeFiat_gov).viewFeeRate();
    }
    function _viewBurnRate() public view returns(uint256){
        return DeFiat_Gov(DeFiat_gov).viewBurnRate();
    }
    function _viewFeeDestination() public view returns(address){
        return DeFiat_Gov(DeFiat_gov).viewFeeDestination();
    }
    function _viewDiscountOf(address _address) public view returns(uint256){
        return DeFiat_Points(DeFiat_points).viewDiscountOf(_address);
    }
    function _viewPointsOf(address _address) public view returns(uint256){
        return DeFiat_Points(DeFiat_points).balanceOf(_address);
    }
  
//== override _transfer function in the ERC20Simple contract ==    
    function updateTxStruct(address sender, address recipient) internal returns(bool){
        transaction.sender = sender;
        transaction.recipient = recipient;
        transaction.burnRate = _viewBurnRate();
        transaction.feeRate = _viewFeeRate();
        transaction.feeDestination = _viewFeeDestination();
        transaction.senderDiscount = _viewDiscountOf(sender);
        transaction.recipientDiscount = _viewDiscountOf(recipient);
        transaction.actualDiscount = SafeMath.max(transaction.senderDiscount, transaction.recipientDiscount);
        
         if( transaction.actualDiscount > 100){transaction.actualDiscount = 100;} //manages "forever pools"
    
        return true;
    } //struct used to prevent "stack too deep" error
    
    function addPoints(address sender, uint256 _threshold) public {
    DeFiat_Points(DeFiat_points).addPoints(sender, _threshold, 1e18); //Update user's loyalty points +1 = +1e18
    }
    
    function _transfer(address sender, address recipient, uint256 amount) internal override { //overrides the inherited ERC20 _transfer
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        
    //load transaction Struct (gets info from external contracts)
        updateTxStruct(sender, recipient);
        
    //get discounts and apply them. You get the MAX discounts of the sender x recipient. discount is base100
        uint256 dAmount = 
        SafeMath.div(
            SafeMath.mul(amount, 
                                SafeMath.sub(100, transaction.actualDiscount))
        ,100);     //amount discounted to calculate fees

    //Calculates burn and fees on discounted amount (burn and fees are 0.0X% ie base 10000 -> "10" = 0.1%)
        uint _toBurn = SafeMath.div(SafeMath.mul(dAmount,transaction.burnRate),10000); 
        uint _toFee = SafeMath.div(SafeMath.mul(dAmount,transaction.feeRate),10000); 
        uint _amount = SafeMath.sub(amount, SafeMath.add(_toBurn,_toFee)); //calculates the remaning amount to be sent
   
    //transfers -> forcing _ERC20 inheritance level
        if(_toFee > 0) {
        _ERC20._transfer(sender, transaction.feeDestination, _toFee); //native _transfer + emit
        } //transfer fee
        
        if(_toBurn > 0) {_ERC20._burn(sender,_toBurn);} //native _burn tokens from sender
        
        //transfer remaining amount. + emit
        _ERC20._transfer(sender, recipient, _amount); //native _transfer + emit

        //mint loyalty points and update lastTX
        if(sender != recipient){addPoints(sender, amount);} //uses the full amount to determine point minting
    }
    
    function burn(uint256 _amount) public returns(bool) {
        _ERC20._burn(msg.sender,_amount);
    }

}

// End of code. Thanks for reading. If you had the patience and skills to read it all, send us a msg on out social media platrofms. (DeFiat 2020)

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_gov","type":"address"},{"internalType":"address","name":"_points","type":"address"}],"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":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_number","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_signature","type":"bytes32"},{"indexed":false,"internalType":"string","name":"_desc","type":"string"}],"name":"stdEvent","type":"event"},{"inputs":[],"name":"DeFiat_gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DeFiat_points","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_viewBurnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"_viewDiscountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_viewFeeDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_viewFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"_viewPointsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"addPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGovernorContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mastermind","type":"address"}],"name":"setMastermind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pts","type":"address"}],"name":"setPointsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"address","name":"_ERC20address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"widthdrawAnyToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002cf938038062002cf9833981810160405260408110156200003757600080fd5b81019080805190602001909291908051906020019092919050505033600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200010f6040518060400160405280600681526020017f44654669617400000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4446540000000000000000000000000000000000000000000000000000000000815250620001d760201b60201c565b6200014d600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166969e10de76676d08000006200022960201b60201c565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000544565b8160039080519060200190620001ef92919062000495565b5080600490805190602001906200020892919062000495565b506012600560006101000a81548160ff021916908360ff1602179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620002e1600083836200040760201b60201c565b620002fd816002546200040c60201b62001da21790919060201c565b6002819055506200035b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200040c60201b62001da21790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b6000808284019050838110156200048b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004d857805160ff191683800117855562000509565b8280016001018555821562000509579182015b8281111562000508578251825591602001919060010190620004eb565b5b5090506200051891906200051c565b5090565b6200054191905b808211156200053d57600081600090555060010162000523565b5090565b90565b6127a580620005546000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063545f5057116100c357806395754abb1161007c57806395754abb146106f457806395d89b4114610738578063a457c2d7146107bb578063a9059cbb14610821578063bdcdb02f14610887578063dd62ed3e146108cb57610158565b8063545f50571461053857806355d2d3d7146105565780635649aceb146105dc57806370a0823114610634578063769623dd1461068c57806376d29ff5146106d657610158565b80632256f585116101155780632256f5851461034a57806323b872dd14610394578063313ce5671461041a578063395093511461043e57806342966c68146104a4578063507cd30f146104ea57610158565b806306c498221461015d57806306fdde03146101a1578063095ea7b3146102245780630baea1ad1461028a578063122ae47c146102e257806318160ddd1461032c575b600080fd5b61019f6004803603602081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610943565b005b6101a9610aa2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101e95780820151818401526020810190506101ce565b50505050905090810190601f1680156102165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102706004803603604081101561023a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b44565b604051808215151515815260200191505060405180910390f35b6102cc600480360360208110156102a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b62565b6040518082815260200191505060405180910390f35b6102ea610c45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610334610c6b565b6040518082815260200191505060405180910390f35b610352610c75565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610400600480360360608110156103aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c9b565b604051808215151515815260200191505060405180910390f35b610422610d74565b604051808260ff1660ff16815260200191505060405180910390f35b61048a6004803603604081101561045457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d8b565b604051808215151515815260200191505060405180910390f35b6104d0600480360360208110156104ba57600080fd5b8101908080359060200190929190505050610e3e565b604051808215151515815260200191505060405180910390f35b6105366004803603604081101561050057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e4f565b005b610540610f24565b6040518082815260200191505060405180910390f35b6105c26004803603606081101561056c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fce565b604051808215151515815260200191505060405180910390f35b61061e600480360360208110156105f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111b9565b6040518082815260200191505060405180910390f35b6106766004803603602081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061129c565b6040518082815260200191505060405180910390f35b6106946112e4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106de61138e565b6040518082815260200191505060405180910390f35b6107366004803603602081101561070a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611438565b005b610740611597565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610780578082015181840152602081019050610765565b50505050905090810190601f1680156107ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610807600480360360408110156107d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611639565b604051808215151515815260200191505060405180910390f35b61086d6004803603604081101561083757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611706565b604051808215151515815260200191505060405180910390f35b6108c96004803603602081101561089d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611724565b005b61092d600480360360408110156108e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061182b565b6040518082815260200191505060405180910390f35b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109ec5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6f6e6c7920476f7665726e616e636520636f6e7472616374000000000000000081525060200191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b5050505050905090565b6000610b58610b516118b2565b84846118ba565b6001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c0357600080fd5b505afa158015610c17573d6000803e3d6000fd5b505050506040513d6020811015610c2d57600080fd5b81019080805190602001909291905050509050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610ca8848484611ab1565b610d6984610cb46118b2565b610d64856040518060600160405280602881526020016126b960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d1a6118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6118ba565b600190509392505050565b6000600560009054906101000a900460ff16905090565b6000610e34610d986118b2565b84610e2f8560016000610da96118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611da290919063ffffffff16565b6118ba565b6001905092915050565b6000610e4a3383611e2a565b919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323d14d608383670de0b6b3a76400006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc97240a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8e57600080fd5b505afa158015610fa2573d6000803e3d6000fd5b505050506040513d6020811015610fb857600080fd5b8101908080519060200190929190505050905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110795750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6f6e6c7920476f7665726e616e636520636f6e7472616374000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561117257600080fd5b505af1158015611186573d6000803e3d6000fd5b505050506040513d602081101561119c57600080fd5b810190808051906020019092919050505050600190509392505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ef94fa7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561125a57600080fd5b505afa15801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b81019080805190602001909291905050509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166344fbf7f16040518163ffffffff1660e01b815260040160206040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d602081101561137857600080fd5b8101908080519060200190929190505050905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633150cf806040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f857600080fd5b505afa15801561140c573d6000803e3d6000fd5b505050506040513d602081101561142257600080fd5b8101908080519060200190929190505050905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114e15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611553576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6f6e6c7920476f7665726e616e636520636f6e7472616374000000000000000081525060200191505060405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561162f5780601f106116045761010080835404028352916020019161162f565b820191906000526020600020905b81548152906001019060200180831161161257829003601f168201915b5050505050905090565b60006116fc6116466118b2565b846116f78560405180606001604052806025815260200161274b60259139600160006116706118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6118ba565b6001905092915050565b600061171a6117136118b2565b8484611ab1565b6001905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6f6e6c79204d61737465726d696e64000000000000000000000000000000000081525060200191505060405180910390fd5b80600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806127276024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806126506022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806127026025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061260b6023913960400191505060405180910390fd5b611bc78383611fee565b506000611bed611be683611be16064600c6007015461214a565b612194565b606461221a565b90506000611c0b611c0383600c60020154612194565b61271061221a565b90506000611c29611c2184600c60030154612194565b61271061221a565b90506000611c4085611c3b8585611da2565b61214a565b90506000821115611c7c57611c7b87600c60040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612264565b5b6000831115611c9057611c8f8784611e2a565b5b611c9b878783612264565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611cd957611cd88786610e4f565b5b50505050505050565b6000838311158290611d8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d54578082015181840152602081019050611d39565b50505050905090810190601f168015611d815780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126e16021913960400191505060405180910390fd5b611ebc82600083612525565b611f278160405180606001604052806022815260200161262e602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f7e8160025461214a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600082600c60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612080610f24565b600c6002018190555061209161138e565b600c600301819055506120a26112e4565b600c60040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120ee836111b9565b600c60050181905550612100826111b9565b600c6006018190555061211d600c60050154600c6006015461252a565b600c600701819055506064600c600701541115612140576064600c600701819055505b6001905092915050565b600061218c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ce2565b905092915050565b6000808314156121a75760009050612214565b60008284029050828482816121b857fe5b041461220f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126986021913960400191505060405180910390fd5b809150505b92915050565b600061225c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612544565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806127026025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061260b6023913960400191505060405180910390fd5b61237b838383612525565b6123e681604051806060016040528060268152602001612672602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612479816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611da290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b505050565b60008183101561253a578161253c565b825b905092915050565b600080831182906125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156125b557808201518184015260208101905061259a565b50505050905090810190601f1680156125e25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816125fc57fe5b04905080915050939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b37b2efef2be4a1b04145669df58cc2807fd436fcac54cb0f879076795435eeb64736f6c634300060000330000000000000000000000003aa3303877a0d1c360a9fe2693ae9f31087a13810000000000000000000000008c9d8f5cc3427f460e20f63b36992f74aa19e27d

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063545f5057116100c357806395754abb1161007c57806395754abb146106f457806395d89b4114610738578063a457c2d7146107bb578063a9059cbb14610821578063bdcdb02f14610887578063dd62ed3e146108cb57610158565b8063545f50571461053857806355d2d3d7146105565780635649aceb146105dc57806370a0823114610634578063769623dd1461068c57806376d29ff5146106d657610158565b80632256f585116101155780632256f5851461034a57806323b872dd14610394578063313ce5671461041a578063395093511461043e57806342966c68146104a4578063507cd30f146104ea57610158565b806306c498221461015d57806306fdde03146101a1578063095ea7b3146102245780630baea1ad1461028a578063122ae47c146102e257806318160ddd1461032c575b600080fd5b61019f6004803603602081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610943565b005b6101a9610aa2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101e95780820151818401526020810190506101ce565b50505050905090810190601f1680156102165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102706004803603604081101561023a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b44565b604051808215151515815260200191505060405180910390f35b6102cc600480360360208110156102a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b62565b6040518082815260200191505060405180910390f35b6102ea610c45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610334610c6b565b6040518082815260200191505060405180910390f35b610352610c75565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610400600480360360608110156103aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c9b565b604051808215151515815260200191505060405180910390f35b610422610d74565b604051808260ff1660ff16815260200191505060405180910390f35b61048a6004803603604081101561045457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d8b565b604051808215151515815260200191505060405180910390f35b6104d0600480360360208110156104ba57600080fd5b8101908080359060200190929190505050610e3e565b604051808215151515815260200191505060405180910390f35b6105366004803603604081101561050057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e4f565b005b610540610f24565b6040518082815260200191505060405180910390f35b6105c26004803603606081101561056c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fce565b604051808215151515815260200191505060405180910390f35b61061e600480360360208110156105f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111b9565b6040518082815260200191505060405180910390f35b6106766004803603602081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061129c565b6040518082815260200191505060405180910390f35b6106946112e4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106de61138e565b6040518082815260200191505060405180910390f35b6107366004803603602081101561070a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611438565b005b610740611597565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610780578082015181840152602081019050610765565b50505050905090810190601f1680156107ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610807600480360360408110156107d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611639565b604051808215151515815260200191505060405180910390f35b61086d6004803603604081101561083757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611706565b604051808215151515815260200191505060405180910390f35b6108c96004803603602081101561089d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611724565b005b61092d600480360360408110156108e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061182b565b6040518082815260200191505060405180910390f35b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109ec5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6f6e6c7920476f7665726e616e636520636f6e7472616374000000000000000081525060200191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b5050505050905090565b6000610b58610b516118b2565b84846118ba565b6001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c0357600080fd5b505afa158015610c17573d6000803e3d6000fd5b505050506040513d6020811015610c2d57600080fd5b81019080805190602001909291905050509050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610ca8848484611ab1565b610d6984610cb46118b2565b610d64856040518060600160405280602881526020016126b960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d1a6118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6118ba565b600190509392505050565b6000600560009054906101000a900460ff16905090565b6000610e34610d986118b2565b84610e2f8560016000610da96118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611da290919063ffffffff16565b6118ba565b6001905092915050565b6000610e4a3383611e2a565b919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323d14d608383670de0b6b3a76400006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc97240a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8e57600080fd5b505afa158015610fa2573d6000803e3d6000fd5b505050506040513d6020811015610fb857600080fd5b8101908080519060200190929190505050905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110795750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6f6e6c7920476f7665726e616e636520636f6e7472616374000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561117257600080fd5b505af1158015611186573d6000803e3d6000fd5b505050506040513d602081101561119c57600080fd5b810190808051906020019092919050505050600190509392505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ef94fa7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561125a57600080fd5b505afa15801561126e573d6000803e3d6000fd5b505050506040513d602081101561128457600080fd5b81019080805190602001909291905050509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166344fbf7f16040518163ffffffff1660e01b815260040160206040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d602081101561137857600080fd5b8101908080519060200190929190505050905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633150cf806040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f857600080fd5b505afa15801561140c573d6000803e3d6000fd5b505050506040513d602081101561142257600080fd5b8101908080519060200190929190505050905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114e15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611553576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6f6e6c7920476f7665726e616e636520636f6e7472616374000000000000000081525060200191505060405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561162f5780601f106116045761010080835404028352916020019161162f565b820191906000526020600020905b81548152906001019060200180831161161257829003601f168201915b5050505050905090565b60006116fc6116466118b2565b846116f78560405180606001604052806025815260200161274b60259139600160006116706118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6118ba565b6001905092915050565b600061171a6117136118b2565b8484611ab1565b6001905092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6f6e6c79204d61737465726d696e64000000000000000000000000000000000081525060200191505060405180910390fd5b80600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806127276024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806126506022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806127026025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061260b6023913960400191505060405180910390fd5b611bc78383611fee565b506000611bed611be683611be16064600c6007015461214a565b612194565b606461221a565b90506000611c0b611c0383600c60020154612194565b61271061221a565b90506000611c29611c2184600c60030154612194565b61271061221a565b90506000611c4085611c3b8585611da2565b61214a565b90506000821115611c7c57611c7b87600c60040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612264565b5b6000831115611c9057611c8f8784611e2a565b5b611c9b878783612264565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611cd957611cd88786610e4f565b5b50505050505050565b6000838311158290611d8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d54578082015181840152602081019050611d39565b50505050905090810190601f168015611d815780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126e16021913960400191505060405180910390fd5b611ebc82600083612525565b611f278160405180606001604052806022815260200161262e602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f7e8160025461214a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600082600c60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612080610f24565b600c6002018190555061209161138e565b600c600301819055506120a26112e4565b600c60040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506120ee836111b9565b600c60050181905550612100826111b9565b600c6006018190555061211d600c60050154600c6006015461252a565b600c600701819055506064600c600701541115612140576064600c600701819055505b6001905092915050565b600061218c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ce2565b905092915050565b6000808314156121a75760009050612214565b60008284029050828482816121b857fe5b041461220f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126986021913960400191505060405180910390fd5b809150505b92915050565b600061225c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612544565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806127026025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061260b6023913960400191505060405180910390fd5b61237b838383612525565b6123e681604051806060016040528060268152602001612672602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce29092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612479816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611da290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b505050565b60008183101561253a578161253c565b825b905092915050565b600080831182906125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156125b557808201518184015260208101905061259a565b50505050905090810190601f1680156125e25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816125fc57fe5b04905080915050939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b37b2efef2be4a1b04145669df58cc2807fd436fcac54cb0f879076795435eeb64736f6c63430006000033

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

0000000000000000000000003aa3303877a0d1c360a9fe2693ae9f31087a13810000000000000000000000008c9d8f5cc3427f460e20f63b36992f74aa19e27d

-----Decoded View---------------
Arg [0] : _gov (address): 0x3Aa3303877A0D1c360a9FE2693AE9f31087A1381
Arg [1] : _points (address): 0x8c9d8f5CC3427F460e20F63b36992f74AA19e27d

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003aa3303877a0d1c360a9fe2693ae9f31087a1381
Arg [1] : 0000000000000000000000008c9d8f5cc3427f460e20f63b36992f74aa19e27d


Deployed Bytecode Sourcemap

29584:6312:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29584:6312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31749:101;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31749:101:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11580:83;;;:::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;11580:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13686:169;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13686:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32803:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32803:143:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29794:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12655:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29863:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14329:321;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14329:321:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12507:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15059:218;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15059:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35788:103;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35788:103:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33803:183;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33803:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32391:116;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31449:255;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31449:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32647:150;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32647:150:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12818:119;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12818:119:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32513:128;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32272:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31885:102;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31885:102:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11782:87;;;:::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;11782:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15780:269;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15780:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13150:175;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13150:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32035:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32035:143:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13388:151;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13388:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31749:101;30549:10;;;;;;;;;;;30535:24;;:10;:24;;;:52;;;;30577:10;;;;;;;;;;;30563:24;;:10;:24;;;30535:52;30527:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31838:4:::1;31825:10;;:17;;;;;;;;;;;;;;;;;;31749:101:::0;:::o;11580:83::-;11617:13;11650:5;11643:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11580:83;:::o;13686:169::-;13769:4;13786:39;13795:12;:10;:12::i;:::-;13809:7;13818:6;13786:8;:39::i;:::-;13843:4;13836:11;;13686:169;;;;:::o;32803:143::-;32864:7;32904:13;;;;;;;;;;;32890:38;;;32929:8;32890:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32890:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32890:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32890:48:0;;;;;;;;;;;;;;;;32883:55;;32803:143;;;:::o;29794:25::-;;;;;;;;;;;;;:::o;12655:100::-;12708:7;12735:12;;12728:19;;12655:100;:::o;29863:28::-;;;;;;;;;;;;;:::o;14329:321::-;14435:4;14452:36;14462:6;14470:9;14481:6;14452:9;:36::i;:::-;14499:121;14508:6;14516:12;:10;:12::i;:::-;14530:89;14568:6;14530:89;;;;;;;;;;;;;;;;;:11;:19;14542:6;14530:19;;;;;;;;;;;;;;;:33;14550:12;:10;:12::i;:::-;14530:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;14499:8;:121::i;:::-;14638:4;14631:11;;14329:321;;;;;:::o;12507:83::-;12548:5;12573:9;;;;;;;;;;;12566:16;;12507:83;:::o;15059:218::-;15147:4;15164:83;15173:12;:10;:12::i;:::-;15187:7;15196:50;15235:10;15196:11;:25;15208:12;:10;:12::i;:::-;15196:25;;;;;;;;;;;;;;;:34;15222:7;15196:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;15164:8;:83::i;:::-;15265:4;15258:11;;15059:218;;;;:::o;35788:103::-;35834:4;35851:32;35864:10;35875:7;35851:12;:32::i;:::-;35788:103;;;:::o;33803:183::-;33886:13;;;;;;;;;;;33872:38;;;33911:6;33919:10;33931:4;33872:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33872:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33872:64:0;;;;33803:183;;:::o;32391:116::-;32436:7;32473:10;;;;;;;;;;;32462:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32462:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32462:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32462:37:0;;;;;;;;;;;;;;;;32455:44;;32391:116;:::o;31449:255::-;31565:4;30549:10;;;;;;;;;;;30535:24;;:10;:24;;;:52;;;;30577:10;;;;;;;;;;;30563:24;;:10;:24;;;30535:52;30527:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31589:13:::1;31582:30;;;31613:10;31625:7;31582:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;31582:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31582:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;31582:51:0;;;;;;;;;;;;;;;;;31692:4;31685:11;;31449:255:::0;;;;;:::o;32647:150::-;32710:7;32750:13;;;;;;;;;;;32736:43;;;32780:8;32736:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32736:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32736:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32736:53:0;;;;;;;;;;;;;;;;32729:60;;32647:150;;;:::o;12818:119::-;12884:7;12911:9;:18;12921:7;12911:18;;;;;;;;;;;;;;;;12904:25;;12818:119;;;:::o;32513:128::-;32564:7;32601:10;;;;;;;;;;;32590:41;;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32590:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32590:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32590:43:0;;;;;;;;;;;;;;;;32583:50;;32513:128;:::o;32272:113::-;32316:7;32352:10;;;;;;;;;;;32341:34;;;:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32341:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32341:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32341:36:0;;;;;;;;;;;;;;;;32334:43;;32272:113;:::o;31885:102::-;30549:10;;;;;;;;;;;30535:24;;:10;:24;;;:52;;;;30577:10;;;;;;;;;;;30563:24;;:10;:24;;;30535:52;30527:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31975:4:::1;31959:13;;:20;;;;;;;;;;;;;;;;;;31885:102:::0;:::o;11782:87::-;11821:13;11854:7;11847:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11782:87;:::o;15780:269::-;15873:4;15890:129;15899:12;:10;:12::i;:::-;15913:7;15922:96;15961:15;15922:96;;;;;;;;;;;;;;;;;:11;:25;15934:12;:10;:12::i;:::-;15922:25;;;;;;;;;;;;;;;:34;15948:7;15922:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;15890:8;:129::i;:::-;16037:4;16030:11;;15780:269;;;;:::o;13150:175::-;13236:4;13253:42;13263:12;:10;:12::i;:::-;13277:9;13288:6;13253:9;:42::i;:::-;13313:4;13306:11;;13150:175;;;;:::o;32035:143::-;30446:10;;;;;;;;;;;30432:24;;:10;:24;;;30424:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32127:11:::1;32114:10;;:24;;;;;;;;;;;;;;;;;;32035:143:::0;:::o;13388:151::-;13477:7;13504:11;:18;13516:5;13504:18;;;;;;;;;;;;;;;:27;13523:7;13504:27;;;;;;;;;;;;;;;;13497:34;;13388:151;;;;:::o;7564:106::-;7617:15;7652:10;7645:17;;7564:106;:::o;18980:346::-;19099:1;19082:19;;:5;:19;;;;19074:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19180:1;19161:21;;:7;:21;;;;19153:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19264:6;19234:11;:18;19246:5;19234:18;;;;;;;;;;;;;;;:27;19253:7;19234:27;;;;;;;;;;;;;;;:36;;;;19302:7;19286:32;;19295:5;19286:32;;;19311:6;19286:32;;;;;;;;;;;;;;;;;;18980:346;;;:::o;33998:1778::-;34165:1;34147:20;;:6;:20;;;;34139:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34249:1;34228:23;;:9;:23;;;;34220:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:33;34394:6;34402:9;34379:14;:33::i;:::-;;34543:15;34571:143;34598:101;34611:6;34653:45;34666:3;34671:11;:26;;;34653:12;:45::i;:::-;34598:12;:101::i;:::-;34710:3;34571:12;:143::i;:::-;34543:171;;34877:12;34892:62;34905:42;34918:7;34926:11;:20;;;34905:12;:42::i;:::-;34948:5;34892:12;:62::i;:::-;34877:77;;34966:11;34980:61;34993:41;35006:7;35014:11;:19;;;34993:12;:41::i;:::-;35035:5;34980:12;:61::i;:::-;34966:75;;35053:12;35068:50;35081:6;35089:28;35102:7;35110:6;35089:12;:28::i;:::-;35068:12;:50::i;:::-;35053:65;;35243:1;35234:6;:10;35231:124;;;35257:60;35274:6;35282:11;:26;;;;;;;;;;;;35310:6;35257:16;:60::i;:::-;35231:124;35403:1;35393:7;:11;35390:47;;;35407:28;35420:6;35427:7;35407:12;:28::i;:::-;35390:47;35536:44;35553:6;35561:9;35572:7;35536:16;:44::i;:::-;35681:9;35671:19;;:6;:19;;;35668:51;;35692:25;35702:6;35710;35692:9;:25::i;:::-;35668:51;33998:1778;;;;;;;:::o;3664:192::-;3750:7;3783:1;3778;:6;;3786:12;3770: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;3770:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3810:9;3826:1;3822;:5;3810:17;;3847:1;3840:8;;;3664:192;;;;;:::o;2761:181::-;2819:7;2839:9;2855:1;2851;:5;2839:17;;2880:1;2875;:6;;2867:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2933:1;2926:8;;;2761:181;;;;:::o;18122:418::-;18225:1;18206:21;;:7;:21;;;;18198:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18278:49;18299:7;18316:1;18320:6;18278:20;:49::i;:::-;18361:68;18384:6;18361:68;;;;;;;;;;;;;;;;;:9;:18;18371:7;18361:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;18340:9;:18;18350:7;18340:18;;;;;;;;;;;;;;;:89;;;;18455:24;18472:6;18455:12;;:16;;:24;;;;:::i;:::-;18440:12;:39;;;;18521:1;18495:37;;18504:7;18495:37;;;18525:6;18495:37;;;;;;;;;;;;;;;;;;18122:418;;:::o;33025:718::-;33101:4;33138:6;33117:11;:18;;;:27;;;;;;;;;;;;;;;;;;33179:9;33155:11;:21;;;:33;;;;;;;;;;;;;;;;;;33222:15;:13;:15::i;:::-;33199:11;:20;;:38;;;;33270:14;:12;:14::i;:::-;33248:11;:19;;:36;;;;33324:21;:19;:21::i;:::-;33295:11;:26;;;:50;;;;;;;;;;;;;;;;;;33385:23;33401:6;33385:15;:23::i;:::-;33356:11;:26;;:52;;;;33451:26;33467:9;33451:15;:26::i;:::-;33419:11;:29;;:58;;;;33517:71;33530:11;:26;;;33558:11;:29;;;33517:12;:71::i;:::-;33488:11;:26;;:100;;;;33643:3;33614:11;:26;;;:32;33610:72;;;33677:3;33648:11;:26;;:32;;;;33610:72;33731:4;33724:11;;33025:718;;;;:::o;3225:136::-;3283:7;3310:43;3314:1;3317;3310:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3303:50;;3225:136;;;;:::o;4115:471::-;4173:7;4423:1;4418;:6;4414:47;;;4448:1;4441:8;;;;4414:47;4473:9;4489:1;4485;:5;4473:17;;4518:1;4513;4509;:5;;;;;;:10;4501:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4577:1;4570:8;;;4115:471;;;;;:::o;5062:132::-;5120:7;5147:39;5151:1;5154;5147:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5140:46;;5062:132;;;;:::o;16563:539::-;16687:1;16669:20;;:6;:20;;;;16661:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16771:1;16750:23;;:9;:23;;;;16742:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16826:47;16847:6;16855:9;16866:6;16826:20;:47::i;:::-;16906:71;16928:6;16906:71;;;;;;;;;;;;;;;;;:9;:17;16916:6;16906:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;16886:9;:17;16896:6;16886:17;;;;;;;;;;;;;;;:91;;;;17011:32;17036:6;17011:9;:20;17021:9;17011:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;16988:9;:20;16998:9;16988:20;;;;;;;;;;;;;;;:55;;;;17076:9;17059:35;;17068:6;17059:35;;;17087:6;17059:35;;;;;;;;;;;;;;;;;;16563:539;;;:::o;20351:92::-;;;;:::o;7274:107::-;7332:7;7364:1;7359;:6;;:14;;7372:1;7359:14;;;7368:1;7359:14;7352:21;;7274:107;;;;:::o;5690:278::-;5776:7;5808:1;5804;:5;5811:12;5796:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;5796:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5835:9;5851:1;5847;:5;;;;;;5835:17;;5959:1;5952:8;;;5690:278;;;;;:::o

Swarm Source

ipfs://b37b2efef2be4a1b04145669df58cc2807fd436fcac54cb0f879076795435eeb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.