Token TAZOR

 

Overview ERC-20

Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
500,137.815229 TAZOR

Holders:
415 addresses

Transfers:
-

Contract:
0xee65d8b88f86ace0f7ba42ba2d2c679b6f604bf00xee65D8B88F86ace0f7bA42BA2d2C679b6f604bf0

Decimals:
9

Social Profiles:
Not Available, Update ?

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Tazor

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 2 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-17
*/

// SPDX-License-Identifier: MIT
// File contracts/libraries/SafeMath.sol
// Tazor.io Domain

pragma solidity ^0.7.5;


// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

}


// File contracts/interfaces/IERC20.sol

pragma solidity >=0.7.5;

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);
}


// File contracts/interfaces/ITAZOR.sol

pragma solidity >=0.7.5;

interface ITAZOR is IERC20 {
  function mint(address account_, uint256 amount_) external;

  function burn(uint256 amount) external;

  function burnFrom(address account_, uint256 amount_) external;
}


// File contracts/interfaces/IERC20Permit.sol


pragma solidity >=0.7.5;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as th xe allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File contracts/types/ERC20.sol

pragma solidity >=0.7.5;

abstract contract ERC20 is IERC20 {

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );

    mapping (address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

    string internal _name;

    string internal _symbol;

    uint8 internal immutable _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    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);
    }

    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);
    }

    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);
    }

    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);
    }

  function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}


// File contracts/cryptography/ECDSA.sol

pragma solidity ^0.7.5;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ├╖ 2 + 1, and for v in (302): v Γêê {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File contracts/cryptography/EIP712.sol

pragma solidity ^0.7.5;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = chainID;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        if (chainID == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        return keccak256(abi.encode(typeHash, nameHash, versionHash, chainID, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}


// File contracts/libraries/Counters.sol

pragma solidity ^0.7.5;

library Counters {
    using SafeMath for uint256;

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

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

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

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


// File contracts/types/ERC20Permit.sol

pragma solidity >=0.7.5;


/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}


// File contracts/interfaces/ITazorAuthority.sol

pragma solidity =0.7.5;

interface ITazorAuthority {
    /* ========== EVENTS ========== */

    event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);

    event GovernorPulled(address indexed from, address indexed to);
    event GuardianPulled(address indexed from, address indexed to);
    event PolicyPulled(address indexed from, address indexed to);
    event VaultPulled(address indexed from, address indexed to);

    /* ========== VIEW ========== */

    function governor() external view returns (address);
    function guardian() external view returns (address);
    function policy() external view returns (address);
    function vault() external view returns (address);
    function vaults(address account) external view returns (bool);
}


// File contracts/types/TazorAccessControlled.sol

pragma solidity >=0.7.5;

abstract contract TazorAccessControlled {

    /* ========== EVENTS ========== */

    event AuthorityUpdated(ITazorAuthority indexed authority);

    string UNAUTHORIZED = "UNAUTHORIZED"; // save gas

    /* ========== STATE VARIABLES ========== */

    ITazorAuthority public authority;


    /* ========== Constructor ========== */

    constructor(ITazorAuthority _authority) {
        authority = _authority;
        emit AuthorityUpdated(_authority);
    }


    /* ========== MODIFIERS ========== */

    modifier onlyGovernor() {
        require(msg.sender == authority.governor(), UNAUTHORIZED);
        _;
    }

    modifier onlyGuardian() {
        require(msg.sender == authority.guardian(), UNAUTHORIZED);
        _;
    }

    modifier onlyPolicy() {
        require(msg.sender == authority.policy(), UNAUTHORIZED);
        _;
    }

    modifier onlyVault() {
        require(authority.vaults(msg.sender) == true, UNAUTHORIZED);
        _;
    }

    /* ========== GOV ONLY ========== */

    function setAuthority(ITazorAuthority _newAuthority) external onlyGovernor {
        authority = _newAuthority;
        emit AuthorityUpdated(_newAuthority);
    }
}


// File contracts/TazorERC20.sol

pragma solidity ^0.7.5;

contract Tazor is ERC20Permit, ITAZOR, TazorAccessControlled {
    using SafeMath for uint256;

    constructor(address _authority)
    ERC20("TAZOR", "TAZOR", 9)
    ERC20Permit("TAZOR")
    TazorAccessControlled(ITazorAuthority(_authority)) {
        // _totalSupply = 7_000_000 * 10**9;
        _mint(msg.sender, 7_000_000 * 10**9);
    }

    function mint(address account_, uint256 amount_) external override onlyVault {
        _mint(account_, amount_);
    }

    function burn(uint256 amount) external override onlyVault {
        _burn(msg.sender, amount);
    }

    function burnFrom(address account_, uint256 amount_) external override onlyVault {
        _burnFrom(account_, amount_);
    }

    function _burnFrom(address account_, uint256 amount_) internal {
        uint256 decreasedAllowance_ = allowance(account_, msg.sender).sub(amount_, "ERC20: burn amount exceeds allowance");

        _approve(account_, msg.sender, decreasedAllowance_);
        _burn(account_, amount_);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_authority","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":"contract ITazorAuthority","name":"authority","type":"address"}],"name":"AuthorityUpdated","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"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[],"name":"authority","outputs":[{"internalType":"contract ITazorAuthority","name":"","type":"address"}],"stateMutability":"view","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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"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":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITazorAuthority","name":"_newAuthority","type":"address"}],"name":"setAuthority","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"}]

7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140526101a0604052600c6101608190526b15539055551213d49256915160a21b610180908152620000579160069190620003bf565b503480156200006557600080fd5b5060405162001d1638038062001d16833981810160405260208110156200008b57600080fd5b50516040805180820182526005808252642a20ad27a960d91b60208381018290528451808601865260018152603160f81b81830152855180870187528481528083018481528751808901909852948752918601929092528051869585949091600991620000fc9160039190620003bf565b50815162000112906004906020850190620003bf565b5060f81b7fff00000000000000000000000000000000000000000000000000000000000000166080525050815160208084019190912082519183019190912060e08290526101008190524660c081905291907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6200019281848462000204565b60a052610120525050600780546001600160a01b0319166001600160a01b0387169081179091556040519094507f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad9350600092509050a250620001fd336618de76816d800062000249565b506200046b565b604080516020808201959095528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b6001600160a01b038216620002a5576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620002b36000838362000358565b620002cf816002546200035d60201b62000cb91790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200030291839062000cb96200035d821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b600082820183811015620003b8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003f7576000855562000442565b82601f106200041257805160ff191683800117855562000442565b8280016001018555821562000442579182015b828111156200044257825182559160200191906001019062000425565b506200045092915062000454565b5090565b5b8082111562000450576000815560010162000455565b60805160f81c60a05160c05160e051610100516101205161014051611854620004c260003980610b6b52508061103d52508061107f52508061105e525080610fe952508061101152508061055f52506118546000f3fe608060405234801561001057600080fd5b50600436106100f15760003560e01c806306fdde03146100f6578063095ea7b31461017357806318160ddd146101b357806323b872dd146101cd578063313ce567146102035780633644e51514610221578063395093511461022957806340c10f191461025557806342966c681461028357806370a08231146102a057806379cc6790146102c65780637a9e5e4b146102f25780637ecebe001461031857806395d89b411461033e578063a457c2d714610346578063a9059cbb14610372578063bf7e214f1461039e578063d505accf146103c2578063dd62ed3e14610413575b600080fd5b6100fe610441565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019f6004803603604081101561018957600080fd5b506001600160a01b0381351690602001356104d8565b604080519115158252519081900360200190f35b6101bb6104ee565b60408051918252519081900360200190f35b61019f600480360360608110156101e357600080fd5b506001600160a01b038135811691602081013590911690604001356104f4565b61020b61055d565b6040805160ff9092168252519081900360200190f35b6101bb610581565b61019f6004803603604081101561023f57600080fd5b506001600160a01b038135169060200135610590565b6102816004803603604081101561026b57600080fd5b506001600160a01b0381351690602001356105c6565b005b6102816004803603602081101561029957600080fd5b50356106f1565b6101bb600480360360208110156102b657600080fd5b50356001600160a01b03166107e1565b610281600480360360408110156102dc57600080fd5b506001600160a01b0381351690602001356107fc565b6102816004803603602081101561030857600080fd5b50356001600160a01b03166108e9565b6101bb6004803603602081101561032e57600080fd5b50356001600160a01b0316610a1f565b6100fe610a46565b61019f6004803603604081101561035c57600080fd5b506001600160a01b038135169060200135610aa7565b61019f6004803603604081101561038857600080fd5b506001600160a01b038135169060200135610af6565b6103a6610b03565b604080516001600160a01b039092168252519081900360200190f35b610281600480360360e08110156103d857600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610b12565b6101bb6004803603604081101561042957600080fd5b506001600160a01b0381358116916020013516610c8e565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104cd5780601f106104a2576101008083540402835291602001916104cd565b820191906000526020600020905b8154815290600101906020018083116104b057829003601f168201915b505050505090505b90565b60006104e5338484610d18565b50600192915050565b60025490565b6000610501848484610e04565b610553843361054e85604051806060016040528060288152602001611724602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190610f4d565b610d18565b5060019392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061058b610fe4565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104e591859061054e9086610cb9565b60075460408051632988bb9f60e21b815233600482015290516001600160a01b039092169163a622ee7c91602480820192602092909190829003018186803b15801561061157600080fd5b505afa158015610625573d6000803e3d6000fd5b505050506040513d602081101561063b57600080fd5b505160069015156001146106e25760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156106d35780601f106106a8576101008083540402835291602001916106d3565b820191906000526020600020905b8154815290600101906020018083116106b657829003601f168201915b50509250505060405180910390fd5b506106ed82826110ab565b5050565b60075460408051632988bb9f60e21b815233600482015290516001600160a01b039092169163a622ee7c91602480820192602092909190829003018186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d602081101561076657600080fd5b505160069015156001146107d35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156106d35780601f106106a8576101008083540402835291602001916106d3565b506107de3382611189565b50565b6001600160a01b031660009081526020819052604090205490565b60075460408051632988bb9f60e21b815233600482015290516001600160a01b039092169163a622ee7c91602480820192602092909190829003018186803b15801561084757600080fd5b505afa15801561085b573d6000803e3d6000fd5b505050506040513d602081101561087157600080fd5b505160069015156001146108de5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156106d35780601f106106a8576101008083540402835291602001916106d3565b506106ed8282611273565b600760009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561093757600080fd5b505afa15801561094b573d6000803e3d6000fd5b505050506040513d602081101561096157600080fd5b50516006906001600160a01b031633146109d45760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156106d35780601f106106a8576101008083540402835291602001916106d3565b50600780546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b6001600160a01b0381166000908152600560205260408120610a40906112bf565b92915050565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104cd5780601f106104a2576101008083540402835291602001916104cd565b60006104e5338461054e856040518060600160405280602581526020016117fa602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190610f4d565b60006104e5338484610e04565b6007546001600160a01b031681565b83421115610b67576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610b968c6112c3565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610bff826112f5565b90506000610c0f82878787611308565b9050896001600160a01b0316816001600160a01b031614610c77576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b610c828a8a8a610d18565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600082820183811015610d11576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b9392505050565b6001600160a01b038316610d5d5760405162461bcd60e51b81526004018080602001828103825260248152602001806117d66024913960400191505060405180910390fd5b6001600160a01b038216610da25760405162461bcd60e51b81526004018080602001828103825260228152602001806116986022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610e495760405162461bcd60e51b81526004018080602001828103825260258152602001806117b16025913960400191505060405180910390fd5b6001600160a01b038216610e8e5760405162461bcd60e51b81526004018080602001828103825260238152602001806116536023913960400191505060405180910390fd5b610e998383836112ba565b610ed6816040518060600160405280602681526020016116ba602691396001600160a01b0386166000908152602081905260409020549190610f4d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610f059082610cb9565b6001600160a01b0380841660008181526020818152604091829020949094558051858152905191939287169260008051602061177083398151915292918290030190a3505050565b60008184841115610fdc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fa1578181015183820152602001610f89565b50505050905090810190601f168015610fce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000467f0000000000000000000000000000000000000000000000000000000000000000811415611038577f00000000000000000000000000000000000000000000000000000000000000009150506104d5565b6110a37f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611330565b9150506104d5565b6001600160a01b038216611106576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611112600083836112ba565b60025461111f9082610cb9565b6002556001600160a01b0382166000908152602081905260409020546111459082610cb9565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391926000805160206117708339815191529281900390910190a35050565b6001600160a01b0382166111ce5760405162461bcd60e51b81526004018080602001828103825260218152602001806117906021913960400191505060405180910390fd5b6111da826000836112ba565b61121781604051806060016040528060228152602001611676602291396001600160a01b0385166000908152602081905260409020549190610f4d565b6001600160a01b03831660009081526020819052604090205560025461123d9082611375565b6002556040805182815290516000916001600160a01b038516916000805160206117708339815191529181900360200190a35050565b60006112a38260405180606001604052806024815260200161174c6024913961129c8633610c8e565b9190610f4d565b90506112b0833383610d18565b6112ba8383611189565b505050565b5490565b6001600160a01b03811660009081526005602052604081206112e4816112bf565b91506112ef816113b7565b50919050565b6000610a40611302610fe4565b836113c0565b6000806000611319878787876113fb565b91509150611326816114e6565b5095945050505050565b604080516020808201959095528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b6000610d1183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f4d565b80546001019055565b6040805161190160f01b6020808301919091526022820194909452604280820193909352815180820390930183526062019052805191012090565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0383111561142857506000905060036114dd565b8460ff16601b1415801561144057508460ff16601c14155b1561145157506000905060046114dd565b600060018787878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156114ad573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166114d6576000600192509250506114dd565b9150600090505b94509492505050565b60008160048111156114f457fe5b14156114ff576107de565b600181600481111561150d57fe5b141561155b576040805162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015290519081900360640190fd5b600281600481111561156957fe5b14156115bc576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60038160048111156115ca57fe5b14156116075760405162461bcd60e51b81526004018080602001828103825260228152602001806116e06022913960400191505060405180910390fd5b600481600481111561161557fe5b14156107de5760405162461bcd60e51b81526004018080602001828103825260228152602001806117026022913960400191505060405180910390fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220be643c8976fe0266033eadf646d633eea5debb96eadf02bb7946e21750340d8b64736f6c6343000705003300000000000000000000000053d72096da7a512ff6353ff5af866704b5795eab

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

00000000000000000000000053d72096da7a512ff6353ff5af866704b5795eab

-----Decoded View---------------
Arg [0] : _authority (address): 0x53d72096da7a512ff6353ff5af866704b5795eab

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000053d72096da7a512ff6353ff5af866704b5795eab


Deployed ByteCode Sourcemap

31257:1030:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7683:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8551:167;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8551:167:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;7968:100;;;:::i;:::-;;;;;;;;;;;;;;;;8726:317;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8726:317:0;;;;;;;;;;;;;;;;;:::i;7869:91::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28265:115;;;:::i;9051:214::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9051:214:0;;;;;;;;:::i;31615:120::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31615:120:0;;;;;;;;:::i;:::-;;31743:102;;;;;;;;;;;;;;;;-1:-1:-1;31743:102:0;;:::i;8076:127::-;;;;;;;;;;;;;;;;-1:-1:-1;8076:127:0;-1:-1:-1;;;;;8076:127:0;;:::i;31853:128::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31853:128:0;;;;;;;;:::i;31019:166::-;;;;;;;;;;;;;;;;-1:-1:-1;31019:166:0;-1:-1:-1;;;;;31019:166:0;;:::i;28007:128::-;;;;;;;;;;;;;;;;-1:-1:-1;28007:128:0;-1:-1:-1;;;;;28007:128:0;;:::i;7774:87::-;;;:::i;9273:265::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9273:265:0;;;;;;;;:::i;8211:173::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8211:173:0;;;;;;;;:::i;30230:32::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30230:32:0;;;;;;;;;;;;;;27296:645;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27296:645:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8392:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8392:151:0;;;;;;;;;;:::i;7683:83::-;7753:5;7746:12;;;;;;;;-1:-1:-1;;7746:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7720:13;;7746:12;;7753:5;;7746:12;;7753:5;7746:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7683:83;;:::o;8551:167::-;8634:4;8651:37;8660:10;8672:7;8681:6;8651:8;:37::i;:::-;-1:-1:-1;8706:4:0;8551:167;;;;:::o;7968:100::-;8048:12;;7968:100;:::o;8726:317::-;8832:4;8849:36;8859:6;8867:9;8878:6;8849:9;:36::i;:::-;8896:117;8905:6;8913:10;8925:87;8961:6;8925:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8925:19:0;;;;;;:11;:19;;;;;;;;8945:10;8925:31;;;;;;;;;:87;:35;:87::i;:::-;8896:8;:117::i;:::-;-1:-1:-1;9031:4:0;8726:317;;;;;:::o;7869:91::-;7943:9;7869:91;:::o;28265:115::-;28325:7;28352:20;:18;:20::i;:::-;28345:27;;28265:115;:::o;9051:214::-;9165:10;9139:4;9186:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;9186:32:0;;;;;;;;;;9139:4;;9156:79;;9177:7;;9186:48;;9223:10;9186:36;:48::i;31615:120::-;30896:9;;:28;;;-1:-1:-1;;;30896:28:0;;30913:10;30896:28;;;;;;-1:-1:-1;;;;;30896:9:0;;;;:16;;:28;;;;;;;;;;;;;;;:9;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30896:28:0;30934:12;;30896:36;;30928:4;30896:36;30888:59;;;;-1:-1:-1;;;30888:59:0;;;;;;;;;;;;-1:-1:-1;;30888:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31703:24:::1;31709:8;31719:7;31703:5;:24::i;:::-;31615:120:::0;;:::o;31743:102::-;30896:9;;:28;;;-1:-1:-1;;;30896:28:0;;30913:10;30896:28;;;;;;-1:-1:-1;;;;;30896:9:0;;;;:16;;:28;;;;;;;;;;;;;;;:9;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30896:28:0;30934:12;;30896:36;;30928:4;30896:36;30888:59;;;;-1:-1:-1;;;30888:59:0;;;;;;;;;;;;-1:-1:-1;;30888:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31812:25:::1;31818:10;31830:6;31812:5;:25::i;:::-;31743:102:::0;:::o;8076:127::-;-1:-1:-1;;;;;8177:18:0;8150:7;8177:18;;;;;;;;;;;;8076:127::o;31853:128::-;30896:9;;:28;;;-1:-1:-1;;;30896:28:0;;30913:10;30896:28;;;;;;-1:-1:-1;;;;;30896:9:0;;;;:16;;:28;;;;;;;;;;;;;;;:9;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30896:28:0;30934:12;;30896:36;;30928:4;30896:36;30888:59;;;;-1:-1:-1;;;30888:59:0;;;;;;;;;;;;-1:-1:-1;;30888:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31945:28:::1;31955:8;31965:7;31945:9;:28::i;31019:166::-:0;30557:9;;;;;;;;;-1:-1:-1;;;;;30557:9:0;-1:-1:-1;;;;;30557:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30557:20:0;30579:12;;-1:-1:-1;;;;;30543:34:0;:10;:34;30535:57;;;;-1:-1:-1;;;30535:57:0;;;;;;;;;;;;-1:-1:-1;;30535:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31105:9:0::1;:25:::0;;-1:-1:-1;;;;;;31105:25:0::1;-1:-1:-1::0;;;;;31105:25:0;::::1;::::0;;::::1;::::0;;;31146:31:::1;::::0;::::1;::::0;-1:-1:-1;;31146:31:0::1;31019:166:::0;:::o;28007:128::-;-1:-1:-1;;;;;28103:14:0;;28076:7;28103:14;;;:7;:14;;;;;:24;;:22;:24::i;:::-;28096:31;28007:128;-1:-1:-1;;28007:128:0:o;7774:87::-;7846:7;7839:14;;;;;;;;-1:-1:-1;;7839:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7813:13;;7839:14;;7846:7;;7839:14;;7846:7;7839:14;;;;;;;;;;;;;;;;;;;;;;;;9273:265;9366:4;9383:125;9392:10;9404:7;9413:94;9450:15;9413:94;;;;;;;;;;;;;;;;;9425:10;9413:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;9413:32:0;;;;;;;;;;;:94;:36;:94::i;8211:173::-;8297:4;8314:40;8324:10;8336:9;8347:6;8314:9;:40::i;30230:32::-;;;-1:-1:-1;;;;;30230:32:0;;:::o;27296:645::-;27540:8;27521:15;:27;;27513:69;;;;;-1:-1:-1;;;27513:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27595:18;27637:16;27655:5;27662:7;27671:5;27678:16;27688:5;27678:9;:16::i;:::-;27696:8;27626:79;;;;;;;;;;;-1:-1:-1;;;;;27626:79:0;;;;;;-1:-1:-1;;;;;27626:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27616:90;;;;;;27595:111;;27719:12;27734:28;27751:10;27734:16;:28::i;:::-;27719:43;;27775:14;27792:28;27806:4;27812:1;27815;27818;27792:13;:28::i;:::-;27775:45;;27849:5;-1:-1:-1;;;;;27839:15:0;:6;-1:-1:-1;;;;;27839:15:0;;27831:58;;;;;-1:-1:-1;;;27831:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27902:31;27911:5;27918:7;27927:5;27902:8;:31::i;:::-;27296:645;;;;;;;;;;:::o;8392:151::-;-1:-1:-1;;;;;8508:18:0;;;8481:7;8508:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8392:151::o;223:181::-;281:7;313:5;;;337:6;;;;329:46;;;;;-1:-1:-1;;;329:46:0;;;;;;;;;;;;-1:-1:-1;;;329:46:0;;;;;;;;;;;;;;;395:1;223:181;-1:-1:-1;;;223:181:0:o;10901:346::-;-1:-1:-1;;;;;11003:19:0;;10995:68;;;;-1:-1:-1;;;10995:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11082:21:0;;11074:68;;;;-1:-1:-1;;;11074:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11155:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11207:32;;;;;;;;;;;;;;;;;10901:346;;;:::o;9546:539::-;-1:-1:-1;;;;;9652:20:0;;9644:70;;;;-1:-1:-1;;;9644:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9733:23:0;;9725:71;;;;-1:-1:-1;;;9725:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9809:47;9830:6;9838:9;9849:6;9809:20;:47::i;:::-;9889:71;9911:6;9889:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9889:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;9869:17:0;;;:9;:17;;;;;;;;;;;:91;;;;9994:20;;;;;;;:32;;10019:6;9994:24;:32::i;:::-;-1:-1:-1;;;;;9971:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10042:35;;;;;;;9971:20;;10042:35;;;;-1:-1:-1;;;;;;;;;;;10042:35:0;;;;;;;;9546:539;;;:::o;556:192::-;642:7;678:12;670:6;;;;662:29;;;;-1:-1:-1;;;662:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;714:5:0;;;556:192::o;23479:370::-;23532:7;23615:9;23662:16;23651:27;;23647:195;;;23702:24;23695:31;;;;;23647:195;23766:64;23788:10;23800:12;23814:15;23766:21;:64::i;:::-;23759:71;;;;;10093:374;-1:-1:-1;;;;;10177:21:0;;10169:65;;;;;-1:-1:-1;;;10169:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10245:49;10274:1;10278:7;10287:6;10245:20;:49::i;:::-;10320:12;;:24;;10337:6;10320:16;:24::i;:::-;10305:12;:39;-1:-1:-1;;;;;10376:18:0;;:9;:18;;;;;;;;;;;:30;;10399:6;10376:22;:30::i;:::-;-1:-1:-1;;;;;10355:18:0;;:9;:18;;;;;;;;;;;:51;;;;10422:37;;;;;;;10355:18;;:9;;-1:-1:-1;;;;;;;;;;;10422:37:0;;;;;;;;;10093:374;;:::o;10475:418::-;-1:-1:-1;;;;;10559:21:0;;10551:67;;;;-1:-1:-1;;;10551:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10631:49;10652:7;10669:1;10673:6;10631:20;:49::i;:::-;10714:68;10737:6;10714:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10714:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;10693:18:0;;:9;:18;;;;;;;;;;:89;10808:12;;:24;;10825:6;10808:16;:24::i;:::-;10793:12;:39;10848:37;;;;;;;;10874:1;;-1:-1:-1;;;;;10848:37:0;;;-1:-1:-1;;;;;;;;;;;10848:37:0;;;;;;;;10475:418;;:::o;31989:295::-;32063:27;32093:84;32129:7;32093:84;;;;;;;;;;;;;;;;;:31;32103:8;32113:10;32093:9;:31::i;:::-;:35;:84;:35;:84::i;:::-;32063:114;;32190:51;32199:8;32209:10;32221:19;32190:8;:51::i;:::-;32252:24;32258:8;32268:7;32252:5;:24::i;:::-;31989:295;;;:::o;25542:114::-;25634:14;;25542:114::o;28518:207::-;-1:-1:-1;;;;;28639:14:0;;28578:15;28639:14;;;:7;:14;;;;;28674:15;28639:14;28674:13;:15::i;:::-;28664:25;;28700:17;:5;:15;:17::i;:::-;28518:207;;;;:::o;24849:167::-;24926:7;24953:55;24975:20;:18;:20::i;:::-;24997:10;24953:21;:55::i;18946:279::-;19074:7;19095:17;19114:18;19136:25;19147:4;19153:1;19156;19159;19136:10;:25::i;:::-;19094:67;;;;19172:18;19184:5;19172:11;:18::i;:::-;-1:-1:-1;19208:9:0;18946:279;-1:-1:-1;;;;;18946:279:0:o;23857:350::-;24131:67;;;;;;;;;;;;;;;;;;;;;;;;;24082:9;24131:67;;;;24192:4;24131:67;;;;;;;;;;;;;;;;;;;;;;;;24121:78;;;;;;23857:350::o;412:136::-;470:7;497:43;501:1;504;497:43;;;;;;;;;;;;;;;;;:3;:43::i;25664:181::-;25818:19;;25836:1;25818:19;;;25664:181::o;20144:196::-;20274:57;;;-1:-1:-1;;;20274:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20264:68;;;;;;20144:196::o;17168:1639::-;17299:7;;-1:-1:-1;;;;;18227:79:0;;18223:163;;;-1:-1:-1;18339:1:0;;-1:-1:-1;18343:30:0;18323:51;;18223:163;18400:1;:7;;18405:2;18400:7;;:18;;;;;18411:1;:7;;18416:2;18411:7;;18400:18;18396:102;;;-1:-1:-1;18451:1:0;;-1:-1:-1;18455:30:0;18435:51;;18396:102;18595:14;18612:24;18622:4;18628:1;18631;18634;18612:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18612:24:0;;-1:-1:-1;;18612:24:0;;;-1:-1:-1;;;;;;;18651:20:0;;18647:103;;18704:1;18708:29;18688:50;;;;;;;18647:103;18770:6;-1:-1:-1;18778:20:0;;-1:-1:-1;17168:1639:0;;;;;;;;:::o;11830:643::-;11908:20;11899:5;:29;;;;;;;;;11895:571;;;11945:7;;11895:571;12006:29;11997:5;:38;;;;;;;;;11993:473;;;12052:34;;;-1:-1:-1;;;12052:34:0;;;;;;;;;;;;-1:-1:-1;;;12052:34:0;;;;;;;;;;;;;;11993:473;12117:35;12108:5;:44;;;;;;;;;12104:362;;;12169:41;;;-1:-1:-1;;;12169:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12104:362;12241:30;12232:5;:39;;;;;;;;;12228:238;;;12288:44;;-1:-1:-1;;;12288:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12228:238;12363:30;12354:5;:39;;;;;;;;;12350:116;;;12410:44;;-1:-1:-1;;;12410:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://be643c8976fe0266033eadf646d633eea5debb96eadf02bb7946e21750340d8b
Loading