Contract 0x25d28a24Ceb6F81015bB0b2007D795ACAc411b4d 8

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x7f020fc23fd0d03f74535418fed1c0e76597e81ab982c9360e8b5d5ce4331459Unstake433702732023-05-31 14:02:492 hrs 32 mins ago0x130d88903f9926ad7c1eba2962c8b1b64bccd821 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.014573769834 173.276538627
0x639027508c4a6e292e9d7d7fa9d3f560efd450eae12a7396702fbda44ad6d332Unstake433698532023-05-31 13:47:232 hrs 47 mins ago0x7ba201929696ab9408e5fb2d8fcf86c0b6326555 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.012840917296 152.673585984
0xa623bb3646a2bc6830ce73f9bdcb7e752892932a0bda9a5342ed4bc40ea075a8Unstake433681252023-05-31 12:45:593 hrs 49 mins ago0x9c29adae0bf1295409e5aa40fe8bd88f00f46c96 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.013433642198 151.11808536
0xf513b9977e4b4e1690697989e2d3c3abaae63712b01dc9c942ec97fd4176a3b9Unstake433676952023-05-31 12:30:324 hrs 4 mins ago0x8efaea6e228e3636676812f79ea658d4fe89a31c IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.014100678254 167.675584213
0xc0067dbce4db4e93bd6d52e0d98098064082676dd39f7b00c9d0510a7671fd7cUnstake433664502023-05-31 11:46:284 hrs 48 mins ago0xffebacd5668754d2bf0dfbf55d35fd2832907782 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.015836222347 199.712747929
0xe31d95936254cec1057670e11b05de4b3b8bf939964c853a9b66d8dc13481992Unstake433627682023-05-31 9:34:297 hrs ago0x8503f24b34b5c20b79080f9971dbaea9aac18708 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.012784184688 151.999057013
0x8283f727665b3f4be34006ff1e23ffe5d3b03bb87146502d1dce395c79a3dc1eUnstake433626752023-05-31 9:31:117 hrs 4 mins ago0x71de69f40c9f0327b9c53769e1fdc0c34137f484 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.012599285567 149.822053246
0x32232813a5a5544d83532ea230a779c9e085922fd4aeb5c8169790117ab3e80bUnstake433615722023-05-31 8:51:507 hrs 43 mins ago uf9vyahc.nft  IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.013793827635 164.026727339
0x30060678302bbb0dddcd7f524fa6e0819862d61eeabc692b25d7b5032f3c6338Unstake433613352023-05-31 8:43:257 hrs 51 mins ago0x6a7c8e3d69c50b0899147cb21841364de5118c23 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.015612620889 185.654567923
0xacda909d95e18060ba611668433caf0e094914763509703a97c14b35d964a857Unstake433598052023-05-31 7:49:068 hrs 46 mins ago0xee4500d45865c63ce5edcbfca755335afac6e7f7 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.017446541206196.260095692
0xfa9fba7da4b684ee390b4f8694243a13116a74494dfbfb1f284945843851afd3Unstake433563532023-05-31 5:45:3110 hrs 49 mins ago0x33f6acc9c25e146491507d5a83dd7fa70943b626 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.013560267804 161.226387874
0xa0b8d026c95db4d5fcf993d305715e464447cd40b4f00cf1630a9c455a418a39Unstake433525642023-05-31 3:29:3113 hrs 5 mins ago0x70a71d20429b449a5adb977bccbbd282dd1bbdd3 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.012042512759 151.869761767
0x82653c58c82b39fd8ea02c50bf988485997b1c5763a08c245a8c1e0583803510Unstake433503162023-05-31 2:09:2014 hrs 25 mins ago0x921850f3356474bcf7843b95fcb41835a5116fcf IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.01746647622 196.43131637
0x20221a204a05a0c026bc3b8a0653a047075e3a9f4c253c151a9af2cea982abb6Unstake433500202023-05-31 1:58:5214 hrs 36 mins ago migz66degenpl.nft  IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.012579832271149.56938509
0xffd7a14f93ac6e0dc148d89933abbb473e2d7262ea6084fbcf4899eb8a245affUnstake433487022023-05-31 1:10:4115 hrs 24 mins ago0x3e8bba7fbbe533608f4b02a3aeb595e290f021d0 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.011686850018 147.406758299
0xf473e394e4b113dce3fc073dbe9749596a048841baee3da22bf9911f6c9d432eUnstake433447242023-05-30 22:46:3317 hrs 48 mins ago0x12166f75ca07e403a7f8c79997e991195878b232 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.012491565248 148.541117168
0x1215630b5e91d9393733715aa004d24733b2b5c268df16b557a21df5de3cafdcUnstake433387162023-05-30 19:09:0621 hrs 26 mins ago0x95d51a959994682f647af2a39f277707a1458333 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.010441767912 155.831001425
0x5fa76d13b7ae3956e944f4f4f26323347a5412dada58367bac5d449db699106cUnstake433385462023-05-30 19:03:0621 hrs 32 mins ago0x5992a8e52a9fda90342eb66e6fcef44b41137fa1 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.01761998254 198.184423508
0xf49cfa51e537ea5d70b5187c825de47c25b8316263a104add806497899292420Unstake433363362023-05-30 17:42:3222 hrs 52 mins ago0x69e8e7228dc1205fa424999aa4ff2389c088adff IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.013139121083 156.19682929
0xd9c1d3fea5d9f2d2bb48460c30b9371a03f85884f403a52fb20e84e319c06bdaUnstake433343252023-05-30 16:30:531 day 4 mins ago0x812d006b4c772d0e09ebb3e132e248829070150b IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.015779978027 199.00344319
0x70b3d7f96d34addb8fb40a68a4e6d84b4e8c86180f080343a08b8ed9c5dab19dUnstake433328082023-05-30 15:37:041 day 58 mins ago0x98d52c0132eaea5345467d492ab46a4d1df5bc3e IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.019148587227227.66936435
0xdea22db69c229a7bc6d7159fb1e3543c170c462eb88a4a1dd29a2fdc8220c40bUnstake433324422023-05-30 15:23:531 day 1 hr ago0xb97ca5fcb3130e4428ba67790fe9a92c2a12191b IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.019203559958 228.355549779
0x51bd857077ba885d14420d9744030fc2e509ca9a57b12749a50614c8274809a7Unstake433311782023-05-30 14:39:061 day 1 hr ago0x882cf5331cdb3395d2ce1c97cb1120e0a034dcf3 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.025219367615 299.891403954
0x3545d25528d539872d2eda57ab28925973f9a4324b3ac4cc841120893d0aeb82Unstake433269722023-05-30 12:07:381 day 4 hrs ago0x485e5b0f2c66fcc2a1264082345497df19979899 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.021180853923251.796311462
0x2521303fa07c104f8665802a3c60a55a3bac77477f2e98510861ea7e93141763Unstake433263202023-05-30 11:43:081 day 4 hrs ago0x7fd73178659fd75fa2c047761beda70ba6a5ea08 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.01714128012 192.800118329
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KlimaStaking

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-10-17
*/

/**
 *Submitted for verification at Etherscan.io on 2021-06-12
*/

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

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) {
        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;
    }
}

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

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

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

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

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

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

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

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    /**
       * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
       * but performing a static call.
       *
       * _Available since v3.3._
       */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function addressToString(address _address) internal pure returns(string memory) {
        bytes32 _bytes = bytes32(uint256(_address));
        bytes memory HEX = "0123456789abcdef";
        bytes memory _addr = new bytes(42);

        _addr[0] = '0';
        _addr[1] = 'x';

        for(uint256 i = 0; i < 20; i++) {
            _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
            _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
        }

        return string(_addr);

    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface IOwnable {
    function manager() external view returns (address);

    function renounceManagement() external;

    function pushManagement( address newOwner_ ) external;

    function pullManagement() external;
}

contract Ownable is IOwnable {

    address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
    event OwnershipPulled(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipPushed( address(0), _owner );
    }

    function manager() public view override returns (address) {
        return _owner;
    }

    modifier onlyManager() {
        require( _owner == msg.sender, "Ownable: caller is not the owner" );
        _;
    }

    function renounceManagement() public virtual override onlyManager() {
        emit OwnershipPushed( _owner, address(0) );
        _owner = address(0);
    }

    function pushManagement( address newOwner_ ) public virtual override onlyManager() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed( _owner, newOwner_ );
        _newOwner = newOwner_;
    }

    function pullManagement() public virtual override {
        require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled( _owner, _newOwner );
        _owner = _newOwner;
    }
}

interface IsKLIMA {
    function rebase( uint256 klimaProfit_, uint epoch_) external returns (uint256);

    function circulatingSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function gonsForBalance( uint amount ) external view returns ( uint );

    function balanceForGons( uint gons ) external view returns ( uint );

    function index() external view returns ( uint );
}

interface IWarmup {
    function retrieve( address staker_, uint amount_ ) external;
}

interface IDistributor {
    function distribute() external returns ( bool );
}

contract KlimaStaking is Ownable {

    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    address public immutable KLIMA;
    address public immutable sKLIMA;

    struct Epoch {
        uint length;
        uint number;
        uint endBlock;
        uint distribute;
    }
    Epoch public epoch;

    address public distributor;

    address public locker;
    uint public totalBonus;

    address public warmupContract;
    uint public warmupPeriod;

    constructor (
        address _KLIMA,
        address _sKLIMA,
        uint _epochLength,
        uint _firstEpochNumber,
        uint _firstEpochBlock
    ) {
        require( _KLIMA != address(0) );
        KLIMA = _KLIMA;
        require( _sKLIMA != address(0) );
        sKLIMA = _sKLIMA;

        epoch = Epoch({
        length: _epochLength,
        number: _firstEpochNumber,
        endBlock: _firstEpochBlock,
        distribute: 0
        });
    }

    struct Claim {
        uint deposit;
        uint gons;
        uint expiry;
        bool lock; // prevents malicious delays
    }
    mapping( address => Claim ) public warmupInfo;

    /**
        @notice stake KLIMA to enter warmup
        @param _amount uint
        @return bool
     */
    function stake( uint _amount, address _recipient ) external returns ( bool ) {
        rebase();

        IERC20( KLIMA ).safeTransferFrom( msg.sender, address(this), _amount );

        Claim memory info = warmupInfo[ _recipient ];
        require( !info.lock, "Deposits for account are locked" );

        warmupInfo[ _recipient ] = Claim ({
        deposit: info.deposit.add( _amount ),
        gons: info.gons.add( IsKLIMA( sKLIMA ).gonsForBalance( _amount ) ),
        expiry: epoch.number.add( warmupPeriod ),
        lock: false
        });

        IERC20( sKLIMA ).safeTransfer( warmupContract, _amount );
        return true;
    }

    /**
        @notice retrieve sKLIMA from warmup
        @param _recipient address
     */
    function claim ( address _recipient ) public {
        Claim memory info = warmupInfo[ _recipient ];
        if ( epoch.number >= info.expiry && info.expiry != 0 ) {
            delete warmupInfo[ _recipient ];
            IWarmup( warmupContract ).retrieve( _recipient, IsKLIMA( sKLIMA ).balanceForGons( info.gons ) );
        }
    }

    /**
        @notice forfeit sKLIMA in warmup and retrieve KLIMA
     */
    function forfeit() external {
        Claim memory info = warmupInfo[ msg.sender ];
        delete warmupInfo[ msg.sender ];

        IWarmup( warmupContract ).retrieve( address(this), IsKLIMA( sKLIMA ).balanceForGons( info.gons ) );
        IERC20( KLIMA ).safeTransfer( msg.sender, info.deposit );
    }

    /**
        @notice prevent new deposits to address (protection from malicious activity)
     */
    function toggleDepositLock() external {
        warmupInfo[ msg.sender ].lock = !warmupInfo[ msg.sender ].lock;
    }

    /**
        @notice redeem sKLIMA for KLIMA
        @param _amount uint
        @param _trigger bool
     */
    function unstake( uint _amount, bool _trigger ) external {
        if ( _trigger ) {
            rebase();
        }
        IERC20( sKLIMA ).safeTransferFrom( msg.sender, address(this), _amount );
        IERC20( KLIMA ).safeTransfer( msg.sender, _amount );
    }

    /**
        @notice returns the sKLIMA index, which tracks rebase growth
        @return uint
     */
    function index() public view returns ( uint ) {
        return IsKLIMA( sKLIMA ).index();
    }

    /**
        @notice trigger rebase if epoch over
     */
    function rebase() public {
        if( epoch.endBlock <= block.number ) {

            IsKLIMA( sKLIMA ).rebase( epoch.distribute, epoch.number );

            epoch.endBlock = epoch.endBlock.add( epoch.length );
            epoch.number++;

            if ( distributor != address(0) ) {
                IDistributor( distributor ).distribute();
            }

            uint balance = contractBalance();
            uint staked = IsKLIMA( sKLIMA ).circulatingSupply();

            if( balance <= staked ) {
                epoch.distribute = 0;
            } else {
                epoch.distribute = balance.sub( staked );
            }
        }
    }

    /**
        @notice returns contract KLIMA holdings, including bonuses provided
        @return uint
     */
    function contractBalance() public view returns ( uint ) {
        return IERC20( KLIMA ).balanceOf( address(this) ).add( totalBonus );
    }

    /**
        @notice provide bonus to locked staking contract
        @param _amount uint
     */
    function giveLockBonus( uint _amount ) external {
        require( msg.sender == locker );
        totalBonus = totalBonus.add( _amount );
        IERC20( sKLIMA ).safeTransfer( locker, _amount );
    }

    /**
        @notice reclaim bonus from locked staking contract
        @param _amount uint
     */
    function returnLockBonus( uint _amount ) external {
        require( msg.sender == locker );
        totalBonus = totalBonus.sub( _amount );
        IERC20( sKLIMA ).safeTransferFrom( locker, address(this), _amount );
    }

    enum CONTRACTS { DISTRIBUTOR, WARMUP, LOCKER }

    /**
        @notice sets the contract address for LP staking
        @param _contract address
     */
    function setContract( CONTRACTS _contract, address _address ) external onlyManager() {
        if( _contract == CONTRACTS.DISTRIBUTOR ) { // 0
            distributor = _address;
        } else if ( _contract == CONTRACTS.WARMUP ) { // 1
            require( warmupContract == address( 0 ), "Warmup cannot be set more than once" );
            warmupContract = _address;
        } else if ( _contract == CONTRACTS.LOCKER ) { // 2
            require( locker == address(0), "Locker cannot be set more than once" );
            locker = _address;
        }
    }

    /**
     * @notice set warmup period for new stakers
     * @param _warmupPeriod uint
     */
    function setWarmup( uint _warmupPeriod ) external onlyManager() {
        warmupPeriod = _warmupPeriod;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_KLIMA","type":"address"},{"internalType":"address","name":"_sKLIMA","type":"address"},{"internalType":"uint256","name":"_epochLength","type":"uint256"},{"internalType":"uint256","name":"_firstEpochNumber","type":"uint256"},{"internalType":"uint256","name":"_firstEpochBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"KLIMA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"distribute","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forfeit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveLockBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"returnLockBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sKLIMA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum KlimaStaking.CONTRACTS","name":"_contract","type":"uint8"},{"internalType":"address","name":"_address","type":"address"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_warmupPeriod","type":"uint256"}],"name":"setWarmup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleDepositLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_trigger","type":"bool"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"warmupContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"warmupInfo","outputs":[{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"gons","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"lock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c060405234801561001057600080fd5b506040516119d13803806119d1833981810160405260a081101561003357600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b0385166100af57600080fd5b6001600160601b0319606086901b166080526001600160a01b0384166100d457600080fd5b6001600160601b0319606094851b1660a0526040805160808101825284815260208101849052908101829052600094018490526002929092556003556004556005555060805160601c60a05160601c61184b6101866000398061040b52806105a55280610686528061080c5280610a0f5280610b1b5280610dc25280610e2f5280610f8a528061117552806112bd5250806109195280610cd25280610df752806110aa528061125c525061184b6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80638f077b83116100de578063c9f464ff11610097578063e3ed12a011610071578063e3ed12a01461039e578063ed4acaa8146103a6578063f3d86e4a146103ae578063f62ae76a146103b657610173565b8063c9f464ff14610371578063d7b96d4e1461038e578063deac361a1461039657610173565b80638f077b83146102fe578063900cf0cf146103065780639ebea88c14610334578063a8dd07dc14610359578063af14052c14610361578063bfe109281461036957610173565b806358d0c5171161013057806358d0c517146102295780635a96ac0a146102315780636746f4c2146102395780637acb775714610287578063865e6fd3146102c75780638b7afe2e146102f657610173565b806303c2367014610178578063089208d8146101975780631e83409a1461019f5780632986c0e5146101c557806346f68ee9146101df578063481c6a7514610205575b600080fd5b6101956004803603602081101561018e57600080fd5b50356103d3565b005b610195610437565b610195600480360360208110156101b557600080fd5b50356001600160a01b03166104ce565b6101cd610682565b60408051918252519081900360200190f35b610195600480360360208110156101f557600080fd5b50356001600160a01b031661070e565b61020d6107fb565b604080516001600160a01b039092168252519081900360200190f35b61020d61080a565b61019561082e565b61025f6004803603602081101561024f57600080fd5b50356001600160a01b03166108d8565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b6102b36004803603604081101561029d57600080fd5b50803590602001356001600160a01b0316610902565b604080519115158252519081900360200190f35b610195600480360360408110156102dd57600080fd5b50803560ff1690602001356001600160a01b0316610b4e565b6101cd610cc8565b610195610d74565b61030e610d98565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6101956004803603604081101561034a57600080fd5b50803590602001351515610da7565b6101cd610e1e565b610195610e24565b61020d611032565b6101956004803603602081101561038757600080fd5b5035611041565b61020d611093565b6101cd6110a2565b61020d6110a8565b61020d6110cc565b6101956110db565b610195600480360360208110156103cc57600080fd5b5035611285565b6007546001600160a01b031633146103ea57600080fd5b6008546103f790826112e7565b600855600754610434906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611348565b50565b6000546001600160a01b03163314610484576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6104d6611713565b506001600160a01b0381166000908152600b6020908152604091829020825160808101845281548152600182015492810192909252600281015492820183905260039081015460ff16151560608301525490911180159061053a5750604081015115155b1561067e576001600160a01b038083166000908152600b602090815260408083208381556001810184905560028101939093556003909201805460ff19169055600954848201518351637965d56d60e01b8152600481019190915292519084169363c3a2a6659387937f000000000000000000000000000000000000000000000000000000000000000090921692637965d56d92602480840193919291829003018186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b505050505b5050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632986c0e56040518163ffffffff1660e01b815260040160206040518083038186803b1580156106dd57600080fd5b505afa1580156106f1573d6000803e3d6000fd5b505050506040513d602081101561070757600080fd5b5051905090565b6000546001600160a01b0316331461075b576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b6001600160a01b0381166107a05760405162461bcd60e51b81526004018080602001828103825260268152602001806117616026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633146108775760405162461bcd60e51b81526004018080602001828103825260228152602001806117aa6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600b6020526000908152604090208054600182015460028301546003909301549192909160ff1684565b600061090c610e24565b6109416001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308661139f565b610949611713565b506001600160a01b0382166000908152600b602090815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff1615801560608301526109ec576040805162461bcd60e51b815260206004820152601f60248201527f4465706f7369747320666f72206163636f756e7420617265206c6f636b656400604482015290519081900360640190fd5b604080516080810190915281518190610a0590876112e7565b8152602001610aa87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631bd39674886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b50516020850151906112e7565b8152600a54600354602090920191610abf916112e7565b8152600060209182018190526001600160a01b038681168252600b8352604091829020845181559284015160018401559083015160028301556060909201516003909101805460ff1916911515919091179055600954610b44917f00000000000000000000000000000000000000000000000000000000000000008116911686611348565b5060019392505050565b6000546001600160a01b03163314610b9b576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b6000826002811115610ba957fe5b1415610bcf57600680546001600160a01b0319166001600160a01b03831617905561067e565b6001826002811115610bdd57fe5b1415610c4b576009546001600160a01b031615610c2b5760405162461bcd60e51b81526004018080602001828103825260238152602001806117876023913960400191505060405180910390fd5b600980546001600160a01b0319166001600160a01b03831617905561067e565b6002826002811115610c5957fe5b141561067e576007546001600160a01b031615610ca75760405162461bcd60e51b815260040180806020018281038252602381526020018061173e6023913960400191505060405180910390fd5b600780546001600160a01b0383166001600160a01b03199091161790555050565b6000610d6f6008547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d3d57600080fd5b505afa158015610d51573d6000803e3d6000fd5b505050506040513d6020811015610d6757600080fd5b5051906112e7565b905090565b336000908152600b60205260409020600301805460ff19811660ff90911615179055565b60025460035460045460055484565b8015610db557610db5610e24565b610dea6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308561139f565b61067e6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163384611348565b60085481565b6004544310611030577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663058ecdb46002600301546002600101546040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b158015610ea557600080fd5b505af1158015610eb9573d6000803e3d6000fd5b505050506040513d6020811015610ecf57600080fd5b5050600254600454610ee0916112e7565b6004556003805460010190556006546001600160a01b031615610f7a57600660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f4d57600080fd5b505af1158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b50505b6000610f84610cc8565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d602081101561100b57600080fd5b5051905080821161102057600060055561067e565b61102a82826113ff565b60055550505b565b6006546001600160a01b031681565b6000546001600160a01b0316331461108e576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b600a55565b6007546001600160a01b031681565b600a5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6009546001600160a01b031681565b6110e3611713565b50336000818152600b602081815260408084208151608081018352815481526001820180548286019081526002840180548487015260038501805460ff8116151560608701529a8a5297875293889055908790559590915560ff1990951690925560095492518251637965d56d60e01b8152600481019190915291516001600160a01b039384169363c3a2a6659330937f000000000000000000000000000000000000000000000000000000000000000090921692637965d56d92602480840193919291829003018186803b1580156111bb57600080fd5b505afa1580156111cf573d6000803e3d6000fd5b505050506040513d60208110156111e557600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b5050825161043492506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691503390611348565b6007546001600160a01b0316331461129c57600080fd5b6008546112a990826113ff565b600855600754610434906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116308461139f565b600082820183811015611341576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261139a908490611441565b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113f9908590611441565b50505050565b600061134183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114f2565b6060611496826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115899092919063ffffffff16565b80519091501561139a578080602001905160208110156114b557600080fd5b505161139a5760405162461bcd60e51b815260040180806020018281038252602a8152602001806117ec602a913960400191505060405180910390fd5b600081848411156115815760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561154657818101518382015260200161152e565b50505050905090810190601f1680156115735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b606061159884846000856115a0565b949350505050565b60606115ab8561170d565b6115fc576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061163b5780518252601f19909201916020918201910161161c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461169d576040519150601f19603f3d011682016040523d82523d6000602084013e6116a2565b606091505b509150915081156116b65791506115989050565b8051156116c65780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561154657818101518382015260200161152e565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600015158152509056fe4c6f636b65722063616e6e6f7420626520736574206d6f7265207468616e206f6e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735761726d75702063616e6e6f7420626520736574206d6f7265207468616e206f6e63654f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220026047705bb10bd9fcc718f60dff11865c4e608321420fe789a8195f3179ac7b64736f6c634300070500330000000000000000000000004e78011ce80ee02d2c3e649fb657e45898257815000000000000000000000000b0c22d8d350c67420f06f48936654f567c73e8c80000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136e3b2

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

0000000000000000000000004e78011ce80ee02d2c3e649fb657e45898257815000000000000000000000000b0c22d8d350c67420f06f48936654f567c73e8c80000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136e3b2

-----Decoded View---------------
Arg [0] : _KLIMA (address): 0x4e78011ce80ee02d2c3e649fb657e45898257815
Arg [1] : _sKLIMA (address): 0xb0c22d8d350c67420f06f48936654f567c73e8c8
Arg [2] : _epochLength (uint256): 11520
Arg [3] : _firstEpochNumber (uint256): 0
Arg [4] : _firstEpochBlock (uint256): 20374450

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000004e78011ce80ee02d2c3e649fb657e45898257815
Arg [1] : 000000000000000000000000b0c22d8d350c67420f06f48936654f567c73e8c8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002d00
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000000136e3b2


Deployed ByteCode Sourcemap

21012:6281:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25779:206;;;;;;;;;;;;;;;;-1:-1:-1;25779:206:0;;:::i;:::-;;19709:159;;;:::i;23067:341::-;;;;;;;;;;;;;;;;-1:-1:-1;23067:341:0;-1:-1:-1;;;;;23067:341:0;;:::i;24551:97::-;;;:::i;:::-;;;;;;;;;;;;;;;;19876:261;;;;;;;;;;;;;;;;-1:-1:-1;19876:261:0;-1:-1:-1;;;;;19876:261:0;;:::i;19482:90::-;;;:::i;:::-;;;;-1:-1:-1;;;;;19482:90:0;;;;;;;;;;;;;;21159:31;;;:::i;20145:221::-;;;:::i;22135:45::-;;;;;;;;;;;;;;;;-1:-1:-1;22135:45:0;-1:-1:-1;;;;;22135:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22303:658;;;;;;;;;;;;;;;;-1:-1:-1;22303:658:0;;;;;;-1:-1:-1;;;;;22303:658:0;;:::i;:::-;;;;;;;;;;;;;;;;;;26499:570;;;;;;;;;;;;;;;;-1:-1:-1;26499:570:0;;;;;;;;-1:-1:-1;;;;;26499:570:0;;:::i;25524:142::-;;;:::i;23918:119::-;;;:::i;21320:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24163:270;;;;;;;;;;;;;;;;-1:-1:-1;24163:270:0;;;;;;;;;:::i;21410:22::-;;;:::i;24720:679::-;;;:::i;21347:26::-;;;:::i;27179:111::-;;;;;;;;;;;;;;;;-1:-1:-1;27179:111:0;;:::i;21382:21::-;;;:::i;21477:24::-;;;:::i;21122:30::-;;;:::i;21441:29::-;;;:::i;23495:311::-;;;:::i;26100:227::-;;;;;;;;;;;;;;;;-1:-1:-1;26100:227:0;;:::i;25779:206::-;25861:6;;-1:-1:-1;;;;;25861:6:0;25847:10;:20;25838:31;;;;;;25893:10;;:25;;25909:7;25893:14;:25::i;:::-;25880:10;:38;25960:6;;25929:48;;-1:-1:-1;;;;;25937:6:0;25929:29;;;25960:6;25968:7;25929:29;:48::i;:::-;25779:206;:::o;19709:159::-;19623:6;;-1:-1:-1;;;;;19623:6:0;19633:10;19623:20;19614:67;;;;;-1:-1:-1;;;19614:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19614:67:0;;;;;;;;;;;;;;;19826:1:::1;19810:6:::0;;19793:37:::1;::::0;-1:-1:-1;;;;;19810:6:0;;::::1;::::0;19793:37:::1;::::0;19826:1;;19793:37:::1;19858:1;19841:19:::0;;-1:-1:-1;;;;;;19841:19:0::1;::::0;;19709:159::o;23067:341::-;23123:17;;:::i;:::-;-1:-1:-1;;;;;;23143:24:0;;;;;;:10;:24;;;;;;;;;23123:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23183:12;23123:44;;-1:-1:-1;23183:27:0;;;:47;;-1:-1:-1;23214:11:0;;;;:16;;23183:47;23178:223;;;-1:-1:-1;;;;;23255:24:0;;;;;;;:10;:24;;;;;;;;23248:31;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23248:31:0;;;23303:14;;23376:9;;;;23342:45;;-1:-1:-1;;;23342:45:0;;;;;;;;;;;23303:14;;;;23294:34;;23267:10;;23351:6;23342:32;;;;;;:45;;;;;23255:24;;23342:45;;;;;;:32;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23342:45:0;23294:95;;;-1:-1:-1;;;;;;23294:95:0;;;;;;;-1:-1:-1;;;;;23294:95:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23294:95:0;;;;;;;-1:-1:-1;23294:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23178:223;23067:341;;:::o;24551:97::-;24590:4;24624:6;-1:-1:-1;;;;;24615:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24615:25:0;;-1:-1:-1;24551:97:0;:::o;19876:261::-;19623:6;;-1:-1:-1;;;;;19623:6:0;19633:10;19623:20;19614:67;;;;;-1:-1:-1;;;19614:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19614:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19979:23:0;::::1;19970:75;;;;-1:-1:-1::0;;;19970:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20078:6;::::0;;20061:36:::1;::::0;-1:-1:-1;;;;;20061:36:0;;::::1;::::0;20078:6;::::1;::::0;20061:36:::1;::::0;::::1;20108:9;:21:::0;;-1:-1:-1;;;;;;20108:21:0::1;-1:-1:-1::0;;;;;20108:21:0;;;::::1;::::0;;;::::1;::::0;;19876:261::o;19482:90::-;19531:7;19558:6;-1:-1:-1;;;;;19558:6:0;19482:90;:::o;21159:31::-;;;:::o;20145:221::-;20229:9;;-1:-1:-1;;;;;20229:9:0;20215:10;:23;20206:71;;;;-1:-1:-1;;;20206:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20318:9;;;20310:6;;20293:36;;-1:-1:-1;;;;;20318:9:0;;;;20310:6;;;;20293:36;;;20349:9;;;20340:18;;-1:-1:-1;;;;;;20340:18:0;-1:-1:-1;;;;;20349:9:0;;;20340:18;;;;;;20145:221::o;22135:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22303:658::-;22373:4;22391:8;:6;:8::i;:::-;22412:70;-1:-1:-1;;;;;22420:5:0;22412:32;22446:10;22466:4;22473:7;22412:32;:70::i;:::-;22495:17;;:::i;:::-;-1:-1:-1;;;;;;22515:24:0;;;;;;:10;:24;;;;;;;;;22495:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22550:56;;;;;-1:-1:-1;;;22550:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22646:216;;;;;;;;;22673:12;;22646:216;;22673:27;;22691:7;22673:16;:27::i;:::-;22646:216;;;;22717:60;22741:6;-1:-1:-1;;;;;22732:32:0;;22766:7;22732:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22732:43:0;;22717:9;;;;:13;:60::i;:::-;22646:216;;22814:12;;22796;;22646:216;;;;;22796:32;;:16;:32::i;:::-;22646:216;;22845:5;22646:216;;;;;;;-1:-1:-1;;;;;22619:24:0;;;;;:10;:24;;;;;;;:243;;;;;;;;22646:216;22619:243;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22619:243:0;;;;;;;;;;22906:14;;22875:56;;22883:6;22875:29;;;22906:14;22922:7;22875:29;:56::i;:::-;-1:-1:-1;22949:4:0;;22303:658;-1:-1:-1;;;22303:658:0:o;26499:570::-;19623:6;;-1:-1:-1;;;;;19623:6:0;19633:10;19623:20;19614:67;;;;;-1:-1:-1;;;19614:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19614:67:0;;;;;;;;;;;;;;;26612:21:::1;26599:9;:34;;;;;;;;;26595:467;;;26656:11;:22:::0;;-1:-1:-1;;;;;;26656:22:0::1;-1:-1:-1::0;;;;;26656:22:0;::::1;;::::0;;26595:467:::1;;;26714:16;26701:9;:29;;;;;;;;;26696:366;;;26762:14;::::0;-1:-1:-1;;;;;26762:14:0::1;:30:::0;26753:80:::1;;;;-1:-1:-1::0;;;26753:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26848:14;:25:::0;;-1:-1:-1;;;;;;26848:25:0::1;-1:-1:-1::0;;;;;26848:25:0;::::1;;::::0;;26696:366:::1;;;26909:16;26896:9;:29;;;;;;;;;26891:171;;;26957:6;::::0;-1:-1:-1;;;;;26957:6:0::1;:20:::0;26948:70:::1;;;;-1:-1:-1::0;;;26948:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27033:6;:17:::0;;-1:-1:-1;;;;;27033:17:0;::::1;-1:-1:-1::0;;;;;;27033:17:0;;::::1;;::::0;;26499:570;;:::o;25524:142::-;25573:4;25598:60;25646:10;;25606:5;-1:-1:-1;;;;;25598:25:0;;25633:4;25598:42;;;;;;;;;;;;;-1:-1:-1;;;;;25598:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25598:42:0;;:46;:60::i;:::-;25591:67;;25524:142;:::o;23918:119::-;24012:10;24000:24;;;;:10;:24;;;;;:29;;;;-1:-1:-1;;23967:62:0;;24000:29;;;;23999:30;23967:62;;;23918:119::o;21320:18::-;;;;;;;;;;:::o;24163:270::-;24236:8;24231:51;;;24262:8;:6;:8::i;:::-;24292:71;-1:-1:-1;;;;;24300:6:0;24292:33;24327:10;24347:4;24354:7;24292:33;:71::i;:::-;24374:51;-1:-1:-1;;;;;24382:5:0;24374:28;24404:10;24416:7;24374:28;:51::i;21410:22::-;;;;:::o;24720:679::-;24760:14;;24778:12;-1:-1:-1;24756:636:0;;24819:6;-1:-1:-1;;;;;24810:24:0;;24836:5;:16;;;24854:5;:12;;;24810:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24922:5:0;:12;24902:14;;:34;;:18;:34::i;:::-;24885:14;:51;24951:12;:14;;:12;:14;;;24987:11;;-1:-1:-1;;;;;24987:11:0;:25;24982:108;;25048:11;;;;;;;;;-1:-1:-1;;;;;25048:11:0;-1:-1:-1;;;;;25034:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24982:108:0;25106:12;25121:17;:15;:17::i;:::-;25106:32;;25153:11;25176:6;-1:-1:-1;;;;;25167:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25167:37:0;;-1:-1:-1;25225:17:0;;;25221:160;;25283:1;25264:16;:20;25221:160;;;25344:21;:7;25357:6;25344:11;:21::i;:::-;25325:16;:40;24756:636;;;24720:679::o;21347:26::-;;;-1:-1:-1;;;;;21347:26:0;;:::o;27179:111::-;19623:6;;-1:-1:-1;;;;;19623:6:0;19633:10;19623:20;19614:67;;;;;-1:-1:-1;;;19614:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19614:67:0;;;;;;;;;;;;;;;27254:12:::1;:28:::0;27179:111::o;21382:21::-;;;-1:-1:-1;;;;;21382:21:0;;:::o;21477:24::-;;;;:::o;21122:30::-;;;:::o;21441:29::-;;;-1:-1:-1;;;;;21441:29:0;;:::o;23495:311::-;23534:17;;:::i;:::-;-1:-1:-1;23566:10:0;23554:24;;;;:10;:24;;;;;;;;23534:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23596:24;;;;;;23589:31;;;;;;;;;;;;-1:-1:-1;;23589:31:0;;;;;;23642:14;;23718:9;;23684:45;;-1:-1:-1;;;23684:45:0;;;;;;;;;;;-1:-1:-1;;;;;23642:14:0;;;;23633:34;;23677:4;;23693:6;23684:32;;;;;;:45;;;;;23554:24;;23684:45;;;;;;:32;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23684:45:0;23633:98;;;-1:-1:-1;;;;;;23633:98:0;;;;;;;-1:-1:-1;;;;;23633:98:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23633:98:0;;;;;;;-1:-1:-1;23633:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23784:12:0;;23742:56;;-1:-1:-1;;;;;;23750:5:0;23742:28;;-1:-1:-1;23772:10:0;;23742:28;:56::i;26100:227::-;26184:6;;-1:-1:-1;;;;;26184:6:0;26170:10;:20;26161:31;;;;;;26216:10;;:25;;26232:7;26216:14;:25::i;:::-;26203:10;:38;26287:6;;26252:67;;-1:-1:-1;;;;;26260:6:0;26252:33;;;26287:6;26303:4;26310:7;26252:33;:67::i;407:181::-;465:7;497:5;;;521:6;;;;513:46;;;;;-1:-1:-1;;;513:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;579:1;407:181;-1:-1:-1;;;407:181:0:o;15784:177::-;15894:58;;;-1:-1:-1;;;;;15894:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15894:58:0;-1:-1:-1;;;15894:58:0;;;15867:86;;15887:5;;15867:19;:86::i;:::-;15784:177;;;:::o;15969:205::-;16097:68;;;-1:-1:-1;;;;;16097:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16097:68:0;-1:-1:-1;;;16097:68:0;;;16070:96;;16090:5;;16070:19;:96::i;:::-;15969:205;;;;:::o;871:136::-;929:7;956:43;960:1;963;956:43;;;;;;;;;;;;;;;;;:3;:43::i;18089:761::-;18513:23;18539:69;18567:4;18539:69;;;;;;;;;;;;;;;;;18547:5;-1:-1:-1;;;;;18539:27:0;;;:69;;;;;:::i;:::-;18623:17;;18513:95;;-1:-1:-1;18623:21:0;18619:224;;18765:10;18754:30;;;;;;;;;;;;;;;-1:-1:-1;18754:30:0;18746:85;;;;-1:-1:-1;;;18746:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1310:192;1396:7;1432:12;1424:6;;;;1416:29;;;;-1:-1:-1;;;1416:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1468:5:0;;;1310:192::o;9843:196::-;9946:12;9978:53;10001:6;10009:4;10015:1;10018:12;9978:22;:53::i;:::-;9971:60;9843:196;-1:-1:-1;;;;9843:196:0:o;11434:979::-;11564:12;11597:18;11608:6;11597:10;:18::i;:::-;11589:60;;;;;-1:-1:-1;;;11589:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11723:12;11737:23;11764:6;-1:-1:-1;;;;;11764:11:0;11784:8;11795:4;11764:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11764:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11722:78;;;;11815:7;11811:595;;;11846:10;-1:-1:-1;11839:17:0;;-1:-1:-1;11839:17:0;11811:595;11960:17;;:21;11956:439;;12223:10;12217:17;12284:15;12271:10;12267:2;12263:19;12256:44;12171:148;12359:20;;-1:-1:-1;;;12359:20:0;;;;;;;;;;;;;;;;;12366:12;;12359:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6923:422;7290:20;7329:8;;;6923:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://026047705bb10bd9fcc718f60dff11865c4e608321420fe789a8195f3179ac7b
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.