Contract 0xd4f94d0c18990Dd6335483567a7bd6a3dd01fBcd 2

 
Txn Hash Method
Block
From
To
Value
0x9371ad22b21f6c3d49721e6adb9719d73966025b616bf57ef8e6becd7602e13cEnd Stake113416272020-11-27 16:33:19244 days 5 hrs ago0x5318ef778a15f83a97910277b197cd3981089bdf IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.01323695849
0x446ddb73830204554ac1138545f64c9b51d1d9abfd026de2512815d3162b97e6End Stake110152882020-10-08 13:55:27294 days 8 hrs ago0x5318ef778a15f83a97910277b197cd3981089bdf IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.01140570653
0x3f33e398f4aa91530091031fa8234ecab6fb1491a89e65b66272da79a4da5ba0End Stake109927332020-10-05 1:15:14297 days 21 hrs ago0x5318ef778a15f83a97910277b197cd3981089bdf IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.0080793237
0x26d437b9d2b9efb7888381565e8c310f0380ceea60578e90722d5355e766b91bStake Hex109812382020-10-03 6:06:05299 days 16 hrs ago0x5318ef778a15f83a97910277b197cd3981089bdf IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.0148206160344.77
0x9bdea489f7ab46c3ca53e4c0c03b308669f5060e58a7b71f70b457191c853399Stake Hex109784352020-10-02 19:26:42300 days 2 hrs ago0xb1a7fe276ca916d8e7349fa78ef805f64705331e IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.019303350
0x936f4487e84126678ea1b55a2d8479f9841090928190fca43238cd6a031534f9Stake Hex109772592020-10-02 14:53:36300 days 7 hrs ago0x5318ef778a15f83a97910277b197cd3981089bdf IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.02813831585
0xc82634272d6edcf9201d59307af3589339aab2786bf0e3d459d94ed6bfd3d53bStake Hex109762752020-10-02 11:10:49300 days 11 hrs ago0x5318ef778a15f83a97910277b197cd3981089bdf IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.03628522294
0x3fc90884de5c59ecb2711884152108242c0cb2738d631f13fa310d93e58b0b8dEnd Stake100281492020-05-08 21:59:07447 days 18 mins ago0x0fc4f62fa79a7e2531490087b7044451f8702bb0 IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.0021487210
0x63aa8867bfee7acf4e77f92fc14074d0f370bcd1efba5f2dcce6686e7b1c724fStake Hex99898132020-05-02 23:39:16452 days 22 hrs ago0x0fc4f62fa79a7e2531490087b7044451f8702bb0 IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.00096503252.5
0x0a64ebd7e9513b35e391616ab7f2b1818bfc0b512aeadc21908a213a343dcc6dStake Hex99897862020-05-02 23:32:30452 days 22 hrs ago0x10c5f7516b4c8a878699f610d68fda60d83f1091 IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.00094783312.9
0x41659f01a5d843aed5eb6ae25344d17a2d218d599371b0695d2ab82ac344c327End Stake99897842020-05-02 23:32:18452 days 22 hrs ago0x10c5f7516b4c8a878699f610d68fda60d83f1091 IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.00040144992.9
0x2f4b55b4d83e3c82b38c7b2731d3d57a9f8c55da5ddf086ff7c67ebd1acba548Stake Hex99897752020-05-02 23:30:21452 days 22 hrs ago0x10c5f7516b4c8a878699f610d68fda60d83f1091 IN  0xd4f94d0c18990dd6335483567a7bd6a3dd01fbcd0 Ether0.0019829044884.645392777
0x7f5e4ce7cd1090c4787b95b6a012c5a83385c9faec0c8c3bf9b7ceb4c28015620x6080604099897242020-05-02 23:13:19452 days 23 hrs ago0x10c5f7516b4c8a878699f610d68fda60d83f1091 IN  Contract Creation0 Ether0.0095771755
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HEXREF

Compiler Version
v0.6.4+commit.1dca32f3

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 2 of 4: HEXREF.sol
//HEXREF.sol
//
//

pragma solidity 0.6.4;

import "./SafeMath.sol";
import "./IERC20.sol";
import "./HEX.sol";

////////////////////////////////////////////////
////////////////////EVENTS/////////////////////
//////////////////////////////////////////////
contract Events {

//when a user starts staking
    event StakeStarted(
        uint heartValue,
        uint indexed dayLength,
        uint hexStakeId
    );

//when a user ends stake
    event StakeEnded(
        uint heartValue,
        uint stakeProfit,
        uint indexed dayLength,
        uint hexStakeId
    );

}

contract HEXREF is Events {

    ///////////////////////////////////////////////////////////////////////
    ////////////////////////////////CONTRACT SETUP///////////////////////
    ////////////////////////////////////////////////////////////////////
    using SafeMath for uint256;

    HEX hexInterface;

    //HEXREF
    address payable constant hexAddress = 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39;

    address payable devAddress;//set in constructor
    uint constant fee = 1000; //0.1%;
    uint constant devFee = 2; // 50% of 0.1% @ 0.05%;
    uint constant refFee = 2; // 50% of 0.1% @ 0.05%
    
    uint public last_stake_id;// stake id
    uint public userCount; 
    uint public lifetimeHeartsStaked;
    
    mapping (address => UserInfo) public users;
    mapping (uint => StakeInfo) public stakes;
    mapping (address => uint[]) internal userStakeIds;

    bool locked;

    struct UserInfo {
        uint     totalHeartsStaked;
        address  userAddress;
    }

    struct StakeInfo {
        uint     heartValue;
        uint     dayLength;
        address payable userAddress;
        address payable refferer;
        uint     stakeId;
        uint     hexStakeIndex;
        uint40   hexStakeId;
        bool     isStaking;
        uint256  stakeStartTimestamp;
        uint     stakeValue;
        uint     stakeProfit;
        bool     stakeEnded;
    }

    modifier onlyOwner {
        require(msg.sender == devAddress, "notOwner");
        _;
    }

    modifier canStake(uint hearts) {
        require(hearts > 0, "Error: value must be greater than 0");
        _;
    }

    modifier synchronized {
        require(!locked, "Sync lock");
        locked = true;
        _;
        locked = false;
    }

    constructor() public {
        devAddress = msg.sender;
        hexInterface = HEX(hexAddress);
    }

    receive() external payable {
        devAddress.transfer(msg.value);//assume any eth sent to contract as donation.
    }

    ///////////////////////////////////////////////////////////////////////
    ////////////////////////////////HEXREF CORE//////////////////////////
    ////////////////////////////////////////////////////////////////////

    //stakes hex - transfers HEX from user to contract - approval needed
    function stakeHex(uint hearts, uint dayLength, address payable ref)
        internal
        returns(bool)
    {
        //send
        require(hexInterface.transferFrom(msg.sender, address(this), hearts), "Transfer failed");//send hex from user to contract
        //user info
        updateUserData(hearts);
        //stake HEX
        hexInterface.stakeStart(hearts, dayLength);
        //get the most recent stakeIndex
        uint hexStakeIndex = hexInterface.stakeCount(address(this)).sub(1);
        //update stake info
        updateStakeData(hearts, dayLength, ref, hexStakeIndex);
        return true;
    }


    //end a stake - cannot emergency unstake
    function endStake(uint stakeId)
        internal
        returns (bool)
    {
        require(stakeId <= last_stake_id, "Error: stakeId out of range");
        StakeInfo storage stake = stakes[stakeId];
        require(stake.userAddress == msg.sender, "cannot end another users stake. If this was intentional, use the HEX good accounting function.");
        require(!stake.stakeEnded, "Stake has already been ended");
        require(stake.heartValue > 0, "Stake has either already ended, or does not exist");

        uint256 oldBalance = getContractBalance();
        //find the stake index then
        //end stake
        hexInterface.stakeEnd(getStakeIndexById(address(this), stake.hexStakeId), stake.hexStakeId);
        stake.isStaking = false;
        stake.stakeEnded = true;
        //calc stakeValue and stakeProfit
        uint256 stakeValue = getContractBalance().sub(oldBalance);
        uint _fee; 
        uint _devFee;
        uint _refFee;
        uint _profit;
        uint _principal;
        if(stakeValue < stake.heartValue)//late or early penalties cut into principal
        {
            stake.stakeValue = stakeValue;//remaining principal
            stake.stakeProfit = 0;//interest
            //calc fee from remaining principal
            _fee = stakeValue.div(fee);
            _devFee = _fee.div(devFee);
            _refFee = _fee.div(refFee);
            _profit = 0;
            _principal = stakeValue.sub(_fee);//sub fee from remaining principal
        }
        else{
            stake.stakeValue = stakeValue;//principal + interest
            stake.stakeProfit = stakeValue.sub(stake.heartValue);//interest
            //calc fee from staking interest
            _fee = stake.stakeProfit.div(fee);
            _devFee = _fee.div(devFee);
            _refFee = _fee.div(refFee);
            _profit = stake.stakeProfit.sub(_fee);//sub fee from interest profit
            _principal = stake.heartValue;
        }
        if(stake.refferer == address(0)){//no ref
            require(hexInterface.transfer(devAddress, _refFee), "Dev transfer failed");//send hex to dev
        }
        else{//ref
            require(hexInterface.transfer(stake.refferer, _refFee), "Ref transfer failed");//send hex to refferer
        }
        require(hexInterface.transfer(devAddress, _devFee), "Dev transfer failed");//send hex to dev
        require(hexInterface.transfer(msg.sender, _principal.add(_profit)), "Transfer failed");//transfer funds to user endstake
        emit StakeEnded(
            stake.stakeProfit,
            stake.heartValue,
            stake.dayLength,
            stake.hexStakeId
        );
        stake.heartValue = 0;
        return true;
    }

    //updates user data
    function updateUserData(uint hearts)
        internal
    {
        UserInfo storage user = users[msg.sender];
        lifetimeHeartsStaked += hearts;
        if(user.totalHeartsStaked == 0){
            userCount++;
        }
        user.totalHeartsStaked = user.totalHeartsStaked.add(hearts);//total amount of hearts staked by this user after fees
        user.userAddress = msg.sender;
    }

    //updates stake data
    function updateStakeData(uint hearts, uint dayLength, address payable ref, uint index)
        internal
    {
        uint _stakeId = _next_stake_id();//new stake id
        userStakeIds[msg.sender].push(_stakeId);//update userStakeIds
        StakeInfo memory stake;
        stake.heartValue = hearts;//amount of hearts staked
        stake.dayLength = dayLength;//length of days staked
        stake.userAddress = msg.sender;//staker
        stake.refferer = ref;//referrer
        stake.hexStakeIndex = index;//hex contract stakeIndex
        SStore memory _stake = getStakeByIndex(address(this), stake.hexStakeIndex); //get stake from address and stakeindex
        stake.hexStakeId = _stake.stakeId;//hex contract stake id
        stake.stakeId = _stakeId;//hexref contract stake id
        stake.stakeStartTimestamp = now;//timestamp stake started
        stake.isStaking = true;//stake is now staking
        stakes[_stakeId] = stake;//update data
        emit StakeStarted(
            hearts,
            dayLength,
            stake.hexStakeId
        );
    }

    //get next stake id
    function _next_stake_id()
        internal
        returns (uint)
    {
        last_stake_id++;
        return last_stake_id;
    }

    //////////////////////////////////////////////////////////////////
    ////////////////////////PUBLIC FACING HEXREF////////////////////
    ////////////////////////////////////////////////////////////////

    //stake HEX
    function StakeHex(uint _hearts, uint _dayLength, address payable _ref)
        public
        canStake(_hearts)
        synchronized
    {
        require(stakeHex(_hearts, _dayLength, _ref), "Error: could not stake");
    }

    //ends a stake then returns HEX + interest to msg.sender
    function EndStake(uint _stakeId)
        public
        synchronized
    {
        require(endStake(_stakeId), "Error: could not endstake");
    }


    //////////////////////////////////////////
    ////////////VIEW ONLY/////////////////////
    //////////////////////////////////////////


    //
    function isStaking(uint _stakeId)
        public
        view
        returns(bool)
    {
        return stakes[_stakeId].isStaking;
    }

    //
    function isStakeFinished(uint _stakeId)
        public
        view
        returns(bool)
    {
        //add 1 to staking dayLength to account for stake pending time
        return stakes[_stakeId].stakeStartTimestamp.add((stakes[_stakeId].dayLength.add(1)).mul(86400)) <= now;
    }

    //
    function isStakeEnded(uint _stakeId)
        public
        view
        returns(bool)
    {
        return stakes[_stakeId].stakeEnded;
    }

    //general user info
    function getUserInfo(address addr)
        public
        view
        returns(
        uint    totalHeartsStaked,
        uint[] memory _stakeIds,
        address userAddress
        )
    {
        return(users[addr].totalHeartsStaked, userStakeIds[addr], users[addr].userAddress);
    }

    //general stake info
    function getStakeInfo(uint stakeId)
        public
        view
        returns(
        uint     heartValue,
        uint     stakeDayLength,
        uint     hexStakeId,
        uint     hexStakeIndex,
        address payable userAddress,
        address payable refferer,
        uint    stakeStartTimestamp
        )
    {
        return(stakes[stakeId].heartValue, stakes[stakeId].dayLength, stakes[stakeId].hexStakeId, stakes[stakeId].hexStakeIndex, stakes[stakeId].userAddress, stakes[stakeId].refferer, stakes[stakeId].stakeStartTimestamp);
    }

    //returns amount of users by address to ever stake via the contract
    function getUserCount()
        public
        view
        returns(uint)
    {
        return userCount;
    }

    //returns contract HEX balance
    function getContractBalance()
        public
        view
        returns(uint)
    {
        return hexInterface.balanceOf(address(this));
    }

    ///////////////////////////////////////////////
    ///////////////////HEX UTILS///////////////////
    ///////////////////////////////////////////////
    //credits to kyle bahr @ https://gist.github.com/kbahr/80e61ab761053849f7fdc6226b85a354

    struct SStore {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;
    }

    struct DailyDataCache {
        uint256 dayPayoutTotal;
        uint256 dayStakeSharesTotal;
        uint256 dayUnclaimedSatoshisTotal;
    }
    uint256 private constant HEARTS_UINT_SHIFT = 72;
    uint256 private constant HEARTS_MASK = (1 << HEARTS_UINT_SHIFT) - 1;
    uint256 private constant SATS_UINT_SHIFT = 56;
    uint256 private constant SATS_MASK = (1 << SATS_UINT_SHIFT) - 1;

    function decodeDailyData(uint256 encDay)
    private
    pure
    returns (DailyDataCache memory)
    {
        uint256 v = encDay;
        uint256 payout = v & HEARTS_MASK;
        v = v >> HEARTS_UINT_SHIFT;
        uint256 shares = v & HEARTS_MASK;
        v = v >> HEARTS_UINT_SHIFT;
        uint256 sats = v & SATS_MASK;
        return DailyDataCache(payout, shares, sats);
    }

    function interestForRange(DailyDataCache[] memory dailyData, uint256 myShares)
    private
    pure
    returns (uint256)
    {
        uint256 len = dailyData.length;
        uint256 total = 0;
        for(uint256 i = 0; i < len; i++){
            total += interestForDay(dailyData[i], myShares);
        }
        return total;
    }

    function interestForDay(DailyDataCache memory dayObj, uint256 myShares)
    private
    pure
    returns (uint256)
    {
        return myShares * dayObj.dayPayoutTotal / dayObj.dayStakeSharesTotal;
    }

    function getDataRange(uint256 b, uint256 e)
    private
    view
    returns (DailyDataCache[] memory)
    {
        uint256[] memory dataRange = hexInterface.dailyDataRange(b, e);
        uint256 len = dataRange.length;
        DailyDataCache[] memory data = new DailyDataCache[](len);
        for(uint256 i = 0; i < len; i++){
            data[i] = decodeDailyData(dataRange[i]);
        }
        return data;
    }

    function getLastDataDay()
    private
    view
    returns(uint256)
    {
        uint256[13] memory globalInfo = hexInterface.globalInfo();
        uint256 lastDay = globalInfo[4];
        return lastDay;
    }

    function getInterestByStake(SStore memory s)
    private
    view
    returns (uint256)
    {
        uint256 b = s.lockedDay;
        uint256 e = getLastDataDay(); // ostensibly "today"

        if (b >= e) {
            //not started - error
            return 0;
        } else {
            DailyDataCache[] memory data = getDataRange(b, e);
            return interestForRange(data, s.stakeShares);
        }
    }

    function getInterestByStakeId(address addr, uint40 stakeId)
    public
    view
    returns (uint256)
    {
        SStore memory s = getStakeByStakeId(addr, stakeId);

        return getInterestByStake(s);
    }

    function getTotalValueByStakeId(address addr, uint40 stakeId)
    public
    view
    returns (uint256)
    {
        SStore memory stake = getStakeByStakeId(addr, stakeId);

        uint256 interest = getInterestByStake(stake);
        return stake.stakedHearts + interest;
    }

    function getStakeByIndex(address addr, uint256 idx)
    private
    view
    returns (SStore memory)
    {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, idx);

        return SStore(stakeId,
                        stakedHearts,
                        stakeShares,
                        lockedDay,
                        stakedDays,
                        unlockedDay,
                        isAutoStake);
    }

    function getStakeByStakeId(address addr, uint40 sid)
    private
    view
    returns (SStore memory)
    {

        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        uint256 stakeCount = hexInterface.stakeCount(addr);
        for(uint256 i = 0; i < stakeCount; i++){
            (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, i);

            if(stakeId == sid){
                return SStore(stakeId,
                                stakedHearts,
                                stakeShares,
                                lockedDay,
                                stakedDays,
                                unlockedDay,
                                isAutoStake);
            }
        }
    }

    function getStakeIndexById(address addr, uint40 sid)
        private
        view
        returns (uint)
    {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        uint256 stakeCount = hexInterface.stakeCount(addr);
        for(uint256 i = 0; i < stakeCount; i++){
            (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, i);

            if(stakeId == sid){
                return i;
            }
        }
    }
}

File 1 of 4: HEX.sol
pragma solidity ^0.6.4;

interface HEX {
   /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @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);
    
   function stakeStart(uint256 newStakedHearts, uint256 newStakedDays) external;
   function stakeEnd(uint256 stakeIndex, uint40 stakeIdParam) external;
   function stakeCount(address stakerAddr) external view returns (uint256);
   function stakeLists(address owner, uint256 stakeIndex) external view returns (uint40, uint72, uint72, uint16, uint16, uint16, bool);
   function currentDay() external view returns (uint256);
   function dailyDataRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory);
   function globalInfo() external view returns (uint256[13] memory);

}

File 3 of 4: IERC20.sol
pragma solidity ^0.6.4;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
 
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @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 4 of 4: SafeMath.sol
pragma solidity ^0.6.4;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeProfit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"dayLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hexStakeId","type":"uint256"}],"name":"StakeEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"dayLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hexStakeId","type":"uint256"}],"name":"StakeStarted","type":"event"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"EndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hearts","type":"uint256"},{"internalType":"uint256","name":"_dayLength","type":"uint256"},{"internalType":"address payable","name":"_ref","type":"address"}],"name":"StakeHex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint40","name":"stakeId","type":"uint40"}],"name":"getInterestByStakeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"getStakeInfo","outputs":[{"internalType":"uint256","name":"heartValue","type":"uint256"},{"internalType":"uint256","name":"stakeDayLength","type":"uint256"},{"internalType":"uint256","name":"hexStakeId","type":"uint256"},{"internalType":"uint256","name":"hexStakeIndex","type":"uint256"},{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"address payable","name":"refferer","type":"address"},{"internalType":"uint256","name":"stakeStartTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint40","name":"stakeId","type":"uint40"}],"name":"getTotalValueByStakeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUserCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"totalHeartsStaked","type":"uint256"},{"internalType":"uint256[]","name":"_stakeIds","type":"uint256[]"},{"internalType":"address","name":"userAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"isStakeEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"isStakeFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"last_stake_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lifetimeHeartsStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"heartValue","type":"uint256"},{"internalType":"uint256","name":"dayLength","type":"uint256"},{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"address payable","name":"refferer","type":"address"},{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint256","name":"hexStakeIndex","type":"uint256"},{"internalType":"uint40","name":"hexStakeId","type":"uint40"},{"internalType":"bool","name":"isStaking","type":"bool"},{"internalType":"uint256","name":"stakeStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"stakeValue","type":"uint256"},{"internalType":"uint256","name":"stakeProfit","type":"uint256"},{"internalType":"bool","name":"stakeEnded","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"totalHeartsStaked","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600180546001600160a01b0319908116331790915560008054909116732b591e99afe9f32eaa6214f7b7629768c40eeb391790556120ee806100546000396000f3fe6080604052600436106100f75760003560e01c8063679b81151161008a578063b0a5df9a11610059578063b0a5df9a1461041f578063b4eb86131461045f578063b5cb15f714610489578063d5a44f861461049e57610138565b8063679b8115146103615780636f9fb98a146103765780637e8e37491461038b578063a87430ba146103cb57610138565b8063451ea563116100c6578063451ea563146102285780634e77ed201461026657806352c3f3ed146102905780636386c1c7146102ba57610138565b806307973ccf1461013d57806309813482146101645780630d7e0592146101d2578063181f599f1461021357610138565b36610138576001546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610135573d6000803e3d6000fd5b50005b600080fd5b34801561014957600080fd5b5061015261053d565b60408051918252519081900360200190f35b34801561017057600080fd5b5061018e6004803603602081101561018757600080fd5b5035610543565b6040805197885260208801969096528686019490945260608601929092526001600160a01b0390811660808601521660a084015260c0830152519081900360e00190f35b3480156101de57600080fd5b50610211600480360360608110156101f557600080fd5b50803590602081013590604001356001600160a01b0316610596565b005b34801561021f57600080fd5b5061015261068c565b34801561023457600080fd5b506102526004803603602081101561024b57600080fd5b5035610692565b604080519115158252519081900360200190f35b34801561027257600080fd5b506102526004803603602081101561028957600080fd5b50356106b7565b34801561029c57600080fd5b50610252600480360360208110156102b357600080fd5b503561071b565b3480156102c657600080fd5b506102ed600480360360208110156102dd57600080fd5b50356001600160a01b0316610733565b6040518084815260200180602001836001600160a01b03166001600160a01b03168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561034b578181015183820152602001610333565b5050505090500194505050505060405180910390f35b34801561036d57600080fd5b506101526107c8565b34801561038257600080fd5b506101526107ce565b34801561039757600080fd5b50610152600480360360408110156103ae57600080fd5b5080356001600160a01b0316906020013564ffffffffff1661084b565b3480156103d757600080fd5b506103fe600480360360208110156103ee57600080fd5b50356001600160a01b0316610874565b604080519283526001600160a01b0390911660208301528051918290030190f35b34801561042b57600080fd5b506101526004803603604081101561044257600080fd5b5080356001600160a01b0316906020013564ffffffffff16610896565b34801561046b57600080fd5b506102116004803603602081101561048257600080fd5b50356108d4565b34801561049557600080fd5b5061015261098c565b3480156104aa57600080fd5b506104c8600480360360208110156104c157600080fd5b5035610992565b604080519c8d5260208d019b909b526001600160a01b03998a168c8c01529790981660608b015260808a019590955260a089019390935264ffffffffff90911660c0880152151560e0870152610100860152610120850152610140840191909152151561016083015251908190036101800190f35b60035481565b60009081526006602081905260409091208054600182015492820154600583015460028401546003850154600790950154939664ffffffffff9093169491936001600160a01b0391821693919092169190565b82600081116105d65760405162461bcd60e51b81526004018080602001828103825260238152602001806120966023913960400191505060405180910390fd5b60085460ff161561061a576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6008805460ff19166001179055610632848484610a0c565b61067c576040805162461bcd60e51b81526020600482015260166024820152754572726f723a20636f756c64206e6f74207374616b6560501b604482015290519081900360640190fd5b50506008805460ff191690555050565b60025481565b6000818152600660208190526040909120015465010000000000900460ff165b919050565b60008181526006602052604081206001908101544291610713916106f59162015180916106e99163ffffffff610beb16565b9063ffffffff610c4c16565b6000858152600660205260409020600701549063ffffffff610beb16565b111592915050565b6000908152600660205260409020600a015460ff1690565b6001600160a01b0380821660009081526005602081815260408084208054600784528286209484526001909101548454835181860281018601909452808452959660609688969395939492909116928491908301828280156107b457602002820191906000526020600020905b8154815260200190600101908083116107a0575b505050505091509250925092509193909250565b60045481565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561081a57600080fd5b505afa15801561082e573d6000803e3d6000fd5b505050506040513d602081101561084457600080fd5b5051905090565b6000610855611eeb565b61085f8484610ca5565b905061086a81610e76565b9150505b92915050565b600560205260009081526040902080546001909101546001600160a01b031682565b60006108a0611eeb565b6108aa8484610ca5565b905060006108b782610e76565b60209092015168ffffffffffffffffff1690910191505092915050565b60085460ff1615610918576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6008805460ff1916600117905561092e81610ed0565b61097f576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20636f756c64206e6f7420656e647374616b6500000000000000604482015290519081900360640190fd5b506008805460ff19169055565b60035490565b600660208190526000918252604090912080546001820154600283015460038401546004850154600586015496860154600787015460088801546009890154600a90990154979996986001600160a01b039687169896909516969395939464ffffffffff84169460ff65010000000000909504851694168c565b60008054604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03909216916323b872dd9160648082019260209290919082900301818787803b158015610a6657600080fd5b505af1158015610a7a573d6000803e3d6000fd5b505050506040513d6020811015610a9057600080fd5b5051610ad5576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b610ade846115b5565b6000805460408051630a54871760e31b8152600481018890526024810187905290516001600160a01b03909216926352a438b89260448084019382900301818387803b158015610b2d57600080fd5b505af1158015610b41573d6000803e3d6000fd5b5050600080546040805163033060d960e41b81523060048201529051929450610bd293506001926001600160a01b03909216916333060d9091602480820192602092909190829003018186803b158015610b9a57600080fd5b505afa158015610bae573d6000803e3d6000fd5b505050506040513d6020811015610bc457600080fd5b50519063ffffffff61160616565b9050610be085858584611648565b506001949350505050565b600082820183811015610c45576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082610c5b5750600061086e565b82820282848281610c6857fe5b0414610c455760405162461bcd60e51b81526004018080602001828103825260218152602001806120756021913960400191505060405180910390fd5b610cad611eeb565b600080546040805163033060d960e41b81526001600160a01b038781166004830152915184938493849384938493849384939116916333060d9091602480820192602092909190829003018186803b158015610d0857600080fd5b505afa158015610d1c573d6000803e3d6000fd5b505050506040513d6020811015610d3257600080fd5b5051905060005b81811015610e675760005460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b158015610d9557600080fd5b505afa158015610da9573d6000803e3d6000fd5b505050506040513d60e0811015610dbf57600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c161415610e5f5750506040805160e08101825264ffffffffff909816885268ffffffffffffffffff9687166020890152949095169386019390935261ffff9182166060860152811660808501521660a0830152151560c0820152905061086e565b600101610d39565b50505050505050505092915050565b606081015160009061ffff1681610e8b611807565b9050808210610e9f576000925050506106b2565b6060610eab83836118a4565b9050610ec681866040015168ffffffffffffffffff16611a56565b93505050506106b2565b6000600254821115610f29576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a207374616b654964206f7574206f662072616e67650000000000604482015290519081900360640190fd5b600082815260066020526040902060028101546001600160a01b03163314610f825760405162461bcd60e51b815260040180806020018281038252605e815260200180611fe6605e913960600191505060405180910390fd5b600a81015460ff1615610fdc576040805162461bcd60e51b815260206004820152601c60248201527f5374616b652068617320616c7265616479206265656e20656e64656400000000604482015290519081900360640190fd5b80546110195760405162461bcd60e51b81526004018080602001828103825260318152602001806120446031913960400191505060405180910390fd5b60006110236107ce565b60005460068401549192506001600160a01b03169063343009a29061105090309064ffffffffff16611a98565b6006850154604080516001600160e01b031960e086901b168152600481019390935264ffffffffff909116602483015251604480830192600092919082900301818387803b1580156110a157600080fd5b505af11580156110b5573d6000803e3d6000fd5b50505060068301805465ff00000000001916905550600a8201805460ff1916600117905560006110f3826110e76107ce565b9063ffffffff61160616565b90506000806000806000876000015486101561116c576008880186905560006009890155611129866103e863ffffffff611c2516565b945061113c85600263ffffffff611c2516565b935061114f85600263ffffffff611c2516565b925060009150611165868663ffffffff61160616565b90506111e5565b60088801869055875461118690879063ffffffff61160616565b6009890181905561119f906103e863ffffffff611c2516565b94506111b285600263ffffffff611c2516565b93506111c585600263ffffffff611c2516565b60098901549093506111dd908663ffffffff61160616565b885490925090505b60038801546001600160a01b03166112cb57600080546001546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018890529051919092169263a9059cbb92604480820193602093909283900390910190829087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b50516112c6576040805162461bcd60e51b815260206004820152601360248201527211195d881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b61139c565b6000805460038a01546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018890529051919092169263a9059cbb92604480820193602093909283900390910190829087803b15801561132957600080fd5b505af115801561133d573d6000803e3d6000fd5b505050506040513d602081101561135357600080fd5b505161139c576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b600080546001546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018990529051919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156113f857600080fd5b505af115801561140c573d6000803e3d6000fd5b505050506040513d602081101561142257600080fd5b505161146b576040805162461bcd60e51b815260206004820152601360248201527211195d881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6000546001600160a01b031663a9059cbb3361148d848663ffffffff610beb16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156114dc57600080fd5b505af11580156114f0573d6000803e3d6000fd5b505050506040513d602081101561150657600080fd5b505161154b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60018801546009890154895460068b015460408051938452602084019290925264ffffffffff1682820152517f68e2a823e3745ee73ff62ba1efa63a1b770cd0bd3568495adc9cdf11c858684d9181900360600190a2505060009095555060019695505050505050565b336000908152600560205260409020600480548301905580546115dc576003805460010190555b80546115ee908363ffffffff610beb16565b815560010180546001600160a01b0319163317905550565b6000610c4583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611c67565b6000611652611cfe565b33600090815260076020908152604082208054600181018255908352912001819055905061167e611f27565b858152602081018590523360408201526001600160a01b038416606082015260a081018390526116ac611eeb565b6116ba308360a00151611d0c565b805164ffffffffff90811660c0850190815260808501868152426101008701908152600160e0880181815260008a8152600660208181526040928390208c518155818d015195810195909555828c01516002860180546001600160a01b039283166001600160a01b03199182161790915560608e01516003880180549190931691161790559551600485015560a08b015160058501559551958301805492511515650100000000000265ff0000000000199790981664ffffffffff19909316831796909616969096179094559051600782015561012087015160088201556101408701516009820155610160870151600a909101805491151560ff199290921691909117905582518b815290810191909152815192935088927fad8825e79ab8c77eccba62396b4d940d31988a32ab2107c705158bd00cc3c2bb929181900390910190a250505050505050565b6000611811611fa5565b6000809054906101000a90046001600160a01b03166001600160a01b031663f04b5fa06040518163ffffffff1660e01b81526004016101a06040518083038186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101a081101561189957600080fd5b506080015192915050565b6000805460408051633510850760e11b81526004810186905260248101859052905160609384936001600160a01b031692636a210a0e9260448083019392829003018186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561193357600080fd5b810190808051604051939291908464010000000082111561195357600080fd5b90830190602082018581111561196857600080fd5b825186602082028301116401000000008211171561198557600080fd5b82525081516020918201928201910280838360005b838110156119b257818101518382015260200161199a565b505050509050016040525050509050600081519050606081604051908082528060200260200182016040528015611a0357816020015b6119f0611fc4565b8152602001906001900390816119e85790505b50905060005b82811015611a4c57611a2d848281518110611a2057fe5b6020026020010151611e26565b828281518110611a3957fe5b6020908102919091010152600101611a09565b5095945050505050565b815160009081805b82811015611a8f57611a83868281518110611a7557fe5b602002602001015186611e69565b90910190600101611a5e565b50949350505050565b60008060008060008060008060008060009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b1057600080fd5b505afa158015611b24573d6000803e3d6000fd5b505050506040513d6020811015611b3a57600080fd5b5051905060005b81811015610e675760005460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b158015611b9d57600080fd5b505afa158015611bb1573d6000803e3d6000fd5b505050506040513d60e0811015611bc757600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c161415611c1d57985061086e975050505050505050565b600101611b41565b6000610c4583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e86565b60008184841115611cf65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cbb578181015183820152602001611ca3565b50505050905090810190601f168015611ce85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600280546001019081905590565b611d14611eeb565b6000805460408051632607443b60e01b81526001600160a01b0387811660048301526024820187905291518493849384938493849384931691632607443b9160448083019260e0929190829003018186803b158015611d7257600080fd5b505afa158015611d86573d6000803e3d6000fd5b505050506040513d60e0811015611d9c57600080fd5b50805160208083015160408085015160608087015160808089015160a0808b015160c09b8c0151885160e081018a5264ffffffffff909c168c5268ffffffffffffffffff998a169a8c019a909a52979095169589019590955261ffff91821692880192909252928316908601529116908301521515918101919091529a9950505050505050505050565b611e2e611fc4565b506040805160608101825268ffffffffffffffffff8381168252604884901c16602082015260909290921c66ffffffffffffff169082015290565b600082602001518360000151830281611e7e57fe5b049392505050565b60008183611ed55760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611cbb578181015183820152602001611ca3565b506000838581611ee157fe5b0495945050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604051806101800160405280600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600064ffffffffff1681526020016000151581526020016000815260200160008152602001600081526020016000151581525090565b604051806101a00160405280600d906020820280368337509192915050565b6040518060600160405280600081526020016000815260200160008152509056fe63616e6e6f7420656e6420616e6f74686572207573657273207374616b652e20496620746869732077617320696e74656e74696f6e616c2c20757365207468652048455820676f6f64206163636f756e74696e672066756e6374696f6e2e5374616b65206861732065697468657220616c726561647920656e6465642c206f7220646f6573206e6f74206578697374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774572726f723a2076616c7565206d7573742062652067726561746572207468616e2030a2646970667358221220bbdc1b092d20cf7546e6c85333266ababb44cfb8744de87eb51047a1ca6e374b64736f6c63430006040033

Deployed ByteCode Sourcemap

615:16387:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2572:10;;:30;;-1:-1:-1;;;;;2572:10:1;;;;2592:9;2572:30;;;;;:10;:30;:10;:30;2592:9;2572:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2572:30:1;615:16387;;12:1:-1;9;2:12;1289:21:1;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1289:21:1;;;:::i;:::-;;;;;;;;;;;;;;;;9991:568;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9991:568:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9991:568:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9991:568:1;;;;;;;;;;;;;;;;;;;;;;;;;8393:230;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8393:230:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8393:230:1;;;;;;;;;;;-1:-1:-1;;;;;8393:230:1;;:::i;:::-;;1246:25;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1246:25:1;;;:::i;9010:144::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9010:144:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9010:144:1;;:::i;:::-;;;;;;;;;;;;;;;;;;9170:291;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9170:291:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9170:291:1;;:::i;9477:148::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9477:148:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9477:148:1;;:::i;9658:299::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9658:299:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9658:299:1;-1:-1:-1;;;;;9658:299:1;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;9658:299:1;-1:-1:-1;;;;;9658:299:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9658:299:1;;;;;;;;;;;;;;;;;;;1318:32;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1318:32:1;;;:::i;10801:151::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10801:151:1;;;:::i;13925:220::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13925:220:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13925:220:1;;-1:-1:-1;;;;;13925:220:1;;;;;;;;:::i;1363:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1363:42:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1363:42:1;-1:-1:-1;;;;;1363:42:1;;:::i;:::-;;;;;;;-1:-1:-1;;;;;1363:42:1;;;;;;;;;;;;;;;;14153:289;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14153:289:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14153:289:1;;-1:-1:-1;;;;;14153:289:1;;;;;;;;:::i;8693:151::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8693:151:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8693:151:1;;:::i;10640:117::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10640:117:1;;;:::i;1412:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1412:41:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1412:41:1;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;1412:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1289:21;;;;:::o;9991:568::-;10084:19;10346:15;;;:6;:15;;;;;;;;:26;;10374:25;;;;10401:26;;;;10429:29;;;;10460:27;;;;10489:24;;;;10515:35;;;;;10346:26;;10401;;;;;10429:29;;-1:-1:-1;;;;;10460:27:1;;;;10489:24;;;;;10515:35;9991:568::o;8393:230::-;8498:7;2214:1;2205:6;:10;2197:58;;;;-1:-1:-1;;;2197:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2325:6:::1;::::0;::::1;;2324:7;2316:29;;;::::0;;-1:-1:-1;;;2316:29:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;2316:29:1;;;;;;;;;;;;;::::1;;2356:6;:13:::0;;-1:-1:-1;;2356:13:1::1;2365:4;2356:13;::::0;;8553:35:::2;8562:7:::0;8571:10;8583:4;8553:8:::2;:35::i;:::-;8545:70;;;::::0;;-1:-1:-1;;;8545:70:1;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;8545:70:1;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;2392:6:1::1;:14:::0;;-1:-1:-1;;2392:14:1::1;::::0;;-1:-1:-1;;8393:230:1:o;1246:25::-;;;;:::o;9010:144::-;9091:4;9120:16;;;:6;:16;;;;;;;;:26;;;;;;;9010:144;;;;:::o;9170:291::-;9257:4;9400:16;;;:6;:16;;;;;9431:1;9400:26;;;;9450:3;;9358:88;;9399:46;;9439:5;;9400:33;;;:30;:33;:::i;:::-;9399:39;:46;:39;:46;:::i;:::-;9358:16;;;;:6;:16;;;;;:36;;;;:88;:40;:88;:::i;:::-;:95;;;9170:291;-1:-1:-1;;9170:291:1:o;9477:148::-;9561:4;9590:16;;;:6;:16;;;;;:27;;;;;;9477:148::o;9658:299::-;-1:-1:-1;;;;;9874:11:1;;;9750:25;9874:11;;;:5;:11;;;;;;;;:29;;9905:12;:18;;;;;9925:11;;;:23;;;;;9867:82;;;;;;;;;;;;;;;;;9750:25;;9786:23;;9750:25;;9874:29;;9905:18;;9925:23;;;;;9905:18;;9867:82;;;9905:18;9867:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9658:299;;;;;:::o;1318:32::-;;;;:::o;10801:151::-;10878:4;10907:12;;:37;;;-1:-1:-1;;;10907:37:1;;10938:4;10907:37;;;;;;-1:-1:-1;;;;;10907:12:1;;;;:22;;:37;;;;;;;;;;;;;;;:12;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;10907:37:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10907:37:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10907:37:1;;-1:-1:-1;10801:151:1;:::o;13925:220::-;14021:7;14046:15;;:::i;:::-;14064:32;14082:4;14088:7;14064:17;:32::i;:::-;14046:50;;14116:21;14135:1;14116:18;:21::i;:::-;14109:28;;;13925:220;;;;;:::o;1363:42::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1363:42:1;;:::o;14153:289::-;14251:7;14276:19;;:::i;:::-;14298:32;14316:4;14322:7;14298:17;:32::i;:::-;14276:54;;14343:16;14362:25;14381:5;14362:18;:25::i;:::-;14405:18;;;;;:29;;;;;;-1:-1:-1;;14153:289:1;;;;:::o;8693:151::-;2325:6;;;;2324:7;2316:29;;;;;-1:-1:-1;;;2316:29:1;;;;;;;;;;;;-1:-1:-1;;;2316:29:1;;;;;;;;;;;;;;;2356:6;:13;;-1:-1:-1;;2356:13:1;2365:4;2356:13;;;8788:18:::1;8797:8:::0;8788::::1;:18::i;:::-;8780:56;;;::::0;;-1:-1:-1;;;8780:56:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;2392:6:1;:14;;-1:-1:-1;;2392:14:1;;;8693:151::o;10640:117::-;10740:9;;10640:117;:::o;1412:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1412:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2966:632::-;3069:4;3115:12;;:60;;;-1:-1:-1;;;3115:60:1;;3141:10;3115:60;;;;3161:4;3115:60;;;;;;;;;;;;-1:-1:-1;;;;;3115:12:1;;;;:25;;:60;;;;;;;;;;;;;;;3069:4;3115:12;:60;;;2:2:-1;;;;27:1;24;17:12;2:2;3115:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3115:60:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3115:60:1;3107:88;;;;;-1:-1:-1;;;3107:88:1;;;;;;;;;;;;-1:-1:-1;;;3107:88:1;;;;;;;;;;;;;;;3259:22;3274:6;3259:14;:22::i;:::-;3313:12;;;:42;;;-1:-1:-1;;;3313:42:1;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3313:12:1;;;;:23;;:42;;;;;;;;;;:12;;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;3313:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;3408:18:1;3429:12;;:38;;;-1:-1:-1;;;3429:38:1;;3461:4;3429:38;;;;;;3408:18;;-1:-1:-1;3429:45:1;;-1:-1:-1;3472:1:1;;-1:-1:-1;;;;;3429:12:1;;;;:23;;:38;;;;;;;;;;;;;;;:12;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;3429:38:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3429:38:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3429:38:1;;:45;:42;:45;:::i;:::-;3408:66;;3514:54;3530:6;3538:9;3549:3;3554:13;3514:15;:54::i;:::-;-1:-1:-1;3586:4:1;;2966:632;-1:-1:-1;;;;2966:632:1:o;859:181:3:-;917:7;949:5;;;973:6;;;;965:46;;;;;-1:-1:-1;;;965:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;1031:1;859:181;-1:-1:-1;;;859:181:3:o;2231:471::-;2289:7;2534:6;2530:47;;-1:-1:-1;2564:1:3;2557:8;;2530:47;2601:5;;;2605:1;2601;:5;:1;2625:5;;;;;:10;2617:56;;;;-1:-1:-1;;;2617:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15244:1017:1;15334:13;;:::i;:::-;15367:14;15585:12;;:29;;;-1:-1:-1;;;15585:29:1;;-1:-1:-1;;;;;15585:29:1;;;;;;;;;15367:14;;;;;;;;;;;;;;15585:12;;;:23;;:29;;;;;;;;;;;;;;;:12;:29;;;2:2:-1;;;;27:1;24;17:12;2:2;15585:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15585:29:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15585:29:1;;-1:-1:-1;15629:9:1;15625:629;15648:10;15644:1;:14;15625:629;;;15845:12;;:32;;;-1:-1:-1;;;15845:32:1;;-1:-1:-1;;;;;15845:32:1;;;;;;;;;;;;;;;:12;;;;;:23;;:32;;;;;;;;;;;;;;:12;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;15845:32:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15845:32:1;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;15845:32:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15845:32:1;;-1:-1:-1;15845:32:1;;-1:-1:-1;15845:32:1;-1:-1:-1;15845:32:1;-1:-1:-1;15845:32:1;;-1:-1:-1;15845:32:1;-1:-1:-1;15897:14:1;;;;;;;;15894:349;;;-1:-1:-1;;15938:289:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15931:296:1;;15894:349;15660:3;;15625:629;;;;15244:1017;;;;;;;;;;;;:::o;13483:434::-;13602:11;;;;13565:7;;13590:23;;13565:7;13636:16;:14;:16::i;:::-;13624:28;;13696:1;13691;:6;13687:223;;13756:1;13749:8;;;;;;13687:223;13790:28;13821:18;13834:1;13837;13821:12;:18::i;:::-;13790:49;;13861:37;13878:4;13884:1;:13;;;13861:37;;:16;:37::i;:::-;13854:44;;;;;;;3654:2765;3722:4;3763:13;;3752:7;:24;;3744:64;;;;;-1:-1:-1;;;3744:64:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;3819:23;3845:15;;;:6;:15;;;;;3879:17;;;;-1:-1:-1;;;;;3879:17:1;3900:10;3879:31;3871:138;;;;-1:-1:-1;;;3871:138:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4029:16;;;;;;4028:17;4020:58;;;;;-1:-1:-1;;;4020:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;4097:16;;4089:82;;;;-1:-1:-1;;;4089:82:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4184:18;4205:20;:18;:20::i;:::-;4294:12;;4349:16;;;;4184:41;;-1:-1:-1;;;;;;4294:12:1;;:21;;4316:50;;4342:4;;4349:16;;4316:17;:50::i;:::-;4368:16;;;;4294:91;;;-1:-1:-1;;;;;;4294:91:1;;;;;;;;;;;;;;4368:16;;;;4294:91;;;;;;;;;;4368:16;;4294:91;;;;;;;4368:16;4294:91;;;;2:2:-1;;;;27:1;24;17:12;2:2;4294:91:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;4396:15:1;;;:23;;-1:-1:-1;;4396:23:1;;;-1:-1:-1;4430:16:1;;;:23;;-1:-1:-1;;4430:23:1;4396;4430;;;4414:5;4528:36;4553:10;4528:20;:18;:20::i;:::-;:24;:36;:24;:36;:::i;:::-;4507:57;;4575:9;4596:12;4619;4642;4665:15;4707:5;:16;;;4694:10;:29;4691:961;;;4793:16;;;:29;;;4878:1;4858:17;;;:21;4960:19;4812:10;1112:4;4960:19;:14;:19;:::i;:::-;4953:26;-1:-1:-1;5004:16:1;4953:26;1154:1;5004:16;:8;:16;:::i;:::-;4994:26;-1:-1:-1;5045:16:1;:4;1209:1;5045:16;:8;:16;:::i;:::-;5035:26;-1:-1:-1;5086:1:1;;-1:-1:-1;5115:20:1;:10;5130:4;5115:20;:14;:20;:::i;:::-;5102:33;;4691:961;;;5210:16;;;:29;;;5311:16;;5296:32;;5229:10;;5296:32;:14;:32;:::i;:::-;5276:17;;;:52;;;5406:26;;1112:4;5406:26;:21;:26;:::i;:::-;5399:33;-1:-1:-1;5457:16:1;5399:33;1154:1;5457:16;:8;:16;:::i;:::-;5447:26;-1:-1:-1;5498:16:1;:4;1209:1;5498:16;:8;:16;:::i;:::-;5539:17;;;;5488:26;;-1:-1:-1;5539:27:1;;5561:4;5539:27;:21;:27;:::i;:::-;5624:16;;5529:37;;-1:-1:-1;5624:16:1;-1:-1:-1;4691:961:1;5665:14;;;;-1:-1:-1;;;;;5665:14:1;5662:304;;5725:12;;;;5747:10;5725:42;;;-1:-1:-1;;;5725:42:1;;-1:-1:-1;;;;;5747:10:1;;;5725:42;;;;;;;;;;;;:12;;;;;:21;;:42;;;;;;;;;;;;;;;;;;:12;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;5725:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5725:42:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5725:42:1;5717:74;;;;;-1:-1:-1;;;5717:74:1;;;;;;;;;;;;-1:-1:-1;;;5717:74:1;;;;;;;;;;;;;;;5662:304;;;5862:12;;;5884:14;;;;5862:46;;;-1:-1:-1;;;5862:46:1;;-1:-1:-1;;;;;5884:14:1;;;5862:46;;;;;;;;;;;;:12;;;;;:21;;:46;;;;;;;;;;;;;;;;;;:12;:46;;;2:2:-1;;;;27:1;24;17:12;2:2;5862:46:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5862:46:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5862:46:1;5854:78;;;;;-1:-1:-1;;;5854:78:1;;;;;;;;;;;;-1:-1:-1;;;5854:78:1;;;;;;;;;;;;;;;5984:12;;;;6006:10;5984:42;;;-1:-1:-1;;;5984:42:1;;-1:-1:-1;;;;;6006:10:1;;;5984:42;;;;;;;;;;;;:12;;;;;:21;;:42;;;;;;;;;;;;;;;;;;:12;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;5984:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5984:42:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5984:42:1;5976:74;;;;;-1:-1:-1;;;5976:74:1;;;;;;;;;;;;-1:-1:-1;;;5976:74:1;;;;;;;;;;;;;;;6086:12;;-1:-1:-1;;;;;6086:12:1;:21;6108:10;6120:23;:10;6135:7;6120:23;:14;:23;:::i;:::-;6086:58;;;;;;;;;;;;;-1:-1:-1;;;;;6086:58:1;-1:-1:-1;;;;;6086:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6086:58:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6086:58:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;6086:58:1;6078:86;;;;;-1:-1:-1;;;6078:86:1;;;;;;;;;;;;-1:-1:-1;;;6078:86:1;;;;;;;;;;;;;;;6301:15;;;;6238:17;;;;6270:16;;6331;;;;6213:145;;;;;;;;;;;;;6331:16;;6213:145;;;;;;;;;;;;;;-1:-1:-1;;6388:1:1;6369:20;;;-1:-1:-1;6407:4:1;;3654:2765;-1:-1:-1;;;;;;3654:2765:1:o;6452:405::-;6553:10;6523:21;6547:17;;;:5;:17;;;;;6575:20;:30;;;;;;6619:22;;6616:69;;6662:9;:11;;;;;;6616:69;6720:22;;:34;;6747:6;6720:34;:26;:34;:::i;:::-;6695:59;;6820:16;;:29;;-1:-1:-1;;;;;;6820:29:1;6839:10;6820:29;;;-1:-1:-1;6452:405:1:o;1315:136:3:-;1373:7;1400:43;1404:1;1407;1400:43;;;;;;;;;;;;;;;;;:3;:43::i;6891:1092:1:-;7012:13;7028:16;:14;:16::i;:::-;7082:10;7069:24;;;;:12;:24;;;;;;;27:10:-1;;39:1;23:18;;45:23;;7069:39:1;;;;;;;;;7012:32;-1:-1:-1;7140:22:1;;:::i;:::-;7173:25;;;7234:15;;;:27;;;7315:10;7295:17;;;:30;-1:-1:-1;;;;;7344:20:1;;:14;;;:20;7385:19;;;:27;;;7448:20;;:::i;:::-;7471:51;7495:4;7502:5;:19;;;7471:15;:51::i;:::-;7592:14;;7573:33;;;;:16;;;:33;;;7640:13;;;:24;;;7729:3;7701:25;;;:31;;;7786:4;7768:15;;;:22;;;7592:14;7823:16;;;:6;-1:-1:-1;7823:16:1;;;-1:-1:-1;7823:16:1;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7823:24:1;;;-1:-1:-1;;;;;;7823:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7823:24:1;;;;-1:-1:-1;;7823:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7823:24:1;;;;;;;;;;7876:99;;;;;;;;;;;;;;7448:74;;-1:-1:-1;7924:9:1;;7876:99;;;;;;;;;;;6891:1092;;;;;;;:::o;13256:219::-;13318:7;13343:29;;:::i;:::-;13375:12;;;;;;;;;-1:-1:-1;;;;;13375:12:1;-1:-1:-1;;;;;13375:23:1;;:25;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13375:25:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13375:25:1;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15:3;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;13429:13:1;;;;13256:219;-1:-1:-1;;13256:219:1:o;12818:430::-;12969:12;;;:33;;;-1:-1:-1;;;12969:33:1;;;;;;;;;;;;;;;;12899:23;;;;-1:-1:-1;;;;;12969:12:1;;:27;;:33;;;;;:12;:33;;;;;:12;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;12969:33:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12969:33:1;;;;;;39:16:-1;36:1;17:17;2:54;101:4;12969:33:1;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;12969:33:1;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;12969:33:1;;421:4:-1;412:14;;;;12969:33:1;;;;;412:14:-1;12969:33:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12969:33:1;;;;;;;;;;;12940:62;;13013:11;13027:9;:16;13013:30;;13054:28;13106:3;13085:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;13054:56:1;-1:-1:-1;13125:9:1;13121:98;13144:3;13140:1;:7;13121:98;;;13178:29;13194:9;13204:1;13194:12;;;;;;;;;;;;;;13178:15;:29::i;:::-;13168:4;13173:1;13168:7;;;;;;;;;;;;;;;;;:39;13149:3;;13121:98;;;-1:-1:-1;13236:4:1;12818:430;-1:-1:-1;;;;;12818:430:1:o;12246:346::-;12401:16;;12362:7;;;;12456:106;12479:3;12475:1;:7;12456:106;;;12512:38;12527:9;12537:1;12527:12;;;;;;;;;;;;;;12541:8;12512:14;:38::i;:::-;12503:47;;;;12484:3;;12456:106;;;-1:-1:-1;12579:5:1;12246:346;-1:-1:-1;;;;12246:346:1:o;16269:730::-;16371:4;16393:14;16418:19;16448:18;16477:16;16504:17;16532:18;16561:16;16590:18;16611:12;;;;;;;;;-1:-1:-1;;;;;16611:12:1;-1:-1:-1;;;;;16611:23:1;;16635:4;16611:29;;;;;;;;;;;;;-1:-1:-1;;;;;16611:29:1;-1:-1:-1;;;;;16611:29:1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16611:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16611:29:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16611:29:1;;-1:-1:-1;16655:9:1;16651:341;16674:10;16670:1;:14;16651:341;;;16871:12;;:32;;;-1:-1:-1;;;16871:32:1;;-1:-1:-1;;;;;16871:32:1;;;;;;;;;;;;;;;:12;;;;;:23;;:32;;;;;;;;;;;;;;:12;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;16871:32:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16871:32:1;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;16871:32:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16871:32:1;;-1:-1:-1;16871:32:1;;-1:-1:-1;16871:32:1;-1:-1:-1;16871:32:1;-1:-1:-1;16871:32:1;;-1:-1:-1;16871:32:1;-1:-1:-1;16923:14:1;;;;;;;;16920:61;;;16964:1;-1:-1:-1;16957:8:1;;-1:-1:-1;;;;;;;;16957:8:1;16920:61;16686:3;;16651:341;;3170:132:3;3228:7;3255:39;3259:1;3262;3255:39;;;;;;;;;;;;;;;;;:3;:39::i;1788:192::-;1874:7;1910:12;1902:6;;;;1894:29;;;;-1:-1:-1;;;1894:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1894:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1946:5:3;;;1788:192::o;8016:138:1:-;8100:13;:15;;;;;;;;8016:138;:::o;14450:786::-;14539:13;;:::i;:::-;14570:14;14933:12;;:34;;;-1:-1:-1;;;14933:34:1;;-1:-1:-1;;;;;14933:34:1;;;;;;;;;;;;;;;14570:14;;;;;;;;;;;;14933:12;;:23;;:34;;;;;;;;;;;;;;:12;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;14933:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14933:34:1;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;14933:34:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14987:241;;14933:34;14987:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14450:786;-1:-1:-1;;;;;;;;;;14450:786:1:o;11842:396::-;11920:21;;:::i;:::-;-1:-1:-1;12194:36:1;;;;;;;;11683:28;12005:15;;;12194:36;;11635:2;12035:22;;;12085:15;12194:36;;;;12115:22;;;;;11807:26;12163:13;12194:36;;;;;11842:396::o;12600:210::-;12709:7;12776:6;:26;;;12752:6;:21;;;12741:8;:32;:61;;;;;;;12600:210;-1:-1:-1;;;12600:210:1:o;3832:345:3:-;3918:7;4020:12;4013:5;4005:28;;;;-1:-1:-1;;;4005:28:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4005:28:3;;4044:9;4060:1;4056;:5;;;;;;;3832:345;-1:-1:-1;;;;;3832:345:3:o;615:16387:1:-;;;;;;;;;-1:-1:-1;615:16387:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;615:16387:1;;;;;;-1:-1:-1;;;;;615:16387:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1;615:16387:1;;;-1:-1:-1;;615:16387:1:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://bbdc1b092d20cf7546e6c85333266ababb44cfb8744de87eb51047a1ca6e374b
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.