ETH Price: $2,024.04 (-1.49%)
 

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
Withdraw238427902025-11-20 21:00:4798 days ago1763672447IN
Kyber: Staking
0 ETH0.000919612.41676337
Withdraw230616202025-08-03 16:06:11207 days ago1754237171IN
Kyber: Staking
0 ETH0.000048330.25985608
Withdraw228606632025-07-06 14:09:35235 days ago1751810975IN
Kyber: Staking
0 ETH0.000552632.97156042
Withdraw223362762025-04-24 3:45:47308 days ago1745466347IN
Kyber: Staking
0 ETH0.00015990.85979855
Withdraw216277892025-01-15 5:26:35407 days ago1736918795IN
Kyber: Staking
0 ETH0.000966292.87651775
Withdraw215039142024-12-28 22:21:35425 days ago1735424495IN
Kyber: Staking
0 ETH0.00074073.98263583
Withdraw214641072024-12-23 8:51:35430 days ago1734943895IN
Kyber: Staking
0 ETH0.000902485.23717872
Withdraw214627062024-12-23 4:08:59430 days ago1734926939IN
Kyber: Staking
0 ETH0.001270526.8310308
Withdraw214201162024-12-17 5:18:59436 days ago1734412739IN
Kyber: Staking
0 ETH0.002694168.45023519
Withdraw213346402024-12-05 6:55:47448 days ago1733381747IN
Kyber: Staking
0 ETH0.0038250214.9
Withdraw212226632024-11-19 15:25:59464 days ago1732029959IN
Kyber: Staking
0 ETH0.0038197319.62812254
Withdraw212111092024-11-18 0:46:59466 days ago1731890819IN
Kyber: Staking
0 ETH0.003345589.95925882
Withdraw210050692024-10-20 6:42:35494 days ago1729406555IN
Kyber: Staking
0 ETH0.001094525.88477373
Withdraw209525472024-10-12 22:37:11502 days ago1728772631IN
Kyber: Staking
0 ETH0.001973726.19058878
Withdraw205215532024-08-13 18:39:59562 days ago1723574399IN
Kyber: Staking
0 ETH0.000502941.49723165
Withdraw204041902024-07-28 9:36:23578 days ago1722159383IN
Kyber: Staking
0 ETH0.000336721.8104856
Withdraw202524442024-07-07 5:08:11599 days ago1720328891IN
Kyber: Staking
0 ETH0.000561511.76117742
Withdraw201419602024-06-21 18:43:35615 days ago1718995415IN
Kyber: Staking
0 ETH0.000834454.48694725
Withdraw197641172024-04-29 23:02:59668 days ago1714431779IN
Kyber: Staking
0 ETH0.00150367.10194039
Withdraw197171822024-04-23 9:24:35674 days ago1713864275IN
Kyber: Staking
0 ETH0.001656877.82588092
Withdraw197047222024-04-21 15:37:47676 days ago1713713867IN
Kyber: Staking
0 ETH0.0033592710
Withdraw196917682024-04-19 20:09:35678 days ago1713557375IN
Kyber: Staking
0 ETH0.002883698.58491359
Withdraw196193482024-04-09 16:43:11688 days ago1712680991IN
Kyber: Staking
0 ETH0.015477646.07594988
Withdraw194990042024-03-23 18:12:11705 days ago1711217531IN
Kyber: Staking
0 ETH0.0042881516.70408336
Withdraw194816592024-03-21 7:49:35707 days ago1711007375IN
Kyber: Staking
0 ETH0.0047691125.64263474
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
-104032482020-07-06 2:43:192062 days ago1594003399  Contract Creation0 ETH
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:
KyberStaking

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 430 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-07-06
*/

// File: contracts/sol6/IERC20.sol

pragma solidity 0.6.6;


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

    function approve(address _spender, uint256 _value) external returns (bool success);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function decimals() external view returns (uint8 digits);

    function totalSupply() external view returns (uint256 supply);
}


// to support backward compatible contract name -- so function signature remains same
abstract contract ERC20 is IERC20 {

}

// File: contracts/sol6/utils/zeppelin/ReentrancyGuard.sol

pragma solidity 0.6.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].
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        // Storing an initial 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 percetange 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.
        _notEntered = true;
    }

    /**
     * @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(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

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

// File: contracts/sol6/Dao/IEpochUtils.sol

pragma solidity 0.6.6;

interface IEpochUtils {
    function epochPeriodInSeconds() external view returns (uint256);

    function firstEpochStartTimestamp() external view returns (uint256);

    function getCurrentEpochNumber() external view returns (uint256);

    function getEpochNumber(uint256 timestamp) external view returns (uint256);
}

// File: contracts/sol6/Dao/IKyberStaking.sol

pragma solidity 0.6.6;



interface IKyberStaking is IEpochUtils {
    event Delegated(
        address indexed staker,
        address indexed representative,
        uint256 indexed epoch,
        bool isDelegated
    );
    event Deposited(uint256 curEpoch, address indexed staker, uint256 amount);
    event Withdraw(uint256 indexed curEpoch, address indexed staker, uint256 amount);

    function initAndReturnStakerDataForCurrentEpoch(address staker)
        external
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        );

    function deposit(uint256 amount) external;

    function delegate(address dAddr) external;

    function withdraw(uint256 amount) external;

    /**
     * @notice return combine data (stake, delegatedStake, representative) of a staker
     * @dev allow to get staker data up to current epoch + 1
     */
    function getStakerData(address staker, uint256 epoch)
        external
        view
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        );

    function getLatestStakerData(address staker)
        external
        view
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        );

    /**
     * @notice return raw data of a staker for an epoch
     *         WARN: should be used only for initialized data
     *          if data has not been initialized, it will return all 0
     *          pool master shouldn't use this function to compute/distribute rewards of pool members
     */
    function getStakerRawData(address staker, uint256 epoch)
        external
        view
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        );
}

// File: contracts/sol6/IKyberDao.sol

pragma solidity 0.6.6;



interface IKyberDao is IEpochUtils {
    event Voted(address indexed staker, uint indexed epoch, uint indexed campaignID, uint option);

    function getLatestNetworkFeeDataWithCache()
        external
        returns (uint256 feeInBps, uint256 expiryTimestamp);

    function getLatestBRRDataWithCache()
        external
        returns (
            uint256 burnInBps,
            uint256 rewardInBps,
            uint256 rebateInBps,
            uint256 epoch,
            uint256 expiryTimestamp
        );

    function handleWithdrawal(address staker, uint256 penaltyAmount) external;

    function vote(uint256 campaignID, uint256 option) external;

    function getLatestNetworkFeeData()
        external
        view
        returns (uint256 feeInBps, uint256 expiryTimestamp);

    function shouldBurnRewardForEpoch(uint256 epoch) external view returns (bool);

    /**
     * @dev  return staker's reward percentage in precision for a past epoch only
     *       fee handler should call this function when a staker wants to claim reward
     *       return 0 if staker has no votes or stakes
     */
    function getPastEpochRewardPercentageInPrecision(address staker, uint256 epoch)
        external
        view
        returns (uint256);

    /**
     * @dev  return staker's reward percentage in precision for the current epoch
     *       reward percentage is not finalized until the current epoch is ended
     */
    function getCurrentEpochRewardPercentageInPrecision(address staker)
        external
        view
        returns (uint256);
}

// File: contracts/sol6/utils/zeppelin/SafeMath.sol

pragma solidity 0.6.6;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

// File: contracts/sol6/Dao/EpochUtils.sol

pragma solidity 0.6.6;



contract EpochUtils is IEpochUtils {
    using SafeMath for uint256;

    uint256 public override epochPeriodInSeconds;
    uint256 public override firstEpochStartTimestamp;

    function getCurrentEpochNumber() public view override returns (uint256) {
        return getEpochNumber(now);
    }

    function getEpochNumber(uint256 timestamp) public view override returns (uint256) {
        if (timestamp < firstEpochStartTimestamp || epochPeriodInSeconds == 0) {
            return 0;
        }
        // ((timestamp - firstEpochStartTimestamp) / epochPeriodInSeconds) + 1;
        return ((timestamp.sub(firstEpochStartTimestamp)).div(epochPeriodInSeconds)).add(1);
    }
}

// File: contracts/sol6/Dao/KyberStaking.sol

pragma solidity 0.6.6;







/**
 * @notice   This contract is using SafeMath for uint, which is inherited from EpochUtils
 *           Some events are moved to interface, easier for public uses
 *           Staking contract will be deployed by KyberDao's contract
 */
contract KyberStaking is IKyberStaking, EpochUtils, ReentrancyGuard {
    struct StakerData {
        uint256 stake;
        uint256 delegatedStake;
        address representative;
    }

    IERC20 public immutable kncToken;
    IKyberDao public immutable kyberDao;

    // staker data per epoch, including stake, delegated stake and representative
    mapping(uint256 => mapping(address => StakerData)) internal stakerPerEpochData;
    // latest data of a staker, including stake, delegated stake, representative
    mapping(address => StakerData) internal stakerLatestData;
    // true/false: if data has been initialized at an epoch for a staker
    mapping(uint256 => mapping(address => bool)) internal hasInited;

    // event is fired if something is wrong with withdrawal
    // even though the withdrawal is still successful
    event WithdrawDataUpdateFailed(uint256 curEpoch, address staker, uint256 amount);

    constructor(
        IERC20 _kncToken,
        uint256 _epochPeriod,
        uint256 _startTimestamp,
        IKyberDao _kyberDao
    ) public {
        require(_epochPeriod > 0, "ctor: epoch period is 0");
        require(_startTimestamp >= now, "ctor: start in the past");
        require(_kncToken != IERC20(0), "ctor: kncToken 0");
        require(_kyberDao != IKyberDao(0), "ctor: kyberDao 0");

        epochPeriodInSeconds = _epochPeriod;
        firstEpochStartTimestamp = _startTimestamp;
        kncToken = _kncToken;
        kyberDao = _kyberDao;
    }

    /**
     * @dev calls to set delegation for msg.sender, will take effect from the next epoch
     * @param newRepresentative address to delegate to
     */
    function delegate(address newRepresentative) external override {
        require(newRepresentative != address(0), "delegate: representative 0");
        address staker = msg.sender;
        uint256 curEpoch = getCurrentEpochNumber();

        initDataIfNeeded(staker, curEpoch);

        address curRepresentative = stakerPerEpochData[curEpoch + 1][staker].representative;
        // nothing changes here
        if (newRepresentative == curRepresentative) {
            return;
        }

        uint256 updatedStake = stakerPerEpochData[curEpoch + 1][staker].stake;

        // reduce delegatedStake for curRepresentative if needed
        if (curRepresentative != staker) {
            initDataIfNeeded(curRepresentative, curEpoch);

            stakerPerEpochData[curEpoch + 1][curRepresentative].delegatedStake =
                stakerPerEpochData[curEpoch + 1][curRepresentative].delegatedStake.sub(updatedStake);
            stakerLatestData[curRepresentative].delegatedStake =
                stakerLatestData[curRepresentative].delegatedStake.sub(updatedStake);

            emit Delegated(staker, curRepresentative, curEpoch, false);
        }

        stakerLatestData[staker].representative = newRepresentative;
        stakerPerEpochData[curEpoch + 1][staker].representative = newRepresentative;

        // ignore if staker is delegating back to himself
        if (newRepresentative != staker) {
            initDataIfNeeded(newRepresentative, curEpoch);
            stakerPerEpochData[curEpoch + 1][newRepresentative].delegatedStake =
                stakerPerEpochData[curEpoch + 1][newRepresentative].delegatedStake.add(updatedStake);
            stakerLatestData[newRepresentative].delegatedStake =
                stakerLatestData[newRepresentative].delegatedStake.add(updatedStake);
            emit Delegated(staker, newRepresentative, curEpoch, true);
        }
    }

    /**
     * @dev call to stake more KNC for msg.sender
     * @param amount amount of KNC to stake
     */
    function deposit(uint256 amount) external override {
        require(amount > 0, "deposit: amount is 0");

        uint256 curEpoch = getCurrentEpochNumber();
        address staker = msg.sender;

        // collect KNC token from staker
        require(
            kncToken.transferFrom(staker, address(this), amount),
            "deposit: can not get token"
        );

        initDataIfNeeded(staker, curEpoch);

        stakerPerEpochData[curEpoch + 1][staker].stake =
            stakerPerEpochData[curEpoch + 1][staker].stake.add(amount);
        stakerLatestData[staker].stake =
            stakerLatestData[staker].stake.add(amount);

        // increase delegated stake for address that staker has delegated to (if it is not staker)
        address representative = stakerPerEpochData[curEpoch + 1][staker].representative;
        if (representative != staker) {
            initDataIfNeeded(representative, curEpoch);
            stakerPerEpochData[curEpoch + 1][representative].delegatedStake =
                stakerPerEpochData[curEpoch + 1][representative].delegatedStake.add(amount);
            stakerLatestData[representative].delegatedStake =
                stakerLatestData[representative].delegatedStake.add(amount);
        }

        emit Deposited(curEpoch, staker, amount);
    }

    /**
     * @dev call to withdraw KNC from staking, it could affect reward when calling KyberDao handleWithdrawal
     * @param amount amount of KNC to withdraw
     */
    function withdraw(uint256 amount) external override nonReentrant {
        require(amount > 0, "withdraw: amount is 0");

        uint256 curEpoch = getCurrentEpochNumber();
        address staker = msg.sender;

        require(
            stakerLatestData[staker].stake >= amount,
            "withdraw: latest amount staked < withdrawal amount"
        );

        (bool success, ) = address(this).call(
            abi.encodeWithSignature(
                "handleWithdrawal(address,uint256,uint256)",
                staker,
                amount,
                curEpoch
            )
        );
        if (!success) {
            // Note: should catch this event to check if something went wrong
            emit WithdrawDataUpdateFailed(curEpoch, staker, amount);
        }

        stakerLatestData[staker].stake = stakerLatestData[staker].stake.sub(amount);

        // transfer KNC back to staker
        require(kncToken.transfer(staker, amount), "withdraw: can not transfer knc");
        emit Withdraw(curEpoch, staker, amount);
    }

    /**
     * @dev initialize data if needed, then return staker's data for current epoch
     * @dev for safe, only allow calling this func from KyberDao address
     * @param staker - staker's address to initialize and get data for
     */
    function initAndReturnStakerDataForCurrentEpoch(address staker)
        external
        override
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        )
    {
        require(
            msg.sender == address(kyberDao),
            "initAndReturnData: only kyberDao"
        );

        uint256 curEpoch = getCurrentEpochNumber();
        initDataIfNeeded(staker, curEpoch);

        StakerData memory stakerData = stakerPerEpochData[curEpoch][staker];
        stake = stakerData.stake;
        delegatedStake = stakerData.delegatedStake;
        representative = stakerData.representative;
    }

    /**
     * @notice return raw data of a staker for an epoch
     *         WARN: should be used only for initialized data
     *          if data has not been initialized, it will return all 0
     *          pool master shouldn't use this function to compute/distribute rewards of pool members
     * @dev  in KyberDao contract, if staker wants to claim reward for past epoch,
     *       we must know the staker's data for that epoch
     *       if the data has not been initialized, it means staker hasn't done any action -> no reward
     */
    function getStakerRawData(address staker, uint256 epoch)
        external
        view
        override
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        )
    {
        StakerData memory stakerData = stakerPerEpochData[epoch][staker];
        stake = stakerData.stake;
        delegatedStake = stakerData.delegatedStake;
        representative = stakerData.representative;
    }

    /**
     * @dev allow to get data up to current epoch + 1
     */
    function getStake(address staker, uint256 epoch) external view returns (uint256) {
        uint256 curEpoch = getCurrentEpochNumber();
        if (epoch > curEpoch + 1) {
            return 0;
        }
        uint256 i = epoch;
        while (true) {
            if (hasInited[i][staker]) {
                return stakerPerEpochData[i][staker].stake;
            }
            if (i == 0) {
                break;
            }
            i--;
        }
        return 0;
    }

    /**
     * @dev allow to get data up to current epoch + 1
     */
    function getDelegatedStake(address staker, uint256 epoch) external view returns (uint256) {
        uint256 curEpoch = getCurrentEpochNumber();
        if (epoch > curEpoch + 1) {
            return 0;
        }
        uint256 i = epoch;
        while (true) {
            if (hasInited[i][staker]) {
                return stakerPerEpochData[i][staker].delegatedStake;
            }
            if (i == 0) {
                break;
            }
            i--;
        }
        return 0;
    }

    /**
     * @dev allow to get data up to current epoch + 1
     */
    function getRepresentative(address staker, uint256 epoch) external view returns (address) {
        uint256 curEpoch = getCurrentEpochNumber();
        if (epoch > curEpoch + 1) {
            return address(0);
        }
        uint256 i = epoch;
        while (true) {
            if (hasInited[i][staker]) {
                return stakerPerEpochData[i][staker].representative;
            }
            if (i == 0) {
                break;
            }
            i--;
        }
        // not delegated to anyone, default to yourself
        return staker;
    }

    /**
     * @notice return combine data (stake, delegatedStake, representative) of a staker
     * @dev allow to get staker data up to current epoch + 1
     */
    function getStakerData(address staker, uint256 epoch)
        external view override
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        )
    {
        stake = 0;
        delegatedStake = 0;
        representative = address(0);

        uint256 curEpoch = getCurrentEpochNumber();
        if (epoch > curEpoch + 1) {
            return (stake, delegatedStake, representative);
        }
        uint256 i = epoch;
        while (true) {
            if (hasInited[i][staker]) {
                stake = stakerPerEpochData[i][staker].stake;
                delegatedStake = stakerPerEpochData[i][staker].delegatedStake;
                representative = stakerPerEpochData[i][staker].representative;
                return (stake, delegatedStake, representative);
            }
            if (i == 0) {
                break;
            }
            i--;
        }
        // not delegated to anyone, default to yourself
        representative = staker;
    }

    function getLatestRepresentative(address staker) external view returns (address) {
        return
            stakerLatestData[staker].representative == address(0)
                ? staker
                : stakerLatestData[staker].representative;
    }

    function getLatestDelegatedStake(address staker) external view returns (uint256) {
        return stakerLatestData[staker].delegatedStake;
    }

    function getLatestStakeBalance(address staker) external view returns (uint256) {
        return stakerLatestData[staker].stake;
    }

    function getLatestStakerData(address staker)
        external view override
        returns (
            uint256 stake,
            uint256 delegatedStake,
            address representative
        )
    {
        stake = stakerLatestData[staker].stake;
        delegatedStake = stakerLatestData[staker].delegatedStake;
        representative = stakerLatestData[staker].representative == address(0)
                ? staker
                : stakerLatestData[staker].representative;
    }

    /**
    * @dev  separate logics from withdraw, so staker can withdraw as long as amount <= staker's deposit amount
            calling this function from withdraw function, ignore reverting
    * @param staker staker that is withdrawing
    * @param amount amount to withdraw
    * @param curEpoch current epoch
    */
    function handleWithdrawal(
        address staker,
        uint256 amount,
        uint256 curEpoch
    ) external {
        require(msg.sender == address(this), "only staking contract");
        initDataIfNeeded(staker, curEpoch);
        // Note: update latest stake will be done after this function
        // update staker's data for next epoch
        stakerPerEpochData[curEpoch + 1][staker].stake =
            stakerPerEpochData[curEpoch + 1][staker].stake.sub(amount);

        address representative = stakerPerEpochData[curEpoch][staker].representative;
        uint256 curStake = stakerPerEpochData[curEpoch][staker].stake;
        uint256 lStakeBal = stakerLatestData[staker].stake.sub(amount);
        uint256 newStake = curStake.min(lStakeBal);
        uint256 reduceAmount = curStake.sub(newStake); // newStake is always <= curStake

        if (reduceAmount > 0) {
            if (representative != staker) {
                initDataIfNeeded(representative, curEpoch);
                // staker has delegated to representative, withdraw will affect representative's delegated stakes
                stakerPerEpochData[curEpoch][representative].delegatedStake =
                    stakerPerEpochData[curEpoch][representative].delegatedStake.sub(reduceAmount);
            }
            stakerPerEpochData[curEpoch][staker].stake = newStake;
            // call KyberDao to reduce reward, if staker has delegated, then pass his representative
            if (address(kyberDao) != address(0)) {
                // don't revert if KyberDao revert so data will be updated correctly
                (bool success, ) = address(kyberDao).call(
                    abi.encodeWithSignature(
                        "handleWithdrawal(address,uint256)",
                        representative,
                        reduceAmount
                    )
                );
                if (!success) {
                    emit WithdrawDataUpdateFailed(curEpoch, staker, amount);
                }
            }
        }
        representative = stakerPerEpochData[curEpoch + 1][staker].representative;
        if (representative != staker) {
            initDataIfNeeded(representative, curEpoch);
            stakerPerEpochData[curEpoch + 1][representative].delegatedStake =
                stakerPerEpochData[curEpoch + 1][representative].delegatedStake.sub(amount);
            stakerLatestData[representative].delegatedStake =
                stakerLatestData[representative].delegatedStake.sub(amount);
        }
    }

    /**
     * @dev initialize data if it has not been initialized yet
     * @param staker staker's address to initialize
     * @param epoch should be current epoch
     */
    function initDataIfNeeded(address staker, uint256 epoch) internal {
        address representative = stakerLatestData[staker].representative;
        if (representative == address(0)) {
            // not delegate to anyone, consider as delegate to yourself
            stakerLatestData[staker].representative = staker;
            representative = staker;
        }

        uint256 ldStake = stakerLatestData[staker].delegatedStake;
        uint256 lStakeBal = stakerLatestData[staker].stake;

        if (!hasInited[epoch][staker]) {
            hasInited[epoch][staker] = true;
            StakerData storage stakerData = stakerPerEpochData[epoch][staker];
            stakerData.representative = representative;
            stakerData.delegatedStake = ldStake;
            stakerData.stake = lStakeBal;
        }

        // whenever stakers deposit/withdraw/delegate, the current and next epoch data need to be updated
        // as the result, we will also initialize data for staker at the next epoch
        if (!hasInited[epoch + 1][staker]) {
            hasInited[epoch + 1][staker] = true;
            StakerData storage nextEpochStakerData = stakerPerEpochData[epoch + 1][staker];
            nextEpochStakerData.representative = representative;
            nextEpochStakerData.delegatedStake = ldStake;
            nextEpochStakerData.stake = lStakeBal;
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20","name":"_kncToken","type":"address"},{"internalType":"uint256","name":"_epochPeriod","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"contract IKyberDao","name":"_kyberDao","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"address","name":"representative","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDelegated","type":"bool"}],"name":"Delegated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curEpoch","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curEpoch","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curEpoch","type":"uint256"},{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawDataUpdateFailed","type":"event"},{"inputs":[{"internalType":"address","name":"newRepresentative","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epochPeriodInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstEpochStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpochNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getDelegatedStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getEpochNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getLatestDelegatedStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getLatestRepresentative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getLatestStakeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getLatestStakerData","outputs":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"address","name":"representative","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getRepresentative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getStakerData","outputs":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"address","name":"representative","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getStakerRawData","outputs":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"address","name":"representative","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"curEpoch","type":"uint256"}],"name":"handleWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"initAndReturnStakerDataForCurrentEpoch","outputs":[{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"address","name":"representative","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kncToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberDao","outputs":[{"internalType":"contract IKyberDao","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405234801561001057600080fd5b50604051611da6380380611da68339818101604052608081101561003357600080fd5b508051602082015160408301516060909301516002805460ff1916600117905591929091826100a9576040805162461bcd60e51b815260206004820152601760248201527f63746f723a2065706f636820706572696f642069732030000000000000000000604482015290519081900360640190fd5b428210156100fe576040805162461bcd60e51b815260206004820152601760248201527f63746f723a20737461727420696e207468652070617374000000000000000000604482015290519081900360640190fd5b6001600160a01b03841661014c576040805162461bcd60e51b815260206004820152601060248201526f063746f723a206b6e63546f6b656e20360841b604482015290519081900360640190fd5b6001600160a01b03811661019a576040805162461bcd60e51b815260206004820152601060248201526f063746f723a206b7962657244616f20360841b604482015290519081900360640190fd5b6000929092556001556001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c611ba86101fe6000398061095d5280610f125280610f87528061154d525080610786528061117552806112c65250611ba86000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063711bbfd9116100ad578063c70d7b6c11610071578063c70d7b6c1461036b578063cfd4766314610373578063d42b72541461039f578063d46684b2146103c5578063f63e7811146103f15761012c565b8063711bbfd9146102c2578063811c7fe2146102f4578063901ab5b2146102fc578063b6b55f2514610328578063b7a13c4c146103455761012c565b80634408d2ba116100f45780634408d2ba146102245780634d8f51051461022c5780635c19a95c146102505780635ee5b4771461027657806360e4f2e01461029c5761012c565b8063072b77f11461013157806316554d62146101695780631c552f00146101bc5780632e1a7d4d146101d957806342ce39cb146101f8575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b03166103f9565b60408051918252519081900360200190f35b6101956004803603604081101561017f57600080fd5b506001600160a01b038135169060200135610418565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b610157600480360360208110156101d257600080fd5b503561047c565b6101f6600480360360208110156101ef57600080fd5b50356104d9565b005b6101956004803603604081101561020e57600080fd5b506001600160a01b03813516906020013561089e565b61015761094b565b61023461095b565b604080516001600160a01b039092168252519081900360200190f35b6101f66004803603602081101561026657600080fd5b50356001600160a01b031661097f565b6102346004803603602081101561028c57600080fd5b50356001600160a01b0316610c95565b610195600480360360208110156102b257600080fd5b50356001600160a01b0316610ce1565b6101f6600480360360608110156102d857600080fd5b506001600160a01b038135169060208101359060400135610d3f565b610234611173565b6102346004803603604081101561031257600080fd5b506001600160a01b038135169060200135611197565b6101f66004803603602081101561033e57600080fd5b5035611233565b6101956004803603602081101561035b57600080fd5b50356001600160a01b031661153e565b610157611635565b6101576004803603604081101561038957600080fd5b506001600160a01b03813516906020013561163b565b610157600480360360208110156103b557600080fd5b50356001600160a01b03166116d4565b610157600480360360408110156103db57600080fd5b506001600160a01b0381351690602001356116f2565b610157611783565b6001600160a01b0381166000908152600460205260409020545b919050565b6000806000610425611b16565b5050506000918252506003602090815260408083206001600160a01b039485168452825291829020825160608101845281548082526001830154938201849052600290920154909416939092018390529092909190565b600060015482108061048e5750600054155b1561049b57506000610413565b6104d360016104c76000546104bb6001548761178990919063ffffffff16565b9063ffffffff6117d216565b9063ffffffff61181416565b92915050565b60025460ff16610530576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002805460ff191690558061058c576040805162461bcd60e51b815260206004820152601560248201527f77697468647261773a20616d6f756e7420697320300000000000000000000000604482015290519081900360640190fd5b600061059661094b565b33600081815260046020526040902054919250908311156105e85760405162461bcd60e51b8152600401808060200182810382526032815260200180611b416032913960400191505060405180910390fd5b604080516001600160a01b038316602482015260448101859052606480820185905282518083039091018152608490910182526020810180516001600160e01b031663711bbfd960e01b17815291518151600093309392918291908083835b602083106106665780518252601f199092019160209182019101610647565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146106c8576040519150601f19603f3d011682016040523d82523d6000602084013e6106cd565b606091505b505090508061071f57604080518481526001600160a01b038416602082015280820186905290517fa412eef5316d3cbf9e2b4ba3d1cf3e482b40dc8946fd919b7f5053450fa621fb9181900360600190a15b6001600160a01b038216600090815260046020526040902054610748908563ffffffff61178916565b6001600160a01b03808416600081815260046020818152604080842096909655855163a9059cbb60e01b8152918201939093526024810189905293517f00000000000000000000000000000000000000000000000000000000000000009093169363a9059cbb936044808301949391928390030190829087803b1580156107ce57600080fd5b505af11580156107e2573d6000803e3d6000fd5b505050506040513d60208110156107f857600080fd5b505161084b576040805162461bcd60e51b815260206004820152601e60248201527f77697468647261773a2063616e206e6f74207472616e73666572206b6e630000604482015290519081900360640190fd5b6040805185815290516001600160a01b0384169185917f9da6493a92039daf47d1f2d7a782299c5994c6323eb1e972f69c432089ec52bf9181900360200190a350506002805460ff191660011790555050565b60008080806108ab61094b565b9050806001018511156108be5750610944565b845b60008181526005602090815260408083206001600160a01b038b16845290915290205460ff161561092b5760009081526003602090815260408083206001600160a01b038a811685529252909120805460018201546002909201549096509094501691506109449050565b806109355761093e565b600019016108c0565b86925050505b9250925092565b60006109564261047c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0381166109da576040805162461bcd60e51b815260206004820152601a60248201527f64656c65676174653a20726570726573656e7461746976652030000000000000604482015290519081900360640190fd5b3360006109e561094b565b90506109f1828261186e565b6001810160009081526003602090815260408083206001600160a01b0380871685529252909120600201548116908416811415610a3057505050610c92565b6001820160009081526003602090815260408083206001600160a01b03808816808652919093529220549190831614610b4757610a6d828461186e565b600180840160009081526003602090815260408083206001600160a01b038716845290915290200154610aa6908263ffffffff61178916565b600180850160009081526003602090815260408083206001600160a01b0388168452825280832084019490945560049052919091200154610aed908263ffffffff61178916565b6001600160a01b0380841660008181526004602090815260408083206001019590955584519182529351879492938916927ffbb976ae5268347766b726bd1edba29af0fe16f9c505fbd3b9a10cb6d00cfa3d928290030190a45b6001600160a01b03808516600081815260046020908152604080832060029081018054968c166001600160a01b0319978816811790915560018a0185526003845282852086865290935292209091018054909316811790925514610c8d57610baf858461186e565b600180840160009081526003602090815260408083206001600160a01b038a16845290915290200154610be8908263ffffffff61181416565b600180850160009081526003602090815260408083206001600160a01b038b168452825280832084019490945560049052919091200154610c2f908263ffffffff61181416565b6001600160a01b0380871660008181526004602090815260409182902060019081019590955581519485529051879492938916927ffbb976ae5268347766b726bd1edba29af0fe16f9c505fbd3b9a10cb6d00cfa3d92908290030190a45b505050505b50565b6001600160a01b0381811660009081526004602052604081206002015490911615610cdd576001600160a01b03808316600090815260046020526040902060020154166104d3565b5090565b6001600160a01b0380821660009081526004602052604081208054600182015460029092015490939192911615610d35576001600160a01b0380851660009081526004602052604090206002015416610d37565b835b929491935050565b333014610d93576040805162461bcd60e51b815260206004820152601560248201527f6f6e6c79207374616b696e6720636f6e74726163740000000000000000000000604482015290519081900360640190fd5b610d9d838261186e565b6001810160009081526003602090815260408083206001600160a01b0387168452909152902054610dd4908363ffffffff61178916565b6001820160009081526003602081815260408084206001600160a01b03808a16808752918452828620969096558685529282528084208385528252808420600281015493855254600490925283205491909316929190610e3a908663ffffffff61178916565b90506000610e4e838363ffffffff611a0416565b90506000610e62848363ffffffff61178916565b9050801561108c57876001600160a01b0316856001600160a01b031614610eea57610e8d858761186e565b60008681526003602090815260408083206001600160a01b0389168452909152902060010154610ec3908263ffffffff61178916565b60008781526003602090815260408083206001600160a01b038a1684529091529020600101555b60008681526003602090815260408083206001600160a01b03808d16855292529091208390557f0000000000000000000000000000000000000000000000000000000000000000161561108c57604080516001600160a01b038781166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663e2346d7160e01b178152925182516000947f000000000000000000000000000000000000000000000000000000000000000093909316939282918083835b60208310610fd15780518252601f199092019160209182019101610fb2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611033576040519150601f19603f3d011682016040523d82523d6000602084013e611038565b606091505b505090508061108a57604080518881526001600160a01b038b1660208201528082018a905290517fa412eef5316d3cbf9e2b4ba3d1cf3e482b40dc8946fd919b7f5053450fa621fb9181900360600190a15b505b6001860160009081526003602090815260408083206001600160a01b03808d16808652919093529220600201541695508514611169576110cc858761186e565b600180870160009081526003602090815260408083206001600160a01b038a16845290915290200154611105908863ffffffff61178916565b600180880160009081526003602090815260408083206001600160a01b038b16845282528083208401949094556004905291909120015461114c908863ffffffff61178916565b6001600160a01b0386166000908152600460205260409020600101555b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806111a261094b565b9050806001018311156111b95760009150506104d3565b825b60008181526005602090815260408083206001600160a01b038916845290915290205460ff16156112175760009081526003602090815260408083206001600160a01b0380891685529252909120600201541691506104d39050565b806112215761122a565b600019016111bb565b50929392505050565b60008111611288576040805162461bcd60e51b815260206004820152601460248201527f6465706f7369743a20616d6f756e742069732030000000000000000000000000604482015290519081900360640190fd5b600061129261094b565b604080516323b872dd60e01b8152336004820181905230602483015260448201869052915192935090916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b505050506040513d602081101561133857600080fd5b505161138b576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a2063616e206e6f742067657420746f6b656e000000000000604482015290519081900360640190fd5b611395818361186e565b6001820160009081526003602090815260408083206001600160a01b03851684529091529020546113cc908463ffffffff61181416565b6001830160009081526003602090815260408083206001600160a01b038616845282528083209390935560049052205461140c908463ffffffff61181416565b6001600160a01b038083166000818152600460209081526040808320959095556001870182526003815284822083835290529290922060020154169081146114f557611458818461186e565b600180840160009081526003602090815260408083206001600160a01b038616845290915290200154611491908563ffffffff61181416565b600180850160009081526003602090815260408083206001600160a01b03871684528252808320840194909455600490529190912001546114d8908563ffffffff61181416565b6001600160a01b0382166000908152600460205260409020600101555b604080518481526020810186905281516001600160a01b038516927f1599c0fcf897af5babc2bfcf707f5dc050f841b044d97c3251ecec35b9abf80b928290030190a250505050565b60008080336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115bf576040805162461bcd60e51b815260206004820181905260248201527f696e6974416e6452657475726e446174613a206f6e6c79206b7962657244616f604482015290519081900360640190fd5b60006115c961094b565b90506115d5858261186e565b6115dd611b16565b5060009081526003602090815260408083206001600160a01b03978816845282529182902082516060810184528154808252600183015493820184905260029092015490971696909201869052909590949350915050565b60015481565b60008061164661094b565b90508060010183111561165d5760009150506104d3565b825b60008181526005602090815260408083206001600160a01b038916845290915290205460ff16156116b65760009081526003602090815260408083206001600160a01b038816845290915290205491506104d39050565b806116c0576116c9565b6000190161165f565b506000949350505050565b6001600160a01b031660009081526004602052604090206001015490565b6000806116fd61094b565b9050806001018311156117145760009150506104d3565b825b60008181526005602090815260408083206001600160a01b038916845290915290205460ff16156117705760009081526003602090815260408083206001600160a01b038816845290915290206001015491506104d39050565b8061177a576116c9565b60001901611716565b60005481565b60006117cb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a1a565b9392505050565b60006117cb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ab1565b6000828201838110156117cb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0380831660009081526004602052604090206002015416806118c057506001600160a01b038216600081815260046020526040902060020180546001600160a01b0319169091179055815b6001600160a01b03831660008181526004602090815260408083206001810154905487855260058452828520958552949092529091205490919060ff1661196c5760008481526005602090815260408083206001600160a01b038981168086529184528285208054600160ff199091168117909155898652600385528386209286529190935292206002810180546001600160a01b031916928716929092179091559081018390558190555b6001840160009081526005602090815260408083206001600160a01b038916845290915290205460ff16610c8d57600193840160008181526005602090815260408083206001600160a01b03998a16808552908352818420805460ff19168a17905593835260038252808320938352929052206002810180546001600160a01b03191694909616939093179094559181019190915555565b6000818310611a1357816117cb565b5090919050565b60008184841115611aa95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a6e578181015183820152602001611a56565b50505050905090810190601f168015611a9b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611b005760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611a6e578181015183820152602001611a56565b506000838581611b0c57fe5b0495945050505050565b6040518060600160405280600081526020016000815260200160006001600160a01b03168152509056fe77697468647261773a206c617465737420616d6f756e74207374616b6564203c207769746864726177616c20616d6f756e74a2646970667358221220e226a6302b84b358849f5b5e0f541d9614dcdad0cedb6d983293d343b124399564736f6c63430006060033000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000005f0d599b00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e9

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063711bbfd9116100ad578063c70d7b6c11610071578063c70d7b6c1461036b578063cfd4766314610373578063d42b72541461039f578063d46684b2146103c5578063f63e7811146103f15761012c565b8063711bbfd9146102c2578063811c7fe2146102f4578063901ab5b2146102fc578063b6b55f2514610328578063b7a13c4c146103455761012c565b80634408d2ba116100f45780634408d2ba146102245780634d8f51051461022c5780635c19a95c146102505780635ee5b4771461027657806360e4f2e01461029c5761012c565b8063072b77f11461013157806316554d62146101695780631c552f00146101bc5780632e1a7d4d146101d957806342ce39cb146101f8575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b03166103f9565b60408051918252519081900360200190f35b6101956004803603604081101561017f57600080fd5b506001600160a01b038135169060200135610418565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b610157600480360360208110156101d257600080fd5b503561047c565b6101f6600480360360208110156101ef57600080fd5b50356104d9565b005b6101956004803603604081101561020e57600080fd5b506001600160a01b03813516906020013561089e565b61015761094b565b61023461095b565b604080516001600160a01b039092168252519081900360200190f35b6101f66004803603602081101561026657600080fd5b50356001600160a01b031661097f565b6102346004803603602081101561028c57600080fd5b50356001600160a01b0316610c95565b610195600480360360208110156102b257600080fd5b50356001600160a01b0316610ce1565b6101f6600480360360608110156102d857600080fd5b506001600160a01b038135169060208101359060400135610d3f565b610234611173565b6102346004803603604081101561031257600080fd5b506001600160a01b038135169060200135611197565b6101f66004803603602081101561033e57600080fd5b5035611233565b6101956004803603602081101561035b57600080fd5b50356001600160a01b031661153e565b610157611635565b6101576004803603604081101561038957600080fd5b506001600160a01b03813516906020013561163b565b610157600480360360208110156103b557600080fd5b50356001600160a01b03166116d4565b610157600480360360408110156103db57600080fd5b506001600160a01b0381351690602001356116f2565b610157611783565b6001600160a01b0381166000908152600460205260409020545b919050565b6000806000610425611b16565b5050506000918252506003602090815260408083206001600160a01b039485168452825291829020825160608101845281548082526001830154938201849052600290920154909416939092018390529092909190565b600060015482108061048e5750600054155b1561049b57506000610413565b6104d360016104c76000546104bb6001548761178990919063ffffffff16565b9063ffffffff6117d216565b9063ffffffff61181416565b92915050565b60025460ff16610530576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002805460ff191690558061058c576040805162461bcd60e51b815260206004820152601560248201527f77697468647261773a20616d6f756e7420697320300000000000000000000000604482015290519081900360640190fd5b600061059661094b565b33600081815260046020526040902054919250908311156105e85760405162461bcd60e51b8152600401808060200182810382526032815260200180611b416032913960400191505060405180910390fd5b604080516001600160a01b038316602482015260448101859052606480820185905282518083039091018152608490910182526020810180516001600160e01b031663711bbfd960e01b17815291518151600093309392918291908083835b602083106106665780518252601f199092019160209182019101610647565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146106c8576040519150601f19603f3d011682016040523d82523d6000602084013e6106cd565b606091505b505090508061071f57604080518481526001600160a01b038416602082015280820186905290517fa412eef5316d3cbf9e2b4ba3d1cf3e482b40dc8946fd919b7f5053450fa621fb9181900360600190a15b6001600160a01b038216600090815260046020526040902054610748908563ffffffff61178916565b6001600160a01b03808416600081815260046020818152604080842096909655855163a9059cbb60e01b8152918201939093526024810189905293517f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2009093169363a9059cbb936044808301949391928390030190829087803b1580156107ce57600080fd5b505af11580156107e2573d6000803e3d6000fd5b505050506040513d60208110156107f857600080fd5b505161084b576040805162461bcd60e51b815260206004820152601e60248201527f77697468647261773a2063616e206e6f74207472616e73666572206b6e630000604482015290519081900360640190fd5b6040805185815290516001600160a01b0384169185917f9da6493a92039daf47d1f2d7a782299c5994c6323eb1e972f69c432089ec52bf9181900360200190a350506002805460ff191660011790555050565b60008080806108ab61094b565b9050806001018511156108be5750610944565b845b60008181526005602090815260408083206001600160a01b038b16845290915290205460ff161561092b5760009081526003602090815260408083206001600160a01b038a811685529252909120805460018201546002909201549096509094501691506109449050565b806109355761093e565b600019016108c0565b86925050505b9250925092565b60006109564261047c565b905090565b7f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e981565b6001600160a01b0381166109da576040805162461bcd60e51b815260206004820152601a60248201527f64656c65676174653a20726570726573656e7461746976652030000000000000604482015290519081900360640190fd5b3360006109e561094b565b90506109f1828261186e565b6001810160009081526003602090815260408083206001600160a01b0380871685529252909120600201548116908416811415610a3057505050610c92565b6001820160009081526003602090815260408083206001600160a01b03808816808652919093529220549190831614610b4757610a6d828461186e565b600180840160009081526003602090815260408083206001600160a01b038716845290915290200154610aa6908263ffffffff61178916565b600180850160009081526003602090815260408083206001600160a01b0388168452825280832084019490945560049052919091200154610aed908263ffffffff61178916565b6001600160a01b0380841660008181526004602090815260408083206001019590955584519182529351879492938916927ffbb976ae5268347766b726bd1edba29af0fe16f9c505fbd3b9a10cb6d00cfa3d928290030190a45b6001600160a01b03808516600081815260046020908152604080832060029081018054968c166001600160a01b0319978816811790915560018a0185526003845282852086865290935292209091018054909316811790925514610c8d57610baf858461186e565b600180840160009081526003602090815260408083206001600160a01b038a16845290915290200154610be8908263ffffffff61181416565b600180850160009081526003602090815260408083206001600160a01b038b168452825280832084019490945560049052919091200154610c2f908263ffffffff61181416565b6001600160a01b0380871660008181526004602090815260409182902060019081019590955581519485529051879492938916927ffbb976ae5268347766b726bd1edba29af0fe16f9c505fbd3b9a10cb6d00cfa3d92908290030190a45b505050505b50565b6001600160a01b0381811660009081526004602052604081206002015490911615610cdd576001600160a01b03808316600090815260046020526040902060020154166104d3565b5090565b6001600160a01b0380821660009081526004602052604081208054600182015460029092015490939192911615610d35576001600160a01b0380851660009081526004602052604090206002015416610d37565b835b929491935050565b333014610d93576040805162461bcd60e51b815260206004820152601560248201527f6f6e6c79207374616b696e6720636f6e74726163740000000000000000000000604482015290519081900360640190fd5b610d9d838261186e565b6001810160009081526003602090815260408083206001600160a01b0387168452909152902054610dd4908363ffffffff61178916565b6001820160009081526003602081815260408084206001600160a01b03808a16808752918452828620969096558685529282528084208385528252808420600281015493855254600490925283205491909316929190610e3a908663ffffffff61178916565b90506000610e4e838363ffffffff611a0416565b90506000610e62848363ffffffff61178916565b9050801561108c57876001600160a01b0316856001600160a01b031614610eea57610e8d858761186e565b60008681526003602090815260408083206001600160a01b0389168452909152902060010154610ec3908263ffffffff61178916565b60008781526003602090815260408083206001600160a01b038a1684529091529020600101555b60008681526003602090815260408083206001600160a01b03808d16855292529091208390557f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e9161561108c57604080516001600160a01b038781166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663e2346d7160e01b178152925182516000947f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e993909316939282918083835b60208310610fd15780518252601f199092019160209182019101610fb2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611033576040519150601f19603f3d011682016040523d82523d6000602084013e611038565b606091505b505090508061108a57604080518881526001600160a01b038b1660208201528082018a905290517fa412eef5316d3cbf9e2b4ba3d1cf3e482b40dc8946fd919b7f5053450fa621fb9181900360600190a15b505b6001860160009081526003602090815260408083206001600160a01b03808d16808652919093529220600201541695508514611169576110cc858761186e565b600180870160009081526003602090815260408083206001600160a01b038a16845290915290200154611105908863ffffffff61178916565b600180880160009081526003602090815260408083206001600160a01b038b16845282528083208401949094556004905291909120015461114c908863ffffffff61178916565b6001600160a01b0386166000908152600460205260409020600101555b5050505050505050565b7f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd20081565b6000806111a261094b565b9050806001018311156111b95760009150506104d3565b825b60008181526005602090815260408083206001600160a01b038916845290915290205460ff16156112175760009081526003602090815260408083206001600160a01b0380891685529252909120600201541691506104d39050565b806112215761122a565b600019016111bb565b50929392505050565b60008111611288576040805162461bcd60e51b815260206004820152601460248201527f6465706f7369743a20616d6f756e742069732030000000000000000000000000604482015290519081900360640190fd5b600061129261094b565b604080516323b872dd60e01b8152336004820181905230602483015260448201869052915192935090916001600160a01b037f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd20016916323b872dd9160648083019260209291908290030181600087803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b505050506040513d602081101561133857600080fd5b505161138b576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a2063616e206e6f742067657420746f6b656e000000000000604482015290519081900360640190fd5b611395818361186e565b6001820160009081526003602090815260408083206001600160a01b03851684529091529020546113cc908463ffffffff61181416565b6001830160009081526003602090815260408083206001600160a01b038616845282528083209390935560049052205461140c908463ffffffff61181416565b6001600160a01b038083166000818152600460209081526040808320959095556001870182526003815284822083835290529290922060020154169081146114f557611458818461186e565b600180840160009081526003602090815260408083206001600160a01b038616845290915290200154611491908563ffffffff61181416565b600180850160009081526003602090815260408083206001600160a01b03871684528252808320840194909455600490529190912001546114d8908563ffffffff61181416565b6001600160a01b0382166000908152600460205260409020600101555b604080518481526020810186905281516001600160a01b038516927f1599c0fcf897af5babc2bfcf707f5dc050f841b044d97c3251ecec35b9abf80b928290030190a250505050565b60008080336001600160a01b037f00000000000000000000000049bdd8854481005bba4acebabf6e06cd5f6312e916146115bf576040805162461bcd60e51b815260206004820181905260248201527f696e6974416e6452657475726e446174613a206f6e6c79206b7962657244616f604482015290519081900360640190fd5b60006115c961094b565b90506115d5858261186e565b6115dd611b16565b5060009081526003602090815260408083206001600160a01b03978816845282529182902082516060810184528154808252600183015493820184905260029092015490971696909201869052909590949350915050565b60015481565b60008061164661094b565b90508060010183111561165d5760009150506104d3565b825b60008181526005602090815260408083206001600160a01b038916845290915290205460ff16156116b65760009081526003602090815260408083206001600160a01b038816845290915290205491506104d39050565b806116c0576116c9565b6000190161165f565b506000949350505050565b6001600160a01b031660009081526004602052604090206001015490565b6000806116fd61094b565b9050806001018311156117145760009150506104d3565b825b60008181526005602090815260408083206001600160a01b038916845290915290205460ff16156117705760009081526003602090815260408083206001600160a01b038816845290915290206001015491506104d39050565b8061177a576116c9565b60001901611716565b60005481565b60006117cb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a1a565b9392505050565b60006117cb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ab1565b6000828201838110156117cb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0380831660009081526004602052604090206002015416806118c057506001600160a01b038216600081815260046020526040902060020180546001600160a01b0319169091179055815b6001600160a01b03831660008181526004602090815260408083206001810154905487855260058452828520958552949092529091205490919060ff1661196c5760008481526005602090815260408083206001600160a01b038981168086529184528285208054600160ff199091168117909155898652600385528386209286529190935292206002810180546001600160a01b031916928716929092179091559081018390558190555b6001840160009081526005602090815260408083206001600160a01b038916845290915290205460ff16610c8d57600193840160008181526005602090815260408083206001600160a01b03998a16808552908352818420805460ff19168a17905593835260038252808320938352929052206002810180546001600160a01b03191694909616939093179094559181019190915555565b6000818310611a1357816117cb565b5090919050565b60008184841115611aa95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a6e578181015183820152602001611a56565b50505050905090810190601f168015611a9b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611b005760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611a6e578181015183820152602001611a56565b506000838581611b0c57fe5b0495945050505050565b6040518060600160405280600081526020016000815260200160006001600160a01b03168152509056fe77697468647261773a206c617465737420616d6f756e74207374616b6564203c207769746864726177616c20616d6f756e74a2646970667358221220e226a6302b84b358849f5b5e0f541d9614dcdad0cedb6d983293d343b124399564736f6c63430006060033

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

000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2000000000000000000000000000000000000000000000000000000000000127500000000000000000000000000000000000000000000000000000000005F0D599B00000000000000000000000049bdd8854481005bBa4aCEbaBF6e06cD5F6312e9

-----Decoded View---------------
Arg [0] : _kncToken (address): 0xdd974D5C2e2928deA5F71b9825b8b646686BD200
Arg [1] : _epochPeriod (uint256): 1209600
Arg [2] : _startTimestamp (uint256): 1594710427
Arg [3] : _kyberDao (address): 0x49bdd8854481005bBa4aCEbaBF6e06cD5F6312e9

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200
Arg [1] : 0000000000000000000000000000000000000000000000000000000000127500
Arg [2] : 000000000000000000000000000000000000000000000000000000005F0D599B
Arg [3] : 00000000000000000000000049bdd8854481005bBa4aCEbaBF6e06cD5F6312e9


Deployed Bytecode Sourcemap

13923:17001:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13923:17001:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;25756:135:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25756:135:0;-1:-1:-1;;;;;25756:135:0;;:::i;:::-;;;;;;;;;;;;;;;;21785:467;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;21785:467:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;21785:467:0;;;;;;;;;;;;;;13204:381;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13204:381:0;;:::i;19192:1079::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19192:1079:0;;:::i;:::-;;24266:1062;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;24266:1062:0;;;;;;;;:::i;13079:117::-;;;:::i;14161:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;14161:35:0;;;;;;;;;;;;;;15619:1930;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15619:1930:0;-1:-1:-1;;;;;15619:1930:0;;:::i;25336:258::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25336:258:0;-1:-1:-1;;;;;25336:258:0;;:::i;25899:503::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25899:503:0;-1:-1:-1;;;;;25899:503:0;;:::i;26740:2581::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;26740:2581:0;;;;;;;;;;;;;:::i;14122:32::-;;;:::i;23505:585::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;23505:585:0;;;;;;;;:::i;17671:1337::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17671:1337:0;;:::i;20527:689::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20527:689:0;-1:-1:-1;;;;;20527:689:0;;:::i;13022:48::-;;;:::i;22333:496::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;22333:496:0;;;;;;;;:::i;25602:146::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25602:146:0;-1:-1:-1;;;;;25602:146:0;;:::i;22910:514::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;22910:514:0;;;;;;;;:::i;12971:44::-;;;:::i;25756:135::-;-1:-1:-1;;;;;25853:24:0;;25826:7;25853:24;;;:16;:24;;;;;:30;25756:135;;;;:::o;21785:467::-;21924:13;21952:22;21989;22039:28;;:::i;:::-;-1:-1:-1;;;22070:25:0;;;;-1:-1:-1;22070:18:0;:25;;;;;;;;-1:-1:-1;;;;;22070:33:0;;;;;;;;;;;22039:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21785:467::o;13204:381::-;13277:7;13313:24;;13301:9;:36;:65;;;-1:-1:-1;13341:20:0;;:25;13301:65;13297:106;;;-1:-1:-1;13390:1:0;13383:8;;13297:106;13501:76;13575:1;13502:67;13548:20;;13503:39;13517:24;;13503:9;:13;;:39;;;;:::i;:::-;13502:45;:67;:45;:67;:::i;:::-;13501:73;:76;:73;:76;:::i;:::-;13494:83;13204:381;-1:-1:-1;;13204:381:0:o;19192:1079::-;2848:11;;;;2840:55;;;;;-1:-1:-1;;;2840:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2973:11;:19;;-1:-1:-1;;2973:19:0;;;19276:10;19268:44:::1;;;::::0;;-1:-1:-1;;;19268:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;19325:16;19344:23;:21;:23::i;:::-;19395:10;19378:14;19440:24:::0;;;:16:::1;:24;::::0;;;;:30;19325:42;;-1:-1:-1;19395:10:0;19440:40;-1:-1:-1;19440:40:0::1;19418:140;;;;-1:-1:-1::0;;;19418:140:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19623:177;::::0;;-1:-1:-1;;;;;19623:177:0;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19623:177:0;;;;;;::::1;25:18:-1::0;::::1;61:17:::0;;-1:-1;;;;;182:15:::1;-1:-1:::0;;;179:29:::1;160:49:::0;;19590:221:0;;;;19572:12:::1;::::0;19598:4:::1;::::0;19623:177;19590:221;;;25:18:-1;19590:221:0;;25:18:-1;36:153:::1;66:2;61:3;58:11;36:153;;176:10:::0;;164:23;;-1:-1;;139:12;;;;98:2:::1;89:12:::0;;::::1;::::0;114::::1;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;19590:221:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;19571:240:0;;;19827:7;19822:175;;19935:50;::::0;;;;;-1:-1:-1;;;;;19935:50:0;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;;::::1;19822:175;-1:-1:-1::0;;;;;20042:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:30;:42:::1;::::0;20077:6;20042:42:::1;:34;:42;:::i;:::-;-1:-1:-1::0;;;;;20009:24:0;;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;:75;;;;20145:33;;-1:-1:-1;;;20145:33:0;;;;::::1;::::0;;;;;;;;;;;;:8:::1;:17:::0;;::::1;::::0;::::1;::::0;:33;;;;;20009:24;20145:33;;;;;;;;;:17;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20145:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20145:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20145:33:0;20137:76:::1;;;::::0;;-1:-1:-1;;;20137:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;20229:34;::::0;;;;;;;-1:-1:-1;;;;;20229:34:0;::::1;::::0;20238:8;;20229:34:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;3153:11:0;:18;;-1:-1:-1;;3153:18:0;3167:4;3153:18;;;-1:-1:-1;;19192:1079:0:o;24266:1062::-;24384:13;;;;24607:23;:21;:23::i;:::-;24588:42;;24653:8;24664:1;24653:12;24645:5;:20;24641:99;;;-1:-1:-1;24682:46:0;;24641:99;24762:5;24778:452;24810:12;;;;:9;:12;;;;;;;;-1:-1:-1;;;;;24810:20:0;;;;;;;;;;;;24806:329;;;24859:21;;;;:18;:21;;;;;;;;-1:-1:-1;;;;;24859:29:0;;;;;;;;;;:35;;24930:44;;;;25010;;;;;24859:35;;-1:-1:-1;24930:44:0;;-1:-1:-1;25010:44:0;;-1:-1:-1;25073:46:0;;-1:-1:-1;25073:46:0;24806:329;25153:6;25149:52;;25180:5;;25149:52;-1:-1:-1;;25215:3:0;24778:452;;;25314:6;25297:23;;24266:1062;;;;;;;;:::o;13079:117::-;13142:7;13169:19;13184:3;13169:14;:19::i;:::-;13162:26;;13079:117;:::o;14161:35::-;;;:::o;15619:1930::-;-1:-1:-1;;;;;15701:31:0;;15693:70;;;;;-1:-1:-1;;;15693:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15791:10;15774:14;15831:23;:21;:23::i;:::-;15812:42;;15867:34;15884:6;15892:8;15867:16;:34::i;:::-;15972:1;15961:12;;15914:25;15942:32;;;:18;:32;;;;;;;;-1:-1:-1;;;;;15942:40:0;;;;;;;;;;:55;;;;;;16045:38;;;;16041:77;;;16100:7;;;;;16041:77;16183:1;16172:12;;16130:20;16153:32;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16153:40:0;;;;;;;;;;;;:46;;16282:27;;;;16278:520;;16326:45;16343:17;16362:8;16326:16;:45::i;:::-;16504:1;16493:12;;;16474:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16474:51:0;;;;;;;;;:66;;:84;;16545:12;16474:84;:70;:84;:::i;:::-;16418:1;16407:12;;;16388:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16388:51:0;;;;;;;;;:66;;:170;;;;16643:16;:35;;;;;;:50;;:68;;16698:12;16643:68;:54;:68;:::i;:::-;-1:-1:-1;;;;;16573:35:0;;;;;;;:16;:35;;;;;;;;:50;;:138;;;;16733:53;;;;;;;16770:8;;16573:35;;16733:53;;;;;;;;;;;16278:520;-1:-1:-1;;;;;16810:24:0;;;;;;;:16;:24;;;;;;;;:39;;;;:59;;;;;-1:-1:-1;;;;;;16810:59:0;;;;;;;;;16899:12;;16880:32;;:18;:32;;;;;:40;;;;;;;;:55;;;:75;;;;;;;;;;17031:27;17027:515;;17075:45;17092:17;17111:8;17075:16;:45::i;:::-;17251:1;17240:12;;;17221:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;17221:51:0;;;;;;;;;:66;;:84;;17292:12;17221:84;:70;:84;:::i;:::-;17165:1;17154:12;;;17135:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;17135:51:0;;;;;;;;;:66;;:170;;;;17390:16;:35;;;;;;:50;;:68;;17445:12;17390:68;:54;:68;:::i;:::-;-1:-1:-1;;;;;17320:35:0;;;;;;;:16;:35;;;;;;;;;:50;;;;:138;;;;17478:52;;;;;;;17515:8;;17320:35;;17478:52;;;;;;;;;;;;17027:515;15619:1930;;;;;;:::o;25336:258::-;-1:-1:-1;;;;;25448:24:0;;;25408:7;25448:24;;;:16;:24;;;;;:39;;;25408:7;;25448:39;:53;:138;;-1:-1:-1;;;;;25547:24:0;;;;;;;:16;:24;;;;;:39;;;;25448:138;;;-1:-1:-1;25521:6:0;25336:258::o;25899:503::-;-1:-1:-1;;;;;26131:24:0;;;26008:13;26131:24;;;:16;:24;;;;;:30;;26189:39;;;;26256;;;;;26131:30;;26189:39;;26008:13;26256:39;:53;:138;;-1:-1:-1;;;;;26355:24:0;;;;;;;:16;:24;;;;;:39;;;;26256:138;;;26329:6;26256:138;25899:503;;;;-1:-1:-1;;25899:503:0:o;26740:2581::-;26878:10;26900:4;26878:27;26870:61;;;;;-1:-1:-1;;;26870:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26942:34;26959:6;26967:8;26942:16;:34::i;:::-;27198:1;27187:12;;27168:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27168:40:0;;;;;;;;;:46;:58;;27219:6;27168:58;:50;:58;:::i;:::-;27136:1;27125:12;;27106:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27106:40:0;;;;;;;;;;;;:120;;;;27264:28;;;;;;;;;:36;;;;;;;;:51;;;;27345:36;;;:42;27418:16;:24;;;;;:30;27264:51;;;;;27345:42;27106:32;27418:42;;27453:6;27418:42;:34;:42;:::i;:::-;27398:62;-1:-1:-1;27471:16:0;27490:23;:8;27398:62;27490:23;:12;:23;:::i;:::-;27471:42;-1:-1:-1;27524:20:0;27547:22;:8;27471:42;27547:22;:12;:22;:::i;:::-;27524:45;-1:-1:-1;27620:16:0;;27616:1192;;27675:6;-1:-1:-1;;;;;27657:24:0;:14;-1:-1:-1;;;;;27657:24:0;;27653:401;;27702:42;27719:14;27735:8;27702:16;:42::i;:::-;27961:28;;;;:18;:28;;;;;;;;-1:-1:-1;;;;;27961:44:0;;;;;;;;;:59;;;:77;;28025:12;27961:77;:63;:77;:::i;:::-;27878:28;;;;:18;:28;;;;;;;;-1:-1:-1;;;;;27878:44:0;;;;;;;;;:59;;:160;27653:401;28068:28;;;;:18;:28;;;;;;;;-1:-1:-1;;;;;28068:36:0;;;;;;;;;;:53;;;28250:8;28242:31;;28238:559;;28444:188;;;-1:-1:-1;;;;;28444:188:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;28444:188:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;28399:252:0;;;;28381:12;;28407:8;28399:22;;;;;28444:188;28399:252;;;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;28399:252:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;28380:271:0;;;28675:7;28670:112;;28712:50;;;;;;-1:-1:-1;;;;;28712:50:0;;;;;;;;;;;;;;;;;;;;;;;28670:112;28238:559;;28865:1;28854:12;;28835:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28835:40:0;;;;;;;;;;;;:55;;;;;-1:-1:-1;28905:24:0;;28901:413;;28946:42;28963:14;28979:8;28946:16;:42::i;:::-;29116:1;29105:12;;;29086:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29086:48:0;;;;;;;;;:63;;:75;;29154:6;29086:75;:67;:75;:::i;:::-;29033:1;29022:12;;;29003:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29003:48:0;;;;;;;;;:63;;:158;;;;29243:16;:32;;;;;;:47;;:59;;29295:6;29243:59;:51;:59;:::i;:::-;-1:-1:-1;;;;;29176:32:0;;;;;;:16;:32;;;;;:47;;:126;28901:413;26740:2581;;;;;;;;:::o;14122:32::-;;;:::o;23505:585::-;23586:7;23606:16;23625:23;:21;:23::i;:::-;23606:42;;23671:8;23682:1;23671:12;23663:5;:20;23659:70;;;23715:1;23700:17;;;;;23659:70;23751:5;23767:235;23799:12;;;;:9;:12;;;;;;;;-1:-1:-1;;;;;23799:20:0;;;;;;;;;;;;23795:112;;;23847:21;;;;:18;:21;;;;;;;;-1:-1:-1;;;;;23847:29:0;;;;;;;;;;:44;;;;;-1:-1:-1;23840:51:0;;-1:-1:-1;23840:51:0;23795:112;23925:6;23921:52;;23952:5;;23921:52;-1:-1:-1;;23987:3:0;23767:235;;;-1:-1:-1;24076:6:0;;23505:585;-1:-1:-1;;;23505:585:0:o;17671:1337::-;17750:1;17741:6;:10;17733:43;;;;;-1:-1:-1;;;17733:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17789:16;17808:23;:21;:23::i;:::-;17946:52;;;-1:-1:-1;;;17946:52:0;;17859:10;17946:52;;;;;;17984:4;17946:52;;;;;;;;;;;;17789:42;;-1:-1:-1;17859:10:0;;-1:-1:-1;;;;;17946:8:0;:21;;;;:52;;;;;;;;;;;;;;17842:14;17946:21;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;17946:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17946:52:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17946:52:0;17924:128;;;;;-1:-1:-1;;;17924:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18065:34;18082:6;18090:8;18065:16;:34::i;:::-;18204:1;18193:12;;18174:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;18174:40:0;;;;;;;;;:46;:58;;18225:6;18174:58;:50;:58;:::i;:::-;18142:1;18131:12;;18112:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;18112:40:0;;;;;;;;;:120;;;;18289:16;:24;;;:30;:42;;18324:6;18289:42;:34;:42;:::i;:::-;-1:-1:-1;;;;;18243:24:0;;;;;;;:16;:24;;;;;;;;:88;;;;18499:1;18488:12;;18469:32;;:18;:32;;;;;:40;;;;;;;;;:55;;;;;18539:24;;18535:413;;18580:42;18597:14;18613:8;18580:16;:42::i;:::-;18750:1;18739:12;;;18720:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;18720:48:0;;;;;;;;;:63;;:75;;18788:6;18720:75;:67;:75;:::i;:::-;18667:1;18656:12;;;18637:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;18637:48:0;;;;;;;;;:63;;:158;;;;18877:16;:32;;;;;;:47;;:59;;18929:6;18877:59;:51;:59;:::i;:::-;-1:-1:-1;;;;;18810:32:0;;;;;;:16;:32;;;;;:47;;:126;18535:413;18965:35;;;;;;;;;;;;;;-1:-1:-1;;;;;18965:35:0;;;;;;;;;;;17671:1337;;;;:::o;20527:689::-;20659:13;;;20796:10;-1:-1:-1;;;;;20818:8:0;20796:31;;20774:113;;;;;-1:-1:-1;;;20774:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20900:16;20919:23;:21;:23::i;:::-;20900:42;;20953:34;20970:6;20978:8;20953:16;:34::i;:::-;21000:28;;:::i;:::-;-1:-1:-1;21031:28:0;;;;:18;:28;;;;;;;;-1:-1:-1;;;;;21031:36:0;;;;;;;;;;;21000:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20527:689:0;-1:-1:-1;;20527:689:0:o;13022:48::-;;;;:::o;22333:496::-;22405:7;22425:16;22444:23;:21;:23::i;:::-;22425:42;;22490:8;22501:1;22490:12;22482:5;:20;22478:61;;;22526:1;22519:8;;;;;22478:61;22561:5;22577:226;22609:12;;;;:9;:12;;;;;;;;-1:-1:-1;;;;;22609:20:0;;;;;;;;;;;;22605:103;;;22657:21;;;;:18;:21;;;;;;;;-1:-1:-1;;;;;22657:29:0;;;;;;;;;:35;;-1:-1:-1;22650:42:0;;-1:-1:-1;22650:42:0;22605:103;22726:6;22722:52;;22753:5;;22722:52;-1:-1:-1;;22788:3:0;22577:226;;;-1:-1:-1;22820:1:0;;22333:496;-1:-1:-1;;;;22333:496:0:o;25602:146::-;-1:-1:-1;;;;;25701:24:0;25674:7;25701:24;;;:16;:24;;;;;:39;;;;25602:146::o;22910:514::-;22991:7;23011:16;23030:23;:21;:23::i;:::-;23011:42;;23076:8;23087:1;23076:12;23068:5;:20;23064:61;;;23112:1;23105:8;;;;;23064:61;23147:5;23163:235;23195:12;;;;:9;:12;;;;;;;;-1:-1:-1;;;;;23195:20:0;;;;;;;;;;;;23191:112;;;23243:21;;;;:18;:21;;;;;;;;-1:-1:-1;;;;;23243:29:0;;;;;;;;;:44;;;;-1:-1:-1;23236:51:0;;-1:-1:-1;23236:51:0;23191:112;23321:6;23317:52;;23348:5;;23317:52;-1:-1:-1;;23383:3:0;23163:235;;12971:44;;;;:::o;8621:136::-;8679:7;8706:43;8710:1;8713;8706:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;8699:50;8621:136;-1:-1:-1;;;8621:136:0:o;10434:132::-;10492:7;10519:39;10523:1;10526;10519:39;;;;;;;;;;;;;;;;;:3;:39::i;8165:181::-;8223:7;8255:5;;;8279:6;;;;8271:46;;;;;-1:-1:-1;;;8271:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29509:1412;-1:-1:-1;;;;;29611:24:0;;;29586:22;29611:24;;;:16;:24;;;;;:39;;;;29665:28;29661:220;;-1:-1:-1;;;;;;29783:24:0;;;;;;:16;:24;;;;;:39;;:48;;-1:-1:-1;;;;;;29783:48:0;;;;;;29825:6;29661:220;-1:-1:-1;;;;;29911:24:0;;29893:15;29911:24;;;:16;:24;;;;;;;;:39;;;;29981:30;;30029:16;;;:9;:16;;;;;:24;;;;;;;;;;;29911:39;;29981:30;30029:24;;30024:319;;30070:16;;;;:9;:16;;;;;;;;-1:-1:-1;;;;;30070:24:0;;;;;;;;;;;;:31;;30097:4;-1:-1:-1;;30070:31:0;;;;;;;;30148:25;;;:18;:25;;;;;:33;;;;;;;;;30196:25;;;:42;;-1:-1:-1;;;;;;30196:42:0;;;;;;;;;;;30253:25;;;:35;;;30303:28;;;30024:319;30570:1;30562:9;;30552:20;;;;:9;:20;;;;;;;;-1:-1:-1;;;;;30552:28:0;;;;;;;;;;;;30547:367;;30628:4;30607:9;;;30597:20;;;;:9;:20;;;;;;;;-1:-1:-1;;;;;30597:28:0;;;;;;;;;;;;:35;;-1:-1:-1;;30597:35:0;;;;;30688:29;;;:18;:29;;;;;:37;;;;;;;30740:34;;;:51;;-1:-1:-1;;;;;;30740:51:0;;;;;;;;;;;;30806:34;;;:44;;;;30865:37;29509:1412::o;12705:106::-;12763:7;12794:1;12790;:5;:13;;12802:1;12790:13;;;-1:-1:-1;12798:1:0;;12705:106;-1:-1:-1;12705:106:0:o;9052:192::-;9138:7;9174:12;9166:6;;;;9158:29;;;;-1:-1:-1;;;9158:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9158:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9210:5:0;;;9052:192::o;11054:345::-;11140:7;11242:12;11235:5;11227:28;;;;-1:-1:-1;;;11227:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11227:28:0;;11266:9;11282:1;11278;:5;;;;;;;11054:345;-1:-1:-1;;;;;11054:345:0:o;13923:17001::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13923:17001:0;;;;;:::o

Swarm Source

ipfs://e226a6302b84b358849f5b5e0f541d9614dcdad0cedb6d983293d343b1243995

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Kyber's staking contract.

Loading...
Loading
[ Download: CSV Export  ]
[ 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.