ETH Price: $2,454.80 (-1.33%)

Token

AyurVeda AG Shares (VEDA)
 

Overview

Max Total Supply

12,351 VEDA

Holders

107

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
196 VEDA

Value
$0.00
0xbf725cb78c78933812e511cebebb57b5710aa00c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x2e804BcB...4E534FD9b
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Shares

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 7 of 7: Shares.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted 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.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* 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
* SOFTWARE.
*/
pragma solidity >=0.8;

import "./ERC20Named.sol";
import "./ERC20Recoverable.sol";
import "./IERC677Receiver.sol";

/**
 * @title CompanyName AG Shares
 * @author Luzius Meisser, [email protected]
 *
 * These tokens are uncertified shares (Wertrechte according to the Swiss code of obligations),
 * with this smart contract serving as onwership registry (Wertrechtebuch), but not as shareholder
 * registry, which is kept separate and run by the company. This is equivalent to the traditional system
 * of having physical share certificates kept at home by the shareholders and a shareholder registry run by
 * the company. Just like with physical certificates, the owners of the tokens are the owners of the shares.
 * However, in order to exercise their rights (for example receive a dividend), shareholders must register
 * with the company. For example, in case the company pays out a dividend to a previous shareholder because
 * the current shareholder did not register, the company cannot be held liable for paying the dividend to
 * the "wrong" shareholder. In relation to the company, only the registered shareholders count as such.
 * Registration requires setting up an account with ledgy.com providing your name and address and proving
 * ownership over your addresses.
 * @notice The main addition is a functionality that allows the user to claim that the key for a certain address is lost.
 * @notice In order to prevent malicious attempts, a collateral needs to be posted.
 * @notice The contract owner can delete claims in case of disputes.
 */
contract Shares is ERC20Recoverable, ERC20Named {

    string public terms;

    uint256 public totalShares = 0; // total number of shares, maybe not all tokenized
    uint256 public invalidTokens = 0;

    event Announcement(string message);
    event TokensDeclaredInvalid(address indexed holder, uint256 amount, string message);
    event SubRegisterRecognized(address contractAddress);

    constructor(string memory _symbol, string memory _name, string memory _terms, uint256 _totalShares, address owner) ERC20Named(owner, _name, _symbol, 0) {
        symbol = _symbol;
        name = _name;
        totalShares = _totalShares;
        terms = _terms;
    }

    function setTerms(string memory _terms) public onlyOwner {
        terms = _terms;
    }

    /**
     * Declares the number of total shares, including those that have not been tokenized and those
     * that are held by the company itself. This number can be substiantially higher than totalSupply()
     * in case not all shares have been tokenized. Also, it can be lower than totalSupply() in case some
     * tokens have become invalid.
     */
    function setTotalShares(uint256 _newTotalShares) public onlyOwner() {
        require(_newTotalShares >= totalValidSupply(), "below supply");
        totalShares = _newTotalShares;
    }

    /**
     * Sometimes, tokens are held by other smart contracts that serve as registers themselves. These could
     * be our draggable contract, it could be a bridget to another blockchain, or it could be an address
     * that belongs to a recognized custodian.
     * We assume that the number of sub registers stays limited, such that they are safe to iterate.
     * Subregisters should always have the same number of decimals as the main register and their total
     * balance must not exceed the number of tokens assigned to the subregister.
     * In order to preserve FIFO-rules meaningfully, subregisters should be empty when added or removed.
     */
    function recognizeSubRegister(address contractAddress) public onlyOwner () {
        emit SubRegisterRecognized(contractAddress);
    }

    /**
     * Allows the issuer to make public announcements that are visible on the blockchain.
     */
    function announcement(string calldata message) external onlyOwner() {
        emit Announcement(message);
    }

    /**
     * See parent method for collateral requirements.
     */
    function setCustomClaimCollateral(address collateral, uint256 rate) public onlyOwner() {
        super._setCustomClaimCollateral(collateral, rate);
    }

    function getClaimDeleter() public override view returns (address) {
        return owner;
    }

    /**
     * Signals that the indicated tokens have been declared invalid (e.g. by a court ruling in accordance
     * with article 973g of the Swiss Code of Obligations) and got detached from
     * the underlying shares. Invalid tokens do not carry any shareholder rights any more.
     *
     * This function is purely declarative. It does not technically immobilize the affected tokens as
     * that would give the issuer too much power.
     */
    function declareInvalid(address holder, uint256 amount, string calldata message) external onlyOwner() {
        uint256 holderBalance = balanceOf(holder);
        require(amount <= holderBalance);
        invalidTokens += amount;
        emit TokensDeclaredInvalid(holder, amount, message);
    }

    /**
     * The total number of valid tokens in circulation. In case some tokens have been declared invalid, this
     * number might be lower than totalSupply(). Also, it will always be lower than or equal to totalShares().
     */
    function totalValidSupply() public view returns (uint256) {
        return totalSupply() - invalidTokens;
    }

    /**
     * Allows the company to tokenize shares. If these shares are newly created, setTotalShares must be
     * called first in order to adjust the total number of shares.
     */
    function mintAndCall(address shareholder, address callee, uint256 amount, bytes calldata data) public {
        mint(callee, amount);
        IERC677Receiver(callee).onTokenTransfer(shareholder, amount, data);
    }

    function mint(address target, uint256 amount) public onlyOwner {
        _mint(target, amount);
    }

    function _mint(address account, uint256 amount) internal override {
        require(totalValidSupply() + amount <= totalShares, "There can't be fewer shares than valid tokens");
        super._mint(account, amount);
    }

    function transfer(address to, uint256 value) virtual override(ERC20Recoverable, ERC20) public returns (bool) {
        return super.transfer(to, value);
    }

    /**
     * Transfers _amount tokens to the company and burns them.
     * The meaning of this operation depends on the circumstances and the fate of the shares does
     * not necessarily follow the fate of the tokens. For example, the company itself might call
     * this function to implement a formal decision to destroy some of the outstanding shares.
     * Also, this function might be called by an owner to return the shares to the company and
     * get them back in another form under an according agreement (e.g. printed certificates or
     * tokens on a different blockchain). It is not recommended to call this function without
     * having agreed with the company on the further fate of the shares in question.
     */
    function burn(uint256 _amount) public {
        require(_amount <= balanceOf(msg.sender), "Not enough shares available");
        _transfer(msg.sender, address(this), _amount);
        _burn(address(this), _amount);
    }

}

File 1 of 7: ERC20.sol
// SPDX-License-Identifier: MIT
// Copied and adjusted from OpenZeppelin
// Adjustments:
// - modifications to support ERC-677
// - removed require messages to save space
// - removed unnecessary require statements
// - removed GSN Context
// - upgraded to 0.8 to drop SafeMath
// - let name() and symbol() be implemented by subclass
// - infinite allowance support, with 2^255 and above considered infinite

pragma solidity >=0.8;

import "./IERC20.sol";
import "./IERC677Receiver.sol";

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

abstract contract ERC20 is IERC20 {

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    uint8 public override decimals;

    constructor(uint8 _decimals) {
        decimals = _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(msg.sender, recipient, amount);
        return true;
    }

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

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public override returns (bool) {
        _approve(msg.sender, spender, value);
        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 `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        uint256 currentAllowance = _allowances[sender][msg.sender];
        if (currentAllowance < (1 << 255)){
            // Only decrease the allowance if it was not set to 'infinite'
            // Documented in /doc/infiniteallowance.md
            _approve(sender, msg.sender, currentAllowance - amount);
        }
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

    // ERC-677 functionality, can be useful for swapping and wrapping tokens
    function transferAndCall(address recipient, uint amount, bytes calldata data) public returns (bool) {
        bool success = transfer(recipient, amount);
        if (success){
            success = IERC677Receiver(recipient).onTokenTransfer(msg.sender, amount, data);
        }
        return success;
    }

    /** @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 recipient, uint256 amount) internal virtual {
        require(recipient != address(0));

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

        _totalSupply += amount;
        _balances[recipient] += amount;
        emit Transfer(address(0), recipient, 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 {
        _beforeTokenTransfer(account, address(0), amount);

        _totalSupply -= amount;
        _balances[account] -= 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 value) internal {
        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @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) virtual internal {
    }
}

File 2 of 7: ERC20Named.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.8;

import "./ERC20.sol";
import "./Ownable.sol";

contract ERC20Named is ERC20, Ownable {

    string public override name;
    string public override symbol;

    constructor(address admin, string memory name_ , string memory symbol_, uint8 decimals) ERC20(decimals) Ownable(admin) {
        name = name_;
        symbol = symbol_;
    }

    function setName(string memory _symbol, string memory _name) public onlyOwner {
        symbol = _symbol;
        name = _name;
    }

}

File 3 of 7: ERC20Recoverable.sol
/**
* SPDX-License-Identifier: LicenseRef-Aktionariat
*
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2020 Aktionariat AG (aktionariat.com)
*
* Permission is hereby granted 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.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* 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
* SOFTWARE.
*/
pragma solidity >=0.8;

import "./ERC20.sol";
import "./IERC20.sol";

/**
 * @title Recoverable
 * In case of tokens that represent real-world assets such as shares of a company, one needs a way
 * to handle lost private keys. With physical certificates, courts can declare share certificates as
 * invalid so the company can issue replacements. Here, we want a solution that does not depend on
 * third parties to resolve such cases. Instead, when someone has lost a private key, he can use the
 * declareLost function to post a deposit and claim that the shares assigned to a specific address are
 * lost. To prevent front running, a commit reveal scheme is used. If he actually is the owner of the shares,
 * he needs to wait for a certain period and can then reclaim the lost shares as well as the deposit.
 * If he is an attacker trying to claim shares belonging to someone else, he risks losing the deposit
 * as it can be claimed at anytime by the rightful owner.
 * Furthermore, if "getClaimDeleter" is defined in the subclass, the returned address is allowed to
 * delete claims, returning the collateral. This can help to prevent obvious cases of abuse of the claim
 * function.
 */

abstract contract ERC20Recoverable is ERC20 {

    // A struct that represents a claim made
    struct Claim {
        address claimant; // the person who created the claim
        uint256 collateral; // the amount of collateral deposited
        uint256 timestamp;  // the timestamp of the block in which the claim was made
        address currencyUsed; // The currency (XCHF) can be updated, we record the currency used for every request
    }

    uint256 public constant claimPeriod = 180 days;

    mapping(address => Claim) public claims; // there can be at most one claim per address, here address is claimed address
    mapping(address => bool) public recoveryDisabled; // disable claimability (e.g. for long term storage)

    // ERC-20 token that can be used as collateral or 0x0 if disabled
    address public customCollateralAddress;
    uint256 public customCollateralRate;

    /**
     * Returns the collateral rate for the given collateral type and 0 if that type
     * of collateral is not accepted. By default, only the token itself is accepted at
     * a rate of 1:1.
     *
     * Subclasses should override this method if they want to add additional types of
     * collateral.
     */
    function getCollateralRate(address collateralType) public virtual view returns (uint256) {
        if (collateralType == address(this)) {
            return 1;
        } else if (collateralType == customCollateralAddress) {
            return customCollateralRate;
        } else {
            return 0;
        }
    }

    /**
     * Allows subclasses to set a custom collateral besides the token itself.
     * The collateral must be an ERC-20 token that returns true on successful transfers and
     * throws an exception or returns false on failure.
     * Also, do not forget to multiply the rate in accordance with the number of decimals of the collateral.
     * For example, rate should be 7*10**18 for 7 units of a collateral with 18 decimals.
     */
    function _setCustomClaimCollateral(address collateral, uint256 rate) internal {
        customCollateralAddress = collateral;
        if (customCollateralAddress == address(0)) {
            customCollateralRate = 0; // disabled
        } else {
            require(rate > 0, "zero");
            customCollateralRate = rate;
        }
        emit CustomClaimCollateralChanged(collateral, rate);
    }

    function getClaimDeleter() virtual public view returns (address);

    function setRecoverable(bool enabled) public {
        recoveryDisabled[msg.sender] = !enabled;
    }

    /**
     * Some users might want to disable claims for their address completely.
     * For example if they use a deep cold storage solution or paper wallet.
     */
    function isRecoveryEnabled(address target) public view returns (bool) {
        return !recoveryDisabled[target];
    }

    event ClaimMade(address indexed lostAddress, address indexed claimant, uint256 balance);
    event ClaimCleared(address indexed lostAddress, uint256 collateral);
    event ClaimDeleted(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimResolved(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event CustomClaimCollateralChanged(address newCustomCollateralAddress, uint256 newCustomCollareralRate);

  /** Anyone can declare that the private key to a certain address was lost by calling declareLost
    * providing a deposit/collateral. There are three possibilities of what can happen with the claim:
    * 1) The claim period expires and the claimant can get the deposit and the shares back by calling recover
    * 2) The "lost" private key is used at any time to call clearClaim. In that case, the claim is deleted and
    *    the deposit sent to the shareholder (the owner of the private key). It is recommended to call recover
    *    whenever someone transfers funds to let claims be resolved automatically when the "lost" private key is
    *    used again.
    * 3) The owner deletes the claim and assigns the deposit to the claimant. This is intended to be used to resolve
    *    disputes. Generally, using this function implies that you have to trust the issuer of the tokens to handle
    *    the situation well. As a rule of thumb, the contract owner should assume the owner of the lost address to be the
    *    rightful owner of the deposit.
    * It is highly recommended that the owner observes the claims made and informs the owners of the claimed addresses
    * whenever a claim is made for their address (this of course is only possible if they are known to the owner, e.g.
    * through a shareholder register).
    */
    function declareLost(address collateralType, address lostAddress) public {
        require(isRecoveryEnabled(lostAddress), "disabled");
        uint256 collateralRate = getCollateralRate(collateralType);
        require(collateralRate > 0, "bad collateral");
        address claimant = msg.sender;
        uint256 balance = balanceOf(lostAddress);
        uint256 collateral = balance * collateralRate;
        IERC20 currency = IERC20(collateralType);
        require(balance > 0, "empty");
        require(claims[lostAddress].collateral == 0, "already claimed");
        require(currency.transferFrom(claimant, address(this), collateral));

        claims[lostAddress] = Claim({
            claimant: claimant,
            collateral: collateral,
            timestamp: block.timestamp,
            currencyUsed: collateralType
        });

        emit ClaimMade(lostAddress, claimant, balance);
    }

    function getClaimant(address lostAddress) public view returns (address) {
        return claims[lostAddress].claimant;
    }

    function getCollateral(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].collateral;
    }

    function getCollateralType(address lostAddress) public view returns (address) {
        return claims[lostAddress].currencyUsed;
    }

    function getTimeStamp(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].timestamp;
    }

    function transfer(address recipient, uint256 amount) override virtual public returns (bool) {
        require(super.transfer(recipient, amount));
        clearClaim();
        return true;
    }

    /**
     * Clears a claim after the key has been found again and assigns the collateral to the "lost" address.
     * This is the price an adverse claimer pays for filing a false claim and makes it risky to do so.
     */
    function clearClaim() public {
        if (claims[msg.sender].collateral != 0) {
            uint256 collateral = claims[msg.sender].collateral;
            IERC20 currency = IERC20(claims[msg.sender].currencyUsed);
            delete claims[msg.sender];
            require(currency.transfer(msg.sender, collateral));
            emit ClaimCleared(msg.sender, collateral);
        }
    }

   /**
    * After the claim period has passed, the claimant can call this function to send the
    * tokens on the lost address as well as the collateral to himself.
    */
    function recover(address lostAddress) public {
        Claim memory claim = claims[lostAddress];
        uint256 collateral = claim.collateral;
        IERC20 currency = IERC20(claim.currencyUsed);
        require(collateral != 0, "not found");
        require(claim.claimant == msg.sender, "not claimant");
        require(claim.timestamp + claimPeriod <= block.timestamp, "too early");
        address claimant = claim.claimant;
        delete claims[lostAddress];
        require(currency.transfer(claimant, collateral));
        _transfer(lostAddress, claimant, balanceOf(lostAddress));
        emit ClaimResolved(lostAddress, claimant, collateral);
    }

    /**
     * This function is to be executed by the claim deleter only in case a dispute needs to be resolved manually.
     */
    function deleteClaim(address lostAddress) public {
        require(msg.sender == getClaimDeleter(), "no access");
        Claim memory claim = claims[lostAddress];
        IERC20 currency = IERC20(claim.currencyUsed);
        require(claim.collateral != 0, "not found");
        delete claims[lostAddress];
        require(currency.transfer(claim.claimant, claim.collateral));
        emit ClaimDeleted(lostAddress, claim.claimant, claim.collateral);
    }

}

File 4 of 7: IERC20.sol
/**
* SPDX-License-Identifier: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
*
*/
pragma solidity >=0.8;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */

interface IERC20 {

    // Optional functions
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    /**
     * @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.
     *
     * > 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 5 of 7: IERC677Receiver.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8;

interface IERC677Receiver {
    
    function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool);

}

File 6 of 7: Ownable.sol
// SPDX-License-Identifier: MIT
//
// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
//
// Modifications:
// - Replaced Context._msgSender() with msg.sender
// - Made leaner
// - Extracted interface

pragma solidity >=0.8;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {

    address public owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor (address initialOwner) {
        owner = initialOwner;
        emit OwnershipTransferred(address(0), owner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    modifier onlyOwner() {
        require(owner == msg.sender, "not owner");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_terms","type":"string"},{"internalType":"uint256","name":"_totalShares","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Announcement","type":"event"},{"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":"lostAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"ClaimMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lostAddress","type":"address"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"}],"name":"ClaimResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newCustomCollateralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCustomCollareralRate","type":"uint256"}],"name":"CustomClaimCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SubRegisterRecognized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"TokensDeclaredInvalid","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":[{"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":"string","name":"message","type":"string"}],"name":"announcement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claims","outputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"currencyUsed","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customCollateralAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"message","type":"string"}],"name":"declareInvalid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"},{"internalType":"address","name":"lostAddress","type":"address"}],"name":"declareLost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimDeleter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getClaimant","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getCollateralType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"getTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invalidTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"isRecoveryEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"},{"internalType":"address","name":"callee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"recognizeSubRegister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lostAddress","type":"address"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recoveryDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collateral","type":"address"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setCustomClaimCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setRecoverable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_terms","type":"string"}],"name":"setTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTotalShares","type":"uint256"}],"name":"setTotalShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalValidSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c556000600d553480156200001b57600080fd5b506040516200232d3803806200232d8339810160408190526200003e916200027c565b6003805460ff19169055600880546001600160a01b0319166001600160a01b03831690811790915560405182918691889160009185919083907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508251620000b29060099060208601906200011f565b508151620000c890600a9060208501906200011f565b50508751620000e29350600a92506020890191506200011f565b508351620000f89060099060208701906200011f565b50600c82905582516200011390600b9060208601906200011f565b5050505050506200038e565b8280546200012d906200033b565b90600052602060002090601f0160209004810192826200015157600085556200019c565b82601f106200016c57805160ff19168380011785556200019c565b828001600101855582156200019c579182015b828111156200019c5782518255916020019190600101906200017f565b50620001aa929150620001ae565b5090565b5b80821115620001aa5760008155600101620001af565b600082601f830112620001d757600080fd5b81516001600160401b0380821115620001f457620001f462000378565b604051601f8301601f19908116603f011681019082821181831017156200021f576200021f62000378565b816040528381526020925086838588010111156200023c57600080fd5b600091505b8382101562000260578582018301518183018401529082019062000241565b83821115620002725760008385830101525b9695505050505050565b600080600080600060a086880312156200029557600080fd5b85516001600160401b0380821115620002ad57600080fd5b620002bb89838a01620001c5565b96506020880151915080821115620002d257600080fd5b620002e089838a01620001c5565b95506040880151915080821115620002f757600080fd5b506200030688828901620001c5565b60608801516080890151919550935090506001600160a01b03811681146200032d57600080fd5b809150509295509295909350565b600181811c908216806200035057607f821691505b602082108114156200037257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611f8f806200039e6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80636091811711610151578063a77384c1116100c3578063cc51e14311610087578063cc51e14314610627578063d50256251461063a578063dd62ed3e14610642578063eb470ebf1461067b578063f2fde38b146106a7578063f54fc060146106ba57600080fd5b8063a77384c114610567578063a9059cbb1461057a578063b0d04c7a1461058d578063b40e80d114610595578063c6788bdd146105b857600080fd5b806378f86afc1161011557806378f86afc146104d65780637dc2cd98146104e95780638da5cb5b146104f357806395d89b41146105065780639b56d6c91461050e578063a3ec18831461053a57600080fd5b8063609181171461045c5780636427ed97146104655780636b03ed5f1461049257806370a082311461049a57806377e071ad146104c357600080fd5b8063313ce567116101ea5780633bcc45ba116101ae5780633bcc45ba146103ce5780634000aea0146103fd57806340c10f191461041057806342966c68146104235780635c707f07146104365780635d6624b71461044957600080fd5b8063313ce5671461037757806332a7ae951461039657806337a8129c146103a95780633a1cdf32146103b25780633a98ef39146103c557600080fd5b80631e3b9de5116102315780631e3b9de5146103015780631f0f06aa1461032d57806323b872dd1461034057806326773ddd146103535780632a0a4ed51461036657600080fd5b806306fdde031461026e578063095ea7b31461028c5780630c6f0e5d146102af5780630cd865ec146102da57806318160ddd146102ef575b600080fd5b6102766106cd565b6040516102839190611e04565b60405180910390f35b61029f61029a366004611bdb565b61075b565b6040519015158152602001610283565b6006546102c2906001600160a01b031681565b6040516001600160a01b039091168152602001610283565b6102ed6102e8366004611ae2565b610771565b005b6002545b604051908152602001610283565b6102c261030f366004611ae2565b6001600160a01b039081166000908152600460205260409020541690565b6102ed61033b366004611c99565b6109e2565b61029f61034e366004611b30565b610a49565b6102ed610361366004611afd565b610aa5565b6008546001600160a01b03166102c2565b6003546103849060ff1681565b60405160ff9091168152602001610283565b6102ed6103a4366004611ae2565b610d58565b6102f3600d5481565b6102ed6103c0366004611bdb565b610f5f565b6102f3600c5481565b6102c26103dc366004611ae2565b6001600160a01b039081166000908152600460205260409020600301541690565b61029f61040b366004611c05565b610f97565b6102ed61041e366004611bdb565b61103c565b6102ed610431366004611d7c565b611070565b6102ed610444366004611d18565b6110e7565b6102ed610457366004611c05565b61113d565b6102f360075481565b6102ed610473366004611c5f565b336000908152600560205260409020805460ff19169115919091179055565b6102ed6111f2565b6102f36104a8366004611ae2565b6001600160a01b031660009081526020819052604090205490565b6102f36104d1366004611ae2565b611311565b6102ed6104e4366004611cdb565b611357565b6102f362ed4e0081565b6008546102c2906001600160a01b031681565b610276611394565b6102f361051c366004611ae2565b6001600160a01b031660009081526004602052604090206001015490565b61029f610548366004611ae2565b6001600160a01b031660009081526005602052604090205460ff161590565b6102ed610575366004611d7c565b6113a1565b61029f610588366004611bdb565b611416565b6102f3611429565b61029f6105a3366004611ae2565b60056020526000908152604090205460ff1681565b6105f86105c6366004611ae2565b60046020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b604080516001600160a01b03958616815260208101949094528301919091529091166060820152608001610283565b6102ed610635366004611ae2565b611446565b6102766114af565b6102f3610650366004611afd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102f3610689366004611ae2565b6001600160a01b031660009081526004602052604090206002015490565b6102ed6106b5366004611ae2565b6114bc565b6102ed6106c8366004611b6c565b611542565b600980546106da90611ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461070690611ee4565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b505050505081565b60006107683384846115d8565b50600192915050565b6001600160a01b03808216600090815260046020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909190816108025760405162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b60448201526064015b60405180910390fd5b82516001600160a01b0316331461084a5760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd0818db185a5b585b9d60a21b60448201526064016107f9565b4262ed4e00846040015161085e9190611e96565b11156108985760405162461bcd60e51b8152602060048201526009602482015268746f6f206561726c7960b81b60448201526064016107f9565b82516001600160a01b03858116600090815260046020819052604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255905163a9059cbb60e01b815282841691810191909152602481018590529083169063a9059cbb90604401602060405180830381600087803b15801561092457600080fd5b505af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c9190611c7c565b61096557600080fd5b61098e8582610989886001600160a01b031660009081526020819052604090205490565b611631565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040516109d391815260200190565b60405180910390a35050505050565b6008546001600160a01b03163314610a0c5760405162461bcd60e51b81526004016107f990611e59565b7f07ce702fc13ca0620c174dab22996a6d5fd9e7accb663555a4e85323692706ba8282604051610a3d929190611df0565b60405180910390a15050565b6000610a56848484611631565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600160ff1b811015610a9a57610a9a8533610a958685611ecd565b6115d8565b506001949350505050565b6001600160a01b03811660009081526005602052604090205460ff1615610af95760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b60448201526064016107f9565b6000610b0483611311565b905060008111610b475760405162461bcd60e51b815260206004820152600e60248201526d1898590818dbdb1b185d195c985b60921b60448201526064016107f9565b336000610b69846001600160a01b031660009081526020819052604090205490565b90506000610b778483611eae565b90508582610baf5760405162461bcd60e51b8152602060048201526005602482015264656d70747960d81b60448201526064016107f9565b6001600160a01b03861660009081526004602052604090206001015415610c0a5760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b60448201526064016107f9565b6040516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018490528216906323b872dd90606401602060405180830381600087803b158015610c5a57600080fd5b505af1158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c929190611c7c565b610c9b57600080fd5b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600490955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610d479087815260200190565b60405180910390a350505050505050565b6008546001600160a01b03163314610d9e5760405162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b60448201526064016107f9565b6001600160a01b038082166000908152600460209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610e285760405162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b60448201526064016107f9565b6001600160a01b03808416600090815260046020818152604080842080546001600160a01b031990811682556001820186905560028201959095556003018054909416909355855190860151925163a9059cbb60e01b81529385169363a9059cbb93610eaa939091016001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015610ec457600080fd5b505af1158015610ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efc9190611c7c565b610f0557600080fd5b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d58460200151604051610f5291815260200190565b60405180910390a3505050565b6008546001600160a01b03163314610f895760405162461bcd60e51b81526004016107f990611e59565b610f9382826116e5565b5050565b600080610fa48686611416565b9050801561103357604051635260769b60e11b81526001600160a01b0387169063a4c0ed3690610fde903390899089908990600401611dbe565b602060405180830381600087803b158015610ff857600080fd5b505af115801561100c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110309190611c7c565b90505b95945050505050565b6008546001600160a01b031633146110665760405162461bcd60e51b81526004016107f990611e59565b610f93828261178f565b336000908152602081905260409020548111156110cf5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682073686172657320617661696c61626c65000000000060448201526064016107f9565b6110da333083611631565b6110e43082611813565b50565b6008546001600160a01b031633146111115760405162461bcd60e51b81526004016107f990611e59565b815161112490600a90602085019061195c565b50805161113890600990602084019061195c565b505050565b6008546001600160a01b031633146111675760405162461bcd60e51b81526004016107f990611e59565b6001600160a01b0384166000908152602081905260409020548084111561118d57600080fd5b83600d600082825461119f9190611e96565b92505081905550846001600160a01b03167f0a605cd1294f60fa3b73548ac68428f33300a051f225afcdcc75e56083c96ee78585856040516111e393929190611e7c565b60405180910390a25050505050565b336000908152600460205260409020600101541561130f5733600081815260046020819052604080832060018101805460038301805484546001600160a01b0319908116865593889055600290940196909655908216909455905163a9059cbb60e01b8152918201939093526024810182905290916001600160a01b031690819063a9059cbb90604401602060405180830381600087803b15801561129657600080fd5b505af11580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190611c7c565b6112d757600080fd5b60405182815233907f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd9060200160405180910390a250505b565b60006001600160a01b03821630141561132c57506001919050565b6006546001600160a01b038381169116141561134a57505060075490565b506000919050565b919050565b6008546001600160a01b031633146113815760405162461bcd60e51b81526004016107f990611e59565b8051610f9390600b90602084019061195c565b600a80546106da90611ee4565b6008546001600160a01b031633146113cb5760405162461bcd60e51b81526004016107f990611e59565b6113d3611429565b8110156114115760405162461bcd60e51b815260206004820152600c60248201526b62656c6f7720737570706c7960a01b60448201526064016107f9565b600c55565b6000611422838361189d565b9392505050565b6000600d5461143760025490565b6114419190611ecd565b905090565b6008546001600160a01b031633146114705760405162461bcd60e51b81526004016107f990611e59565b6040516001600160a01b03821681527f6563ed86749f41d6f22086ebb321adce1e55ec5333f6bba7d83659510c49b73c9060200160405180910390a150565b600b80546106da90611ee4565b6008546001600160a01b031633146114e65760405162461bcd60e51b81526004016107f990611e59565b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b61154c848461103c565b604051635260769b60e11b81526001600160a01b0385169063a4c0ed369061157e908890879087908790600401611dbe565b602060405180830381600087803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190611c7c565b505050505050565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610f52565b6001600160a01b03821661164457600080fd5b6001600160a01b0383166000908152602081905260408120805483929061166c908490611ecd565b90915550506001600160a01b03821660009081526020819052604081208054839290611699908490611e96565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f5291815260200190565b600680546001600160a01b0319166001600160a01b038416908117909155611711576000600755611750565b6000811161174a5760405162461bcd60e51b81526004016107f9906020808252600490820152637a65726f60e01b604082015260600190565b60078190555b604080516001600160a01b0384168152602081018390527f94238858463adf0fecc0e064844831a54bccf8467c86f0b93d2a9508e05968539101610a3d565b600c548161179b611429565b6117a59190611e96565b11156118095760405162461bcd60e51b815260206004820152602d60248201527f54686572652063616e277420626520666577657220736861726573207468616e60448201526c2076616c696420746f6b656e7360981b60648201526084016107f9565b610f9382826118ba565b80600260008282546118259190611ecd565b90915550506001600160a01b03821660009081526020819052604081208054839290611852908490611ecd565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60006118a9838361194f565b6118b257600080fd5b6107686111f2565b6001600160a01b0382166118cd57600080fd5b80600260008282546118df9190611e96565b90915550506001600160a01b0382166000908152602081905260408120805483929061190c908490611e96565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611891565b6000610768338484611631565b82805461196890611ee4565b90600052602060002090601f01602090048101928261198a57600085556119d0565b82601f106119a357805160ff19168380011785556119d0565b828001600101855582156119d0579182015b828111156119d05782518255916020019190600101906119b5565b506119dc9291506119e0565b5090565b5b808211156119dc57600081556001016119e1565b80356001600160a01b038116811461135257600080fd5b60008083601f840112611a1e57600080fd5b50813567ffffffffffffffff811115611a3657600080fd5b602083019150836020828501011115611a4e57600080fd5b9250929050565b600082601f830112611a6657600080fd5b813567ffffffffffffffff80821115611a8157611a81611f35565b604051601f8301601f19908116603f01168101908282118183101715611aa957611aa9611f35565b81604052838152866020858801011115611ac257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611af457600080fd5b611422826119f5565b60008060408385031215611b1057600080fd5b611b19836119f5565b9150611b27602084016119f5565b90509250929050565b600080600060608486031215611b4557600080fd5b611b4e846119f5565b9250611b5c602085016119f5565b9150604084013590509250925092565b600080600080600060808688031215611b8457600080fd5b611b8d866119f5565b9450611b9b602087016119f5565b935060408601359250606086013567ffffffffffffffff811115611bbe57600080fd5b611bca88828901611a0c565b969995985093965092949392505050565b60008060408385031215611bee57600080fd5b611bf7836119f5565b946020939093013593505050565b60008060008060608587031215611c1b57600080fd5b611c24856119f5565b935060208501359250604085013567ffffffffffffffff811115611c4757600080fd5b611c5387828801611a0c565b95989497509550505050565b600060208284031215611c7157600080fd5b813561142281611f4b565b600060208284031215611c8e57600080fd5b815161142281611f4b565b60008060208385031215611cac57600080fd5b823567ffffffffffffffff811115611cc357600080fd5b611ccf85828601611a0c565b90969095509350505050565b600060208284031215611ced57600080fd5b813567ffffffffffffffff811115611d0457600080fd5b611d1084828501611a55565b949350505050565b60008060408385031215611d2b57600080fd5b823567ffffffffffffffff80821115611d4357600080fd5b611d4f86838701611a55565b93506020850135915080821115611d6557600080fd5b50611d7285828601611a55565b9150509250929050565b600060208284031215611d8e57600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611de6606083018486611d95565b9695505050505050565b602081526000611d10602083018486611d95565b600060208083528351808285015260005b81811015611e3157858101830151858201604001528201611e15565b81811115611e43576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b838152604060208201526000611033604083018486611d95565b60008219821115611ea957611ea9611f1f565b500190565b6000816000190483118215151615611ec857611ec8611f1f565b500290565b600082821015611edf57611edf611f1f565b500390565b600181811c90821680611ef857607f821691505b60208210811415611f1957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146110e457600080fdfea26469706673582212201147be0eeabda03a2c46b74f348bfb79bc954b5279f73a6d06c971502d84df9464736f6c6343000806003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000002e42a000000000000000000000000a206a72ca311ea6a63ee78abfdfa39168ee241ef000000000000000000000000000000000000000000000000000000000000000354424f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a54426f20536861726573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016696e766573746f72732e74626f2e636c6f7468696e6700000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c80636091811711610151578063a77384c1116100c3578063cc51e14311610087578063cc51e14314610627578063d50256251461063a578063dd62ed3e14610642578063eb470ebf1461067b578063f2fde38b146106a7578063f54fc060146106ba57600080fd5b8063a77384c114610567578063a9059cbb1461057a578063b0d04c7a1461058d578063b40e80d114610595578063c6788bdd146105b857600080fd5b806378f86afc1161011557806378f86afc146104d65780637dc2cd98146104e95780638da5cb5b146104f357806395d89b41146105065780639b56d6c91461050e578063a3ec18831461053a57600080fd5b8063609181171461045c5780636427ed97146104655780636b03ed5f1461049257806370a082311461049a57806377e071ad146104c357600080fd5b8063313ce567116101ea5780633bcc45ba116101ae5780633bcc45ba146103ce5780634000aea0146103fd57806340c10f191461041057806342966c68146104235780635c707f07146104365780635d6624b71461044957600080fd5b8063313ce5671461037757806332a7ae951461039657806337a8129c146103a95780633a1cdf32146103b25780633a98ef39146103c557600080fd5b80631e3b9de5116102315780631e3b9de5146103015780631f0f06aa1461032d57806323b872dd1461034057806326773ddd146103535780632a0a4ed51461036657600080fd5b806306fdde031461026e578063095ea7b31461028c5780630c6f0e5d146102af5780630cd865ec146102da57806318160ddd146102ef575b600080fd5b6102766106cd565b6040516102839190611e04565b60405180910390f35b61029f61029a366004611bdb565b61075b565b6040519015158152602001610283565b6006546102c2906001600160a01b031681565b6040516001600160a01b039091168152602001610283565b6102ed6102e8366004611ae2565b610771565b005b6002545b604051908152602001610283565b6102c261030f366004611ae2565b6001600160a01b039081166000908152600460205260409020541690565b6102ed61033b366004611c99565b6109e2565b61029f61034e366004611b30565b610a49565b6102ed610361366004611afd565b610aa5565b6008546001600160a01b03166102c2565b6003546103849060ff1681565b60405160ff9091168152602001610283565b6102ed6103a4366004611ae2565b610d58565b6102f3600d5481565b6102ed6103c0366004611bdb565b610f5f565b6102f3600c5481565b6102c26103dc366004611ae2565b6001600160a01b039081166000908152600460205260409020600301541690565b61029f61040b366004611c05565b610f97565b6102ed61041e366004611bdb565b61103c565b6102ed610431366004611d7c565b611070565b6102ed610444366004611d18565b6110e7565b6102ed610457366004611c05565b61113d565b6102f360075481565b6102ed610473366004611c5f565b336000908152600560205260409020805460ff19169115919091179055565b6102ed6111f2565b6102f36104a8366004611ae2565b6001600160a01b031660009081526020819052604090205490565b6102f36104d1366004611ae2565b611311565b6102ed6104e4366004611cdb565b611357565b6102f362ed4e0081565b6008546102c2906001600160a01b031681565b610276611394565b6102f361051c366004611ae2565b6001600160a01b031660009081526004602052604090206001015490565b61029f610548366004611ae2565b6001600160a01b031660009081526005602052604090205460ff161590565b6102ed610575366004611d7c565b6113a1565b61029f610588366004611bdb565b611416565b6102f3611429565b61029f6105a3366004611ae2565b60056020526000908152604090205460ff1681565b6105f86105c6366004611ae2565b60046020526000908152604090208054600182015460028301546003909301546001600160a01b039283169391921684565b604080516001600160a01b03958616815260208101949094528301919091529091166060820152608001610283565b6102ed610635366004611ae2565b611446565b6102766114af565b6102f3610650366004611afd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102f3610689366004611ae2565b6001600160a01b031660009081526004602052604090206002015490565b6102ed6106b5366004611ae2565b6114bc565b6102ed6106c8366004611b6c565b611542565b600980546106da90611ee4565b80601f016020809104026020016040519081016040528092919081815260200182805461070690611ee4565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b505050505081565b60006107683384846115d8565b50600192915050565b6001600160a01b03808216600090815260046020908152604091829020825160808101845281548516815260018201549281018390526002820154938101939093526003015490921660608201819052909190816108025760405162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b60448201526064015b60405180910390fd5b82516001600160a01b0316331461084a5760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd0818db185a5b585b9d60a21b60448201526064016107f9565b4262ed4e00846040015161085e9190611e96565b11156108985760405162461bcd60e51b8152602060048201526009602482015268746f6f206561726c7960b81b60448201526064016107f9565b82516001600160a01b03858116600090815260046020819052604080832080546001600160a01b031990811682556001820185905560028201949094556003018054909316909255905163a9059cbb60e01b815282841691810191909152602481018590529083169063a9059cbb90604401602060405180830381600087803b15801561092457600080fd5b505af1158015610938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095c9190611c7c565b61096557600080fd5b61098e8582610989886001600160a01b031660009081526020819052604090205490565b611631565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040516109d391815260200190565b60405180910390a35050505050565b6008546001600160a01b03163314610a0c5760405162461bcd60e51b81526004016107f990611e59565b7f07ce702fc13ca0620c174dab22996a6d5fd9e7accb663555a4e85323692706ba8282604051610a3d929190611df0565b60405180910390a15050565b6000610a56848484611631565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600160ff1b811015610a9a57610a9a8533610a958685611ecd565b6115d8565b506001949350505050565b6001600160a01b03811660009081526005602052604090205460ff1615610af95760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b60448201526064016107f9565b6000610b0483611311565b905060008111610b475760405162461bcd60e51b815260206004820152600e60248201526d1898590818dbdb1b185d195c985b60921b60448201526064016107f9565b336000610b69846001600160a01b031660009081526020819052604090205490565b90506000610b778483611eae565b90508582610baf5760405162461bcd60e51b8152602060048201526005602482015264656d70747960d81b60448201526064016107f9565b6001600160a01b03861660009081526004602052604090206001015415610c0a5760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b60448201526064016107f9565b6040516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018490528216906323b872dd90606401602060405180830381600087803b158015610c5a57600080fd5b505af1158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c929190611c7c565b610c9b57600080fd5b604080516080810182526001600160a01b038087168083526020808401878152428587019081528d8516606087019081528d86166000818152600490955293889020965187549087166001600160a01b0319918216178855925160018801559051600287015551600390950180549590941694169390931790915591517f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535990610d479087815260200190565b60405180910390a350505050505050565b6008546001600160a01b03163314610d9e5760405162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b60448201526064016107f9565b6001600160a01b038082166000908152600460209081526040918290208251608081018452815485168152600182015492810183905260028201549381019390935260030154909216606082018190529091610e285760405162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b60448201526064016107f9565b6001600160a01b03808416600090815260046020818152604080842080546001600160a01b031990811682556001820186905560028201959095556003018054909416909355855190860151925163a9059cbb60e01b81529385169363a9059cbb93610eaa939091016001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015610ec457600080fd5b505af1158015610ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efc9190611c7c565b610f0557600080fd5b81600001516001600160a01b0316836001600160a01b03167fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d58460200151604051610f5291815260200190565b60405180910390a3505050565b6008546001600160a01b03163314610f895760405162461bcd60e51b81526004016107f990611e59565b610f9382826116e5565b5050565b600080610fa48686611416565b9050801561103357604051635260769b60e11b81526001600160a01b0387169063a4c0ed3690610fde903390899089908990600401611dbe565b602060405180830381600087803b158015610ff857600080fd5b505af115801561100c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110309190611c7c565b90505b95945050505050565b6008546001600160a01b031633146110665760405162461bcd60e51b81526004016107f990611e59565b610f93828261178f565b336000908152602081905260409020548111156110cf5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682073686172657320617661696c61626c65000000000060448201526064016107f9565b6110da333083611631565b6110e43082611813565b50565b6008546001600160a01b031633146111115760405162461bcd60e51b81526004016107f990611e59565b815161112490600a90602085019061195c565b50805161113890600990602084019061195c565b505050565b6008546001600160a01b031633146111675760405162461bcd60e51b81526004016107f990611e59565b6001600160a01b0384166000908152602081905260409020548084111561118d57600080fd5b83600d600082825461119f9190611e96565b92505081905550846001600160a01b03167f0a605cd1294f60fa3b73548ac68428f33300a051f225afcdcc75e56083c96ee78585856040516111e393929190611e7c565b60405180910390a25050505050565b336000908152600460205260409020600101541561130f5733600081815260046020819052604080832060018101805460038301805484546001600160a01b0319908116865593889055600290940196909655908216909455905163a9059cbb60e01b8152918201939093526024810182905290916001600160a01b031690819063a9059cbb90604401602060405180830381600087803b15801561129657600080fd5b505af11580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190611c7c565b6112d757600080fd5b60405182815233907f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd9060200160405180910390a250505b565b60006001600160a01b03821630141561132c57506001919050565b6006546001600160a01b038381169116141561134a57505060075490565b506000919050565b919050565b6008546001600160a01b031633146113815760405162461bcd60e51b81526004016107f990611e59565b8051610f9390600b90602084019061195c565b600a80546106da90611ee4565b6008546001600160a01b031633146113cb5760405162461bcd60e51b81526004016107f990611e59565b6113d3611429565b8110156114115760405162461bcd60e51b815260206004820152600c60248201526b62656c6f7720737570706c7960a01b60448201526064016107f9565b600c55565b6000611422838361189d565b9392505050565b6000600d5461143760025490565b6114419190611ecd565b905090565b6008546001600160a01b031633146114705760405162461bcd60e51b81526004016107f990611e59565b6040516001600160a01b03821681527f6563ed86749f41d6f22086ebb321adce1e55ec5333f6bba7d83659510c49b73c9060200160405180910390a150565b600b80546106da90611ee4565b6008546001600160a01b031633146114e65760405162461bcd60e51b81526004016107f990611e59565b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b61154c848461103c565b604051635260769b60e11b81526001600160a01b0385169063a4c0ed369061157e908890879087908790600401611dbe565b602060405180830381600087803b15801561159857600080fd5b505af11580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190611c7c565b505050505050565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610f52565b6001600160a01b03821661164457600080fd5b6001600160a01b0383166000908152602081905260408120805483929061166c908490611ecd565b90915550506001600160a01b03821660009081526020819052604081208054839290611699908490611e96565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610f5291815260200190565b600680546001600160a01b0319166001600160a01b038416908117909155611711576000600755611750565b6000811161174a5760405162461bcd60e51b81526004016107f9906020808252600490820152637a65726f60e01b604082015260600190565b60078190555b604080516001600160a01b0384168152602081018390527f94238858463adf0fecc0e064844831a54bccf8467c86f0b93d2a9508e05968539101610a3d565b600c548161179b611429565b6117a59190611e96565b11156118095760405162461bcd60e51b815260206004820152602d60248201527f54686572652063616e277420626520666577657220736861726573207468616e60448201526c2076616c696420746f6b656e7360981b60648201526084016107f9565b610f9382826118ba565b80600260008282546118259190611ecd565b90915550506001600160a01b03821660009081526020819052604081208054839290611852908490611ecd565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60006118a9838361194f565b6118b257600080fd5b6107686111f2565b6001600160a01b0382166118cd57600080fd5b80600260008282546118df9190611e96565b90915550506001600160a01b0382166000908152602081905260408120805483929061190c908490611e96565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611891565b6000610768338484611631565b82805461196890611ee4565b90600052602060002090601f01602090048101928261198a57600085556119d0565b82601f106119a357805160ff19168380011785556119d0565b828001600101855582156119d0579182015b828111156119d05782518255916020019190600101906119b5565b506119dc9291506119e0565b5090565b5b808211156119dc57600081556001016119e1565b80356001600160a01b038116811461135257600080fd5b60008083601f840112611a1e57600080fd5b50813567ffffffffffffffff811115611a3657600080fd5b602083019150836020828501011115611a4e57600080fd5b9250929050565b600082601f830112611a6657600080fd5b813567ffffffffffffffff80821115611a8157611a81611f35565b604051601f8301601f19908116603f01168101908282118183101715611aa957611aa9611f35565b81604052838152866020858801011115611ac257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611af457600080fd5b611422826119f5565b60008060408385031215611b1057600080fd5b611b19836119f5565b9150611b27602084016119f5565b90509250929050565b600080600060608486031215611b4557600080fd5b611b4e846119f5565b9250611b5c602085016119f5565b9150604084013590509250925092565b600080600080600060808688031215611b8457600080fd5b611b8d866119f5565b9450611b9b602087016119f5565b935060408601359250606086013567ffffffffffffffff811115611bbe57600080fd5b611bca88828901611a0c565b969995985093965092949392505050565b60008060408385031215611bee57600080fd5b611bf7836119f5565b946020939093013593505050565b60008060008060608587031215611c1b57600080fd5b611c24856119f5565b935060208501359250604085013567ffffffffffffffff811115611c4757600080fd5b611c5387828801611a0c565b95989497509550505050565b600060208284031215611c7157600080fd5b813561142281611f4b565b600060208284031215611c8e57600080fd5b815161142281611f4b565b60008060208385031215611cac57600080fd5b823567ffffffffffffffff811115611cc357600080fd5b611ccf85828601611a0c565b90969095509350505050565b600060208284031215611ced57600080fd5b813567ffffffffffffffff811115611d0457600080fd5b611d1084828501611a55565b949350505050565b60008060408385031215611d2b57600080fd5b823567ffffffffffffffff80821115611d4357600080fd5b611d4f86838701611a55565b93506020850135915080821115611d6557600080fd5b50611d7285828601611a55565b9150509250929050565b600060208284031215611d8e57600080fd5b5035919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b0385168152836020820152606060408201526000611de6606083018486611d95565b9695505050505050565b602081526000611d10602083018486611d95565b600060208083528351808285015260005b81811015611e3157858101830151858201604001528201611e15565b81811115611e43576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b838152604060208201526000611033604083018486611d95565b60008219821115611ea957611ea9611f1f565b500190565b6000816000190483118215151615611ec857611ec8611f1f565b500290565b600082821015611edf57611edf611f1f565b500390565b600181811c90821680611ef857607f821691505b60208210811415611f1957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146110e457600080fdfea26469706673582212201147be0eeabda03a2c46b74f348bfb79bc954b5279f73a6d06c971502d84df9464736f6c63430008060033

Deployed Bytecode Sourcemap

2928:5775:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158:27:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3085:157:0;;;;;;:::i;:::-;;:::i;:::-;;;8203:14:7;;8196:22;8178:41;;8166:2;8151:18;3085:157:0;8133:92:7;3373:38:2;;;;;-1:-1:-1;;;;;3373:38:2;;;;;;-1:-1:-1;;;;;6466:32:7;;;6448:51;;6436:2;6421:18;3373:38:2;6403:102:7;9826:671:2;;;;;;:::i;:::-;;:::i;:::-;;2064:100:0;2144:12;;2064:100;;;13717:25:7;;;13705:2;13690:18;2064:100:0;13672:76:7;8255:126:2;;;;;;:::i;:::-;-1:-1:-1;;;;;8345:19:2;;;8318:7;8345:19;;;:6;:19;;;;;:28;;;8255:126;5203:113:6;;;;;;:::i;:::-;;:::i;3713:508:0:-;;;;;;:::i;:::-;;:::i;7323:924:2:-;;;;;;:::i;:::-;;:::i;5560:97:6:-;5644:5;;-1:-1:-1;;;;;5644:5:6;5560:97;;1892:30:0;;;;;;;;;;;;14247:4:7;14235:17;;;14217:36;;14205:2;14190:18;1892:30:0;14172:87:7;10638:464:2;;;;;;:::i;:::-;;:::i;3101:32:6:-;;;;;;5397:155;;;;;;:::i;:::-;;:::i;3013:30::-;;;;;;8527:136:2;;;;;;:::i;:::-;-1:-1:-1;;;;;8623:19:2;;;8596:7;8623:19;;;:6;:19;;;;;:32;;;;;8527:136;5127:313:0;;;;;;:::i;:::-;;:::i;7213:103:6:-;;;;;;:::i;:::-;;:::i;8473:225::-;;;;;;:::i;:::-;;:::i;415:136:1:-;;;;;;:::i;:::-;;:::i;6126:301:6:-;;;;;;:::i;:::-;;:::i;3418:35:2:-;;;;;;5066:103;;;;;;:::i;:::-;5139:10;5122:28;;;;:16;:28;;;;;:39;;-1:-1:-1;;5122:39:2;5153:8;;5122:39;;;;;;5066:103;9243:397;;;:::i;2227:119:0:-;;;;;;:::i;:::-;-1:-1:-1;;;;;2320:18:0;2293:7;2320:18;;;;;;;;;;;;2227:119;3791:327:2;;;;;;:::i;:::-;;:::i;3614:90:6:-;;;;;;:::i;:::-;;:::i;3012:46:2:-;;3050:8;3012:46;;822:20:5;;;;;-1:-1:-1;;;;;822:20:5;;;192:29:1;;;:::i;8389:130:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;8481:19:2;8454:7;8481:19;;;:6;:19;;;;;:30;;;;8389:130;5351:121;;;;;;:::i;:::-;-1:-1:-1;;;;;5440:24:2;5415:4;5440:24;;;:16;:24;;;;;;;;5439:25;;5351:121;4077:189:6;;;;;;:::i;:::-;;:::i;7556:160::-;;;;;;:::i;:::-;;:::i;6675:113::-;;;:::i;3192:48:2:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3067:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3067:39:2;;;;;;;;;;;;;-1:-1:-1;;;;;7873:15:7;;;7855:34;;7920:2;7905:18;;7898:34;;;;7948:18;;7941:34;;;;8011:15;;;8006:2;7991:18;;7984:43;7804:3;7789:19;3067:39:2;7771:262:7;4949:137:6;;;;;;:::i;:::-;;:::i;2985:19::-;;;:::i;2795:143:0:-;;;;;;:::i;:::-;-1:-1:-1;;;;;2903:18:0;;;2876:7;2903:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2795:143;8671:128:2;;;;;;:::i;:::-;-1:-1:-1;;;;;8762:19:2;8735:7;8762:19;;;:6;:19;;;;;:29;;;;8671:128;1326:150:5;;;;;;:::i;:::-;;:::i;6987:218:6:-;;;;;;:::i;:::-;;:::i;158:27:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3085:157:0:-;3159:4;3176:36;3185:10;3197:7;3206:5;3176:8;:36::i;:::-;-1:-1:-1;3230:4:0;3085:157;;;;:::o;9826:671:2:-;-1:-1:-1;;;;;9903:19:2;;;9882:18;9903:19;;;:6;:19;;;;;;;;;9882:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10044:15;10036:37;;;;-1:-1:-1;;;10036:37:2;;11651:2:7;10036:37:2;;;11633:21:7;11690:1;11670:18;;;11663:29;-1:-1:-1;;;11708:18:7;;;11701:39;11757:18;;10036:37:2;;;;;;;;;10092:14;;-1:-1:-1;;;;;10092:28:2;10110:10;10092:28;10084:53;;;;-1:-1:-1;;;10084:53:2;;9961:2:7;10084:53:2;;;9943:21:7;10000:2;9980:18;;;9973:30;-1:-1:-1;;;10019:18:7;;;10012:42;10071:18;;10084:53:2;9933:162:7;10084:53:2;10189:15;3050:8;10156:5;:15;;;:29;;;;:::i;:::-;:48;;10148:70;;;;-1:-1:-1;;;10148:70:2;;12344:2:7;10148:70:2;;;12326:21:7;12383:1;12363:18;;;12356:29;-1:-1:-1;;;12401:18:7;;;12394:39;12450:18;;10148:70:2;12316:158:7;10148:70:2;10248:14;;-1:-1:-1;;;;;10280:19:2;;;10229:16;10280:19;;;:6;:19;;;;;;;;10273:26;;-1:-1:-1;;;;;;10273:26:2;;;;;-1:-1:-1;10273:26:2;;;;;;;;;;;;;;;;;;;;;;10318:39;;-1:-1:-1;;;10318:39:2;;7082:32:7;;;10318:39:2;;;7064:51:7;;;;7131:18;;;7124:34;;;10318:17:2;;;;;;7037:18:7;;10318:39:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10310:48;;;;;;10369:56;10379:11;10392:8;10402:22;10412:11;-1:-1:-1;;;;;2320:18:0;2293:7;2320:18;;;;;;;;;;;;2227:119;10402:22:2;10369:9;:56::i;:::-;10468:8;-1:-1:-1;;;;;10441:48:2;10455:11;-1:-1:-1;;;;;10441:48:2;;10478:10;10441:48;;;;13717:25:7;;13705:2;13690:18;;13672:76;10441:48:2;;;;;;;;9871:626;;;;9826:671;:::o;5203:113:6:-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;5287:21:6::1;5300:7;;5287:21;;;;;;;:::i;:::-;;;;;;;;5203:113:::0;;:::o;3713:508:0:-;3811:4;3828:36;3838:6;3846:9;3857:6;3828:9;:36::i;:::-;-1:-1:-1;;;;;3902:19:0;;3875:24;3902:19;;;:11;:19;;;;;;;;3922:10;3902:31;;;;;;;;-1:-1:-1;;;3948:29:0;;3944:248;;;4125:55;4134:6;4142:10;4154:25;4173:6;4154:16;:25;:::i;:::-;4125:8;:55::i;:::-;-1:-1:-1;4209:4:0;;3713:508;-1:-1:-1;;;;3713:508:0:o;7323:924:2:-;-1:-1:-1;;;;;5440:24:2;;5415:4;5440:24;;;:16;:24;;;;;;;;5439:25;7407:51;;;;-1:-1:-1;;;7407:51:2;;10302:2:7;7407:51:2;;;10284:21:7;10341:1;10321:18;;;10314:29;-1:-1:-1;;;10359:18:7;;;10352:38;10407:18;;7407:51:2;10274:157:7;7407:51:2;7469:22;7494:33;7512:14;7494:17;:33::i;:::-;7469:58;;7563:1;7546:14;:18;7538:45;;;;-1:-1:-1;;;7538:45:2;;10971:2:7;7538:45:2;;;10953:21:7;11010:2;10990:18;;;10983:30;-1:-1:-1;;;11029:18:7;;;11022:44;11083:18;;7538:45:2;10943:164:7;7538:45:2;7613:10;7594:16;7652:22;7662:11;-1:-1:-1;;;;;2320:18:0;2293:7;2320:18;;;;;;;;;;;;2227:119;7652:22:2;7634:40;-1:-1:-1;7685:18:2;7706:24;7716:14;7634:40;7706:24;:::i;:::-;7685:45;-1:-1:-1;7766:14:2;7800:11;7792:29;;;;-1:-1:-1;;;7792:29:2;;10638:2:7;7792:29:2;;;10620:21:7;10677:1;10657:18;;;10650:29;-1:-1:-1;;;10695:18:7;;;10688:35;10740:18;;7792:29:2;10610:154:7;7792:29:2;-1:-1:-1;;;;;7840:19:2;;;;;;:6;:19;;;;;:30;;;:35;7832:63;;;;-1:-1:-1;;;7832:63:2;;9617:2:7;7832:63:2;;;9599:21:7;9656:2;9636:18;;;9629:30;-1:-1:-1;;;9675:18:7;;;9668:45;9730:18;;7832:63:2;9589:165:7;7832:63:2;7914:58;;-1:-1:-1;;;7914:58:2;;-1:-1:-1;;;;;6768:15:7;;;7914:58:2;;;6750:34:7;7954:4:2;6800:18:7;;;6793:43;6852:18;;;6845:34;;;7914:21:2;;;;;6685:18:7;;7914:58:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7906:67;;;;;;8008:172;;;;;;;;-1:-1:-1;;;;;8008:172:2;;;;;;;;;;;;;8110:15;8008:172;;;;;;;;;;;;;;;7986:19;;;-1:-1:-1;7986:19:2;;;:6;:19;;;;;;;:194;;;;;;;-1:-1:-1;;;;;;7986:194:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8198:41;;;;;;8231:7;13717:25:7;;13705:2;13690:18;;13672:76;8198:41:2;;;;;;;;7396:851;;;;;7323:924;;:::o;10638:464::-;5644:5:6;;-1:-1:-1;;;;;5644:5:6;10706:10:2;:31;10698:53;;;;-1:-1:-1;;;10698:53:2;;11314:2:7;10698:53:2;;;11296:21:7;11353:1;11333:18;;;11326:29;-1:-1:-1;;;11371:18:7;;;11364:39;11420:18;;10698:53:2;11286:158:7;10698:53:2;-1:-1:-1;;;;;10783:19:2;;;10762:18;10783:19;;;:6;:19;;;;;;;;;10762:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10868:43;;;;-1:-1:-1;;;10868:43:2;;11651:2:7;10868:43:2;;;11633:21:7;11690:1;11670:18;;;11663:29;-1:-1:-1;;;11708:18:7;;;11701:39;11757:18;;10868:43:2;11623:158:7;10868:43:2;-1:-1:-1;;;;;10929:19:2;;;;;;;:6;:19;;;;;;;;10922:26;;-1:-1:-1;;;;;;10922:26:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;10985:14;;11001:16;;;;10967:51;;-1:-1:-1;;;10967:51:2;;:17;;;;;;:51;;11001:16;;10967:51;-1:-1:-1;;;;;7082:32:7;;;;7064:51;;7146:2;7131:18;;7124:34;7052:2;7037:18;;7019:145;10967:51:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10959:60;;;;;;11061:5;:14;;;-1:-1:-1;;;;;11035:59:2;11048:11;-1:-1:-1;;;;;11035:59:2;;11077:5;:16;;;11035:59;;;;13717:25:7;;13705:2;13690:18;;13672:76;11035:59:2;;;;;;;;10687:415;;10638:464;:::o;5397:155:6:-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;5495:49:6::1;5527:10;5539:4;5495:31;:49::i;:::-;5397:155:::0;;:::o;5127:313:0:-;5221:4;5238:12;5253:27;5262:9;5273:6;5253:8;:27::i;:::-;5238:42;;5295:7;5291:117;;;5328:68;;-1:-1:-1;;;5328:68:0;;-1:-1:-1;;;;;5328:42:0;;;;;:68;;5371:10;;5383:6;;5391:4;;;;5328:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5318:78;;5291:117;5425:7;5127:313;-1:-1:-1;;;;;5127:313:0:o;7213:103:6:-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;7287:21:6::1;7293:6;7301;7287:5;:21::i;8473:225::-:0;8551:10;2293:7:0;2320:18;;;;;;;;;;;8530:7:6;:32;;8522:72;;;;-1:-1:-1;;;8522:72:6;;11988:2:7;8522:72:6;;;11970:21:7;12027:2;12007:18;;;12000:30;12066:29;12046:18;;;12039:57;12113:18;;8522:72:6;11960:177:7;8522:72:6;8605:45;8615:10;8635:4;8642:7;8605:9;:45::i;:::-;8661:29;8675:4;8682:7;8661:5;:29::i;:::-;8473:225;:::o;415:136:1:-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;504:16:1;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;531:12:1;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;;415:136:::0;;:::o;6126:301:6:-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;2320:18:0;;6239:21:6::1;2320:18:0::0;;;;;;;;;;;6299:23:6;;::::1;;6291:32;;;::::0;::::1;;6351:6;6334:13;;:23;;;;;;;:::i;:::-;;;;;;;;6395:6;-1:-1:-1::0;;;;;6373:46:6::1;;6403:6;6411:7;;6373:46;;;;;;;;:::i;:::-;;;;;;;;6228:199;6126:301:::0;;;;:::o;9243:397:2:-;9294:10;9287:18;;;;:6;:18;;;;;:29;;;:34;9283:350;;9366:10;9338:18;9359;;;:6;:18;;;;;;;;:29;;;;;9428:31;;;;;9475:25;;-1:-1:-1;;;;;;9475:25:2;;;;;;;;;-1:-1:-1;9475:25:2;;;;;;;;;;;;;9523:41;;-1:-1:-1;;;9523:41:2;;;;;7064:51:7;;;;7131:18;;;7124:34;;;9359:29:2;;-1:-1:-1;;;;;9428:31:2;;;;9523:17;;7037:18:7;;9523:41:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9515:50;;;;;;9585:36;;13717:25:7;;;9598:10:2;;9585:36;;13705:2:7;13690:18;9585:36:2;;;;;;;9323:310;;9283:350;9243:397::o;3791:327::-;3871:7;-1:-1:-1;;;;;3895:31:2;;3921:4;3895:31;3891:220;;;-1:-1:-1;3950:1:2;;3791:327;-1:-1:-1;3791:327:2:o;3891:220::-;3991:23;;-1:-1:-1;;;;;3973:41:2;;;3991:23;;3973:41;3969:142;;;-1:-1:-1;;4038:20:2;;;3791:327::o;3969:142::-;-1:-1:-1;4098:1:2;;3791:327;-1:-1:-1;3791:327:2:o;3969:142::-;3791:327;;;:::o;3614:90:6:-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;3682:14:6;;::::1;::::0;:5:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;192:29:1:-:0;;;;;;;:::i;4077:189:6:-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;4183:18:6::1;:16;:18::i;:::-;4164:15;:37;;4156:62;;;::::0;-1:-1:-1;;;4156:62:6;;12681:2:7;4156:62:6::1;::::0;::::1;12663:21:7::0;12720:2;12700:18;;;12693:30;-1:-1:-1;;;12739:18:7;;;12732:42;12791:18;;4156:62:6::1;12653:162:7::0;4156:62:6::1;4229:11;:29:::0;4077:189::o;7556:160::-;7659:4;7683:25;7698:2;7702:5;7683:14;:25::i;:::-;7676:32;7556:160;-1:-1:-1;;;7556:160:6:o;6675:113::-;6724:7;6767:13;;6751;2144:12:0;;;2064:100;6751:13:6;:29;;;;:::i;:::-;6744:36;;6675:113;:::o;4949:137::-;1524:5:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;5040:38:6::1;::::0;-1:-1:-1;;;;;6466:32:7;;6448:51;;5040:38:6::1;::::0;6436:2:7;6421:18;5040:38:6::1;;;;;;;4949:137:::0;:::o;2985:19::-;;;;;;;:::i;1326:150:5:-;1524:5;;-1:-1:-1;;;;;1524:5:5;1533:10;1524:19;1516:41;;;;-1:-1:-1;;;1516:41:5;;;;;;;:::i;:::-;1425:5:::1;::::0;1404:37:::1;::::0;-1:-1:-1;;;;;1404:37:5;;::::1;::::0;1425:5:::1;::::0;1404:37:::1;::::0;1425:5:::1;::::0;1404:37:::1;1452:5;:16:::0;;-1:-1:-1;;;;;;1452:16:5::1;-1:-1:-1::0;;;;;1452:16:5;;;::::1;::::0;;;::::1;::::0;;1326:150::o;6987:218:6:-;7100:20;7105:6;7113;7100:4;:20::i;:::-;7131:66;;-1:-1:-1;;;7131:66:6;;-1:-1:-1;;;;;7131:39:6;;;;;:66;;7171:11;;7184:6;;7192:4;;;;7131:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6987:218;;;;;:::o;7067:175:0:-;-1:-1:-1;;;;;7152:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;7203:31;;13717:25:7;;;7203:31:0;;13690:18:7;7203:31:0;13672:76:7;4711:330:0;-1:-1:-1;;;;;4817:23:0;;4809:32;;;;;;-1:-1:-1;;;;;4914:17:0;;:9;:17;;;;;;;;;;:27;;4935:6;;4914:9;:27;;4935:6;;4914:27;:::i;:::-;;;;-1:-1:-1;;;;;;;4952:20:0;;:9;:20;;;;;;;;;;:30;;4976:6;;4952:9;:30;;4976:6;;4952:30;:::i;:::-;;;;;;;;5015:9;-1:-1:-1;;;;;4998:35:0;5007:6;-1:-1:-1;;;;;4998:35:0;;5026:6;4998:35;;;;13717:25:7;;13705:2;13690:18;;13672:76;4574:411:2;4663:23;:36;;-1:-1:-1;;;;;;4663:36:2;-1:-1:-1;;;;;4663:36:2;;;;;;;;4710:206;;4791:1;4768:20;:24;4710:206;;;4852:1;4845:4;:8;4837:25;;;;-1:-1:-1;;;4837:25:2;;;;;;9285:2:7;9267:21;;;9324:1;9304:18;;;9297:29;-1:-1:-1;;;9357:2:7;9342:18;;9335:34;9401:2;9386:18;;9257:153;4837:25:2;4877:20;:27;;;4710:206;4931:46;;;-1:-1:-1;;;;;7082:32:7;;7064:51;;7146:2;7131:18;;7124:34;;;4931:46:2;;7037:18:7;4931:46:2;7019:145:7;7324:224:6;7440:11;;7430:6;7409:18;:16;:18::i;:::-;:27;;;;:::i;:::-;:42;;7401:100;;;;-1:-1:-1;;;7401:100:6;;13022:2:7;7401:100:6;;;13004:21:7;13061:2;13041:18;;;13034:30;13100:34;13080:18;;;13073:62;-1:-1:-1;;;13151:18:7;;;13144:43;13204:19;;7401:100:6;12994:235:7;7401:100:6;7512:28;7524:7;7533:6;7512:11;:28::i;6367:260:0:-;6521:6;6505:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6538:18:0;;:9;:18;;;;;;;;;;:28;;6560:6;;6538:9;:28;;6560:6;;6538:28;:::i;:::-;;;;-1:-1:-1;;6582:37:0;;13717:25:7;;;6608:1:0;;-1:-1:-1;;;;;6582:37:0;;;;;13705:2:7;13690:18;6582:37:0;;;;;;;;6367:260;;:::o;8807:198:2:-;8893:4;8918:33;8933:9;8944:6;8918:14;:33::i;:::-;8910:42;;;;;;8963:12;:10;:12::i;5721:313:0:-;-1:-1:-1;;;;;5807:23:0;;5799:32;;;;;;5924:6;5908:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;5941:20:0;;:9;:20;;;;;;;;;;:30;;5965:6;;5941:9;:30;;5965:6;;5941:30;:::i;:::-;;;;-1:-1:-1;;5987:39:0;;13717:25:7;;;-1:-1:-1;;;;;5987:39:0;;;6004:1;;5987:39;;13705:2:7;13690:18;5987:39:0;13672:76:7;2559:173:0;2645:4;2662:40;2672:10;2684:9;2695:6;2662:9;:40::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:7;82:20;;-1:-1:-1;;;;;131:31:7;;121:42;;111:2;;177:1;174;167:12;192:347;243:8;253:6;307:3;300:4;292:6;288:17;284:27;274:2;;325:1;322;315:12;274:2;-1:-1:-1;348:20:7;;391:18;380:30;;377:2;;;423:1;420;413:12;377:2;460:4;452:6;448:17;436:29;;512:3;505:4;496:6;488;484:19;480:30;477:39;474:2;;;529:1;526;519:12;474:2;264:275;;;;;:::o;544:719::-;587:5;640:3;633:4;625:6;621:17;617:27;607:2;;658:1;655;648:12;607:2;694:6;681:20;720:18;757:2;753;750:10;747:2;;;763:18;;:::i;:::-;838:2;832:9;806:2;892:13;;-1:-1:-1;;888:22:7;;;912:2;884:31;880:40;868:53;;;936:18;;;956:22;;;933:46;930:2;;;982:18;;:::i;:::-;1022:10;1018:2;1011:22;1057:2;1049:6;1042:18;1103:3;1096:4;1091:2;1083:6;1079:15;1075:26;1072:35;1069:2;;;1120:1;1117;1110:12;1069:2;1184;1177:4;1169:6;1165:17;1158:4;1150:6;1146:17;1133:54;1231:1;1224:4;1219:2;1211:6;1207:15;1203:26;1196:37;1251:6;1242:15;;;;;;597:666;;;;:::o;1268:186::-;1327:6;1380:2;1368:9;1359:7;1355:23;1351:32;1348:2;;;1396:1;1393;1386:12;1348:2;1419:29;1438:9;1419:29;:::i;1459:260::-;1527:6;1535;1588:2;1576:9;1567:7;1563:23;1559:32;1556:2;;;1604:1;1601;1594:12;1556:2;1627:29;1646:9;1627:29;:::i;:::-;1617:39;;1675:38;1709:2;1698:9;1694:18;1675:38;:::i;:::-;1665:48;;1546:173;;;;;:::o;1724:328::-;1801:6;1809;1817;1870:2;1858:9;1849:7;1845:23;1841:32;1838:2;;;1886:1;1883;1876:12;1838:2;1909:29;1928:9;1909:29;:::i;:::-;1899:39;;1957:38;1991:2;1980:9;1976:18;1957:38;:::i;:::-;1947:48;;2042:2;2031:9;2027:18;2014:32;2004:42;;1828:224;;;;;:::o;2057:626::-;2154:6;2162;2170;2178;2186;2239:3;2227:9;2218:7;2214:23;2210:33;2207:2;;;2256:1;2253;2246:12;2207:2;2279:29;2298:9;2279:29;:::i;:::-;2269:39;;2327:38;2361:2;2350:9;2346:18;2327:38;:::i;:::-;2317:48;;2412:2;2401:9;2397:18;2384:32;2374:42;;2467:2;2456:9;2452:18;2439:32;2494:18;2486:6;2483:30;2480:2;;;2526:1;2523;2516:12;2480:2;2565:58;2615:7;2606:6;2595:9;2591:22;2565:58;:::i;:::-;2197:486;;;;-1:-1:-1;2197:486:7;;-1:-1:-1;2642:8:7;;2539:84;2197:486;-1:-1:-1;;;2197:486:7:o;2688:254::-;2756:6;2764;2817:2;2805:9;2796:7;2792:23;2788:32;2785:2;;;2833:1;2830;2823:12;2785:2;2856:29;2875:9;2856:29;:::i;:::-;2846:39;2932:2;2917:18;;;;2904:32;;-1:-1:-1;;;2775:167:7:o;2947:551::-;3035:6;3043;3051;3059;3112:2;3100:9;3091:7;3087:23;3083:32;3080:2;;;3128:1;3125;3118:12;3080:2;3151:29;3170:9;3151:29;:::i;:::-;3141:39;;3227:2;3216:9;3212:18;3199:32;3189:42;;3282:2;3271:9;3267:18;3254:32;3309:18;3301:6;3298:30;3295:2;;;3341:1;3338;3331:12;3295:2;3380:58;3430:7;3421:6;3410:9;3406:22;3380:58;:::i;:::-;3070:428;;;;-1:-1:-1;3457:8:7;-1:-1:-1;;;;3070:428:7:o;4060:241::-;4116:6;4169:2;4157:9;4148:7;4144:23;4140:32;4137:2;;;4185:1;4182;4175:12;4137:2;4224:9;4211:23;4243:28;4265:5;4243:28;:::i;4306:245::-;4373:6;4426:2;4414:9;4405:7;4401:23;4397:32;4394:2;;;4442:1;4439;4432:12;4394:2;4474:9;4468:16;4493:28;4515:5;4493:28;:::i;4556:410::-;4627:6;4635;4688:2;4676:9;4667:7;4663:23;4659:32;4656:2;;;4704:1;4701;4694:12;4656:2;4744:9;4731:23;4777:18;4769:6;4766:30;4763:2;;;4809:1;4806;4799:12;4763:2;4848:58;4898:7;4889:6;4878:9;4874:22;4848:58;:::i;:::-;4925:8;;4822:84;;-1:-1:-1;4646:320:7;-1:-1:-1;;;;4646:320:7:o;4971:322::-;5040:6;5093:2;5081:9;5072:7;5068:23;5064:32;5061:2;;;5109:1;5106;5099:12;5061:2;5149:9;5136:23;5182:18;5174:6;5171:30;5168:2;;;5214:1;5211;5204:12;5168:2;5237:50;5279:7;5270:6;5259:9;5255:22;5237:50;:::i;:::-;5227:60;5051:242;-1:-1:-1;;;;5051:242:7:o;5298:543::-;5386:6;5394;5447:2;5435:9;5426:7;5422:23;5418:32;5415:2;;;5463:1;5460;5453:12;5415:2;5503:9;5490:23;5532:18;5573:2;5565:6;5562:14;5559:2;;;5589:1;5586;5579:12;5559:2;5612:50;5654:7;5645:6;5634:9;5630:22;5612:50;:::i;:::-;5602:60;;5715:2;5704:9;5700:18;5687:32;5671:48;;5744:2;5734:8;5731:16;5728:2;;;5760:1;5757;5750:12;5728:2;;5783:52;5827:7;5816:8;5805:9;5801:24;5783:52;:::i;:::-;5773:62;;;5405:436;;;;;:::o;5846:180::-;5905:6;5958:2;5946:9;5937:7;5933:23;5929:32;5926:2;;;5974:1;5971;5964:12;5926:2;-1:-1:-1;5997:23:7;;5916:110;-1:-1:-1;5916:110:7:o;6031:266::-;6119:6;6114:3;6107:19;6171:6;6164:5;6157:4;6152:3;6148:14;6135:43;-1:-1:-1;6223:1:7;6198:16;;;6216:4;6194:27;;;6187:38;;;;6279:2;6258:15;;;-1:-1:-1;;6254:29:7;6245:39;;;6241:50;;6097:200::o;7169:412::-;7411:1;7407;7402:3;7398:11;7394:19;7386:6;7382:32;7371:9;7364:51;7451:6;7446:2;7435:9;7431:18;7424:34;7494:2;7489;7478:9;7474:18;7467:30;7345:4;7514:61;7571:2;7560:9;7556:18;7548:6;7540;7514:61;:::i;:::-;7506:69;7354:227;-1:-1:-1;;;;;;7354:227:7:o;8230:246::-;8389:2;8378:9;8371:21;8352:4;8409:61;8466:2;8455:9;8451:18;8443:6;8435;8409:61;:::i;8481:597::-;8593:4;8622:2;8651;8640:9;8633:21;8683:6;8677:13;8726:6;8721:2;8710:9;8706:18;8699:34;8751:1;8761:140;8775:6;8772:1;8769:13;8761:140;;;8870:14;;;8866:23;;8860:30;8836:17;;;8855:2;8832:26;8825:66;8790:10;;8761:140;;;8919:6;8916:1;8913:13;8910:2;;;8989:1;8984:2;8975:6;8964:9;8960:22;8956:31;8949:42;8910:2;-1:-1:-1;9062:2:7;9041:15;-1:-1:-1;;9037:29:7;9022:45;;;;9069:2;9018:54;;8602:476;-1:-1:-1;;;8602:476:7:o;13234:332::-;13436:2;13418:21;;;13475:1;13455:18;;;13448:29;-1:-1:-1;;;13508:2:7;13493:18;;13486:39;13557:2;13542:18;;13408:158::o;13753:317::-;13940:6;13929:9;13922:25;13983:2;13978;13967:9;13963:18;13956:30;13903:4;14003:61;14060:2;14049:9;14045:18;14037:6;14029;14003:61;:::i;14264:128::-;14304:3;14335:1;14331:6;14328:1;14325:13;14322:2;;;14341:18;;:::i;:::-;-1:-1:-1;14377:9:7;;14312:80::o;14397:168::-;14437:7;14503:1;14499;14495:6;14491:14;14488:1;14485:21;14480:1;14473:9;14466:17;14462:45;14459:2;;;14510:18;;:::i;:::-;-1:-1:-1;14550:9:7;;14449:116::o;14570:125::-;14610:4;14638:1;14635;14632:8;14629:2;;;14643:18;;:::i;:::-;-1:-1:-1;14680:9:7;;14619:76::o;14700:380::-;14779:1;14775:12;;;;14822;;;14843:2;;14897:4;14889:6;14885:17;14875:27;;14843:2;14950;14942:6;14939:14;14919:18;14916:38;14913:2;;;14996:10;14991:3;14987:20;14984:1;14977:31;15031:4;15028:1;15021:15;15059:4;15056:1;15049:15;14913:2;;14755:325;;;:::o;15085:127::-;15146:10;15141:3;15137:20;15134:1;15127:31;15177:4;15174:1;15167:15;15201:4;15198:1;15191:15;15217:127;15278:10;15273:3;15269:20;15266:1;15259:31;15309:4;15306:1;15299:15;15333:4;15330:1;15323:15;15349:118;15435:5;15428:13;15421:21;15414:5;15411:32;15401:2;;15457:1;15454;15447:12

Swarm Source

ipfs://1147be0eeabda03a2c46b74f348bfb79bc954b5279f73a6d06c971502d84df94
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.