Contract 0x9863056b4bdb32160a70107a6797dd06b56e8137 3

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x6e48b2ac9be9de46a31da11a4fd907e121222c63a0d0d1184ccd03ab6499785cUnstake444666652022-08-08 8:52:354 hrs 1 min ago0xc12de812ae612b6d514b52d529f97f6acb524c8e IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000347181317
0xe16aa1d535d8f454dc598e153b73ec7ff0c6733df323762811c08256277ad7b5Unstake444664272022-08-08 8:45:094 hrs 9 mins ago0x048d686c08652725034eaf1db9e2de59a17fe8f6 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000213883361
0x7804cca68622be11888734ba10621a5d601e1b369d1a04346ea381c6fa3b18c7Unstake444664082022-08-08 8:44:444 hrs 9 mins ago0xc12de812ae612b6d514b52d529f97f6acb524c8e IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000223401477
0xb5d2254d8e6151195fe5c2994fa0ed72dedf256b20a0d12410bd859e0a6fc60cUnstake444649932022-08-08 8:14:214 hrs 40 mins ago0x331f323fdb2b0c50a4cf159b01b75ad78dc53ee5 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.004268448
0x5cc32348dd6e3b8bc6ba6eaa48ae7a1b98021ebb2416ee2facaff6ca364867e8Unstake444643052022-08-08 8:00:204 hrs 54 mins ago0xf2ba2ead3d26c213721114a02e0c56d8631ae388 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.00024853724
0xb8a51beac748e7bd20d15b381393914a4b25646ed60302b63e1607af5d736e2aUnstake444640552022-08-08 7:55:234 hrs 59 mins ago0xb3c4435235de882d02cd68397a3b093a04ad57ff IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000222315
0x831a28992ad603b390dcd7b708747cdecec8456a9e14096dcfebe957970f8895Unstake444567262022-08-08 5:15:337 hrs 38 mins ago0x8cbe6ad423c4145dc9eb37e143ccd4ac639d3035 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000225020928
0xb6ec2e7a48c79450ed79744616239fb0b7493a850e5411edbf2807e5926fa679Unstake444557252022-08-08 4:55:227 hrs 59 mins ago0xd4a65d66cb7991f056f1e0ed22a8efe78d3e4528 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000673572026
0x9951d114d793514fa7125ab22c0e72a9079136fd8de1e010d6ef48cde630a326Unstake444542662022-08-08 4:25:438 hrs 28 mins ago0x37b3f19b8145e3562d5aa8896f27466b48a2d9a6 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000225191628
0x36369992610d97cf0964e8f154c0fc9d6f669052e3b7ad99ddb5bd8e189417b6Unstake444353142022-08-07 21:37:3415 hrs 16 mins ago0xf757fa89bb5068ce7d2f8de904026f05a5cc4cd8 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000076757063
0x9b59f9917e650f96c31ad76ad83d6a2154922ec4c40be1c0fd10b54159d6bb9cUnstake444353072022-08-07 21:37:2315 hrs 17 mins ago0xf757fa89bb5068ce7d2f8de904026f05a5cc4cd8 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000117278547
0xc1934abeb77296d38b23989bb46d25a140a30115a592f4666deda3478b83e285Unstake444348512022-08-07 21:28:3515 hrs 25 mins ago0x73235406044856aeaee28f6cbf700a3f81d75c29 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000123795144
0x2257ecd4508f08209f2e43aba2ec7bef8704a3b2156a0958fea84670c28a2702Unstake444259772022-08-07 18:24:0818 hrs 30 mins ago0xe08563966aca5f5297cf58ff11cf28ca660e0012 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000418401382
0x9a19303531964d25c0fe19fca1534cc41986101a3ee1be6873cd41613e8d4086Unstake444130162022-08-07 13:27:2523 hrs 26 mins ago0x1c8d68f8713e8fdb5376639338acd36518e0f4c7 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000581792
0xf17848e8cf52a66c661ecf315ec5e5f8852b91ffe9fe3546fab3ddb7da02a328Unstake444077882022-08-07 11:36:551 day 1 hr ago0x81a052b492dd96aefc65cf1348a3f75f3593f55f IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000222826407
0xd25bc4adffe81e00bf0eae70f40560f100614e8aaf897b89df692edfdfe52597Unstake443722342022-08-06 23:26:251 day 13 hrs ago0x67dacc258dccc8cbfb493c652ab5170c3cff0ad9 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000184471156
0xc496fa10bdc25644c6877e3513d736c9f5f3281dda045a7b1e2af6e9fc1ac8e3Unstake443700882022-08-06 22:41:171 day 14 hrs ago0x97849fb0dd573dc48cfa394d1703e881893b6f4c IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000188247041
0xb3dded6342f0fca7898afbaf33fb3a4857f0ac051227945ab9f6e21b198f42eaUnstake443572722022-08-06 18:11:001 day 18 hrs ago0x06d7289a7f7e75805d7ba9fc0758cd18f8231fb0 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000310961711
0x5dae9d7ee1140db9d1688833bda5221223287d24f65ec12338608630add77d25Unstake443567312022-08-06 18:00:311 day 18 hrs ago0x3a55e080d4109f68709d9cae342f2719de6860ce IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000355663286
0xb2099f827f4101a6f1ddf5f851a3e1af32fee0e8c6cd92d4193410b37a106894Unstake443565852022-08-06 17:57:211 day 18 hrs ago0x4dcb7473922e9cf517ac73fc763d2891f8943f15 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000375190763
0xfaa7a6b53ed040c87d3d2b29527e5d174254f0e1efc30b0cad39de7e45d0e414Unstake443563572022-08-06 17:52:321 day 19 hrs ago0xa9606817f7d804d8981a3ad7add456101e67bb2c IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.001417504
0x677dc571038a21b6c8a5445435459b2b57404957362e6ca3e0e67a0fd7b8fddaUnstake443554832022-08-06 17:31:261 day 19 hrs ago0xaccccc99767209dbfbec22a9673bea9864fbb1cd IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000679546827
0x8e491bd36557591bd052111093e583d58573ff18e1bd31c827ea209b2488a702Unstake443550372022-08-06 17:21:531 day 19 hrs ago0xaccccc99767209dbfbec22a9673bea9864fbb1cd IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.004932683589
0xa388b2404ff5b663aad610e46c8dc33f6ff75616fa1cc701c4570f6f280fe3d0Unstake443549012022-08-06 17:17:511 day 19 hrs ago0x7cb5fd8cb523598c4f1324d51dcec4e54aea52b7 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000560292
0xa5b027c67467669f8d1fe27c7147880a885ee8c02666b0ddcf7c1dfe98f40fd6Unstake443492092022-08-06 15:09:111 day 21 hrs ago0x91ddeb35264287785762e666b5fba5da9e83b5c8 IN  0x9863056b4bdb32160a70107a6797dd06b56e81370 FTM0.000225810803
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xff46fd731f876252d22d6fc78ae0f3e7988fbdf523e28e08661a885df9265740207436462021-11-01 11:55:20280 days 59 mins ago 0x23172a552bed9b521dbbaa2eee9331e16d73865c  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SpartacusStaking

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 FtmScan.com on 2021-11-01
*/

// 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 IsOHM {
    function rebase( uint256 ohmProfit_, 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 SpartacusStaking is Ownable {

    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    address public immutable OHM;
    address public immutable sOHM;

    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 _OHM, 
        address _sOHM, 
        uint _epochLength,
        uint _firstEpochNumber,
        uint _firstEpochBlock
    ) {
        require( _OHM != address(0) );
        OHM = _OHM;
        require( _sOHM != address(0) );
        sOHM = _sOHM;
        
        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 OHM to enter warmup
        @param _amount uint
        @return bool
     */
    function stake( uint _amount, address _recipient ) external returns ( bool ) {
        rebase();
        
        IERC20( OHM ).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( IsOHM( sOHM ).gonsForBalance( _amount ) ),
            expiry: epoch.number.add( warmupPeriod ),
            lock: false
        });
        
        IERC20( sOHM ).safeTransfer( warmupContract, _amount );
        return true;
    }

    /**
        @notice retrieve sOHM 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, IsOHM( sOHM ).balanceForGons( info.gons ) );
        }
    }

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

        IWarmup( warmupContract ).retrieve( address(this), IsOHM( sOHM ).balanceForGons( info.gons ) );
        IERC20( OHM ).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 sOHM for OHM
        @param _amount uint
        @param _trigger bool
     */
    function unstake( uint _amount, bool _trigger ) external {
        if ( _trigger ) {
            rebase();
        }
        IERC20( sOHM ).safeTransferFrom( msg.sender, address(this), _amount );
        IERC20( OHM ).safeTransfer( msg.sender, _amount );
    }

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

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

            IsOHM( sOHM ).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 = IsOHM( sOHM ).circulatingSupply();

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

    /**
        @notice returns contract OHM holdings, including bonuses provided
        @return uint
     */
    function contractBalance() public view returns ( uint ) {
        return IERC20( OHM ).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( sOHM ).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( sOHM ).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":"_OHM","type":"address"},{"internalType":"address","name":"_sOHM","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":"OHM","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":"sOHM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum SpartacusStaking.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"}]

60c060405234801561001057600080fd5b506040516119d13803806119d1833981810160405260a081101561003357600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b0385166100af57600080fd5b6001600160601b0319606086901b166080526001600160a01b0384166100d457600080fd5b6001600160601b0319606094851b1660a0526040805160808101825284815260208101849052908101829052600094018490526002929092556003556004556005555060805160601c60a05160601c61184b6101866000398061040b52806104d052806105c952806106aa5280610a0f5280610b1b5280610dc25280610e535280610fae528061117552806112bd5250806109195280610cd25280610df75280610e20528061125c525061184b6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80638f077b83116100de578063bfe1092811610097578063deac361a11610071578063deac361a1461039e578063ed4acaa8146103a6578063f3d86e4a146103ae578063f62ae76a146103b657610173565b8063bfe1092814610371578063c9f464ff14610379578063d7b96d4e1461039657610173565b80638f077b83146102fe578063900cf0cf146103065780639ebea88c14610334578063a6c41fec14610359578063a8dd07dc14610361578063af14052c1461036957610173565b8063481c6a7511610130578063481c6a75146102295780635a96ac0a146102315780636746f4c2146102395780637acb775714610287578063865e6fd3146102c75780638b7afe2e146102f657610173565b806303c2367014610178578063089208d814610197578063150799251461019f5780631e83409a146101c35780632986c0e5146101e957806346f68ee914610203575b600080fd5b6101956004803603602081101561018e57600080fd5b50356103d3565b005b610195610437565b6101a76104ce565b604080516001600160a01b039092168252519081900360200190f35b610195600480360360208110156101d957600080fd5b50356001600160a01b03166104f2565b6101f16106a6565b60408051918252519081900360200190f35b6101956004803603602081101561021957600080fd5b50356001600160a01b0316610732565b6101a761081f565b61019561082e565b61025f6004803603602081101561024f57600080fd5b50356001600160a01b03166108d8565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b6102b36004803603604081101561029d57600080fd5b50803590602001356001600160a01b0316610902565b604080519115158252519081900360200190f35b610195600480360360408110156102dd57600080fd5b50803560ff1690602001356001600160a01b0316610b4e565b6101f1610cc8565b610195610d74565b61030e610d98565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6101956004803603604081101561034a57600080fd5b50803590602001351515610da7565b6101a7610e1e565b6101f1610e42565b610195610e48565b6101a7611056565b6101956004803603602081101561038f57600080fd5b5035611065565b6101a76110b7565b6101f16110c6565b6101a76110cc565b6101956110db565b610195600480360360208110156103cc57600080fd5b5035611285565b6007546001600160a01b031633146103ea57600080fd5b6008546103f790826112e7565b600855600754610434906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611348565b50565b6000546001600160a01b03163314610484576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6104fa611713565b506001600160a01b0381166000908152600b6020908152604091829020825160808101845281548152600182015492810192909252600281015492820183905260039081015460ff16151560608301525490911180159061055e5750604081015115155b156106a2576001600160a01b038083166000908152600b602090815260408083208381556001810184905560028101939093556003909201805460ff19169055600954848201518351637965d56d60e01b8152600481019190915292519084169363c3a2a6659387937f000000000000000000000000000000000000000000000000000000000000000090921692637965d56d92602480840193919291829003018186803b15801561060f57600080fd5b505afa158015610623573d6000803e3d6000fd5b505050506040513d602081101561063957600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b15801561068957600080fd5b505af115801561069d573d6000803e3d6000fd5b505050505b5050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632986c0e56040518163ffffffff1660e01b815260040160206040518083038186803b15801561070157600080fd5b505afa158015610715573d6000803e3d6000fd5b505050506040513d602081101561072b57600080fd5b5051905090565b6000546001600160a01b0316331461077f576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b6001600160a01b0381166107c45760405162461bcd60e51b81526004018080602001828103825260268152602001806117616026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b6001546001600160a01b031633146108775760405162461bcd60e51b81526004018080602001828103825260228152602001806117aa6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600b6020526000908152604090208054600182015460028301546003909301549192909160ff1684565b600061090c610e48565b6109416001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308661139f565b610949611713565b506001600160a01b0382166000908152600b602090815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff1615801560608301526109ec576040805162461bcd60e51b815260206004820152601f60248201527f4465706f7369747320666f72206163636f756e7420617265206c6f636b656400604482015290519081900360640190fd5b604080516080810190915281518190610a0590876112e7565b8152602001610aa87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631bd39674886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b50516020850151906112e7565b8152600a54600354602090920191610abf916112e7565b8152600060209182018190526001600160a01b038681168252600b8352604091829020845181559284015160018401559083015160028301556060909201516003909101805460ff1916911515919091179055600954610b44917f00000000000000000000000000000000000000000000000000000000000000008116911686611348565b5060019392505050565b6000546001600160a01b03163314610b9b576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b6000826002811115610ba957fe5b1415610bcf57600680546001600160a01b0319166001600160a01b0383161790556106a2565b6001826002811115610bdd57fe5b1415610c4b576009546001600160a01b031615610c2b5760405162461bcd60e51b81526004018080602001828103825260238152602001806117876023913960400191505060405180910390fd5b600980546001600160a01b0319166001600160a01b0383161790556106a2565b6002826002811115610c5957fe5b14156106a2576007546001600160a01b031615610ca75760405162461bcd60e51b815260040180806020018281038252602381526020018061173e6023913960400191505060405180910390fd5b600780546001600160a01b0383166001600160a01b03199091161790555050565b6000610d6f6008547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d3d57600080fd5b505afa158015610d51573d6000803e3d6000fd5b505050506040513d6020811015610d6757600080fd5b5051906112e7565b905090565b336000908152600b60205260409020600301805460ff19811660ff90911615179055565b60025460035460045460055484565b8015610db557610db5610e48565b610dea6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308561139f565b6106a26001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163384611348565b7f000000000000000000000000000000000000000000000000000000000000000081565b60085481565b6004544310611054577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663058ecdb46002600301546002600101546040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b158015610ec957600080fd5b505af1158015610edd573d6000803e3d6000fd5b505050506040513d6020811015610ef357600080fd5b5050600254600454610f04916112e7565b6004556003805460010190556006546001600160a01b031615610f9e57600660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050506040513d6020811015610f9b57600080fd5b50505b6000610fa8610cc8565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d602081101561102f57600080fd5b505190508082116110445760006005556106a2565b61104e82826113ff565b60055550505b565b6006546001600160a01b031681565b6000546001600160a01b031633146110b2576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b600a55565b6007546001600160a01b031681565b600a5481565b6009546001600160a01b031681565b6110e3611713565b50336000818152600b602081815260408084208151608081018352815481526001820180548286019081526002840180548487015260038501805460ff8116151560608701529a8a5297875293889055908790559590915560ff1990951690925560095492518251637965d56d60e01b8152600481019190915291516001600160a01b039384169363c3a2a6659330937f000000000000000000000000000000000000000000000000000000000000000090921692637965d56d92602480840193919291829003018186803b1580156111bb57600080fd5b505afa1580156111cf573d6000803e3d6000fd5b505050506040513d60208110156111e557600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b5050825161043492506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691503390611348565b6007546001600160a01b0316331461129c57600080fd5b6008546112a990826113ff565b600855600754610434906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116308461139f565b600082820183811015611341576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261139a908490611441565b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113f9908590611441565b50505050565b600061134183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114f2565b6060611496826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115899092919063ffffffff16565b80519091501561139a578080602001905160208110156114b557600080fd5b505161139a5760405162461bcd60e51b815260040180806020018281038252602a8152602001806117ec602a913960400191505060405180910390fd5b600081848411156115815760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561154657818101518382015260200161152e565b50505050905090810190601f1680156115735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b606061159884846000856115a0565b949350505050565b60606115ab8561170d565b6115fc576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061163b5780518252601f19909201916020918201910161161c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461169d576040519150601f19603f3d011682016040523d82523d6000602084013e6116a2565b606091505b509150915081156116b65791506115989050565b8051156116c65780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561154657818101518382015260200161152e565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600015158152509056fe4c6f636b65722063616e6e6f7420626520736574206d6f7265207468616e206f6e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735761726d75702063616e6e6f7420626520736574206d6f7265207468616e206f6e63654f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212204fbdbd3680015e3170549886cbc935022daa261fc90558d38b9ba81700e2d77a64736f6c634300070500330000000000000000000000005602df4a94eb6c680190accfa2a475621e0ddbdc0000000000000000000000008e2549225e21b1da105563d419d5689b80343e01000000000000000000000000000000000000000000000000000000000000814c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000013e0994

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

0000000000000000000000005602df4a94eb6c680190accfa2a475621e0ddbdc0000000000000000000000008e2549225e21b1da105563d419d5689b80343e01000000000000000000000000000000000000000000000000000000000000814c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000013e0994

-----Decoded View---------------
Arg [0] : _OHM (address): 0x5602df4a94eb6c680190accfa2a475621e0ddbdc
Arg [1] : _sOHM (address): 0x8e2549225e21b1da105563d419d5689b80343e01
Arg [2] : _epochLength (uint256): 33100
Arg [3] : _firstEpochNumber (uint256): 1
Arg [4] : _firstEpochBlock (uint256): 20842900

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000005602df4a94eb6c680190accfa2a475621e0ddbdc
Arg [1] : 0000000000000000000000008e2549225e21b1da105563d419d5689b80343e01
Arg [2] : 000000000000000000000000000000000000000000000000000000000000814c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000000000000000000000000000000000000013e0994


Deployed ByteCode Sourcemap

20805:6296:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25587:204;;;;;;;;;;;;;;;;-1:-1:-1;25587:204:0;;:::i;:::-;;19498:159;;;:::i;20954:29::-;;;:::i;:::-;;;;-1:-1:-1;;;;;20954:29:0;;;;;;;;;;;;;;22903:337;;;;;;;;;;;;;;;;-1:-1:-1;22903:337:0;-1:-1:-1;;;;;22903:337:0;;:::i;24363:93::-;;;:::i;:::-;;;;;;;;;;;;;;;;19665:261;;;;;;;;;;;;;;;;-1:-1:-1;19665:261:0;-1:-1:-1;;;;;19665:261:0;;:::i;19271:90::-;;;:::i;19938:221::-;;;:::i;21951:45::-;;;;;;;;;;;;;;;;-1:-1:-1;21951:45:0;-1:-1:-1;;;;;21951:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22117:682;;;;;;;;;;;;;;;;-1:-1:-1;22117:682:0;;;;;;-1:-1:-1;;;;;22117:682:0;;:::i;:::-;;;;;;;;;;;;;;;;;;26303:570;;;;;;;;;;;;;;;;-1:-1:-1;26303:570:0;;;;;;;;-1:-1:-1;;;;;26303:570:0;;:::i;25334:140::-;;;:::i;23740:119::-;;;:::i;21113:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23981:266;;;;;;;;;;;;;;;;-1:-1:-1;23981:266:0;;;;;;;;;:::i;20919:28::-;;;:::i;21207:22::-;;;:::i;24528:683::-;;;:::i;21140:26::-;;;:::i;26987:111::-;;;;;;;;;;;;;;;;-1:-1:-1;26987:111:0;;:::i;21179:21::-;;;:::i;21278:24::-;;;:::i;21242:29::-;;;:::i;23323:305::-;;;:::i;25906:225::-;;;;;;;;;;;;;;;;-1:-1:-1;25906:225:0;;:::i;25587:204::-;25669:6;;-1:-1:-1;;;;;25669:6:0;25655:10;:20;25646:31;;;;;;25701:10;;:25;;25717:7;25701:14;:25::i;:::-;25688:10;:38;25766:6;;25737:46;;-1:-1:-1;;;;;25745:4:0;25737:27;;;25766:6;25774:7;25737:27;:46::i;:::-;25587:204;:::o;19498:159::-;19412:6;;-1:-1:-1;;;;;19412:6:0;19422:10;19412:20;19403:67;;;;;-1:-1:-1;;;19403:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19403:67:0;;;;;;;;;;;;;;;19615:1:::1;19599:6:::0;;19582:37:::1;::::0;-1:-1:-1;;;;;19599:6:0;;::::1;::::0;19582:37:::1;::::0;19615:1;;19582:37:::1;19647:1;19630:19:::0;;-1:-1:-1;;;;;;19630:19:0::1;::::0;;19498:159::o;20954:29::-;;;:::o;22903:337::-;22959:17;;:::i;:::-;-1:-1:-1;;;;;;22979:24:0;;;;;;:10;:24;;;;;;;;;22959:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23019:12;22959:44;;-1:-1:-1;23019:27:0;;;:47;;-1:-1:-1;23050:11:0;;;;:16;;23019:47;23014:219;;;-1:-1:-1;;;;;23091:24:0;;;;;;;:10;:24;;;;;;;;23084:31;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23084:31:0;;;23139:14;;23208:9;;;;23178:41;;-1:-1:-1;;;23178:41:0;;;;;;;;;;;23139:14;;;;23130:34;;23103:10;;23185:4;23178:28;;;;;;:41;;;;;23091:24;;23178:41;;;;;;:28;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23178:41:0;23130:91;;;-1:-1:-1;;;;;;23130:91:0;;;;;;;-1:-1:-1;;;;;23130:91:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23130:91:0;;;;;;;-1:-1:-1;23130:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23014:219;22903:337;;:::o;24363:93::-;24402:4;24434;-1:-1:-1;;;;;24427:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24427:21:0;;-1:-1:-1;24363:93:0;:::o;19665:261::-;19412:6;;-1:-1:-1;;;;;19412:6:0;19422:10;19412:20;19403:67;;;;;-1:-1:-1;;;19403:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19403:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19768:23:0;::::1;19759:75;;;;-1:-1:-1::0;;;19759:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19867:6;::::0;;19850:36:::1;::::0;-1:-1:-1;;;;;19850:36:0;;::::1;::::0;19867:6;::::1;::::0;19850:36:::1;::::0;::::1;19897:9;:21:::0;;-1:-1:-1;;;;;;19897:21:0::1;-1:-1:-1::0;;;;;19897:21:0;;;::::1;::::0;;;::::1;::::0;;19665:261::o;19271:90::-;19320:7;19347:6;-1:-1:-1;;;;;19347:6:0;19271:90;:::o;19938:221::-;20022:9;;-1:-1:-1;;;;;20022:9:0;20008:10;:23;19999:71;;;;-1:-1:-1;;;19999:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20111:9;;;20103:6;;20086:36;;-1:-1:-1;;;;;20111:9:0;;;;20103:6;;;;20086:36;;;20142:9;;;20133:18;;-1:-1:-1;;;;;;20133:18:0;-1:-1:-1;;;;;20142:9:0;;;20133:18;;;;;;19938:221::o;21951:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22117:682::-;22187:4;22205:8;:6;:8::i;:::-;22234:68;-1:-1:-1;;;;;22242:3:0;22234:30;22266:10;22286:4;22293:7;22234:30;:68::i;:::-;22315:17;;:::i;:::-;-1:-1:-1;;;;;;22335:24:0;;;;;;:10;:24;;;;;;;;;22315:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22370:56;;;;;-1:-1:-1;;;22370:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22466:228;;;;;;;;;22497:12;;22466:228;;22497:27;;22515:7;22497:16;:27::i;:::-;22466:228;;;;22545:56;22567:4;-1:-1:-1;;;;;22560:28:0;;22590:7;22560:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22560:39:0;;22545:9;;;;:13;:56::i;:::-;22466:228;;22642:12;;22624;;22466:228;;;;;22624:32;;:16;:32::i;:::-;22466:228;;22677:5;22466:228;;;;;;;-1:-1:-1;;;;;22439:24:0;;;;;:10;:24;;;;;;;:255;;;;;;;;22466:228;22439:255;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22439:255:0;;;;;;;;;;22744:14;;22715:54;;22723:4;22715:27;;;22744:14;22760:7;22715:27;:54::i;:::-;-1:-1:-1;22787:4:0;;22117:682;-1:-1:-1;;;22117:682:0:o;26303:570::-;19412:6;;-1:-1:-1;;;;;19412:6:0;19422:10;19412:20;19403:67;;;;;-1:-1:-1;;;19403:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19403:67:0;;;;;;;;;;;;;;;26416:21:::1;26403:9;:34;;;;;;;;;26399:467;;;26460:11;:22:::0;;-1:-1:-1;;;;;;26460:22:0::1;-1:-1:-1::0;;;;;26460:22:0;::::1;;::::0;;26399:467:::1;;;26518:16;26505:9;:29;;;;;;;;;26500:366;;;26566:14;::::0;-1:-1:-1;;;;;26566:14:0::1;:30:::0;26557:80:::1;;;;-1:-1:-1::0;;;26557:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26652:14;:25:::0;;-1:-1:-1;;;;;;26652:25:0::1;-1:-1:-1::0;;;;;26652:25:0;::::1;;::::0;;26500:366:::1;;;26713:16;26700:9;:29;;;;;;;;;26695:171;;;26761:6;::::0;-1:-1:-1;;;;;26761:6:0::1;:20:::0;26752:70:::1;;;;-1:-1:-1::0;;;26752:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26837:6;:17:::0;;-1:-1:-1;;;;;26837:17:0;::::1;-1:-1:-1::0;;;;;;26837:17:0;;::::1;;::::0;;26303:570;;:::o;25334:140::-;25383:4;25408:58;25454:10;;25416:3;-1:-1:-1;;;;;25408:23:0;;25441:4;25408:40;;;;;;;;;;;;;-1:-1:-1;;;;;25408:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25408:40:0;;:44;:58::i;:::-;25401:65;;25334:140;:::o;23740:119::-;23834:10;23822:24;;;;:10;:24;;;;;:29;;;;-1:-1:-1;;23789:62:0;;23822:29;;;;23821:30;23789:62;;;23740:119::o;21113:18::-;;;;;;;;;;:::o;23981:266::-;24054:8;24049:51;;;24080:8;:6;:8::i;:::-;24110:69;-1:-1:-1;;;;;24118:4:0;24110:31;24143:10;24163:4;24170:7;24110:31;:69::i;:::-;24190:49;-1:-1:-1;;;;;24198:3:0;24190:26;24218:10;24230:7;24190:26;:49::i;20919:28::-;;;:::o;21207:22::-;;;;:::o;24528:683::-;24568:14;;24586:12;-1:-1:-1;24564:640:0;;24625:4;-1:-1:-1;;;;;24618:20:0;;24640:5;:16;;;24658:5;:12;;;24618:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24726:5:0;:12;24706:14;;:34;;:18;:34::i;:::-;24689:14;:51;24755:12;:14;;:12;:14;;;24803:11;;-1:-1:-1;;;;;24803:11:0;:25;24798:108;;24864:11;;;;;;;;;-1:-1:-1;;;;;24864:11:0;-1:-1:-1;;;;;24850:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24798:108:0;24922:12;24937:17;:15;:17::i;:::-;24922:32;;24969:11;24990:4;-1:-1:-1;;;;;24983:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24983:33:0;;-1:-1:-1;25037:17:0;;;25033:160;;25095:1;25076:16;:20;25033:160;;;25156:21;:7;25169:6;25156:11;:21::i;:::-;25137:16;:40;24564:640;;;24528:683::o;21140:26::-;;;-1:-1:-1;;;;;21140:26:0;;:::o;26987:111::-;19412:6;;-1:-1:-1;;;;;19412:6:0;19422:10;19412:20;19403:67;;;;;-1:-1:-1;;;19403:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19403:67:0;;;;;;;;;;;;;;;27062:12:::1;:28:::0;26987:111::o;21179:21::-;;;-1:-1:-1;;;;;21179:21:0;;:::o;21278:24::-;;;;:::o;21242:29::-;;;-1:-1:-1;;;;;21242:29:0;;:::o;23323:305::-;23362:17;;:::i;:::-;-1:-1:-1;23394:10:0;23382:24;;;;:10;:24;;;;;;;;23362:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23424:24;;;;;;23417:31;;;;;;;;;;;;-1:-1:-1;;23417:31:0;;;;;;23470:14;;23542:9;;23512:41;;-1:-1:-1;;;23512:41:0;;;;;;;;;;;-1:-1:-1;;;;;23470:14:0;;;;23461:34;;23505:4;;23519;23512:28;;;;;;:41;;;;;23382:24;;23512:41;;;;;;:28;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23512:41:0;23461:94;;;-1:-1:-1;;;;;;23461:94:0;;;;;;;-1:-1:-1;;;;;23461:94:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23461:94:0;;;;;;;-1:-1:-1;23461:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23606:12:0;;23566:54;;-1:-1:-1;;;;;;23574:3:0;23566:26;;-1:-1:-1;23594:10:0;;23566:26;:54::i;25906:225::-;25990:6;;-1:-1:-1;;;;;25990:6:0;25976:10;:20;25967:31;;;;;;26022:10;;:25;;26038:7;26022:14;:25::i;:::-;26009:10;:38;26091:6;;26058:65;;-1:-1:-1;;;;;26066:4:0;26058:31;;;26091:6;26107:4;26114:7;26058:31;:65::i;336:181::-;394:7;426:5;;;450:6;;;;442:46;;;;;-1:-1:-1;;;442:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;508:1;336:181;-1:-1:-1;;;336:181:0:o;15577:177::-;15687:58;;;-1:-1:-1;;;;;15687:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15687:58:0;-1:-1:-1;;;15687:58:0;;;15660:86;;15680:5;;15660:19;:86::i;:::-;15577:177;;;:::o;15762:205::-;15890:68;;;-1:-1:-1;;;;;15890:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15890:68:0;-1:-1:-1;;;15890:68:0;;;15863:96;;15883:5;;15863:19;:96::i;:::-;15762:205;;;;:::o;800:136::-;858:7;885:43;889:1;892;885:43;;;;;;;;;;;;;;;;;:3;:43::i;17882:761::-;18306:23;18332:69;18360:4;18332:69;;;;;;;;;;;;;;;;;18340:5;-1:-1:-1;;;;;18332:27:0;;;:69;;;;;:::i;:::-;18416:17;;18306:95;;-1:-1:-1;18416:21:0;18412:224;;18558:10;18547:30;;;;;;;;;;;;;;;-1:-1:-1;18547:30:0;18539:85;;;;-1:-1:-1;;;18539:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1239:192;1325:7;1361:12;1353:6;;;;1345:29;;;;-1:-1:-1;;;1345:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1397:5:0;;;1239:192::o;9648:196::-;9751:12;9783:53;9806:6;9814:4;9820:1;9823:12;9783:22;:53::i;:::-;9776:60;9648:196;-1:-1:-1;;;;9648:196:0:o;11239:979::-;11369:12;11402:18;11413:6;11402:10;:18::i;:::-;11394:60;;;;;-1:-1:-1;;;11394:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11528:12;11542:23;11569:6;-1:-1:-1;;;;;11569:11:0;11589:8;11600:4;11569:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11569:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11527:78;;;;11620:7;11616:595;;;11651:10;-1:-1:-1;11644:17:0;;-1:-1:-1;11644:17:0;11616:595;11765:17;;:21;11761:439;;12028:10;12022:17;12089:15;12076:10;12072:2;12068:19;12061:44;11976:148;12164:20;;-1:-1:-1;;;12164:20:0;;;;;;;;;;;;;;;;;12171:12;;12164:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6730:422;7097:20;7136:8;;;6730:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://4fbdbd3680015e3170549886cbc935022daa261fc90558d38b9ba81700e2d77a
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.