Token Feyorra

 

Overview [ERC-20]

Price
$0.01 @ 0.000003 Eth (+0.14%)
Fully Diluted Market Cap
Max Total Supply:
438,915,127.319017844193767178 FEY

Holders:
1,658 (0.00%)

Transfers:
-

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

OVERVIEW

Feyorra (FEY) is an utility token for all projects associated with WALP Entertainment. Holders can stake Feyorra and get a reward paid from 4.1% to 410% APY.

Market

Volume (24H):$561.23
Market Capitalization:$0.00
Circulating Supply:0.00 FEY
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FEYToken

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 3 of 10: FEYToken.sol
// SPDX-License-Identifier: -- 💰 --

import './Token.sol';

pragma solidity ^0.7.3;

contract FEYToken is Token {

    using SafeMath for uint256;

    /**
        * @notice returns the interest rate by getting the global variable
        * YEARLY_INTEREST and subtracting the percentage passed.
        * Lowers the default interest rate as amount staked rises towards the totalSupply.
        * Used to record the rates for snapshots + to calculate stake interest
        * @param _percentage any uint256 figure
        * @return interestRate
     */
    function getInterestRateYearly(
        uint256 _percentage
    )
        public
        pure
        returns (uint256 interestRate)
    {
        return _percentage > 100
            ? uint256(YEARLY_INTEREST).mul(uint256(10000)).div(_percentage)
            : YEARLY_INTEREST.mul(100);
    }
    
    /**
        * @notice a no args function used to get current APY
        * @dev _precision in getPercent is fixed to 4
        * @return percentage -- totalStaked on a particular day out of totalSupply
        * @return interestRateYearly -- APY based on relative size of current total stakes
     */
    function getYearlyInterestLatest()
        public
        view
        returns (
            uint256 percentage,
            uint256 interestRateYearly
        )
    {
        percentage = getPercent(
            globals.totalStakedAmount,
            totalSupply,
            4
        );

        interestRateYearly = getInterestRateYearly(
            percentage
        );
    }

    /**
        * @notice function used to get APY of a specific day
        * @param _day integer for the target day, starting @ 0
        * @dev _precision in getPercent is fixed to 4
        * @return percentage -- totalStaked on a particular day out of totalSupply
        * @return interestRateYearly -- APY based on relative size of stake
     */
    function getYearlyInterestHistorical(
        uint256 _day
    )
        public
        view
        returns (
            uint256 percentage,
            uint256 interestRateYearly
        )
    {
        SnapShot memory s = snapshots[_day];

        if (s.totalSupply == 0) {
            return getYearlyInterestLatest();
        }

        percentage = getPercent(
            s.totalStakedAmount,
            s.totalSupply,
            4
        );

        interestRateYearly = getInterestRateYearly(
            percentage
        );
    }

    /**
        * @notice calculates amount of interest earned per second
        * @param _stakedAmount principal amount
        * @param _totalStakedAmount summation of principal amount staked by everyone
        * @param _seconds time spent earning interest on a particular day
        * _seconds will be passed as the full SECONDS_IN_DAY for full days that we staked
        * _seconds will be the seconds that have passed by the time getInterest is called on the last day
        * @dev _precision in getPercent is fixed to 4
        * @return durationInterestAmt -- totalStaked on a particular day out of totalSupply
     */
    function getInterest(
        uint256 _stakedAmount,
        uint256 _totalStakedAmount,
        uint256 _seconds
    )
        public
        view
        returns (uint256 durationInterestAmt)
    {
        uint256 percentage = getPercent(
            _totalStakedAmount,
            totalSupply,
            4
        );

        uint256 interestRateYearly = getInterestRateYearly(
            percentage
        );

        uint256 yearFullAmount = _stakedAmount
            .mul(interestRateYearly)
            .div(100);

        uint256 dailyInterestAmt = getPercent(
            yearFullAmount,
            31556952,
            0
        );

        durationInterestAmt = dailyInterestAmt
            .mul(_seconds)
            .div(100);
    }

    /**
         * @notice admin function to close a matured stake OBO the staker
         * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
         * @dev can only close after all of the seconds of the last day have passed
      */
    function closeGhostStake(
        uint256 _stakingId
    )
        external
        onlyOwner
    {
        (uint256 daysOld, uint256 secondsOld) =

        getStakeAge(
            _stakingId
        );

        require(
            daysOld == MAX_STAKE_DAYS &&
            secondsOld == SECONDS_IN_DAY,
            'FEYToken: not old enough'
        );

        _closeStake(
            stakeList[_stakingId].userAddress,
            _stakingId
        );

        emit ClosedGhostStake(
            daysOld,
            secondsOld,
            _stakingId
        );
    }

    /**
        * @notice calculates number of days and remaining seconds on current day that a stake is open
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return daysTotal -- number of complete days that the stake has been open
        * @return secondsToday -- number of seconds the stake has been open on the current day
     */
    function getStakeAge(
        uint256 _stakingId
    )
        public
        view
        returns (
            uint256 daysTotal,
            uint256 secondsToday
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        uint256 secondsTotal = getNow()
            .sub(_stakeElement.stakedAt);

        daysTotal = secondsTotal
            .div(SECONDS_IN_DAY);

        if (daysTotal > MAX_STAKE_DAYS) {

            daysTotal = MAX_STAKE_DAYS;
            secondsToday = SECONDS_IN_DAY;

        } else {
            secondsToday = secondsTotal
                .mod(SECONDS_IN_DAY);
        }
    }

    /**
        * @notice calculates amount of interest due to be credited to the staker based on:
        * number of days and remaining seconds on current day that a stake is open
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return stakeInterest -- total interest per second the stake was open on each day
     */
    function getStakeInterest(
        uint256 _stakingId
    )
        public
        view
        returns (
            uint256 stakeInterest
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        if (_stakeElement.isActive == false) {

            stakeInterest = _stakeElement.interestAmount;

        } else {

            (
                uint256 daysTotal,
                uint256 secondsToday
            ) = getStakeAge(_stakingId);

            uint256 finalDay = _currentFeyDay();
            uint256 startDay = finalDay.sub(daysTotal);

            for (uint256 _day = startDay; _day < finalDay; _day++) {
                stakeInterest += getInterest(
                    _stakeElement.stakedAmount,
                    snapshots[_day].totalStakedAmount,
                    SECONDS_IN_DAY
                );
            }

            stakeInterest += getInterest(
                _stakeElement.stakedAmount,
                globals.totalStakedAmount,
                secondsToday
            );
        }
    }

    /**
        * @notice penalties are taken if you close a stake before the completion of the 4th day
        * if closed before the end of the 15th day: 7.5% of staked amount is penalized
        * if closed before the end of the 30th day: 5% of staked amount is penalized
        * if closed before the end of the 45th day: 2.5% of staked amount is penalized
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return penaltyAmount -- amount that will be debited from the stakers principal when they close their stake
     */
    function getStakePenalty(
        uint256 _stakingId
    )
        public
        view
        returns (uint256 penaltyAmount)
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        uint256 daysDifference = getNow()
            .sub(_stakeElement.stakedAt)
            .div(SECONDS_IN_DAY);

        if (daysDifference < 15) {

            penaltyAmount = percentCalculator(
                _stakeElement.stakedAmount,
                750
            );

        } else if (daysDifference < 30) {

            penaltyAmount = percentCalculator(
                _stakeElement.stakedAmount,
                500
            );

        } else if (daysDifference < 45) {

            penaltyAmount = percentCalculator(
                _stakeElement.stakedAmount,
                250
            );
        }
    }

    /**
        * @notice calculates principal + interest - penalty (if applicable)
        * Note: this does not calculate a return rate, only what the sum would be if the stake was closed at that moment
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @dev the calculated value is only in memory
        * @return uint256 -- principal + interest - penalty
     */
    function estimateReturn(
        uint256 _stakingId
    )
        public
        view
        returns (uint256)
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        if (_stakeElement.isActive == false) {
            return  _stakeElement.returnAmount;
        }

        return _stakeElement.stakedAmount
            .add(getStakeInterest(_stakingId))
            .sub(getStakePenalty(_stakingId));
    }

    /**
        * @notice close a stake older than 1 full day to:
        * 1) credit principal + interest - penalty to the balance of the staker
        * 2) update totalStakedAmount in globals
        * 3) take snapshot of current FEY status before the stake closes
        * No interest is accrued unless the stake is at least on its 4th day
        * Updates global variables to reflect the closed stake
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return stakedAmount -- represents the total calculated by: principal + interest - penalty
        * @return penaltyAmount -- amount that will be debited from the stakers principal when they close their stake
        * @return interestAmount -- amount that will be debited from the stakers principal when they close their stake
     */
    function closeStake(
        uint256 _stakingId
    )
        public
        snapshotTriggerOnClose
        returns (
            uint256 stakedAmount,
            uint256 penaltyAmount,
            uint256 interestAmount
        )
    {
        return _closeStake(
            msg.sender,
            _stakingId
        );
    }

    function _closeStake(
        address _staker,
        uint256 _stakingId
    )
        internal
        returns (
            uint256 stakedAmount,
            uint256 penaltyAmount,
            uint256 interestAmount
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        uint256 daysDifference = getNow()
            .sub(_stakeElement.stakedAt)
            .div(SECONDS_IN_DAY);

        require(
            daysDifference >= 3,
            'FEYToken: immature stake'
        );

        require(
            _stakeElement.userAddress == _staker,
            'FEYToken: wrong stake owner'
        );

        require(
            _stakeElement.isActive,
            'FEYToken: stake not active'
        );

        _stakeElement.isActive = false;

        stakedAmount = _stakeElement.stakedAmount;

        if (daysDifference >= 45) {
            interestAmount = getStakeInterest(
                _stakingId
            );
        }

        penaltyAmount = getStakePenalty(
            _stakingId
        );

        totalSupply = totalSupply
            .add(interestAmount)
            .sub(penaltyAmount);

        _stakeElement.interestAmount = interestAmount;
        _stakeElement.returnAmount = stakedAmount
            .add(interestAmount)
            .sub(penaltyAmount);

        stakeList[_stakingId] = _stakeElement;

        balances[_staker] =
        balances[_staker].add(_stakeElement.returnAmount);

        globals.totalStakedAmount =
        globals.totalStakedAmount.sub(stakedAmount);

        emit StakeEnd(
            _stakingId,
            _staker,
            _stakeElement.returnAmount
        );

        emit Transfer(
            address(0x0),
            _staker,
            _stakeElement.returnAmount
        );
    }

    /**
        * @notice open a stake:
        * 1) must be greater than MINIMUM_STAKE in Declarations
        * 2) address opening the stake must have the amount of funds that they wish to stake in their balances[0xaddress]
        * 3) increment the global incrementId that is used to set the stakingId
        * 3) take snapshot of current FEY status before the stake is opened
        * Updates global variables to reflect the new stake
        * @param _amount the amount that you want to stake, will become your principal amount
        * @return true if no revert or error occurs
     */
    function openStake(
        uint256 _amount
    )
        external
        incrementId
        snapshotTriggerOnOpen
        returns (bool)
    {
        require(
            _transferCheck(
                msg.sender,
                address(0x0),
                _amount,
                true
            ),
            'FEYToken: _transferCheck failed'
        );

        require(
            _amount >= MINIMUM_STAKE,
            'FEYToken: stake below minimum'
        );

        balances[msg.sender] =
        balances[msg.sender].sub(_amount);

        stakeList[globals.stakingId] = StakeElement(
            msg.sender,
            _amount,
            0,
            0,
            getNow(),
            true
        );

        globals.totalStakedAmount =
        globals.totalStakedAmount.add(_amount);

        emit StakeStart(
            globals.stakingId,
            msg.sender,
            _amount
        );

        emit Transfer(
            msg.sender,
            address(0),
            _amount
        );

        return true;
    }

    /**
        * @notice getter for the data of a specific stake
        * @param _stakingId ID of the stake, used as the Key from the stakeList mapping
        * @return _stakedAmount -- represents the total calculated by: principal + interest - penalty
        * @return _userAddress -- address that was used to open the stake
        * @return _returnAmount -- principal + interest - penalty
        * @return interestAmount -- amount of interest accrued after closing the stake
        * @return _stakedAt -- timestamp of when stake was opened
        * @return _isActive -- boolean for if the stake is open and accruing interest
     */
    function getStaking(
        uint256 _stakingId
    )
        external
        view
        returns (
            uint256 _stakedAmount,
            address _userAddress,
            uint256 _returnAmount,
            uint256 interestAmount,
            uint256 _stakedAt,
            bool _isActive
        )
    {
        StakeElement memory _stakeElement = stakeList[_stakingId];

        return (
            _stakeElement.stakedAmount,
            _stakeElement.userAddress,
            _stakeElement.returnAmount,
            _stakeElement.interestAmount,
            _stakeElement.stakedAt,
            _stakeElement.isActive
        );
    }
}

File 1 of 10: Declaration.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

abstract contract Declaration  {

    string public name = "Feyorra";
    string public symbol = "FEY";

    uint256 public decimals = 18;
    uint256 public totalSupply = 1000000000E18;

    uint256 public constant YEARLY_INTEREST = 410;
    uint256 public constant MINIMUM_STAKE = 100E18;
    uint256 public constant SECONDS_IN_DAY = 86400;
    uint256 public constant MAX_STAKE_DAYS = 1825;

    uint256 public immutable LAUNCH_TIME;

    struct Globals {
        uint256 stakingId;
        uint256 currentFeyDay;
        uint256 totalStakedAmount;
    }

    struct StakeElement {
        address userAddress;
        uint256 stakedAmount;
        uint256 returnAmount;
        uint256 interestAmount;
        uint256 stakedAt;
        bool isActive;
    }

    struct SnapShot {
        uint256 totalSupply;
        uint256 totalStakedAmount;
    }

    mapping(address => uint256) public balances;
    mapping(address => mapping(address => uint256)) public allowances;

    mapping(uint256 => SnapShot) public snapshots;
    mapping(uint256 => StakeElement) public stakeList;

    Globals public globals;

    modifier incrementId() {
        _;
        globals.stakingId++;
    }

    constructor() {
        LAUNCH_TIME = block.timestamp;
        balances[msg.sender] = totalSupply;
    }
}

File 2 of 10: Events.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

abstract contract Events  {

    event StakeStart(
        uint256 indexed _stakingId,
        address _address,
        uint256 _amount
    );

    event StakeEnd(
        uint256 indexed _stakingId,
        address _address,
        uint256 _amount
    );

    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 _value
    );

    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _value
    );

    event ClosedGhostStake(
        uint256 daysOld,
        uint256 secondsOld,
        uint256 stakeId
    );

    event SnapshotCaptured(
        uint256 _totalSupply,
        uint256 _totalStakedAmount,
        uint64 _snapshotDay
    );
}

File 4 of 10: Helper.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import './Timing.sol';
import './Ownable.sol';
import './Events.sol';
import './SafeMath.sol';

contract Helper is Ownable, Timing, Events {

    using SafeMath for uint256;

    /**
    * @notice burns set amount of tokens
    * @dev currently unused based on changing requirements
    * @param _amount -- amount to be burned
    * @return true if burn() succeeds
    */
    function burn(
        uint256 _amount
    )
        external
        onlyOwner
        returns (bool)
    {
        require(
            balances[msg.sender].sub(_amount) >= 0,
            'FEYToken: exceeding balance'
        );

        totalSupply =
        totalSupply.sub(_amount);

        balances[msg.sender] =
        balances[msg.sender].sub(_amount);

        emit Transfer(
            msg.sender,
            address(0x0),
            _amount
       );

        return true;
    }

    /**
    * @notice Groups common requirements in global, internal function
    * @dev Used by Transfer(), TransferFrom(), OpenStake()
    * @param _sender -- msg.sender of the functions listed above
    * @param _recipient -- recipient of amount
    * @param _amount -- amount that is transferred
    * @param _allowBurnAddress -- boolean to allow burning tokens
    * @return balance[] value of the input address
    */
    function _transferCheck(
        address _sender,
        address _recipient,
        uint256 _amount,
        bool _allowBurnAddress
    )
        internal
        view
        returns (bool)
    {

        if (_allowBurnAddress == false) {
            require(
                _recipient != address(0x0),
                'FEYToken: cannot send to burn address'
            );
        }

        require(
            balances[_sender] >= _amount,
            'FEYToken: exceeding balance'
        );

        require(
            balances[_recipient].add(_amount) >= balances[_recipient],
            'FEYToken: overflow detected'
        );

        return true;
    }

    /**
    * @notice Used to calculate % that is staked out of the totalSupply
    * @dev Used by getYearlyInterestLatest(), getYearlyInterestHistorical(), + twice in getInterest()
    * @param _numerator -- numerator, typically globals.totalStakedAmount
    * @param _denominator -- denominator, typically totalSupply
    * @param _precision -- number of decimal points, fixed at 4
    * @return quotient -- calculated value
    */
    function getPercent(
        uint256 _numerator,
        uint256 _denominator,
        uint256 _precision
    )
        public
        pure
        returns(uint256 quotient)
    {
        uint256 numerator = _numerator * 10 ** (_precision + 1);
        quotient = ((numerator / _denominator) + 5) / 10;
    }

    /**
    * @notice Used to reduce value by a set percentage amount
    * @dev Used to calculate penaltyAmount
    * @param _value -- initial value, typically _stakeElement.stakedAmount
    * @param _perc -- percentage reduction that will be applied
    * @return percentageValue -- value reduced by the input percentage
    */
    function percentCalculator(
        uint256 _value,
        uint256 _perc
    )
        public
        pure
        returns (uint256 percentageValue)
    {
        percentageValue = _value
            .mul(_perc)
            .div(10000);
    }

}

File 5 of 10: Migrations.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.8.0;

contract Migrations {
    address public owner;
    uint public last_completed_migration;

    constructor() {
        owner = msg.sender;
    }

    modifier restricted() {
        if (msg.sender == owner) _;
    }

    function setCompleted(uint completed) public restricted {
        last_completed_migration = completed;
    }

    function upgrade(address new_address) public restricted {
        Migrations upgraded = Migrations(new_address);
        upgraded.setCompleted(last_completed_migration);
    }
}

File 6 of 10: Ownable.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

contract Ownable {

    address public owner;

    event ownershipChanged(
        address indexed _invoker,
        address indexed _newOwner
    );

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(
            msg.sender == owner,
            'Ownable: must be the owner'
        );
        _;
    }

    function changeOwner(
        address _newOwner
    )
        external
        onlyOwner
        returns (bool)
    {
        
        require(
            _newOwner != address(0),
            'Ownable: new owner must not be the blackhole address'
        );
        
        owner = _newOwner;

        emit ownershipChanged(
            msg.sender,
            _newOwner
        );

        return true;
    }
}

File 7 of 10: SafeMath.sol
// SPDX-License-Identifier: -- 🎲 --

pragma solidity ^0.7.0;

library SafeMath {

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

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, 'SafeMath: subtraction overflow');
        uint256 c = a - b;
        return c;
    }

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

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

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, 'SafeMath: division by zero');
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, 'SafeMath: modulo by zero');
        return a % b;
    }
}

File 8 of 10: Snapshot.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import "./Helper.sol";

abstract contract Snapshot is Helper {

    using SafeMath for uint;


    /**
    * @notice modifier to capture snapshots when a stake is opened
    * @dev used in OpenStake() in FeyToken 
    */
    modifier snapshotTriggerOnOpen() 
    {
        _;
        _dailySnapshotPoint(
            _currentFeyDay()
        );
    }
    
    
    /**
    * @notice modifier to capture snapshots when a stake is closed
    * @dev used in CloseStake() in FeyToken 
    */
    modifier snapshotTriggerOnClose() 
    {
        _dailySnapshotPoint(
            _currentFeyDay()
        );
        _;
    }

    /**
    * @notice Manually capture snapshot
    */
    function manualDailySnapshot() 
        external
    {
        _dailySnapshotPoint(
            _currentFeyDay()
        );
    }

    /**
    * @notice takes in todays feyday + updates all missing snapshot days with todays data
    * @param _updateDay -- current FeyDay as outputted from timing's _currentFeyDay() function
    * Emits SnapshotCaptured event
    */
    function _dailySnapshotPoint(
        uint64 _updateDay
    )
        private
    {
        for (uint256 _day = globals.currentFeyDay; _day < _updateDay; _day++) {

            SnapShot memory s = snapshots[_day];

            s.totalSupply = totalSupply;
            s.totalStakedAmount = globals.totalStakedAmount;
            

            snapshots[_day] = s;

            globals.currentFeyDay++;
        }

        emit SnapshotCaptured(
            totalSupply,
            globals.totalStakedAmount,
            _updateDay
        );
    }
}

File 9 of 10: Timing.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import './Declaration.sol';

abstract contract Timing is Declaration {

    /**
    * @notice external view function to get current FeyDay, unless called at LAUNCH_TIME, in which case it will return 0 to save gas
    * @dev called by _currentFeyDay
    * @return current FeyDay
    */
    function currentFeyDay()
        public
        view
        returns (uint64)
    {
        return getNow() >= LAUNCH_TIME
            ? _currentFeyDay()
            : 0;
    }

    /**
    * @notice internal view function to calculate current FeyDay by using _feyDayFromStamp()
    * @dev called by snapshotTrigger(), manualDailySnapshot(), + getStakeInterest()
    * @return current FeyDay
    */
    function _currentFeyDay()
        internal
        view
        returns (uint64)
    {
        return _feyDayFromStamp(getNow());
    }

    /**
    * @notice calculates difference between passed timestamp + original LAUNCH_TIME, set when contract was deployed
    * @dev called by _currentFeyDay
    * @param _timestamp -- timestamp to use for difference
    * @return number of days between timestamp param + LAUNCH_TIME 
    */
    function _feyDayFromStamp(
        uint256 _timestamp
    )
        internal
        view
        returns (uint64)
    {
        return uint64((_timestamp - LAUNCH_TIME) / SECONDS_IN_DAY);
    }
    
    /**
    * @dev called by getStakeAge(), getStakePenalty, closeStake(), openStake(), + _currentFeyDay
    * @return current block.timestamp
    */
    function getNow()
        public
        view
        returns (uint256)
    {
        return block.timestamp;
    }

}

File 10 of 10: Token.sol
// SPDX-License-Identifier: -- 💰 --

pragma solidity ^0.7.3;

import "./Snapshot.sol";

contract Token is Snapshot {

    using SafeMath for uint256;

    /**
    * @notice Moves amount tokens from the caller’s account to recipient.
    * Returns a boolean value indicating whether the operation succeeded.
    * @dev See {IERC20-transfer}.
    * Emits an {Transfer} event indicating a successful transfer.
    * @param _receiver -- recipient of amount
    * @param _amount -- amount that is transferred
    * @return true if transfer() succeeds
    */
    function transfer(
        address _receiver,
        uint256 _amount
    )
        external
        returns (bool)
    {
        require(
            _transferCheck(
                msg.sender,
                _receiver,
                _amount,
                false
            ),
            'Token: _transferCheck failed'
        );

        balances[msg.sender] =
        balances[msg.sender].sub(_amount);

        balances[_receiver] =
        balances[_receiver].add(_amount);

        emit Transfer(
            msg.sender,
            _receiver,
            _amount
        );

        return true;
    }

    /**
    * @notice 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.
    * @dev See {IERC20-transferFrom}.
    * Emits an {Transfer} event indicating a successful transfer.
    * @param _owner -- address who is sending the transfer amount
    * @param _receiver -- recipient of amount
    * @param _amount -- amount that is transferred
    * @return true if transferFrom() succeeds
     */
    function transferFrom(
        address _owner,
        address _receiver,
        uint256 _amount
    )
        external
        returns (bool)
    {
        require(
            _transferCheck(
                _owner,
                _receiver,
                _amount,
                false
            ),
            'Token: _transferCheck failed'
        );

        require(
            allowances[_owner][msg.sender] >= _amount,
            'Token: exceeding allowance'
        );

        allowances[_owner][msg.sender] =
        allowances[_owner][msg.sender].sub(_amount);

        balances[_owner] =
        balances[_owner].sub(_amount);

        balances[_receiver] =
        balances[_receiver].add(_amount);

        emit Transfer(
            _owner,
            _receiver,
            _amount
        );

        return true;
    }

    /**
    * @notice Sets amount as the allowance of spender over the caller’s tokens.
    * @dev See {IERC20-approve}.
    * Emits an {Approval} event indicating how much was approved and whom is the spender
    * @param _spender -- approved address
    * @param _amount -- amount that they are approved to spend
    * @return true if Approve() succeeds
    */
    function approve(
        address _spender,
        uint256 _amount
    )
        external
        returns (bool)
    {

        allowances[msg.sender][_spender] = _amount;

        emit Approval(
            msg.sender,
            _spender,
            _amount
        );

        return true;
    }

    /**
    * @notice Returns the amount of tokens owned by account.
    * @dev See {IERC20-approve}.
    * @param _address -- address whose balance will be returned
    * @return balance[] value of the input address
    */
    function balanceOf(
        address _address
    )
        external
        view
        returns (uint256)
    {
        return balances[_address];
    }

    /**
    * @notice 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.
    * @dev See {IERC20-allowance}.
    * @param _owner -- owner address
    * @param _spender -- address that is approved to spend tokens
    * @return allowances[] value of the input addresses to reflect the value mapped to the _spender's address
    */
    function allowance(
        address _owner,
        address _spender
    )
        external
        view
        returns (uint256)
    {
        return allowances[_owner][_spender];
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"daysOld","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondsOld","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"ClosedGhostStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalStakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_snapshotDay","type":"uint64"}],"name":"SnapshotCaptured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_stakingId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_stakingId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakeStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_invoker","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"ownershipChanged","type":"event"},{"inputs":[],"name":"LAUNCH_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_STAKE_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_STAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YEARLY_INTEREST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"closeGhostStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"closeStake","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentFeyDay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"estimateReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"uint256","name":"_totalStakedAmount","type":"uint256"},{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"getInterest","outputs":[{"internalType":"uint256","name":"durationInterestAmt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"getInterestRateYearly","outputs":[{"internalType":"uint256","name":"interestRate","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getNow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"},{"internalType":"uint256","name":"_precision","type":"uint256"}],"name":"getPercent","outputs":[{"internalType":"uint256","name":"quotient","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakeAge","outputs":[{"internalType":"uint256","name":"daysTotal","type":"uint256"},{"internalType":"uint256","name":"secondsToday","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakeInterest","outputs":[{"internalType":"uint256","name":"stakeInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStakePenalty","outputs":[{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"getStaking","outputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_returnAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"},{"internalType":"uint256","name":"_stakedAt","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_day","type":"uint256"}],"name":"getYearlyInterestHistorical","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"interestRateYearly","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYearlyInterestLatest","outputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"interestRateYearly","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globals","outputs":[{"internalType":"uint256","name":"stakingId","type":"uint256"},{"internalType":"uint256","name":"currentFeyDay","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualDailySnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"openStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"percentCalculator","outputs":[{"internalType":"uint256","name":"percentageValue","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeList","outputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"interestAmount","type":"uint256"},{"internalType":"uint256","name":"stakedAt","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60e0604052600760a0819052664665796f72726160c81b60c09081526200002a9160019190620000aa565b506040805180820190915260038082526246455960e81b60209092019182526200005791600291620000aa565b5060126003556b033b2e3c9fd0803ce80000006004553480156200007a57600080fd5b50600080546001600160a01b03191633908117825542608052600454908252600560205260409091205562000156565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620000e257600085556200012d565b82601f10620000fd57805160ff19168380011785556200012d565b828001600101855582156200012d579182015b828111156200012d57825182559160200191906001019062000110565b506200013b9291506200013f565b5090565b5b808211156200013b576000815560010162000140565b608051611fdc6200017b6000398061078f52806111a45280611ee65250611fdc6000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806355b6ed5c1161013b578063a9059cbb116100b8578063d6565a2d1161007c578063d6565a2d146106eb578063dd62ed3e14610708578063e498484c14610736578063f67e675614610753578063f7d623bb146107705761023d565b8063a9059cbb1461066c578063bbe4fd5014610698578063bd5bf4ce146106a0578063c3124525146106db578063d2e6bcfa146106e35761023d565b80638da5cb5b116100ff5780638da5cb5b146105d25780638f2dbc21146105f657806395d89b411461061b57806399d0cfa114610623578063a6f9dae1146106465761023d565b806355b6ed5c1461055157806358ff4ddd1461057f578063613fc9fd1461059c57806361a52a36146105a457806370a08231146105ac5761023d565b806323b872dd116101c9578063313ce5671161018d578063313ce5671461045957806331eb3f37146104615780633a6088db146104bb57806342966c68146104d85780634c86259e146104f55761023d565b806323b872dd146103ad57806325c01505146103e357806326986d3f1461040257806327e235e31461040a578063291ab43b146104305761023d565b80630eb1bc08116102105780630eb1bc081461032157806317f4cb8b1461032957806318160ddd146103465780631c89edc71461034e5780631df5b4d2146103845761023d565b8063022466b51461024257806306fdde031461025c57806308dbbb03146102d9578063095ea7b3146102e1575b600080fd5b61024a61078d565b60408051918252519081900360200190f35b6102646107b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029e578181015183820152602001610286565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024a61083e565b61030d600480360360408110156102f757600080fd5b506001600160a01b03813516906020013561084b565b604080519115158252519081900360200190f35b61024a6108b2565b61024a6004803603602081101561033f57600080fd5b50356108b8565b61024a61099c565b61036b6004803603602081101561036457600080fd5b50356109a2565b6040805192835260208301919091528051918290030190f35b61024a6004803603606081101561039a57600080fd5b5080359060208101359060400135610a0d565b61030d600480360360608110156103c357600080fd5b506001600160a01b03813581169160208101359091169060400135610a6f565b610400600480360360208110156103f957600080fd5b5035610c2e565b005b61024a610d69565b61024a6004803603602081101561042057600080fd5b50356001600160a01b0316610d6f565b61024a6004803603606081101561044657600080fd5b5080359060208101359060400135610d81565b61024a610dad565b61047e6004803603602081101561047757600080fd5b5035610db3565b604080519687526001600160a01b0390951660208701528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61024a600480360360208110156104d157600080fd5b5035610e26565b61030d600480360360208110156104ee57600080fd5b5035610f2e565b6105126004803603602081101561050b57600080fd5b5035611063565b604080516001600160a01b03909716875260208701959095528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61024a6004803603604081101561056757600080fd5b506001600160a01b03813581169160200135166110a5565b61024a6004803603602081101561059557600080fd5b50356110c2565b61040061115d565b61024a61116f565b61024a600480360360208110156105c257600080fd5b50356001600160a01b0316611176565b6105da611191565b604080516001600160a01b039092168252519081900360200190f35b6105fe6111a0565b6040805167ffffffffffffffff9092168252519081900360200190f35b6102646111e5565b61024a6004803603604081101561063957600080fd5b508035906020013561123d565b61030d6004803603602081101561065c57600080fd5b50356001600160a01b031661124f565b61030d6004803603604081101561068257600080fd5b506001600160a01b038135169060200135611341565b61024a611433565b6106bd600480360360208110156106b657600080fd5b5035611437565b60408051938452602084019290925282820152519081900360600190f35b6106bd61145e565b61036b61146a565b61036b6004803603602081101561070157600080fd5b5035611491565b61024a6004803603604081101561071e57600080fd5b506001600160a01b03813581169160200135166114aa565b61024a6004803603602081101561074c57600080fd5b50356114d5565b61036b6004803603602081101561076957600080fd5b5035611503565b61030d6004803603602081101561078657600080fd5b50356115ba565b7f000000000000000000000000000000000000000000000000000000000000000081565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108365780601f1061080b57610100808354040283529160200191610836565b820191906000526020600020905b81548152906001019060200180831161081957829003601f168201915b505050505081565b68056bc75e2d6310000081565b3360008181526006602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b61019a81565b6000818152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a0830152829061093f90620151809061093990610933611433565b906117de565b9061183b565b9050600f8110156109615761095a82602001516102ee61123d565b9250610995565b601e81101561097a5761095a82602001516101f461123d565b602d81101561099557610992826020015160fa61123d565b92505b5050919050565b60045481565b6000818152600760209081526040808320815180830190925280548083526001909101549282019290925282916109e5576109db61146a565b9250925050610a08565b6109f9816020015182600001516004610d81565b9250610a04836114d5565b9150505b915091565b600080610a1e846004546004610d81565b90506000610a2b826114d5565b90506000610a3e606461093989856118a5565b90506000610a52826301e185586000610d81565b9050610a63606461093983896118a5565b98975050505050505050565b6000610a7e84848460006118fe565b610acf576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a205f7472616e73666572436865636b206661696c656400000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600660209081526040808320338452909152902054821115610b47576040805162461bcd60e51b815260206004820152601a60248201527f546f6b656e3a20657863656564696e6720616c6c6f77616e6365000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600660209081526040808320338452909152902054610b7590836117de565b6001600160a01b038516600081815260066020908152604080832033845282528083209490945591815260059091522054610bb090836117de565b6001600160a01b038086166000908152600560205260408082209390935590851681522054610bdf9083611a38565b6001600160a01b038085166000818152600560209081526040918290209490945580518681529051919392881692600080516020611f6283398151915292918290030190a35060019392505050565b6000546001600160a01b03163314610c8a576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b600080610c9683611503565b9150915061072182148015610cad57506201518081145b610cfe576040805162461bcd60e51b815260206004820152601860248201527f464559546f6b656e3a206e6f74206f6c6420656e6f7567680000000000000000604482015290519081900360640190fd5b600083815260086020526040902054610d20906001600160a01b031684611a92565b5050604080518481526020810184905280820186905290517f9fb5c0857986c4f071d2fdb4e3d5e9a116bb3be34ecc8a4ca1abe6a886d098d292509081900360600190a1505050565b61072181565b60056020526000908152604090205481565b600060018201600a90810a850290848281610d9857fe5b0460050181610da357fe5b0495945050505050565b60035481565b600090815260086020908152604091829020825160c08101845281546001600160a01b03168082526001830154938201849052600283015494820185905260038301546060830181905260048401546080840181905260059094015460ff16151560a09093018390529395909493929190565b6000818152600860209081526040808320815160c08101835281546001600160a01b0316815260018201549381019390935260028101549183019190915260038101546060830152600481015460808301526005015460ff16151560a08201819052610e985780606001519150610f28565b600080610ea485611503565b915091506000610eb2611db8565b67ffffffffffffffff1690506000610eca82856117de565b9050805b82811015610f0a57610efe8660200151600760008481526020019081526020016000206001015462015180610a0d565b90960195600101610ece565b50610f1f856020015160096002015485610a0d565b86019550505050505b50919050565b600080546001600160a01b03163314610f8b576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b33600090815260056020526040812054610fa590846117de565b1015610ff8576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a20657863656564696e672062616c616e63650000000000604482015290519081900360640190fd5b60045461100590836117de565b6004553360009081526005602052604090205461102290836117de565b33600081815260056020908152604080832094909455835186815293519193600080516020611f62833981519152929081900390910190a35060015b919050565b6008602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909160ff1686565b600660209081526000928352604080842090915290825290205481565b6000818152600860209081526040808320815160c08101835281546001600160a01b0316815260018201549381019390935260028101549183019190915260038101546060830152600481015460808301526005015460ff16151560a082018190526111335760400151905061105e565b61115661113f846108b8565b61093361114b86610e26565b602085015190611a38565b9392505050565b61116d611168611db8565b611dca565b565b6201518081565b6001600160a01b031660009081526005602052604090205490565b6000546001600160a01b031681565b60007f00000000000000000000000000000000000000000000000000000000000000006111cb611433565b10156111d85760006111e0565b6111e0611db8565b905090565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156108365780601f1061080b57610100808354040283529160200191610836565b600061115661271061093985856118a5565b600080546001600160a01b031633146112ac576040805162461bcd60e51b815260206004820152601a60248201527927bbb730b136329d1036bab9ba103132903a34329037bbb732b960311b604482015290519081900360640190fd5b6001600160a01b0382166112f15760405162461bcd60e51b8152600401808060200182810382526034815260200180611f2e6034913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0384169081178255604051909133917f5d92051b4a9b6e7154c5be37e18edd17bfd2e650a3a6dbf8c3eded0ef431ff0e9190a3506001919050565b600061135033848460006118fe565b6113a1576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e3a205f7472616e73666572436865636b206661696c656400000000604482015290519081900360640190fd5b336000908152600560205260409020546113bb90836117de565b33600090815260056020526040808220929092556001600160a01b038516815220546113e79083611a38565b6001600160a01b038416600081815260056020908152604091829020939093558051858152905191923392600080516020611f628339815191529281900390910190a350600192915050565b4290565b6000806000611447611168611db8565b6114513385611a92565b9250925092509193909250565b600954600a54600b5483565b6000806114806009600201546004546004610d81565b915061148b826114d5565b90509091565b6007602052600090815260409020805460019091015482565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000606482116114f1576114ec61019a60646118a5565b6108ac565b6108ac8261093961019a6127106118a5565b6000818152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a0830152829190829061157890610933611433565b9050611587816201518061183b565b93506107218411156115a35761072193506201518092506115b3565b6115b08162015180611e7b565b92505b5050915091565b60006115ca3360008460016118fe565b61161b576040805162461bcd60e51b815260206004820152601f60248201527f464559546f6b656e3a205f7472616e73666572436865636b206661696c656400604482015290519081900360640190fd5b68056bc75e2d63100000821015611679576040805162461bcd60e51b815260206004820152601d60248201527f464559546f6b656e3a207374616b652062656c6f77206d696e696d756d000000604482015290519081900360640190fd5b3360009081526005602052604090205461169390836117de565b33600081815260056020908152604080832094909455835160c08101855292835282018590529181018290526060810191909152608081016116d3611433565b815260016020918201819052600954600090815260088352604090819020845181546001600160a01b0319166001600160a01b0390911617815592840151918301919091558201516002820155606082015160038201556080820151600482015560a0909101516005909101805460ff1916911515919091179055600b5461175b9083611a38565b600b55600954604080513381526020810185905281517f32705d413ffd76af5104215480a9b5784ae0349bc7fd042427e7f186d3bee6a2929181900390910190a26040805183815290516000913391600080516020611f628339815191529181900360200190a35060016117d0611168611db8565b600980546001019055919050565b600082821115611835576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211611891576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161189c57fe5b04949350505050565b6000826118b4575060006108ac565b828202828482816118c157fe5b04146111565760405162461bcd60e51b8152600401808060200182810382526021815260200180611f0d6021913960400191505060405180910390fd5b60008161194a576001600160a01b03841661194a5760405162461bcd60e51b8152600401808060200182810382526025815260200180611f826025913960400191505060405180910390fd5b6001600160a01b0385166000908152600560205260409020548311156119b7576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a20657863656564696e672062616c616e63650000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600560205260409020546119da8185611a38565b1015611a2d576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a206f766572666c6f772064657465637465640000000000604482015290519081900360640190fd5b506001949350505050565b600082820183811015611156576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000818152600860209081526040808320815160c08101835281546001600160a01b031681526001820154938101939093526002810154918301919091526003810154606083015260048101546080830181905260059091015460ff16151560a0830152829182918290611b1190620151809061093990610933611433565b90506003811015611b69576040805162461bcd60e51b815260206004820152601860248201527f464559546f6b656e3a20696d6d6174757265207374616b650000000000000000604482015290519081900360640190fd5b866001600160a01b031682600001516001600160a01b031614611bd3576040805162461bcd60e51b815260206004820152601b60248201527f464559546f6b656e3a2077726f6e67207374616b65206f776e65720000000000604482015290519081900360640190fd5b8160a00151611c29576040805162461bcd60e51b815260206004820152601a60248201527f464559546f6b656e3a207374616b65206e6f7420616374697665000000000000604482015290519081900360640190fd5b600060a083015260208201519450602d8110611c4b57611c4886610e26565b92505b611c54866108b8565b9350611c6f8461093385600454611a3890919063ffffffff16565b60045560608201839052611c87846109338786611a38565b6040838101918252600088815260086020908152828220865181546001600160a01b0319166001600160a01b03918216178255828801516001830155945160028201819055606088015160038301556080880151600483015560a08801516005928301805460ff1916911515919091179055948c16835290522054611d0b91611a38565b6001600160a01b038816600090815260056020526040902055600b54611d3190866117de565b600b5560408083015181516001600160a01b038a1681526020810191909152815188927f1400fbd2ee4a2075080df3e8fe9550cae0dab5bd1d037452a12390141e45563d928290030190a2604080830151815190815290516001600160a01b03891691600091600080516020611f628339815191529181900360200190a350509250925092565b60006111e0611dc5611433565b611ee0565b600a545b8167ffffffffffffffff16811015611e2857600081815260076020818152604080842081518083019092526004548252600b5482840190815294869052929091525181559051600191820155600a80548201905501611dce565b50600454600b5460408051928352602083019190915267ffffffffffffffff831682820152517f94a13e9f9a91f7369c805b3cd3ffa4ae084c462ce95a364deeb1db54b4672f879181900360600190a150565b600081611ecf576040805162461bcd60e51b815260206004820152601860248201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604482015290519081900360640190fd5b818381611ed857fe5b069392505050565b620151807f0000000000000000000000000000000000000000000000000000000000000000909103049056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a206e6577206f776e6572206d757374206e6f742062652074686520626c61636b686f6c652061646472657373ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef464559546f6b656e3a2063616e6e6f742073656e6420746f206275726e2061646472657373a2646970667358221220c1917cf1139d22cdade3da4c9bb704080c483bc9a0e2340e761658bcd06d5bc864736f6c63430007060033

Deployed ByteCode Sourcemap

88:15275:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;464:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;103:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;308:46;;;:::i;2955:301:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2955:301:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;257:45:0;;;:::i;7732:836:2:-;;;;;;;;;;;;;;;;-1:-1:-1;7732:836:2;;:::i;208:42:0:-;;;:::i;1909:545:2:-;;;;;;;;;;;;;;;;-1:-1:-1;1909:545:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3091:752;;;;;;;;;;;;;;;;-1:-1:-1;3091:752:2;;;;;;;;;;;;:::i;1737:847:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1737:847:9;;;;;;;;;;;;;;;;;:::i;4113:574:2:-;;;;;;;;;;;;;;;;-1:-1:-1;4113:574:2;;:::i;:::-;;412:45:0;;;:::i;924:43::-;;;;;;;;;;;;;;;;-1:-1:-1;924:43:0;-1:-1:-1;;;;;924:43:0;;:::i;2475:308:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2475:308:3;;;;;;;;;;;;:::i;174:28:0:-;;;:::i;14712:649:2:-;;;;;;;;;;;;;;;;-1:-1:-1;14712:649:2;;:::i;:::-;;;;;;;-1:-1:-1;;;;;14712:649:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6091:1058;;;;;;;;;;;;;;;;-1:-1:-1;6091:1058:2;;:::i;441:494:3:-;;;;;;;;;;;;;;;;-1:-1:-1;441:494:3;;:::i;1096:49:0:-;;;;;;;;;;;;;;;;-1:-1:-1;1096:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;1096:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;973:65;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;973:65:0;;;;;;;;;;:::i;8989:433:2:-;;;;;;;;;;;;;;;;-1:-1:-1;8989:433:2;;:::i;744:129:7:-;;;:::i;360:46:0:-;;;:::i;3486:153:9:-;;;;;;;;;;;;;;;;-1:-1:-1;3486:153:9;-1:-1:-1;;;;;3486:153:9;;:::i;89:20:5:-;;;:::i;:::-;;;;-1:-1:-1;;;;;89:20:5;;;;;;;;;;;;;;354:176:8;;;:::i;:::-;;;;;;;;;;;;;;;;;;;139:28:0;;;:::i;3119:243:3:-;;;;;;;;;;;;;;;;-1:-1:-1;3119:243:3;;;;;;;:::i;422:411:5:-;;;;;;;;;;;;;;;;-1:-1:-1;422:411:5;-1:-1:-1;;;;;422:411:5;;:::i;562:615:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;562:615:9;;;;;;;;:::i;1546:115:8:-;;;:::i;10270:329:2:-;;;;;;;;;;;;;;;;-1:-1:-1;10270:329:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1152:22:0;;;:::i;1168:382:2:-;;;:::i;1045:45:0:-;;;;;;;;;;;;;;;;-1:-1:-1;1045:45:0;;:::i;4137:187:9:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4137:187:9;;;;;;;;;;:::i;560:293:2:-;;;;;;;;;;;;;;;;-1:-1:-1;560:293:2;;:::i;5078:637::-;;;;;;;;;;;;;;;;-1:-1:-1;5078:637:2;;:::i;13004:1059::-;;;;;;;;;;;;;;;;-1:-1:-1;13004:1059:2;;:::i;464:36:0:-;;;:::o;103:30::-;;;;;;;;;;;;;;;-1:-1:-1;;103:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;308:46::-;348:6;308:46;:::o;2955:301:9:-;3095:10;3063:4;3084:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3084:32:9;;;;;;;;;;;:42;;;3142:85;;;;;;;3063:4;;3084:32;;3095:10;;3142:85;;;;;;;;-1:-1:-1;3245:4:9;2955:301;;;;;:::o;257:45:0:-;299:3;257:45;:::o;7732:836:2:-;7836:21;7909;;;:9;:21;;;;;;;;7873:57;;;;;;;;;-1:-1:-1;;;;;7873:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7836:21;;7966:82;;401:5:0;;7966:49:2;;:8;:6;:8::i;:::-;:25;;:49::i;:::-;:66;;:82::i;:::-;7941:107;;8080:2;8063:14;:19;8059:503;;;8115:96;8150:13;:26;;;8194:3;8115:17;:96::i;:::-;8099:112;;8059:503;;;8250:2;8233:14;:19;8229:333;;;8285:96;8320:13;:26;;;8364:3;8285:17;:96::i;8229:333::-;8420:2;8403:14;:19;8399:163;;;8455:96;8490:13;:26;;;8534:3;8455:17;:96::i;:::-;8439:112;;8399:163;7732:836;;;;;:::o;208:42:0:-;;;;:::o;1909:545:2:-;2032:18;2135:15;;;:9;:15;;;;;;;;2115:35;;;;;;;;;;;;;;;;;;;;;;;;;2032:18;;2161:81;;2206:25;:23;:25::i;:::-;2199:32;;;;;;;2161:81;2265:95;2289:1;:19;;;2322:1;:13;;;2349:1;2265:10;:95::i;:::-;2252:108;;2392:55;2427:10;2392:21;:55::i;:::-;2371:76;;1909:545;;;;;:::o;3091:752::-;3256:27;3299:18;3320:92;3344:18;3376:11;;3401:1;3320:10;:92::i;:::-;3299:113;;3423:26;3452:55;3487:10;3452:21;:55::i;:::-;3423:84;-1:-1:-1;3518:22:2;3543:72;3611:3;3543:50;:13;3423:84;3543:30;:50::i;:72::-;3518:97;;3626:24;3653:85;3677:14;3705:8;3727:1;3653:10;:85::i;:::-;3626:112;-1:-1:-1;3771:65:2;3832:3;3771:43;3626:112;3805:8;3771:33;:43::i;:65::-;3749:87;3091:752;-1:-1:-1;;;;;;;;3091:752:2:o;1737:847:9:-;1875:4;1916:127;1948:6;1972:9;1999:7;2024:5;1916:14;:127::i;:::-;1895:202;;;;;-1:-1:-1;;;1895:202:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2129:18:9;;;;;;:10;:18;;;;;;;;2148:10;2129:30;;;;;;;;:41;-1:-1:-1;2129:41:9;2108:114;;;;;-1:-1:-1;;;2108:114:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2274:18:9;;;;;;:10;:18;;;;;;;;2293:10;2274:30;;;;;;;;:43;;2309:7;2274:34;:43::i;:::-;-1:-1:-1;;;;;2233:18:9;;;;;;:10;:18;;;;;;;;2252:10;2233:30;;;;;;;:84;;;;2355:16;;;:8;:16;;;;;:29;;2376:7;2355:20;:29::i;:::-;-1:-1:-1;;;;;2328:16:9;;;;;;;:8;:16;;;;;;:56;;;;2425:19;;;;;;;:32;;2449:7;2425:23;:32::i;:::-;-1:-1:-1;;;;;2395:19:9;;;;;;;:8;:19;;;;;;;;;:62;;;;2473:82;;;;;;;2395:19;;2473:82;;;;-1:-1:-1;;;;;;;;;;;2473:82:9;;;;;;;;-1:-1:-1;2573:4:9;1737:847;;;;;:::o;4113:574:2:-;341:5:5;;-1:-1:-1;;;;;341:5:5;327:10;:19;306:92;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;;;;4222:15:2::1;4239:18:::0;4270:45:::1;4295:10;4270:11;:45::i;:::-;4221:94;;;;453:4:0;4347:7:2;:25;:69;;;;;401:5:0;4388:10:2;:28;4347:69;4326:140;;;::::0;;-1:-1:-1;;;4326:140:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;4502:21;::::0;;;:9:::1;:21;::::0;;;;:33;4477:92:::1;::::0;-1:-1:-1;;;;;4502:33:2::1;4512:10:::0;4477:11:::1;:92::i;:::-;-1:-1:-1::0;;4585:95:2::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;4585:95:2;;;;;;;::::1;408:1:5;;4113:574:2::0;:::o;412:45:0:-;453:4;412:45;:::o;924:43::-;;;;;;;;;;;;;:::o;2475:308:3:-;2631:16;2716:1;2703:14;;2696:2;:22;;;2683:35;;;2753:12;2683:35;2753:12;2741:24;;;;;2769:1;2740:30;2739:37;;;;;;;2475:308;-1:-1:-1;;;;;2475:308:3:o;174:28:0:-;;;;:::o;14712:649:2:-;14826:21;15072;;;:9;:21;;;;;;;;;15036:57;;;;;;;;;-1:-1:-1;;;;;15036:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14712:649::o;6091:1058::-;6209:21;6291;;;:9;:21;;;;;;;;6255:57;;;;;;;;;-1:-1:-1;;;;;6255:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6323:820;;6391:13;:28;;;6375:44;;6323:820;;;6470:17;6505:20;6542:23;6554:10;6542:11;:23::i;:::-;6452:113;;;;6580:16;6599;:14;:16::i;:::-;6580:35;;;-1:-1:-1;6629:16:2;6648:23;6580:35;6661:9;6648:12;:23::i;:::-;6629:42;-1:-1:-1;6629:42:2;6686:273;6723:8;6716:4;:15;6686:273;;;6776:168;6809:13;:26;;;6857:9;:15;6867:4;6857:15;;;;;;;;;;;:33;;;401:5:0;6776:11:2;:168::i;:::-;6759:185;;;;6733:6;;6686:273;;;;6990:142;7019:13;:26;;;7063:7;:25;;;7106:12;6990:11;:142::i;:::-;6973:159;;;;6323:820;;;;;6091:1058;;;;:::o;441:494:3:-;538:4;341:5:5;;-1:-1:-1;;;;;341:5:5;327:10;:19;306:92;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;;;;588:10:3::1;616:1;579:20:::0;;;:8:::1;:20;::::0;;;;;:33:::1;::::0;604:7;579:24:::1;:33::i;:::-;:38;;558:112;;;::::0;;-1:-1:-1;;;558:112:3;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;703:11;::::0;:24:::1;::::0;719:7;703:15:::1;:24::i;:::-;681:11;:46:::0;778:10:::1;769:20;::::0;;;:8:::1;:20;::::0;;;;;:33:::1;::::0;794:7;769:24:::1;:33::i;:::-;747:10;738:20;::::0;;;:8:::1;:20;::::0;;;;;;;:64;;;;818:88;;;;;;;738:20;;-1:-1:-1;;;;;;;;;;;818:88:3;;;;;;;;;::::1;-1:-1:-1::0;924:4:3::1;408:1:5;441:494:3::0;;;:::o;1096:49:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1096:49:0;;;;;;;;;;;;;:::o;973:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;8989:433:2:-;9092:7;9151:21;;;:9;:21;;;;;;;;9115:57;;;;;;;;;-1:-1:-1;;;;;9115:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9183:96;;9242:26;;;;-1:-1:-1;9234:34:2;;9183:96;9296:119;9387:27;9403:10;9387:15;:27::i;:::-;9296:73;9340:28;9357:10;9340:16;:28::i;:::-;9296:26;;;;;:43;:73::i;:119::-;9289:126;8989:433;-1:-1:-1;;;8989:433:2:o;744:129:7:-;807:59;840:16;:14;:16::i;:::-;807:19;:59::i;:::-;744:129::o;360:46:0:-;401:5;360:46;:::o;3486:153:9:-;-1:-1:-1;;;;;3614:18:9;3584:7;3614:18;;;:8;:18;;;;;;;3486:153::o;89:20:5:-;;;-1:-1:-1;;;;;89:20:5;;:::o;354:176:8:-;424:6;465:11;453:8;:6;:8::i;:::-;:23;;:70;;522:1;453:70;;;491:16;:14;:16::i;:::-;446:77;;354:176;:::o;139:28:0:-;;;;;;;;;;;;;;-1:-1:-1;;139:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3119:243:3;3244:23;3301:54;3349:5;3301:30;:6;3325:5;3301:23;:30::i;422:411:5:-;528:4;341:5;;-1:-1:-1;;;;;341:5:5;327:10;:19;306:92;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;-1:-1:-1;;;306:92:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;578:23:5;::::1;557:122;;;;-1:-1:-1::0;;;557:122:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;698:5;:17:::0;;-1:-1:-1;;;;;;698:17:5::1;-1:-1:-1::0;;;;;698:17:5;::::1;::::0;;::::1;::::0;;731:73:::1;::::0;698:17;;761:10:::1;::::0;731:73:::1;::::0;698:5;731:73:::1;-1:-1:-1::0;822:4:5::1;422:411:::0;;;:::o;562:615:9:-;672:4;713:131;745:10;773:9;800:7;825:5;713:14;:131::i;:::-;692:206;;;;;-1:-1:-1;;;692:206:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;949:10;940:20;;;;:8;:20;;;;;;:33;;965:7;940:24;:33::i;:::-;918:10;909:20;;;;:8;:20;;;;;;:64;;;;-1:-1:-1;;;;;1014:19:9;;;;;;:32;;1038:7;1014:23;:32::i;:::-;-1:-1:-1;;;;;984:19:9;;;;;;:8;:19;;;;;;;;;:62;;;;1062:86;;;;;;;984:19;;1084:10;;-1:-1:-1;;;;;;;;;;;1062:86:9;;;;;;;;;-1:-1:-1;1166:4:9;562:615;;;;:::o;1546:115:8:-;1639:15;1546:115;:::o;10270:329:2:-;10400:20;10434:21;10469:22;606:59:7;639:16;:14;:16::i;606:59::-;10523:69:2::1;10548:10;10572;10523:11;:69::i;:::-;10516:76;;;;;;10270:329:::0;;;;;:::o;1152:22:0:-;;;;;;;;:::o;1168:382:2:-;1261:18;1293:26;1357:99;1381:7;:25;;;1420:11;;1445:1;1357:10;:99::i;:::-;1344:112;;1488:55;1523:10;1488:21;:55::i;:::-;1467:76;;1168:382;;:::o;1045:45:0:-;;;;;;;;;;;;;;;;;;;:::o;4137:187:9:-;-1:-1:-1;;;;;4289:18:9;;;4259:7;4289:18;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;4137:187::o;560:293:2:-;671:20;728:3;714:11;:17;:132;;822:24;299:3:0;842::2;822:19;:24::i;:::-;714:132;;;746:61;795:11;746:44;299:3:0;783:5:2;746:28;:44::i;5078:637::-;5191:17;5303:21;;;:9;:21;;;;;;;;5267:57;;;;;;;;;-1:-1:-1;;;;;5267:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5191:17;;5267:57;5191:17;;5358:49;;:8;:6;:8::i;:49::-;5335:72;-1:-1:-1;5430:45:2;5335:72;401:5:0;5430:29:2;:45::i;:::-;5418:57;;453:4:0;5490:9:2;:26;5486:223;;;453:4:0;5533:26:2;;401:5:0;5573:29:2;;5486:223;;;5649:49;:12;401:5:0;5649:33:2;:49::i;:::-;5634:64;;5486:223;5078:637;;;;;:::o;13004:1059::-;13138:4;13179:133:::2;13211:10;13247:3;13269:7;13294:4;13179:14;:133::i;:::-;13158:211;;;::::0;;-1:-1:-1;;;13158:211:2;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;348:6:0;13401:7:2;:24;;13380:100;;;::::0;;-1:-1:-1;;;13380:100:2;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;13531:10;13522:20;::::0;;;:8:::2;:20;::::0;;;;;:33:::2;::::0;13547:7;13522:24:::2;:33::i;:::-;13500:10;13491:20;::::0;;;:8:::2;:20;::::0;;;;;;;:64;;;;13597:137;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;13698:8:::2;:6;:8::i;:::-;13597:137:::0;;13720:4:::2;13597:137;::::0;;::::2;::::0;;;13576:7:::2;:17:::0;-1:-1:-1;13566:28:2;;;:9:::2;:28:::0;;;;;;;:168;;;;-1:-1:-1;;;;;;13566:168:2::2;-1:-1:-1::0;;;;;13566:168:2;;::::2;;::::0;;;;::::2;::::0;;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;-1:-1:-1;;13566:168:2::2;::::0;::::2;;::::0;;;::::2;::::0;;13781:25;;:38:::2;::::0;13811:7;13781:29:::2;:38::i;:::-;13745:25:::0;:74;:7:::2;13859:17:::0;13835:96:::2;::::0;;13890:10:::2;13835:96:::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;;;;;;;;::::2;13947:87;::::0;;;;;;;14001:1:::2;::::0;13969:10:::2;::::0;-1:-1:-1;;;;;;;;;;;13947:87:2;;;;::::2;::::0;;::::2;-1:-1:-1::0;14052:4:2::2;349:59:7::1;382:16;:14;:16::i;349:59::-;1225:7:0::0;:19;;;;;;13004:1059:2;;-1:-1:-1;13004:1059:2:o;270:178:6:-;328:7;360:1;355;:6;;347:49;;;;;-1:-1:-1;;;347:49:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;418:5:6;;;270:178::o;700:259::-;758:7;789:1;785;:5;777:44;;;;;-1:-1:-1;;;777:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;831:9;847:1;843;:5;;;;;;;700:259;-1:-1:-1;;;;700:259:6:o;454:240::-;512:7;535:6;531:45;;-1:-1:-1;564:1:6;557:8;;531:45;598:5;;;602:1;598;:5;:1;621:5;;;;;:10;613:56;;;;-1:-1:-1;;;613:56:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1365:670:3;1552:4;1577:26;1573:179;;-1:-1:-1;;;;;1644:26:3;;1619:122;;;;-1:-1:-1;;;1619:122:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1783:17:3;;;;;;:8;:17;;;;;;:28;-1:-1:-1;1783:28:3;1762:102;;;;;-1:-1:-1;;;1762:102:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1933:20:3;;;;;;:8;:20;;;;;;1896:33;1933:20;1921:7;1896:24;:33::i;:::-;:57;;1875:131;;;;;-1:-1:-1;;;1875:131:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2024:4:3;1365:670;;;;;;:::o;89:175:6:-;147:7;178:5;;;201:6;;;;193:46;;;;;-1:-1:-1;;;193:46:6;;;;;;;;;;;;;;;;;;;;;;;;;;;10605:1797:2;10732:20;10884:21;;;:9;:21;;;;;;;;10848:57;;;;;;;;;-1:-1:-1;;;;;10848:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10732:20;;;;;;10941:82;;401:5:0;;10941:49:2;;:8;:6;:8::i;:82::-;10916:107;;11073:1;11055:14;:19;;11034:90;;;;;-1:-1:-1;;;11034:90:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;11185:7;-1:-1:-1;;;;;11156:36:2;:13;:25;;;-1:-1:-1;;;;;11156:36:2;;11135:110;;;;;-1:-1:-1;;;11135:110:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;11277:13;:22;;;11256:95;;;;;-1:-1:-1;;;11256:95:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;11387:5;11362:22;;;:30;11418:26;;;;;-1:-1:-1;11477:2:2;11459:20;;11455:126;;11512:58;11546:10;11512:16;:58::i;:::-;11495:75;;11455:126;11607:49;11636:10;11607:15;:49::i;:::-;11591:65;;11681:76;11743:13;11681:44;11710:14;11681:11;;:28;;:44;;;;:::i;:76::-;11667:11;:90;11768:28;;;:45;;;11852:77;11915:13;11852:45;:12;11799:14;11852:29;:45::i;:77::-;11823:26;;;;:106;;;11940:21;;;;:9;:21;;;;;;;:37;;;;-1:-1:-1;;;;;;11940:37:2;-1:-1:-1;;;;;11940:37:2;;;;;;;;;;-1:-1:-1;11940:37:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11940:37:2;;;;;;;;;;12016:17;;;;;;;;;:49;;:21;:49::i;:::-;-1:-1:-1;;;;;11988:17:2;;;;;;:8;:17;;;;;:77;12112:25;;:43;;12142:12;12112:29;:43::i;:::-;12076:25;:79;12238:26;;;;;12171:103;;-1:-1:-1;;;;;12171:103:2;;;;;;;;;;;;;12193:10;;12171:103;;;;;;;;12359:26;;;;;12290:105;;;;;;;-1:-1:-1;;;;;12290:105:2;;;12320:3;;-1:-1:-1;;;;;;;;;;;12290:105:2;;;;;;;;10605:1797;;;;;;;:::o;757:135:8:-;830:6;859:26;876:8;:6;:8::i;:::-;859:16;:26::i;1114:547:7:-;1226:21;;1206:319;1256:10;1249:17;;:4;:17;1206:319;;;1291:17;1311:15;;;:9;:15;;;;;;;;1291:35;;;;;;;;1357:11;;1341:27;;1404:25;;1291:35;;;1382:47;;;1457:15;;;;;;;;:19;;;;;1291:35;;;;1457:19;1491:21;:23;;;;;;1268:6;1206:319;;;-1:-1:-1;1570:11:7;;1595:25;;1540:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1114:547;:::o;965:149:6:-;1023:7;1050:6;1042:43;;;;;-1:-1:-1;;;1042:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;1106:1;1102;:5;;;;;;;965:149;-1:-1:-1;;;965:149:6:o;1192:194:8:-;401:5:0;1349:11:8;1336:24;;;1335:43;;1192:194::o

Swarm Source

ipfs://c1917cf1139d22cdade3da4c9bb704080c483bc9a0e2340e761658bcd06d5bc8

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.