Contract 0x25d28a24Ceb6F81015bB0b2007D795ACAc411b4d 6

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9bf9e8a2b4476666804dd84febb24c7f7d353cd4ee6a458d7c30b2e4e19bd08eUnstake300824762022-06-28 3:18:4611 mins ago0xb11bf5c1864fd3a2debfdd1bded3ffcd8f471f73 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.002738322787 30.804013578
0xc29feaf77e9b816271d7c047d6a8d243d5ddce8ebcee685b8777411fcbfd549fUnstake300821652022-06-28 3:06:5023 mins ago0xb8c62511ac373c15d52602a206a31f5441b2576d IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003231457747 36.351400498
0x8f50f7844b0a8bd0146451c1de41c84cb351c26538fd9d8ef4a0dbaa734ee533Unstake300812682022-06-28 2:33:5256 mins ago0x5262a5f60455cd47d3df45f7656b84a8d7225c51 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.002667210001 30.00000002
0x98dcf9ba955186927396142ef6361b7a2e8aa3d87e388dc26286494438276dc1Unstake300775682022-06-28 0:15:583 hrs 14 mins ago0x1bfecdfab4787338f0998ddfee85e78dd25e06a4 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.004565106013 51.346980706
0xb43a81694f1ef0a7616b13164f72b8aae9db0e1ab1eb9229e7bd28b217e5199aUnstake300769562022-06-27 23:50:383 hrs 39 mins ago0x121fa2787cf0180593da4dfd0e7e47dd34177c92 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.002679232647 37.317816663
0xebacc54488cceadd7a2442e5fa5ecae871050e7189910007812129b9b44e0a4aUnstake300768432022-06-27 23:46:443 hrs 43 mins ago0xaafb6a589849676e6df48a8ed53398d0641c7ed5 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003708310974 41.710000045
0x36bf5785405bbdddb589d599a97ced969525ddb7f61767b677bc7aea551462dcUnstake300751302022-06-27 22:39:184 hrs 50 mins ago0xa669d9a37ceff65114666aebd0108405e2457c18 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003265796981 36.732731751
0x251a3c735665a87cbcd1e3a53cad321194f708933604eb0b918ee052fa508836Unstake300750872022-06-27 22:37:524 hrs 52 mins ago0xbdb21e816e455e1642dbe8cef6668a62e180657b IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003282785925 36.928802812
0x53c3596e9204eca746adad7665de9a1b2749e8f56b26c97619895204ef068a5aUnstake300732872022-06-27 21:29:366 hrs ago0xd88d52f17bf2707d70ad315a5deb55b39279e629 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003013759557 33.902464233
0xde23a69098d8f7c35dfea87988a4cda1c960bb9e5dd8ef7be38a64a5430653f0Unstake300730662022-06-27 21:20:346 hrs 9 mins ago0x9a39f286e1cd710da14e45ac124e38f2b6242622 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.005432373457 61.110000085
0xd41609b8fa3208f45b5b634175cd1540193c414aca756cdfc00490a8ec3cf916Unstake300729172022-06-27 21:12:366 hrs 17 mins ago0xcc2478e74e965a104f2a0af4316a6d81404f8bb5 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003449591599 38.799999998
0x1534e09a2f40b1312a6fa530d0d9ed6d4a3948d9c0d9e22f02eb4f790a9dcd56Unstake300722572022-06-27 20:47:486 hrs 42 mins ago0x8d7c27797a81b7b75fa7e290611a523c75781b18 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.002666850001 30.000000012
0x9eb0b3619eee2ca43d5e0e34165f6e0176cb294bb18cf7a9218b08c6a2f700c6Unstake300719662022-06-27 20:37:466 hrs 52 mins ago0x6253000063ef7671e7874e4a450009c4f6a89dbe IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.00256635461 35.739616067
0x278f8cb672df822fa8d8f249dc95b6b16493ae601f892cd8c02e707494880e45Unstake300719382022-06-27 20:36:506 hrs 53 mins ago0xc0f9e8de7ce5ad40979de08b6b746ba47ca608cc IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003233992126 36.375000016
0xd4cd7d35c62a0d4b9fe65c2dcd95fe44634e2bb2a27fe738a25dc2a26af321dbUnstake300709972022-06-27 20:02:207 hrs 27 mins ago0x6253000063ef7671e7874e4a450009c4f6a89dbe IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.00266685165 30.000018571
0x9de651a6309e4d1ef20b4c9b8512ad30fa8a1317c260589da31cda80428fc9afUnstake300703702022-06-27 19:40:467 hrs 49 mins ago0x47005117818b443b39c8449f5e10e101fc2b59e0 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.002860086182 32.16941504
0x362151945eda2b7a8f2c036e631f61357cbde4d1c440b4a8eb38e1ffe1ddd3a0Unstake300684372022-06-27 18:27:569 hrs 2 mins ago0xe09ba0853a040c83aefb220df6e5ea8d298cef53 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.006200226374 69.747751558
0xcb88c5e36dac7cf338d786716d96c3ca8f77f9cbd96f60bce90dd2487f3561a0Unstake300671132022-06-27 17:32:129 hrs 57 mins ago0xe09ba0853a040c83aefb220df6e5ea8d298cef53 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003725677219 41.905330509
0xcfe30fc4c93e3d9dad73d42de3ebf79e0136fcfe080db9613ccb392863e79cbfUnstake300664932022-06-27 17:08:4410 hrs 21 mins ago0x2edfff99fc4f6c49f22db5991a08c6bb092031c5 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.008556677989 96.243017871
0xfa31f906fc95b0df8af1208795b6c184adfff76c1409cf80e987fa0483bc62f9Unstake300659542022-06-27 16:48:0610 hrs 42 mins ago0x701d0ecb3ba780de7b2b36789aec4493a426010a IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.009617332426 108.172949562
0x7c26413970c7772dd6aa5bfaf2727a2107ed6ddedd0864cc1f139526756f8192Unstake300630562022-06-27 14:55:4612 hrs 34 mins ago0xd4a17ad38d5264d165db58e72a8cbe715d7dbcf7 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.014951228608 168.167057808
0x60d5be9c862d4351a60aebbde6724aad2100bbfffe9b2868ade81c20b9bb1eabUnstake300628002022-06-27 14:46:2412 hrs 43 mins ago0x60e1a7e356a7b661bb1a9c031e55e86a81e25599 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.046278820862 134.570966658
0x7c8a5fc9340da6e35911b3c968e0e2585b15f51aada8ac99eff10d7477f0ec45Unstake300627782022-06-27 14:45:3612 hrs 44 mins ago0x60e1a7e356a7b661bb1a9c031e55e86a81e25599 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.009137505688 103.559916678
0xb87b8210faa21368e71c77049bb78feab7f6aa64689fdd94ad15ca9996ff109cUnstake300627532022-06-27 14:44:4612 hrs 45 mins ago0x0e9680a5564c9e7af390e5025286c2563eff6da5 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.009851278272 110.804304184
0x653724526e18ec4133dd37c77d6e5ea618fac52c83476e0ebdac6dbca5a460bfUnstake300603182022-06-27 13:12:3214 hrs 17 mins ago0xb471e4d16e68011a5e333640268d4a9c5f178276 IN  0x25d28a24ceb6f81015bb0b2007d795acac411b4d0 MATIC0.003212014783 36.132682191
[ 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.