ETH Price: $1,822.12 (-4.86%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim189935212024-01-12 21:32:35773 days ago1705095155IN
Synapse Network: Vesting
0 ETH0.002639721.97337517
Claim189715312024-01-09 19:36:59776 days ago1704829019IN
Synapse Network: Vesting
0 ETH0.0093523621.30783124
Claim189714032024-01-09 19:10:59776 days ago1704827459IN
Synapse Network: Vesting
0 ETH0.0029804724.18428936
Claim189699922024-01-09 14:26:23776 days ago1704810383IN
Synapse Network: Vesting
0 ETH0.0023128221.17045304
Claim189636542024-01-08 17:04:11777 days ago1704733451IN
Synapse Network: Vesting
0 ETH0.0022975424.93315853
Claim189494562024-01-06 16:53:23779 days ago1704560003IN
Synapse Network: Vesting
0 ETH0.0029194926.72358819
Claim189492502024-01-06 16:11:35779 days ago1704557495IN
Synapse Network: Vesting
0 ETH0.0018083619.6245333
Claim189445332024-01-06 0:10:35780 days ago1704499835IN
Synapse Network: Vesting
0 ETH0.0016620213.48612064
Claim189197072024-01-02 12:30:23783 days ago1704198623IN
Synapse Network: Vesting
0 ETH0.0015252114.0004795
Claim189000752023-12-30 18:20:35786 days ago1703960435IN
Synapse Network: Vesting
0 ETH0.0019601221.27148029
Claim188786062023-12-27 17:53:47789 days ago1703699627IN
Synapse Network: Vesting
0 ETH0.0042144435.08176432
Claim188538122023-12-24 6:21:23793 days ago1703398883IN
Synapse Network: Vesting
0 ETH0.0148308625.7053573
Claim188361442023-12-21 18:52:11795 days ago1703184731IN
Synapse Network: Vesting
0 ETH0.0048206538.15382413
Claim188119462023-12-18 9:20:35799 days ago1702891235IN
Synapse Network: Vesting
0 ETH0.0041301338.91216095
Claim186941182023-12-01 21:02:47815 days ago1701464567IN
Synapse Network: Vesting
0 ETH0.0039761436.395626
Claim186764852023-11-29 9:50:23818 days ago1701251423IN
Synapse Network: Vesting
0 ETH0.0033329330.59427113
Claim185296812023-11-08 20:39:47838 days ago1699475987IN
Synapse Network: Vesting
0 ETH0.0044816947.50727829
Claim185087662023-11-05 22:26:47841 days ago1699223207IN
Synapse Network: Vesting
0 ETH0.0019359817.87132047
Claim183043262023-10-08 7:38:35870 days ago1696750715IN
Synapse Network: Vesting
0 ETH0.000581725.22025789
Claim To182499232023-09-30 17:10:35877 days ago1696093835IN
Synapse Network: Vesting
0 ETH0.0010768411.34883602
Claim To182498992023-09-30 17:05:47877 days ago1696093547IN
Synapse Network: Vesting
0 ETH0.0013962914.71548712
Claim To182498802023-09-30 17:01:59877 days ago1696093319IN
Synapse Network: Vesting
0 ETH0.0015044415.8553178
Claim To182497502023-09-30 16:35:35877 days ago1696091735IN
Synapse Network: Vesting
0 ETH0.0019994612.50679167
Claim179551492023-08-20 9:45:35919 days ago1692524735IN
Synapse Network: Vesting
0 ETH0.0011092911.75888772
Claim177733712023-07-25 23:26:23944 days ago1690327583IN
Synapse Network: Vesting
0 ETH0.0018093419.1795579
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SynapseVesting

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license
File 1 of 6 : SynapseVesting.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

import { ReentrancyGuard } from "./external/openzeppelin/ReentrancyGuard.sol";

import { StableMath } from "./libraries/StableMath.sol";
import { IERC20 } from "./interfaces/IERC20.sol";
import { Ownable } from "./abstract/Ownable.sol";
import { Lockable } from "./abstract/Lockable.sol";

/**
 * @title   SynapseVesting
 * @notice  Synapse Network Vesting contract
 * @dev     Vesting is constantly releasing tokens every block every second
 */
contract SynapseVesting is Ownable, Lockable, ReentrancyGuard {
    using StableMath for uint256;

    /// @notice address of Synapse Network token
    address public snpToken;
    /// @notice total tokens vested in contract
    /// @dev tokens from not initialized sale contracts are not included
    uint256 public totalVested;
    /// @notice total tokens already claimed form vesting
    uint256 public totalClaimed;
    /// @notice staking contract address
    /// @dev set by Owner, for claimAndStake
    address public stakingAddress;

    struct Vest {
        uint256 dateStart; // start of claiming, can claim startTokens
        uint256 dateEnd; // after it all tokens can be claimed
        uint256 totalTokens; // total tokens to claim
        uint256 startTokens; // tokens to claim on start
        uint256 claimedTokens; // tokens already claimed
    }
    /// @notice storage of vestings
    Vest[] internal vestings;
    /// @notice map of vestings for user
    mapping(address => uint256[]) internal user2vesting;

    struct SaleContract {
        address[] contractAddresses; // list of cross sale contracts from sale round
        uint256 tokensPerCent; // amount of tokens per cent for sale round
        uint256 maxAmount; // max amount in USD cents for sale round
        uint256 percentOnStart; // percent of tokens to claim on start
        uint256 startDate; // start of claiming, can claim start tokens
        uint256 endDate; // after it all tokens can be claimed
    }
    /// @notice list of sale contract that will be checked
    SaleContract[] internal saleContracts;

    /// @notice map of users that initialized vestings from sale contracts
    mapping(address => bool) public vestingAdded;
    /// @notice map of users that were refunded after sales
    mapping(address => bool) public refunded;

    /// @dev events
    event Claimed(address indexed user, uint256 amount);
    event Vested(address indexed user, uint256 totalAmount, uint256 endDate);

    /**
     * @dev Contract initiator
     * @param _token address of SNP token
     */
    function init(address _token) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        require(snpToken == address(0), "Init already done");
        snpToken = _token;
    }

    /**
     * @dev Add multiple vesting to contract by arrays of data
     * @param _users[] addresses of holders
     * @param _startTokens[] tokens that can be withdrawn at startDate
     * @param _totalTokens[] total tokens in vesting
     * @param _startDate date from when tokens can be claimed
     * @param _endDate date after which all tokens can be claimed
     */
    function massAddHolders(
        address[] calldata _users,
        uint256[] calldata _startTokens,
        uint256[] calldata _totalTokens,
        uint256 _startDate,
        uint256 _endDate
    ) external onlyOwner whenNotLocked {
        uint256 len = _users.length; //cheaper to use one variable
        require((len == _startTokens.length) && (len == _totalTokens.length), "data size mismatch");
        require(_startDate < _endDate, "startDate cannot exceed endDate");
        uint256 i;
        for (i; i < len; i++) {
            _addHolder(_users[i], _startTokens[i], _totalTokens[i], _startDate, _endDate);
        }
    }

    /**
     * @dev Add new vesting to contract
     * @param _user address of a holder
     * @param _startTokens how many tokens are claimable at start date
     * @param _totalTokens total number of tokens in added vesting
     * @param _startDate date from when tokens can be claimed
     * @param _endDate date after which all tokens can be claimed
     */
    function _addHolder(
        address _user,
        uint256 _startTokens,
        uint256 _totalTokens,
        uint256 _startDate,
        uint256 _endDate
    ) internal {
        require(_user != address(0), "user address cannot be 0");
        Vest memory v;
        v.startTokens = _startTokens;
        v.totalTokens = _totalTokens;
        v.dateStart = _startDate;
        v.dateEnd = _endDate;

        totalVested += _totalTokens;
        vestings.push(v);
        user2vesting[_user].push(vestings.length); // we are skipping index "0" for reasons
        emit Vested(_user, _totalTokens, _endDate);
    }

    /**
     * @dev Claim tokens from msg.sender vestings
     */
    function claim() external {
        _claim(msg.sender, msg.sender);
    }

    /**
     * @dev Claim tokens from msg.sender vestings to external address
     * @param _target transfer address for claimed tokens
     */
    function claimTo(address _target) external {
        _claim(msg.sender, _target);
    }

    /**
     * @dev Claim and stake claimed tokens directly in staking contract
     *      Ask staking contract if user is not in withdrawing state
     */
    function claimAndStake() external {
        require(stakingAddress != address(0), "Staking contract not configured");
        require(IStaking(stakingAddress).canStakeTokens(msg.sender), "Unable to stake");
        uint256 amt = _claim(msg.sender, stakingAddress);
        IStaking(stakingAddress).onClaimAndStake(msg.sender, amt);
    }

    /**
     * @dev internal claim function
     * @param _user address of holder
     * @param _target where tokens should be send
     * @return amt number of tokens claimed
     */
    function _claim(address _user, address _target) internal nonReentrant returns (uint256 amt) {
        require(_target != address(0), "Claim, then burn");
        if (!vestingAdded[_user] && !refunded[_user]) {
            _addVesting(_user);
        }
        uint256 len = user2vesting[_user].length;
        require(len > 0, "No vestings for user");
        uint256 cl;
        uint256 i;
        for (i; i < len; i++) {
            Vest storage v = vestings[user2vesting[_user][i] - 1];
            cl = _claimable(v);
            v.claimedTokens += cl;
            amt += cl;
        }
        if (amt > 0) {
            totalClaimed += amt;
            _transfer(_target, amt);
            emit Claimed(_user, amt);
        } else revert("Nothing to claim");
    }

    /**
     * @dev Internal function to send out claimed tokens
     * @param _user address that we send tokens
     * @param _amt amount of tokens
     */
    function _transfer(address _user, uint256 _amt) internal {
        require(IERC20(snpToken).transfer(_user, _amt), "Token transfer failed");
    }

    /**
     * @dev Count how many tokens can be claimed from vesting to date
     * @param _vesting Vesting object
     * @return canWithdraw number of tokens
     */
    function _claimable(Vest memory _vesting) internal view returns (uint256 canWithdraw) {
        uint256 currentTime = block.timestamp;
        if (_vesting.dateStart > currentTime) return 0;
        // we are somewhere in the middle
        if (currentTime < _vesting.dateEnd) {
            // how much time passed (as fraction * 10^18)
            // timeRatio = (time passed * 1e18) / duration
            uint256 timeRatio = (currentTime - _vesting.dateStart).divPrecisely(_vesting.dateEnd - _vesting.dateStart);
            // how much tokens we can get in total to date
            canWithdraw = (_vesting.totalTokens - _vesting.startTokens).mulTruncate(timeRatio) + _vesting.startTokens;
        }
        // time has passed, we can take all tokens
        else {
            canWithdraw = _vesting.totalTokens;
        }
        // but maybe we take something earlier?
        canWithdraw -= _vesting.claimedTokens;
    }

    /**
     * @dev Read number of claimable tokens by user and vesting no
     * @param _user address of holder
     * @param _id his vesting number (starts from 0)
     * @return amount number of tokens
     */
    function getClaimable(address _user, uint256 _id) external view returns (uint256 amount) {
        amount = _claimable(vestings[user2vesting[_user][_id] - 1]);
    }

    /**
     * @dev Read total amount of tokens that user can claim to date from all vestings
     *      Function also includes tokens to claim from sale contracts that were not
     *      yet initiated for user.
     * @param _user address of holder
     * @return amount number of tokens
     */
    function getAllClaimable(address _user) public view returns (uint256 amount) {
        uint256 len = user2vesting[_user].length;
        uint256 i;
        for (i; i < len; i++) {
            amount += _claimable(vestings[user2vesting[_user][i] - 1]);
        }

        if (!vestingAdded[_user]) {
            amount += _claimableFromSaleContracts(_user);
        }
    }

    /**
     * @dev Extract all the vestings for the user
     *      Also extract not initialized vestings from
     *      sale contracts.
     * @param _user address of holder
     * @return v array of Vest objects
     */
    function getVestings(address _user) external view returns (Vest[] memory) {
        // array of pending vestings
        Vest[] memory pV;

        if (!vestingAdded[_user]) {
            pV = _vestingsFromSaleContracts(_user);
        }
        uint256 pLen = pV.length;
        uint256 len = user2vesting[_user].length;
        Vest[] memory v = new Vest[](len + pLen);

        // copy normal vestings
        uint256 i;
        for (i; i < len; i++) {
            v[i] = vestings[user2vesting[_user][i] - 1];
        }

        // copy not initialized vestings
        if (!vestingAdded[_user]) {
            uint256 j;
            for (j; j < pLen; j++) {
                v[i + j] = pV[j];
            }
        }

        return v;
    }

    /**
     * @dev Read total number of vestings registered
     * @return number of registered vestings on contract
     */
    function getVestingsCount() external view returns (uint256) {
        return vestings.length;
    }

    /**
     * @dev Read single registered vesting entry
     * @param _id index of vesting in storage
     * @return Vest object
     */
    function getVestingByIndex(uint256 _id) external view returns (Vest memory) {
        return vestings[_id];
    }

    /**
     * @dev Read registered vesting list by range from-to
     * @param _start first index
     * @param _end last index
     * @return array of Vest objects
     */
    function getVestingsByRange(uint256 _start, uint256 _end) external view returns (Vest[] memory) {
        uint256 cnt = _end - _start + 1;
        uint256 len = vestings.length;
        require(_end < len, "range error");
        Vest[] memory v = new Vest[](cnt);
        uint256 i;
        for (i; i < cnt; i++) {
            v[i] = vestings[_start + i];
        }
        return v;
    }

    /**
     * @dev Extract all sale contracts
     * @return array of SaleContract objects
     */
    function getSaleContracts() external view returns (SaleContract[] memory) {
        return saleContracts;
    }

    /**
     * @dev Read total number of sale contracts
     * @return number of SaleContracts
     */
    function getSaleContractsCount() external view returns (uint256) {
        return saleContracts.length;
    }

    /**
     * @dev Read single sale contract entry
     * @param _id index of sale contract in storage
     * @return SaleContract object
     */
    function getSaleContractByIndex(uint256 _id) external view returns (SaleContract memory) {
        return saleContracts[_id];
    }

    /**
     * @dev Register sale contract
     * @param _contractAddresses  addresses of sale contracts
     * @param _tokensPerCent      sale price
     * @param _maxAmount          the maximum amount in USD cents for which user could buy
     * @param _percentOnStart     percentage of vested coins that can be claimed on start date
     * @param _startDate          date when initial vesting can be released
     * @param _endDate            final date of vesting, where all tokens can be claimed
     */
    function addSaleContract(
        address[] memory _contractAddresses,
        uint256 _tokensPerCent,
        uint256 _maxAmount,
        uint256 _percentOnStart,
        uint256 _startDate,
        uint256 _endDate
    ) external onlyOwner whenNotLocked {
        require(_contractAddresses.length > 0, "data is missing");
        require(_startDate < _endDate, "startDate cannot exceed endDate");
        SaleContract memory s;
        s.contractAddresses = _contractAddresses;
        s.tokensPerCent = _tokensPerCent;
        s.maxAmount = _maxAmount;
        s.startDate = _startDate;
        s.percentOnStart = _percentOnStart;
        s.endDate = _endDate;
        saleContracts.push(s);
    }

    /**
     * @dev Initialize vestings from sale contracts for msg.sender
     */
    function addMyVesting() external {
        _addVesting(msg.sender);
    }

    /**
     * @dev Initialize vestings from sale contracts for target user
     * @param _user address of user that will be initialized
     */
    function addVesting(address _user) external {
        require(_user != address(0), "User address cannot be 0");
        _addVesting(_user);
    }

    /**
     * @dev Function iterate sale contracts and initialize corresponding
     *      vesting for user.
     * @param _user address that will be initialized
     */
    function _addVesting(address _user) internal {
        require(!refunded[_user], "User refunded");
        require(!vestingAdded[_user], "Already done");
        uint256 len = saleContracts.length;
        uint256 i;
        for (i; i < len; i++) {
            SaleContract memory s = saleContracts[i];
            uint256 sLen = s.contractAddresses.length;
            uint256 j;
            uint256 amt;
            for (j; j < sLen; j++) {
                amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
            }
            // amt is in cents, so $100 = 10000
            if (amt > 0) {
                if (amt > s.maxAmount) {
                    amt = s.maxAmount;
                }
                // create Vest object
                Vest memory v = _vestFromSaleContractAndAmount(s, amt);
                // update contract data
                totalVested += v.totalTokens;
                vestings.push(v);
                user2vesting[_user].push(vestings.length);
                emit Vested(_user, v.totalTokens, v.dateEnd);
            }
        }
        vestingAdded[_user] = true;
    }

    /**
     * @dev Function iterate sale contracts and count claimable amounts for given user.
     *      Used to calculate claimable amounts from not initialized vestings.
     * @param _user address of user to count claimable
     * @return claimable amount of tokens
     */
    function _claimableFromSaleContracts(address _user) internal view returns (uint256 claimable) {
        if (refunded[_user]) return 0;
        uint256 len = saleContracts.length;
        if (len == 0) return 0;
        uint256 i;
        for (i; i < len; i++) {
            SaleContract memory s = saleContracts[i];
            uint256 sLen = s.contractAddresses.length;
            uint256 j;
            uint256 amt;
            for (j; j < sLen; j++) {
                amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
            }
            // amt is in cents, so $100 = 10000
            if (amt > 0) {
                if (amt > s.maxAmount) {
                    amt = s.maxAmount;
                }
                claimable += _claimable(_vestFromSaleContractAndAmount(s, amt));
            }
        }
    }

    /**
     * @dev Function iterate sale contracts and extract not initialized user vestings.
     *      Used to return all stored and not initialized vestings.
     * @param _user address of user to extract vestings
     * @return v vesting array
     */
    function _vestingsFromSaleContracts(address _user) internal view returns (Vest[] memory) {
        uint256 len = saleContracts.length;
        if (refunded[_user] || len == 0) return new Vest[](0);

        Vest[] memory v = new Vest[](_numberOfVestingsFromSaleContracts(_user));
        uint256 i;
        uint256 idx;
        for (i; i < len; i++) {
            SaleContract memory s = saleContracts[i];
            uint256 sLen = s.contractAddresses.length;
            uint256 j;
            uint256 amt;
            for (j; j < sLen; j++) {
                amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
            }
            // amt is in cents, so $100 = 10000
            if (amt > 0) {
                if (amt > s.maxAmount) {
                    amt = s.maxAmount;
                }
                v[idx] = _vestFromSaleContractAndAmount(s, amt);
                idx++;
            }
        }
        return v;
    }

    /**
     * @dev Function iterate sale contracts and return number of not initialized vestings for user.
     * @param _user address of user to extract vestings
     * @return number of not not initialized user vestings
     */
    function _numberOfVestingsFromSaleContracts(address _user) internal view returns (uint256 number) {
        uint256 len = saleContracts.length;
        uint256 i;
        for (i; i < len; i++) {
            SaleContract memory s = saleContracts[i];
            uint256 sLen = s.contractAddresses.length;
            uint256 j;
            uint256 amt;
            for (j; j < sLen; j++) {
                amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
            }
            // amt is in cents, so $100 = 10000
            if (amt > 0) {
                number++;
            }
        }
    }

    /**
     * @dev Return vesting created from given sale and usd cent amount.
     * @param _sale address of user to extract vestings
     * @param _amount address of user to extract vestings
     * @return v vesting from given parameters
     */
    function _vestFromSaleContractAndAmount(SaleContract memory _sale, uint256 _amount) internal pure returns (Vest memory v) {
        v.dateStart = _sale.startDate;
        v.dateEnd = _sale.endDate;
        uint256 total = _amount * _sale.tokensPerCent;
        v.totalTokens = total;
        v.startTokens = (total * _sale.percentOnStart) / 100;
    }

    /**
     * @dev Set staking contract address for Claim and Stake.
     *      Only contract owner can set.
     * @param _staking address
     */
    function setStakingAddress(address _staking) external onlyOwner {
        stakingAddress = _staking;
    }

    /**
     * @dev Mark user as refunded
     * @param _user address of user
     * @param _refunded true=refunded
     */
    function setRefunded(address _user, bool _refunded) external onlyOwner whenNotLocked {
        require(_user != address(0), "user address cannot be 0");
        refunded[_user] = _refunded;
    }

    /**
     * @dev Mark multiple refunded users
     * @param _users[] addresses of refunded users
     */
    function massSetRefunded(address[] calldata _users) external onlyOwner whenNotLocked {
        uint256 i;
        for (i; i < _users.length; i++) {
            require(_users[i] != address(0), "user address cannot be 0");
            refunded[_users[i]] = true;
        }
    }

    /**
     * @dev Recover ETH from contract to owner address.
     */
    function recoverETH() external {
        payable(owner).transfer(address(this).balance);
    }

    /**
     * @dev Recover given ERC20 token from contract to owner address.
     *      Can't recover SNP tokens.
     * @param _token address of ERC20 token to recover
     */
    function recoverErc20(address _token) external {
        require(_token != snpToken, "Not permitted");
        uint256 amt = IERC20(_token).balanceOf(address(this));
        require(amt > 0, "Nothing to recover");
        IBadErc20(_token).transfer(owner, amt);
    }
}

/**
 * @title IStaking
 * @dev Interface for claim and stake
 */
interface IStaking {
    function canStakeTokens(address _account) external view returns (bool);

    function onClaimAndStake(address _from, uint256 _amount) external;
}

/**
 * @title ISaleContract
 * @dev Interface for sale contract
 */
interface ISaleContract {
    function balanceOf(address _account) external view returns (uint256);
}

/**
 * @title IBadErc20
 * @dev Interface for emergency recover any ERC20-tokens,
 *      even non-erc20-compliant like USDT not returning boolean
 */
interface IBadErc20 {
    function transfer(address _recipient, uint256 _amount) external;
}

File 2 of 6 : Lockable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

import { Ownable } from "./Ownable.sol";

abstract contract LockableData {
    bool public locked;
}

abstract contract Lockable is LockableData, Ownable {
    /**
     * @dev Locks functions with whenNotLocked modifier
     */
    function lock() external onlyOwner {
        locked = true;
    }

    /**
     * @dev Throws if called after it was locked.
     */
    modifier whenNotLocked {
        require(!locked, "Lockable: locked");
        _;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

abstract contract OwnableData {
    address public owner;
    address public pendingOwner;
}

abstract contract Ownable is OwnableData {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev `owner` defaults to msg.sender on construction.
     */
    constructor() {
        _setOwner(msg.sender);
    }

    /**
     * @dev Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
     *      Can only be invoked by the current `owner`.
     * @param _newOwner Address of the new owner.
     * @param _direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
     */
    function transferOwnership(address _newOwner, bool _direct) external onlyOwner {
        if (_direct) {
            require(_newOwner != address(0), "zero address");

            emit OwnershipTransferred(owner, _newOwner);
            owner = _newOwner;
            pendingOwner = address(0);
        } else {
            pendingOwner = _newOwner;
        }
    }

    /**
     * @dev Needs to be called by `pendingOwner` to claim ownership.
     */
    function claimOwnership() external {
        address _pendingOwner = pendingOwner;
        require(msg.sender == _pendingOwner, "caller != pending owner");

        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    /**
     * @dev Throws if called by any account other than the Owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner, "caller is not the owner");
        _;
    }

    function _setOwner(address newOwner) internal {
        address oldOwner = owner;
        owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 4 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    // EIP 2612
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function nonces(address owner) external view returns (uint256);
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
    function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
}

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.6;

// Based on StableMath from mStable
// https://github.com/mstable/mStable-contracts/blob/master/contracts/shared/StableMath.sol

library StableMath {
    /**
     * @dev Scaling unit for use in specific calculations,
     * where 1 * 10**18, or 1e18 represents a unit '1'
     */
    uint256 private constant FULL_SCALE = 1e18;

    /**
     * @dev Provides an interface to the scaling unit
     * @return Scaling unit (1e18 or 1 * 10**18)
     */
    function getFullScale() internal pure returns (uint256) {
        return FULL_SCALE;
    }

    /**
     * @dev Scales a given integer to the power of the full scale.
     * @param x   Simple uint256 to scale
     * @return    Scaled value a to an exact number
     */
    function scaleInteger(uint256 x) internal pure returns (uint256) {
        return x * FULL_SCALE;
    }

    /***************************************
              PRECISE ARITHMETIC
    ****************************************/

    /**
     * @dev Multiplies two precise units, and then truncates by the full scale
     * @param x     Left hand input to multiplication
     * @param y     Right hand input to multiplication
     * @return      Result after multiplying the two inputs and then dividing by the shared
     *              scale unit
     */
    function mulTruncate(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulTruncateScale(x, y, FULL_SCALE);
    }

    /**
     * @dev Multiplies two precise units, and then truncates by the given scale. For example,
     * when calculating 90% of 10e18, (10e18 * 9e17) / 1e18 = (9e36) / 1e18 = 9e18
     * @param x     Left hand input to multiplication
     * @param y     Right hand input to multiplication
     * @param scale Scale unit
     * @return      Result after multiplying the two inputs and then dividing by the shared
     *              scale unit
     */
    function mulTruncateScale(
        uint256 x,
        uint256 y,
        uint256 scale
    ) internal pure returns (uint256) {
        // e.g. assume scale = fullScale
        // z = 10e18 * 9e17 = 9e36
        // return 9e36 / 1e18 = 9e18
        return (x * y) / scale;
    }

    /**
     * @dev Multiplies two precise units, and then truncates by the full scale, rounding up the result
     * @param x     Left hand input to multiplication
     * @param y     Right hand input to multiplication
     * @return      Result after multiplying the two inputs and then dividing by the shared
     *              scale unit, rounded up to the closest base unit.
     */
    function mulTruncateCeil(uint256 x, uint256 y) internal pure returns (uint256) {
        // e.g. 8e17 * 17268172638 = 138145381104e17
        uint256 scaled = x * y;
        // e.g. 138145381104e17 + 9.99...e17 = 138145381113.99...e17
        uint256 ceil = scaled + FULL_SCALE - 1;
        // e.g. 13814538111.399...e18 / 1e18 = 13814538111
        return ceil / FULL_SCALE;
    }

    /**
     * @dev Precisely divides two units, by first scaling the left hand operand. Useful
     *      for finding percentage weightings, i.e. 8e18/10e18 = 80% (or 8e17)
     * @param x     Left hand input to division
     * @param y     Right hand input to division
     * @return      Result after multiplying the left operand by the scale, and
     *              executing the division on the right hand input.
     */
    function divPrecisely(uint256 x, uint256 y) internal pure returns (uint256) {
        // e.g. 8e18 * 1e18 = 8e36
        // e.g. 8e36 / 10e18 = 8e17
        return (x * FULL_SCALE) / y;
    }

    /***************************************
                    HELPERS
    ****************************************/

    /**
     * @dev Calculates minimum of two numbers
     * @param x     Left hand input
     * @param y     Right hand input
     * @return      Minimum of the two inputs
     */
    function min(uint256 x, uint256 y) internal pure returns (uint256) {
        return x > y ? y : x;
    }

    /**
     * @dev Calculated maximum of two numbers
     * @param x     Left hand input
     * @param y     Right hand input
     * @return      Maximum of the two inputs
     */
    function max(uint256 x, uint256 y) internal pure returns (uint256) {
        return x > y ? x : y;
    }

    /**
     * @dev Clamps a value to an upper bound
     * @param x           Left hand input
     * @param upperBound  Maximum possible value to return
     * @return            Input x clamped to a maximum value, upperBound
     */
    function clamp(uint256 x, uint256 upperBound) internal pure returns (uint256) {
        return x > upperBound ? upperBound : x;
    }
}

Settings
{
  "evmVersion": "berlin",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"}],"name":"Vested","type":"event"},{"inputs":[],"name":"addMyVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contractAddresses","type":"address[]"},{"internalType":"uint256","name":"_tokensPerCent","type":"uint256"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"},{"internalType":"uint256","name":"_percentOnStart","type":"uint256"},{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"}],"name":"addSaleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"claimTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllClaimable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getClaimable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getSaleContractByIndex","outputs":[{"components":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"},{"internalType":"uint256","name":"tokensPerCent","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"percentOnStart","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"}],"internalType":"struct SynapseVesting.SaleContract","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleContracts","outputs":[{"components":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"},{"internalType":"uint256","name":"tokensPerCent","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"percentOnStart","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"}],"internalType":"struct SynapseVesting.SaleContract[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleContractsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getVestingByIndex","outputs":[{"components":[{"internalType":"uint256","name":"dateStart","type":"uint256"},{"internalType":"uint256","name":"dateEnd","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"startTokens","type":"uint256"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"}],"internalType":"struct SynapseVesting.Vest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getVestings","outputs":[{"components":[{"internalType":"uint256","name":"dateStart","type":"uint256"},{"internalType":"uint256","name":"dateEnd","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"startTokens","type":"uint256"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"}],"internalType":"struct SynapseVesting.Vest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"getVestingsByRange","outputs":[{"components":[{"internalType":"uint256","name":"dateStart","type":"uint256"},{"internalType":"uint256","name":"dateEnd","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"startTokens","type":"uint256"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"}],"internalType":"struct SynapseVesting.Vest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVestingsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_startTokens","type":"uint256[]"},{"internalType":"uint256[]","name":"_totalTokens","type":"uint256[]"},{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"}],"name":"massAddHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"massSetRefunded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"refunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_refunded","type":"bool"}],"name":"setRefunded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_direct","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestingAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506200001d3362000028565b600160025562000081565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b613f6280620000916000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806391a6de8e1161012a578063d02ffa55116100bd578063e30c39781161008c578063f83d08ba11610071578063f83d08ba146104dd578063fc0d8329146104e5578063fcf4b140146104f857600080fd5b8063e30c3978146104aa578063f4e0d9ac146104ca57600080fd5b8063d02ffa551461044e578063d54ad2a114610461578063d7b4be241461046a578063da638e641461048a57600080fd5b8063b95e099e116100f9578063b95e099e14610403578063c033a49014610416578063cb1a4fc014610439578063cf3090121461044157600080fd5b806391a6de8e146103b55780639a854bc4146103d5578063a262f5f8146103dd578063b242e534146103f057600080fd5b80634e71d92d116101bd578063603e56061161018c5780637a0c6dc0116101715780637a0c6dc014610338578063843277d1146103585780638da5cb5b1461036b57600080fd5b8063603e5606146103125780636f5244b11461032557600080fd5b80634e71d92d146102cd5780634e71e0c8146102d557806355f8b368146102dd5780635ae2a4e1146102fd57600080fd5b80631fb61122116101f95780631fb611221461026c5780633138b0a91461029f57806334671e64146102a75780633860f9d0146102ba57600080fd5b80630614117a1461022b5780631811ba9514610235578063199cbc541461023d57806319ab453c14610259575b600080fd5b61023361050b565b005b61023361055c565b61024660045481565b6040519081526020015b60405180910390f35b6102336102673660046138f3565b610567565b61028f61027a3660046138f3565b600a6020526000908152604090205460ff1681565b6040519015158152602001610250565b600754610246565b6102336102b53660046138f3565b610736565b6102336102c836600461396f565b6107bc565b6102336109f8565b610233610a02565b6102f06102eb366004613b88565b610b43565b6040516102509190613d65565b610305610c50565b6040516102509190613c6c565b610233610320366004613a5a565b610d50565b610246610333366004613945565b611001565b61034b6103463660046138f3565b6110bf565b6040516102509190613cec565b6102336103663660046139b1565b61132f565b60005461039090610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610250565b6003546103909073ffffffffffffffffffffffffffffffffffffffff1681565b600954610246565b6102336103eb3660046138f3565b61158c565b6102336103fe36600461390e565b61159a565b6102336104113660046138f3565b6117a6565b61028f6104243660046138f3565b600b6020526000908152604090205460ff1681565b6102336119cc565b60005461028f9060ff1681565b61024661045c3660046138f3565b611c07565b61024660055481565b6006546103909073ffffffffffffffffffffffffffffffffffffffff1681565b61049d610498366004613b88565b611cf6565b6040516102509190613d78565b6001546103909073ffffffffffffffffffffffffffffffffffffffff1681565b6102336104d83660046138f3565b611d8d565b610233611e5a565b61034b6104f3366004613bba565b611f0d565b61023361050636600461390e565b6120c4565b6000805460405173ffffffffffffffffffffffffffffffffffffffff61010090920491909116914780156108fc02929091818181858888f19350505050158015610559573d6000803e3d6000fd5b50565b6105653361228a565b565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146105f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016105e9565b60035473ffffffffffffffffffffffffffffffffffffffff16156106ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e697420616c726561647920646f6e6500000000000000000000000000000060448201526064016105e9565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166107b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6105598161228a565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156108af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b60005b818110156109f35760008383838181106108ce576108ce613ec0565b90506020020160208101906108e391906138f3565b73ffffffffffffffffffffffffffffffffffffffff161415610961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6001600b600085858581811061097957610979613ec0565b905060200201602081019061098e91906138f3565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806109eb81613e58565b9150506108b2565b505050565b6105593333612786565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c657220213d2070656e64696e67206f776e657200000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b610b7c6040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b60098281548110610b8f57610b8f613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610be3575b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b60606009805480602002602001604051908101604052809291908181526020016000905b82821015610d4757838290600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610cfd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610cd2575b505050505081526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505081526020019060010190610c74565b50505050905090565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b6000865111610eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f64617461206973206d697373696e67000000000000000000000000000000000060448201526064016105e9565b808210610f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b610f506040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b868152602080820187905260408201869052608082018490526060820185905260a082018390526009805460018101825560009190915282518051849360069093027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0192610fc39284929101906137df565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040812080546110b891600791600191908690811061104357611043613ec0565b90600052602060002001546110589190613e41565b8154811061106857611068613ec0565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020526040902054606090819060ff166110fd576110fa83612bf5565b90505b805173ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812054906111308383613db1565b67ffffffffffffffff81111561114857611148613eef565b6040519080825280602002602001820160405280156111ab57816020015b6111986040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816111665790505b50905060005b828110156112965773ffffffffffffffffffffffffffffffffffffffff871660009081526008602052604090208054600791600191849081106111f6576111f6613ec0565b906000526020600020015461120b9190613e41565b8154811061121b5761121b613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061127857611278613ec0565b6020026020010181905250808061128e90613e58565b9150506111b1565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602052604090205460ff166113255760005b84811015611323578581815181106112e0576112e0613ec0565b60200260200101518382846112f59190613db1565b8151811061130557611305613ec0565b6020026020010181905250808061131b90613e58565b9150506112c6565b505b5095945050505050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146113b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b86858114801561143157508084145b611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f646174612073697a65206d69736d61746368000000000000000000000000000060448201526064016105e9565b818310611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b60005b818110156115805761156e8a8a8381811061152057611520613ec0565b905060200201602081019061153591906138f3565b89898481811061154757611547613ec0565b9050602002013588888581811061156057611560613ec0565b905060200201358787612f5a565b8061157881613e58565b915050611503565b50505050505050505050565b6115963382612786565b5050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b80156117605773ffffffffffffffffffffffffffffffffffffffff82166116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f2061646472657373000000000000000000000000000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8086169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff8416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909116179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6001805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60035473ffffffffffffffffffffffffffffffffffffffff8281169116141561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74207065726d69747465640000000000000000000000000000000000000060448201526064016105e9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb9190613ba1565b905060008111611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7468696e6720746f207265636f766572000000000000000000000000000060448201526064016105e9565b6000546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff90811660048301526024820183905283169063a9059cbb90604401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505050565b60065473ffffffffffffffffffffffffffffffffffffffff16611a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5374616b696e6720636f6e7472616374206e6f7420636f6e666967757265640060448201526064016105e9565b6006546040517f95ba0bee00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906395ba0bee9060240160206040518083038186803b158015611ab457600080fd5b505afa158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec9190613b6b565b611b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f556e61626c6520746f207374616b65000000000000000000000000000000000060448201526064016105e9565b600654600090611b7990339073ffffffffffffffffffffffffffffffffffffffff16612786565b6006546040517fee14613a0000000000000000000000000000000000000000000000000000000081523360048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063ee14613a90604401600060405180830381600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020526040812054815b81811015611cac57611c8e60076001600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061104357611043613ec0565b611c989084613db1565b925080611ca481613e58565b915050611c2f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16611cef57611ce284613197565b611cec9084613db1565b92505b5050919050565b611d286040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60078281548110611d3b57611d3b613ec0565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050919050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611e13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60606000611f1b8484613e41565b611f26906001613db1565b600754909150808410611f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f72616e6765206572726f7200000000000000000000000000000000000000000060448201526064016105e9565b60008267ffffffffffffffff811115611fb057611fb0613eef565b60405190808252806020026020018201604052801561201357816020015b6120006040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081611fce5790505b50905060005b838110156120b857600761202d8289613db1565b8154811061203d5761203d613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061209a5761209a613ec0565b602002602001018190525080806120b090613e58565b915050612019565b50925050505b92915050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff16331461214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156121b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff8216612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff161561231a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5573657220726566756e6465640000000000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff16156123aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f416c726561647920646f6e65000000000000000000000000000000000000000060448201526064016105e9565b60095460005b81811015612735576000600982815481106123cd576123cd613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561244c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612421575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156125775783518051839081106124ae576124ae613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152909116906370a082319060240160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125599190613ba1565b6125639082613db1565b90508161256f81613e58565b925050612492565b801561271e578360400151811115612590575060408301515b600061259c85836133f7565b90508060400151600460008282546125b49190613db1565b909155505060078054600181810183556000838152845160059093027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810193909355602080860180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689860155604080880180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a88015560608901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b88015560808901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9097019690965573ffffffffffffffffffffffffffffffffffffffff8f168085526008845281852097548854968701895597855292909320909301949094559151905191517ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc692612714928252602082015260400190565b60405180910390a2505b50505050808061272d90613e58565b9150506123b0565b505073ffffffffffffffffffffffffffffffffffffffff166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006002805414156127f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105e9565b6002805573ffffffffffffffffffffffffffffffffffffffff8216612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436c61696d2c207468656e206275726e0000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff161580156128d1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b156128df576128df8361228a565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020548061296c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f2076657374696e677320666f72207573657200000000000000000000000060448201526064016105e9565b6000805b82811015612a6c5773ffffffffffffffffffffffffffffffffffffffff861660009081526008602052604081208054600791600191859081106129b5576129b5613ec0565b90600052602060002001546129ca9190613e41565b815481106129da576129da613ec0565b90600052602060002090600502019050612a30816040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b925082816004016000828254612a469190613db1565b90915550612a5690508386613db1565b9450508080612a6490613e58565b915050612970565b8315612ae9578360056000828254612a849190613db1565b90915550612a9490508585613480565b8573ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a85604051612adc91815260200190565b60405180910390a2612b4b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d0000000000000000000000000000000060448201526064016105e9565b505060016002555092915050565b80516000904290811015612b705750600092915050565b8260200151811015612bde576000612ba784600001518560200151612b959190613e41565b8551612ba19085613e41565b90613592565b90508360600151612bcc8286606001518760400151612bc69190613e41565b906135b1565b612bd69190613db1565b925050612be6565b826040015191505b60808301516110b89083613e41565b60095473ffffffffffffffffffffffffffffffffffffffff82166000908152600b60205260409020546060919060ff1680612c2e575080155b15612c96576040805160008082526020820190925290612c8e565b612c7b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612c495790505b509392505050565b6000612ca1846135c6565b67ffffffffffffffff811115612cb957612cb9613eef565b604051908082528060200260200182016040528015612d1c57816020015b612d096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612cd75790505b5090506000805b83821015612f5057600060098381548110612d4057612d40613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015612dbf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612d94575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b82821015612eea578351805183908110612e2157612e21613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152909116906370a082319060240160206040518083038186803b158015612e9457600080fd5b505afa158015612ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecc9190613ba1565b612ed69082613db1565b905081612ee281613e58565b925050612e05565b8015612f39578360400151811115612f03575060408301515b612f0d84826133f7565b878681518110612f1f57612f1f613ec0565b60200260200101819052508480612f3590613e58565b9550505b505050508180612f4890613e58565b925050612d23565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516612fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6130096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60608101859052604081018490528281526020810182905260048054859190600090613036908490613db1565b90915550506007805460018082018355600083815284517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886005909402938401556020808601517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6898501556040808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a86015560608701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b86015560808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9095019490945573ffffffffffffffffffffffffffffffffffffffff8b1680835260088252848320955486549485018755958352918190209092019390935581518781529081018590527ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc6910160405180910390a2505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604081205460ff16156131cd57506000919050565b600954806131de5750600092915050565b60005b81811015611cef576000600982815481106131fe576131fe613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561327d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613252575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156133a85783518051839081106132df576132df613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561335257600080fd5b505afa158015613366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338a9190613ba1565b6133949082613db1565b9050816133a081613e58565b9250506132c3565b80156133e05783604001518111156133c1575060408301515b6133d36133ce85836133f7565b612b59565b6133dd9088613db1565b96505b5050505080806133ef90613e58565b9150506131e1565b6134296040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6080830151815260a083015160208083019190915283015160009061344e9084613e04565b60408301819052606085015190915060649061346a9083613e04565b6134749190613dc9565b60608301525092915050565b6003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156134f457600080fd5b505af1158015613508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352c9190613b6b565b611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f546f6b656e207472616e73666572206661696c6564000000000000000000000060448201526064016105e9565b6000816135a7670de0b6b3a764000085613e04565b6110b89190613dc9565b60006110b88383670de0b6b3a76400006137c0565b600954600090815b81811015611cef576000600982815481106135eb576135eb613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561366a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161363f575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156137955783518051839081106136cc576136cc613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561373f57600080fd5b505afa158015613753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137779190613ba1565b6137819082613db1565b90508161378d81613e58565b9250506136b0565b80156137a957866137a581613e58565b9750505b5050505080806137b890613e58565b9150506135ce565b6000816137cd8486613e04565b6137d79190613dc9565b949350505050565b828054828255906000526020600020908101928215613859579160200282015b8281111561385957825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137ff565b50613865929150613869565b5090565b5b80821115613865576000815560010161386a565b803573ffffffffffffffffffffffffffffffffffffffff811681146138a257600080fd5b919050565b60008083601f8401126138b957600080fd5b50813567ffffffffffffffff8111156138d157600080fd5b6020830191508360208260051b85010111156138ec57600080fd5b9250929050565b60006020828403121561390557600080fd5b6110b88261387e565b6000806040838503121561392157600080fd5b61392a8361387e565b9150602083013561393a81613f1e565b809150509250929050565b6000806040838503121561395857600080fd5b6139618361387e565b946020939093013593505050565b6000806020838503121561398257600080fd5b823567ffffffffffffffff81111561399957600080fd5b6139a5858286016138a7565b90969095509350505050565b60008060008060008060008060a0898b0312156139cd57600080fd5b883567ffffffffffffffff808211156139e557600080fd5b6139f18c838d016138a7565b909a50985060208b0135915080821115613a0a57600080fd5b613a168c838d016138a7565b909850965060408b0135915080821115613a2f57600080fd5b50613a3c8b828c016138a7565b999c989b509699959896976060870135966080013595509350505050565b60008060008060008060c08789031215613a7357600080fd5b863567ffffffffffffffff80821115613a8b57600080fd5b818901915089601f830112613a9f57600080fd5b8135602082821115613ab357613ab3613eef565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108682111715613af657613af6613eef565b604052838152828101945085830182870184018f1015613b1557600080fd5b600096505b84871015613b3f57613b2b8161387e565b865260019690960195948301948301613b1a565b509d918c01359c505060408b01359a60608101359a506080810135995060a00135975095505050505050565b600060208284031215613b7d57600080fd5b81516110b881613f1e565b600060208284031215613b9a57600080fd5b5035919050565b600060208284031215613bb357600080fd5b5051919050565b60008060408385031215613bcd57600080fd5b50508035926020909101359150565b805160c080845281519084018190526000916020919082019060e0860190845b81811015613c2e57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613bfc565b5050828501518387015260408501516040870152606085015160608701526080850151608087015260a085015160a087015280935050505092915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613ccd858351613bdc565b94509285019290850190600101613c93565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613d5957613d4683855180518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b9284019260a09290920191600101613d08565b50909695505050505050565b6020815260006110b86020830184613bdc565b60a081016120be828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60008219821115613dc457613dc4613e91565b500190565b600082613dff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3c57613e3c613e91565b500290565b600082821015613e5357613e53613e91565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8a57613e8a613e91565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461055957600080fdfea26469706673582212200c6b23ef39c0ae2a456b9d96c467ca73ead268fcb3a3da61be0e9d630b51d82564736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102265760003560e01c806391a6de8e1161012a578063d02ffa55116100bd578063e30c39781161008c578063f83d08ba11610071578063f83d08ba146104dd578063fc0d8329146104e5578063fcf4b140146104f857600080fd5b8063e30c3978146104aa578063f4e0d9ac146104ca57600080fd5b8063d02ffa551461044e578063d54ad2a114610461578063d7b4be241461046a578063da638e641461048a57600080fd5b8063b95e099e116100f9578063b95e099e14610403578063c033a49014610416578063cb1a4fc014610439578063cf3090121461044157600080fd5b806391a6de8e146103b55780639a854bc4146103d5578063a262f5f8146103dd578063b242e534146103f057600080fd5b80634e71d92d116101bd578063603e56061161018c5780637a0c6dc0116101715780637a0c6dc014610338578063843277d1146103585780638da5cb5b1461036b57600080fd5b8063603e5606146103125780636f5244b11461032557600080fd5b80634e71d92d146102cd5780634e71e0c8146102d557806355f8b368146102dd5780635ae2a4e1146102fd57600080fd5b80631fb61122116101f95780631fb611221461026c5780633138b0a91461029f57806334671e64146102a75780633860f9d0146102ba57600080fd5b80630614117a1461022b5780631811ba9514610235578063199cbc541461023d57806319ab453c14610259575b600080fd5b61023361050b565b005b61023361055c565b61024660045481565b6040519081526020015b60405180910390f35b6102336102673660046138f3565b610567565b61028f61027a3660046138f3565b600a6020526000908152604090205460ff1681565b6040519015158152602001610250565b600754610246565b6102336102b53660046138f3565b610736565b6102336102c836600461396f565b6107bc565b6102336109f8565b610233610a02565b6102f06102eb366004613b88565b610b43565b6040516102509190613d65565b610305610c50565b6040516102509190613c6c565b610233610320366004613a5a565b610d50565b610246610333366004613945565b611001565b61034b6103463660046138f3565b6110bf565b6040516102509190613cec565b6102336103663660046139b1565b61132f565b60005461039090610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610250565b6003546103909073ffffffffffffffffffffffffffffffffffffffff1681565b600954610246565b6102336103eb3660046138f3565b61158c565b6102336103fe36600461390e565b61159a565b6102336104113660046138f3565b6117a6565b61028f6104243660046138f3565b600b6020526000908152604090205460ff1681565b6102336119cc565b60005461028f9060ff1681565b61024661045c3660046138f3565b611c07565b61024660055481565b6006546103909073ffffffffffffffffffffffffffffffffffffffff1681565b61049d610498366004613b88565b611cf6565b6040516102509190613d78565b6001546103909073ffffffffffffffffffffffffffffffffffffffff1681565b6102336104d83660046138f3565b611d8d565b610233611e5a565b61034b6104f3366004613bba565b611f0d565b61023361050636600461390e565b6120c4565b6000805460405173ffffffffffffffffffffffffffffffffffffffff61010090920491909116914780156108fc02929091818181858888f19350505050158015610559573d6000803e3d6000fd5b50565b6105653361228a565b565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146105f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016105e9565b60035473ffffffffffffffffffffffffffffffffffffffff16156106ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e697420616c726561647920646f6e6500000000000000000000000000000060448201526064016105e9565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166107b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6105598161228a565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156108af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b60005b818110156109f35760008383838181106108ce576108ce613ec0565b90506020020160208101906108e391906138f3565b73ffffffffffffffffffffffffffffffffffffffff161415610961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6001600b600085858581811061097957610979613ec0565b905060200201602081019061098e91906138f3565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806109eb81613e58565b9150506108b2565b505050565b6105593333612786565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c657220213d2070656e64696e67206f776e657200000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b610b7c6040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b60098281548110610b8f57610b8f613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610be3575b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b60606009805480602002602001604051908101604052809291908181526020016000905b82821015610d4757838290600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610cfd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610cd2575b505050505081526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505081526020019060010190610c74565b50505050905090565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b6000865111610eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f64617461206973206d697373696e67000000000000000000000000000000000060448201526064016105e9565b808210610f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b610f506040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b868152602080820187905260408201869052608082018490526060820185905260a082018390526009805460018101825560009190915282518051849360069093027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0192610fc39284929101906137df565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040812080546110b891600791600191908690811061104357611043613ec0565b90600052602060002001546110589190613e41565b8154811061106857611068613ec0565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020526040902054606090819060ff166110fd576110fa83612bf5565b90505b805173ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812054906111308383613db1565b67ffffffffffffffff81111561114857611148613eef565b6040519080825280602002602001820160405280156111ab57816020015b6111986040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816111665790505b50905060005b828110156112965773ffffffffffffffffffffffffffffffffffffffff871660009081526008602052604090208054600791600191849081106111f6576111f6613ec0565b906000526020600020015461120b9190613e41565b8154811061121b5761121b613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061127857611278613ec0565b6020026020010181905250808061128e90613e58565b9150506111b1565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602052604090205460ff166113255760005b84811015611323578581815181106112e0576112e0613ec0565b60200260200101518382846112f59190613db1565b8151811061130557611305613ec0565b6020026020010181905250808061131b90613e58565b9150506112c6565b505b5095945050505050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146113b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b86858114801561143157508084145b611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f646174612073697a65206d69736d61746368000000000000000000000000000060448201526064016105e9565b818310611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b60005b818110156115805761156e8a8a8381811061152057611520613ec0565b905060200201602081019061153591906138f3565b89898481811061154757611547613ec0565b9050602002013588888581811061156057611560613ec0565b905060200201358787612f5a565b8061157881613e58565b915050611503565b50505050505050505050565b6115963382612786565b5050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b80156117605773ffffffffffffffffffffffffffffffffffffffff82166116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f2061646472657373000000000000000000000000000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8086169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff8416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909116179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6001805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60035473ffffffffffffffffffffffffffffffffffffffff8281169116141561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74207065726d69747465640000000000000000000000000000000000000060448201526064016105e9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb9190613ba1565b905060008111611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7468696e6720746f207265636f766572000000000000000000000000000060448201526064016105e9565b6000546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff90811660048301526024820183905283169063a9059cbb90604401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505050565b60065473ffffffffffffffffffffffffffffffffffffffff16611a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5374616b696e6720636f6e7472616374206e6f7420636f6e666967757265640060448201526064016105e9565b6006546040517f95ba0bee00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906395ba0bee9060240160206040518083038186803b158015611ab457600080fd5b505afa158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec9190613b6b565b611b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f556e61626c6520746f207374616b65000000000000000000000000000000000060448201526064016105e9565b600654600090611b7990339073ffffffffffffffffffffffffffffffffffffffff16612786565b6006546040517fee14613a0000000000000000000000000000000000000000000000000000000081523360048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063ee14613a90604401600060405180830381600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020526040812054815b81811015611cac57611c8e60076001600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061104357611043613ec0565b611c989084613db1565b925080611ca481613e58565b915050611c2f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16611cef57611ce284613197565b611cec9084613db1565b92505b5050919050565b611d286040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60078281548110611d3b57611d3b613ec0565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050919050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611e13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60606000611f1b8484613e41565b611f26906001613db1565b600754909150808410611f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f72616e6765206572726f7200000000000000000000000000000000000000000060448201526064016105e9565b60008267ffffffffffffffff811115611fb057611fb0613eef565b60405190808252806020026020018201604052801561201357816020015b6120006040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081611fce5790505b50905060005b838110156120b857600761202d8289613db1565b8154811061203d5761203d613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061209a5761209a613ec0565b602002602001018190525080806120b090613e58565b915050612019565b50925050505b92915050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff16331461214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156121b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff8216612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff161561231a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5573657220726566756e6465640000000000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff16156123aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f416c726561647920646f6e65000000000000000000000000000000000000000060448201526064016105e9565b60095460005b81811015612735576000600982815481106123cd576123cd613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561244c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612421575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156125775783518051839081106124ae576124ae613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152909116906370a082319060240160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125599190613ba1565b6125639082613db1565b90508161256f81613e58565b925050612492565b801561271e578360400151811115612590575060408301515b600061259c85836133f7565b90508060400151600460008282546125b49190613db1565b909155505060078054600181810183556000838152845160059093027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810193909355602080860180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689860155604080880180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a88015560608901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b88015560808901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9097019690965573ffffffffffffffffffffffffffffffffffffffff8f168085526008845281852097548854968701895597855292909320909301949094559151905191517ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc692612714928252602082015260400190565b60405180910390a2505b50505050808061272d90613e58565b9150506123b0565b505073ffffffffffffffffffffffffffffffffffffffff166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006002805414156127f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105e9565b6002805573ffffffffffffffffffffffffffffffffffffffff8216612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436c61696d2c207468656e206275726e0000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff161580156128d1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b156128df576128df8361228a565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020548061296c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f2076657374696e677320666f72207573657200000000000000000000000060448201526064016105e9565b6000805b82811015612a6c5773ffffffffffffffffffffffffffffffffffffffff861660009081526008602052604081208054600791600191859081106129b5576129b5613ec0565b90600052602060002001546129ca9190613e41565b815481106129da576129da613ec0565b90600052602060002090600502019050612a30816040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b925082816004016000828254612a469190613db1565b90915550612a5690508386613db1565b9450508080612a6490613e58565b915050612970565b8315612ae9578360056000828254612a849190613db1565b90915550612a9490508585613480565b8573ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a85604051612adc91815260200190565b60405180910390a2612b4b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d0000000000000000000000000000000060448201526064016105e9565b505060016002555092915050565b80516000904290811015612b705750600092915050565b8260200151811015612bde576000612ba784600001518560200151612b959190613e41565b8551612ba19085613e41565b90613592565b90508360600151612bcc8286606001518760400151612bc69190613e41565b906135b1565b612bd69190613db1565b925050612be6565b826040015191505b60808301516110b89083613e41565b60095473ffffffffffffffffffffffffffffffffffffffff82166000908152600b60205260409020546060919060ff1680612c2e575080155b15612c96576040805160008082526020820190925290612c8e565b612c7b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612c495790505b509392505050565b6000612ca1846135c6565b67ffffffffffffffff811115612cb957612cb9613eef565b604051908082528060200260200182016040528015612d1c57816020015b612d096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612cd75790505b5090506000805b83821015612f5057600060098381548110612d4057612d40613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015612dbf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612d94575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b82821015612eea578351805183908110612e2157612e21613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152909116906370a082319060240160206040518083038186803b158015612e9457600080fd5b505afa158015612ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecc9190613ba1565b612ed69082613db1565b905081612ee281613e58565b925050612e05565b8015612f39578360400151811115612f03575060408301515b612f0d84826133f7565b878681518110612f1f57612f1f613ec0565b60200260200101819052508480612f3590613e58565b9550505b505050508180612f4890613e58565b925050612d23565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516612fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6130096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60608101859052604081018490528281526020810182905260048054859190600090613036908490613db1565b90915550506007805460018082018355600083815284517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886005909402938401556020808601517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6898501556040808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a86015560608701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b86015560808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9095019490945573ffffffffffffffffffffffffffffffffffffffff8b1680835260088252848320955486549485018755958352918190209092019390935581518781529081018590527ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc6910160405180910390a2505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604081205460ff16156131cd57506000919050565b600954806131de5750600092915050565b60005b81811015611cef576000600982815481106131fe576131fe613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561327d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613252575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156133a85783518051839081106132df576132df613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561335257600080fd5b505afa158015613366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338a9190613ba1565b6133949082613db1565b9050816133a081613e58565b9250506132c3565b80156133e05783604001518111156133c1575060408301515b6133d36133ce85836133f7565b612b59565b6133dd9088613db1565b96505b5050505080806133ef90613e58565b9150506131e1565b6134296040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6080830151815260a083015160208083019190915283015160009061344e9084613e04565b60408301819052606085015190915060649061346a9083613e04565b6134749190613dc9565b60608301525092915050565b6003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156134f457600080fd5b505af1158015613508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352c9190613b6b565b611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f546f6b656e207472616e73666572206661696c6564000000000000000000000060448201526064016105e9565b6000816135a7670de0b6b3a764000085613e04565b6110b89190613dc9565b60006110b88383670de0b6b3a76400006137c0565b600954600090815b81811015611cef576000600982815481106135eb576135eb613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561366a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161363f575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156137955783518051839081106136cc576136cc613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561373f57600080fd5b505afa158015613753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137779190613ba1565b6137819082613db1565b90508161378d81613e58565b9250506136b0565b80156137a957866137a581613e58565b9750505b5050505080806137b890613e58565b9150506135ce565b6000816137cd8486613e04565b6137d79190613dc9565b949350505050565b828054828255906000526020600020908101928215613859579160200282015b8281111561385957825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137ff565b50613865929150613869565b5090565b5b80821115613865576000815560010161386a565b803573ffffffffffffffffffffffffffffffffffffffff811681146138a257600080fd5b919050565b60008083601f8401126138b957600080fd5b50813567ffffffffffffffff8111156138d157600080fd5b6020830191508360208260051b85010111156138ec57600080fd5b9250929050565b60006020828403121561390557600080fd5b6110b88261387e565b6000806040838503121561392157600080fd5b61392a8361387e565b9150602083013561393a81613f1e565b809150509250929050565b6000806040838503121561395857600080fd5b6139618361387e565b946020939093013593505050565b6000806020838503121561398257600080fd5b823567ffffffffffffffff81111561399957600080fd5b6139a5858286016138a7565b90969095509350505050565b60008060008060008060008060a0898b0312156139cd57600080fd5b883567ffffffffffffffff808211156139e557600080fd5b6139f18c838d016138a7565b909a50985060208b0135915080821115613a0a57600080fd5b613a168c838d016138a7565b909850965060408b0135915080821115613a2f57600080fd5b50613a3c8b828c016138a7565b999c989b509699959896976060870135966080013595509350505050565b60008060008060008060c08789031215613a7357600080fd5b863567ffffffffffffffff80821115613a8b57600080fd5b818901915089601f830112613a9f57600080fd5b8135602082821115613ab357613ab3613eef565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108682111715613af657613af6613eef565b604052838152828101945085830182870184018f1015613b1557600080fd5b600096505b84871015613b3f57613b2b8161387e565b865260019690960195948301948301613b1a565b509d918c01359c505060408b01359a60608101359a506080810135995060a00135975095505050505050565b600060208284031215613b7d57600080fd5b81516110b881613f1e565b600060208284031215613b9a57600080fd5b5035919050565b600060208284031215613bb357600080fd5b5051919050565b60008060408385031215613bcd57600080fd5b50508035926020909101359150565b805160c080845281519084018190526000916020919082019060e0860190845b81811015613c2e57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613bfc565b5050828501518387015260408501516040870152606085015160608701526080850151608087015260a085015160a087015280935050505092915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613ccd858351613bdc565b94509285019290850190600101613c93565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613d5957613d4683855180518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b9284019260a09290920191600101613d08565b50909695505050505050565b6020815260006110b86020830184613bdc565b60a081016120be828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60008219821115613dc457613dc4613e91565b500190565b600082613dff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3c57613e3c613e91565b500290565b600082821015613e5357613e53613e91565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8a57613e8a613e91565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461055957600080fdfea26469706673582212200c6b23ef39c0ae2a456b9d96c467ca73ead268fcb3a3da61be0e9d630b51d82564736f6c63430008060033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.