Contract 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa

Contract Overview

Balance:
902.786306564276580155 MOVR

MOVR Value:
$7,577.99 (@ $8.39/MOVR)
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x89e936ee1fa1544aa5114e25f5730944fc215e20a8178c744d4c79b4182bbbb6Transfer Ownersh...19971282022-06-10 18:29:30294 days 22 hrs ago0xad8cc90b59a9710276b99a3fc1338dc99119065d IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.000048086
0x1a5b1fb0fe4bb592a08df3ee7e22b953c9b58e280821d83dfbdcc14a1ee27100Transfer Ownersh...17567672022-04-28 17:52:12337 days 22 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00025767
0x9bc66b4734f2559fbf3c0151c3f5a75eb86b00a7c3d59df46ae02b59f1a77d9fAdd Reward Info17567612022-04-28 17:49:48337 days 23 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa316.597647058824096 MOVR0.00101673
0x3ad843b362643068cebdd5c24a2365f835ade4f6506c9059a1d8750f406a7056Add Reward Info17566062022-04-28 16:47:00338 days 4 mins ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa316.597647058824096 MOVR0.00024145
0x6211960a544920b8ec9d57bb82839a362de7864c062e760775428606fb16bb16Transfer Ownersh...17094782022-04-15 15:06:48351 days 1 hr ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00025767
0xe39c61d13723f9b6145d135937675b159950f7503e40e8b9767444cc3593435aAdd Reward Info17094052022-04-15 14:34:12351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa271.369411764705676 MOVR0.00140129
0xac5b1b1f7b80a6111830d2dfbddd088c6527b8733385b2b0205469e82fd545f7Add Reward Info17094042022-04-15 14:33:42351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa452.282352941176934 MOVR0.00101685
0xf5f51aae9400a540c953dea7e6dd673ad882feaffe44e409828d8939e8d3e707Add Reward Info17094022022-04-15 14:32:54351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa452.282352941176934 MOVR0.00101685
0x7135d979f5653614fecc6a6530c4d6ff4ab24c4957ad3f28a61bd178b62a060dAdd Reward Info17094012022-04-15 14:32:30351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa452.282352941176934 MOVR0.00101685
0x1d893885b601f5ae5f97d277ae260ba55f7d1a6c18e610f0c861cefa6c5e103cAdd Reward Info17094002022-04-15 14:32:12351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa90.456470588235628 MOVR0.00101673
0x13cec223212886ba784400aa54d0d2b0251b1351d2b05565120cb8db8444e062Add Reward Info17093992022-04-15 14:30:54351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa452.282352941176934 MOVR0.00101685
0x1d9223ad254c04ca20b1edc3815e2677dd8771c055a13f9d77f757d1d5480291Add Reward Info17093972022-04-15 14:28:30351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa452.282352941176934 MOVR0.00101685
0x6ce5f8c84513082dd79570ed4b6df13c1f49ad366ea733e0c698c08a93f15f9fAdd Reward Info17093962022-04-15 14:28:00351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa22.614117647058604 MOVR0.00101661
0xad3c371c0478741d895ba2110ebab8b8bd3a7b67d6411d89a74bcb0d1bcac45cAdd Reward Info17093952022-04-15 14:27:00351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa361.825882352941305 MOVR0.00101685
0xa24104aeae617db3efadc68b83250f46175054d749da37397dbca8248f49bfd2Add Reward Info17093942022-04-15 14:26:42351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa271.369411764705676 MOVR0.00101673
0x8e942d8f88976c38c923a3a9d61a891a2ce9d311a124037c2142ba55066c4c84Add Reward Info17093922022-04-15 14:25:54351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa180.912941176470048 MOVR0.00101661
0xe77b57c373d8a0091001aa2dae315f33aad873c415a966bd624087cb514094d3Add17093882022-04-15 14:24:42351 days 2 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.000196542
0xadd1d3d0b1c30b3a46c1f3e7a450c03bb4a65df0865f3f86d6b254cb876ba532Transfer Ownersh...16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00025767
0x19d0563731adb2a51ee528cc967c3a778b61fd9d4fd83e9e70a7512d921c7a31Add16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00098271
0xd1bd8ae33f43e8b2937bc4b7d46042df9fe4b231398991998a3dffc9c7f7c803Add16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00098271
0x411931cbbeae6a88891a94567d5d0fa89b1f107bbda54442af3dd70199a77764Add16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00098271
0x5783ad0de4402dae43c64d568bc7a2f5ad5b2e6dccdbd7fca4049e98b289de9dAdd16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00098271
0x3be94b4bbdb3c463b6ea7e8927fcf4b4e53fae18b9e919dac3f9db1cb91b26b0Add16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00098271
0x2eb97293dbb1a85a1a0e212994593bb3a2b3be2f69cd9e69c2fa4d0fbe89dcf4Add16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00098271
0xf2003aaf4c6521262dbab7d18bf5c44c2fbb0debf4cfdcab9e043b3257e19a72Add16523442022-03-29 12:05:30368 days 4 hrs ago0xb7f23fae09decfdfaac75e26c2bcc2fccd322bfb IN  0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0 MOVR0.00098271
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x30af1556ad986b711cf83521cfcb4f18e79b4f35f20ccbb5d2e8b6060312609e39319542023-03-30 19:12:001 day 21 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x7c6472435fe595e537718b2311a656eeab3cbe690.042000307018431404 MOVR
0x1c610d0b9a0539a55a77f9356dbcbb0cc9b7100a9268e9bf15c596191d8dd72339313652023-03-30 17:08:361 day 23 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x89604efc0f05417c9da41b894619063c8094818a0.013394766751040624 MOVR
0x73a4f5255176028ded785770db6cacf8d2955f3d6fedfe2674c93cdba04c619439182892023-03-28 20:17:483 days 20 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x9a212305c951911d92fc7a457c48d900e33dfecd0.016616830410639971 MOVR
0x8e2f9b1c5b896fd0718bb363d8c0160b54ca987f1d7db13ab9cfe2b59237c20b39078362023-03-27 8:40:365 days 8 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x0c1fd8441c36b288ec0f77e12ca8ba27a27b28bf0.820314330611762014 MOVR
0x74199a0a44fe90a7099bb551b809cea94d0dbf6b918ec1fe89558c19e1f8a72c38956382023-03-25 15:08:187 days 1 hr ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x90ef6c7b9a4075f97d963b5592c02c921456271b0.110946263468926342 MOVR
0x536fb86f3f4175b9a0a213304da8aff4aceaa20b3b94e309142f01f39c8e79a038394382023-03-17 16:16:4215 days 34 mins ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xfa8ba02d4e9d566f1d4730b322b236f26472cf250.103482950029601444 MOVR
0x70ef90e295c8f514450e2c581b768ff8ae3d784a3965f0d45d2ab34d6522907038317232023-03-16 14:11:5416 days 2 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xf962e09a92f4127bbc770c22af41a0c3baf0b66a0.016170694924792489 MOVR
0xb0649d0712e9287e1d7bf35d5ab04f0d2276c158adc64511f0ebf5fc3666e3c538234932023-03-15 10:16:3117 days 6 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xf76400be96d91e4d645e7c8cae70c0886dfd170a0.018463328241181903 MOVR
0xa8d6c25a0c2419269a4c686dd304d3052606de364ed7d17cc9cace306036ab8337558292023-03-05 15:32:3027 days 1 hr ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xffcd67f5ad22fd50c176c827638c38763bfade010.045305237128274921 MOVR
0x8c4c91aa9482fd1f657a2fa3b78db3ebc45aa6a34e3412e1d9f49400bc2cd31037222092023-02-28 20:12:2431 days 20 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x0b69202b80dd74fdd5d26576ddae0fc188e504e20.007814895363356688 MOVR
0xcf71b132cc9af9c36f6fe1c1f698e5c16f090d3f8b143639eb09d8d9411ca46b37154842023-02-27 21:04:3032 days 19 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x1009bec137c2a3ee9ba62f7d9c161f60bec3da850.229969786560598784 MOVR
0x120885c7cc9df6460e965ed4c64878dd483fe503e455b3a04264c9301d60fd8536912802023-02-24 10:14:0036 days 6 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x99e99692c2c14fa50a1c15c09319ee7434fa71200.081707001015241613 MOVR
0x7fde59e3426772f2b6c3383084bd0d9b621bfa4f90bccb4193a69fe645a19a7436704642023-02-21 11:27:3639 days 5 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x4cf790425886037a27ec41d2ad7c02078c8c99a10.087564721283522136 MOVR
0x2a0d1fd003fc69e43cab34f9d91f4d972b404272872325775858ce24745deec636657912023-02-20 18:49:3039 days 22 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x018f0d6edad04715e550c1c852dc9ef2ff39fa7e0.072013878397141688 MOVR
0xfc9c02e9a65f3e13e4b9196c79854443d6fa0c5536665873e3ec81d1c28f66b036516192023-02-18 18:31:0041 days 22 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xb8a2d5770c5bd58b761afeced5e8172bc421e9490.016645343171511709 MOVR
0x61f4b3dcb574d6583e9d02146f47ef3b6128b8830ad921d3450c48715bc1164236305692023-02-15 18:57:5444 days 21 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xa6525f92d9be3f4067bea30d47d1137194d3aa900.008771138560285645 MOVR
0xfc0b0fee17035f1b4f92f66eae381dc05852ad715352b12827230920edb1dde436045992023-02-12 2:47:2448 days 14 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x909553765bfa9441767e778705642293d1c2c6ed1.940687674542730653 MOVR
0xafca72158e91df85b46185928beb5ceb75c05a8786941cc630f745a1f307023d35914522023-02-10 6:03:0050 days 10 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x2b96d2a3bc8237aeaf392f1af39e70b230f4ee480.001921728307633498 MOVR
0x039979bb4e5f996b8f47c78f0014d7ffc98baf16715bbc7348f2508f225c5b0335914512023-02-10 6:02:4850 days 10 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x2b96d2a3bc8237aeaf392f1af39e70b230f4ee480.004537464959540914 MOVR
0x6c82d060a617e9024740953f6c8b554607e867f9f9c814228cfc3ae901ccd24935809452023-02-08 18:13:4251 days 22 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xa74b259f3d3d254ace6ce70e87833be4f41b53770.032522248173610416 MOVR
0xa3cdfcc4587c068658915b1d828b1893595a163a4d453043371ad12edb34aa0235772422023-02-08 5:35:4252 days 11 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x834a1f0e9e7a7628f160d21fe2429f5fb38243390.182963785762727443 MOVR
0xcbf27b93664785b3d39f092440da1ebe9d896e31468068f853c49263fd5b69f535503662023-02-04 10:17:0656 days 6 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x768f2a7ccdfde9ebdfd5cea8b635dd590cb3a3f135.834813406815748971 MOVR
0x239bb2787829de18e07a0deeb53446e2d89412703edb692498fd71e7203e8a5c35466332023-02-03 21:37:4856 days 19 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0x7644fef96321e78d0158b7b432ab9c58122f319f0.042619632627686305 MOVR
0x7a96c00ffb8bd7b5fc311bb8ce0d04a97c2a99af2c499a4e6ed9923815bbeb7335439792023-02-03 12:35:5457 days 4 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xafeda4157704b62526a6187a222e812a71f497410.008271011426800713 MOVR
0xd54c2ebd1cd3c1f7be7826de299bb74cf23e115bf49ac331f1d81515acff49be35340892023-02-02 2:54:4858 days 13 hrs ago 0x1c0e983d2b0bd5c2ca1a81d2627e82764aa597aa0xb96eae5ec9b149f99d02ea9c60767f9573c6d4c30.051291049724972471 MOVR
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x48E47d6554D78ca7478a6EFf5FCEE463ECf13a8C

Contract Name:
ComplexRewarderPerSecV3

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2022-02-23
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
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 on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        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");

        (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");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, 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");

        (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.4._
     */
    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.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}



/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



interface IBoringERC20 {
    function mint(address to, uint256 amount) external;

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

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

    /// @notice EIP 2612
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}


interface IComplexRewarder {
    function onSolarReward(
        uint256 pid,
        address user,
        uint256 newLpAmount
    ) external;

    function pendingTokens(uint256 pid, address user)
        external
        view
        returns (uint256 pending);

    function rewardToken() external view returns (IBoringERC20);

    function poolRewardsPerSec(uint256 pid) external view returns (uint256);
}



interface ISolarDistributorV2 {
    function totalAllocPoint() external view returns (uint256);

    function deposit(uint256 _pid, uint256 _amount) external;

    function poolLength() external view returns (uint256);

    function poolTotalLp(uint256 pid) external view returns (uint256);
}


// solhint-disable avoid-low-level-calls
library BoringERC20 {
    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
    bytes4 private constant SIG_NAME = 0x06fdde03; // name()
    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)

    function returnDataToString(bytes memory data)
        internal
        pure
        returns (string memory)
    {
        if (data.length >= 64) {
            return abi.decode(data, (string));
        } else if (data.length == 32) {
            uint8 i = 0;
            while (i < 32 && data[i] != 0) {
                i++;
            }
            bytes memory bytesArray = new bytes(i);
            for (i = 0; i < 32 && data[i] != 0; i++) {
                bytesArray[i] = data[i];
            }
            return string(bytesArray);
        } else {
            return "???";
        }
    }

    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token symbol.
    function safeSymbol(IBoringERC20 token)
        internal
        view
        returns (string memory)
    {
        (bool success, bytes memory data) = address(token).staticcall(
            abi.encodeWithSelector(SIG_SYMBOL)
        );
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token name.
    function safeName(IBoringERC20 token)
        internal
        view
        returns (string memory)
    {
        (bool success, bytes memory data) = address(token).staticcall(
            abi.encodeWithSelector(SIG_NAME)
        );
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.
    /// @param token The address of the ERC-20 token contract.
    /// @return (uint8) Token decimals.
    function safeDecimals(IBoringERC20 token) internal view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(
            abi.encodeWithSelector(SIG_DECIMALS)
        );
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }

    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransfer(
        IBoringERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(SIG_TRANSFER, to, amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "BoringERC20: Transfer failed"
        );
    }

    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param from Transfer tokens from.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransferFrom(
        IBoringERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "BoringERC20: TransferFrom failed"
        );
    }
}


/**
 * This is a sample contract to be used in the SolarDistributorV2 contract for partners to reward
 * stakers with their native token alongside SOLAR.
 *
 * It assumes no minting rights, so requires a set amount of YOUR_TOKEN to be transferred to this contract prior.
 * E.g. say you've allocated 100,000 XYZ to the SOLAR-XYZ farm over 30 days. Then you would need to transfer
 * 100,000 XYZ and set the block reward accordingly so it's fully distributed after 30 days.
 */

contract ComplexRewarderPerSecV3 is IComplexRewarder, Ownable, ReentrancyGuard {
    using BoringERC20 for IBoringERC20;

    IBoringERC20 public immutable override rewardToken;
    ISolarDistributorV2 public immutable distributorV2;
    bool public immutable isNative;

    /// @notice Info of each distributorV2 user.
    /// `amount` LP token amount the user has provided.
    /// `rewardDebt` The amount of REWARD entitled to the user.
    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
    }

    /// @notice Info of each distributorV2 poolInfo.
    /// `accTokenPerShare` Amount of REWARD each LP token is worth.
    /// `startTimestamp` The start timestamp of rewards.
    /// `lastRewardTimestamp` The last timestamp REWARD was rewarded to the poolInfo.
    /// `allocPoint` The amount of allocation points assigned to the pool.
    /// `totalRewards` The amount of rewards added to the pool.
    struct PoolInfo {
        uint256 accTokenPerShare;
        uint256 startTimestamp;
        uint256 lastRewardTimestamp;
        uint256 totalRewards;
    }

    /// @notice Reward info
    /// `startTimestamp` The start timestamp of rewards
    /// `endTimestamp` The end timestamp of rewards
    /// `rewardPerSec` The amount of rewards per second
    struct RewardInfo {
        uint256 startTimestamp;
        uint256 endTimestamp;
        uint256 rewardPerSec;
    }

    /// @notice Info of each pool.
    mapping(uint256 => PoolInfo) public poolInfo;

    /// @dev this is mostly used for extending reward period
    /// @notice Reward info is a set of {endTimestamp, rewardPerSec}
    /// indexed by pool id
    mapping(uint256 => RewardInfo[]) public poolRewardInfo;

    uint256[] public poolIds;

    /// @notice Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;

    /// @notice limit length of reward info
    /// how many phases are allowed
    uint256 public immutable rewardInfoLimit = 52; //1y

    // The precision factor
    uint256 private immutable ACC_TOKEN_PRECISION;

    event OnReward(address indexed user, uint256 amount);
    event RewardRateUpdated(uint256 oldRate, uint256 newRate);
    event AddPool(uint256 indexed pid);
    event UpdatePool(
        uint256 indexed pid,
        uint256 lastRewardTimestamp,
        uint256 lpSupply,
        uint256 accTokenPerShare
    );

    event AddRewardInfo(
        uint256 indexed pid,
        uint256 indexed phase,
        uint256 endTimestamp,
        uint256 rewardPerSec
    );

    modifier onlyDistributorV2() {
        require(
            msg.sender == address(distributorV2),
            "onlyDistributorV2: only DistributorV2 can call this function"
        );
        _;
    }

    constructor(
        IBoringERC20 _rewardToken,
        ISolarDistributorV2 _distributorV2,
        bool _isNative
    ) {
        require(
            Address.isContract(address(_rewardToken)),
            "constructor: reward token must be a valid contract"
        );
        require(
            Address.isContract(address(_distributorV2)),
            "constructor: SolarDistributorV2 must be a valid contract"
        );
        rewardToken = _rewardToken;
        distributorV2 = _distributorV2;
        isNative = _isNative;

        uint256 decimalsRewardToken = uint256(
            _isNative ? 18 : _rewardToken.safeDecimals()
        );
        require(
            decimalsRewardToken < 30,
            "constructor: reward token decimals must be inferior to 30"
        );

        ACC_TOKEN_PRECISION = uint256(
            10**(uint256(30) - (decimalsRewardToken))
        );
    }

    /// @notice Add a new pool. Can only be called by the owner.
    /// @param _pid pool id on DistributorV2
    function add(uint256 _pid, uint256 _startTimestamp) public onlyOwner {
        require(poolInfo[_pid].lastRewardTimestamp == 0, "pool already exists");

        poolInfo[_pid] = PoolInfo({
            startTimestamp: _startTimestamp,
            lastRewardTimestamp: _startTimestamp,
            accTokenPerShare: 0,
            totalRewards: 0
        });

        poolIds.push(_pid);
        emit AddPool(_pid);
    }

    /// @notice if the new reward info is added, the reward & its end timestamp will be extended by the newly pushed reward info.
    function addRewardInfo(
        uint256 _pid,
        uint256 _endTimestamp,
        uint256 _rewardPerSec
    ) external payable onlyOwner {
        RewardInfo[] storage rewardInfo = poolRewardInfo[_pid];
        PoolInfo storage pool = poolInfo[_pid];
        require(
            rewardInfo.length < rewardInfoLimit,
            "add reward info: reward info length exceeds the limit"
        );
        require(
            rewardInfo.length == 0 ||
                rewardInfo[rewardInfo.length - 1].endTimestamp >=
                block.timestamp,
            "add reward info: reward period ended"
        );
        require(
            rewardInfo.length == 0 ||
                rewardInfo[rewardInfo.length - 1].endTimestamp < _endTimestamp,
            "add reward info: bad new endTimestamp"
        );

        uint256 startTimestamp = rewardInfo.length == 0
            ? pool.startTimestamp
            : rewardInfo[rewardInfo.length - 1].endTimestamp;

        uint256 timeRange = _endTimestamp - startTimestamp;
        uint256 totalRewards = timeRange * _rewardPerSec;

        if (!isNative) {
            rewardToken.safeTransferFrom(
                msg.sender,
                address(this),
                totalRewards
            );
        } else {
            require(
                msg.value == totalRewards,
                "add reward info: not enough funds to transfer"
            );
        }

        pool.totalRewards += totalRewards;

        rewardInfo.push(
            RewardInfo({
                startTimestamp: startTimestamp,
                endTimestamp: _endTimestamp,
                rewardPerSec: _rewardPerSec
            })
        );

        emit AddRewardInfo(
            _pid,
            rewardInfo.length - 1,
            _endTimestamp,
            _rewardPerSec
        );
    }

    function _endTimestampOf(uint256 _pid, uint256 _timestamp)
        internal
        view
        returns (uint256)
    {
        RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
        uint256 len = rewardInfo.length;
        if (len == 0) {
            return 0;
        }
        for (uint256 i = 0; i < len; ++i) {
            if (_timestamp <= rewardInfo[i].endTimestamp)
                return rewardInfo[i].endTimestamp;
        }

        /// @dev when couldn't find any reward info, it means that _timestamp exceed endTimestamp
        /// so return the latest reward info.
        return rewardInfo[len - 1].endTimestamp;
    }

    /// @notice this will return end timestamp based on the current block timestamp.
    function currentEndTimestamp(uint256 _pid) external view returns (uint256) {
        return _endTimestampOf(_pid, block.timestamp);
    }

    /// @notice Return reward multiplier over the given _from to _to timestamp.
    function _getTimeElapsed(
        uint256 _from,
        uint256 _to,
        uint256 _endTimestamp
    ) public pure returns (uint256) {
        if ((_from >= _endTimestamp) || (_from > _to)) {
            return 0;
        }
        if (_to <= _endTimestamp) {
            return _to - _from;
        }
        return _endTimestamp - _from;
    }

    /// @notice Update reward variables of the given pool.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @return pool Returns the pool that was updated.
    function updatePool(uint256 _pid)
        external
        nonReentrant
        returns (PoolInfo memory pool)
    {
        return _updatePool(_pid);
    }

    /// @notice Update reward variables of the given pool.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @return pool Returns the pool that was updated.
    function _updatePool(uint256 pid) public returns (PoolInfo memory pool) {
        pool = poolInfo[pid];
        RewardInfo[] memory rewardInfo = poolRewardInfo[pid];

        if (block.timestamp <= pool.lastRewardTimestamp) {
            return pool;
        }

        uint256 lpSupply = distributorV2.poolTotalLp(pid);

        if (lpSupply == 0) {
            // if there is no total supply, return and use the pool's start timestamp as the last reward timestamp
            // so that ALL reward will be distributed.
            // however, if the first deposit is out of reward period, last reward timestamp will be its timestamp
            // in order to keep the multiplier = 0
            if (block.timestamp > _endTimestampOf(pid, block.timestamp)) {
                pool.lastRewardTimestamp = block.timestamp;
                emit UpdatePool(
                    pid,
                    pool.lastRewardTimestamp,
                    lpSupply,
                    pool.accTokenPerShare
                );
            }

            return pool;
        }

        /// @dev for each reward info
        for (uint256 i = 0; i < rewardInfo.length; ++i) {
            // @dev get multiplier based on current timestamp and rewardInfo's end timestamp
            // multiplier will be a range of either (current timestamp - pool.timestamp)
            // or (reward info's endtimestamp - pool.timestamp) or 0
            uint256 timeElapsed = _getTimeElapsed(
                pool.lastRewardTimestamp,
                block.timestamp,
                rewardInfo[i].endTimestamp
            );
            if (timeElapsed == 0) continue;

            // @dev if currentTimestamp exceed end timestamp, use end timestamp as the last reward timestamp
            // so that for the next iteration, previous endTimestamp will be used as the last reward timestamp
            if (block.timestamp > rewardInfo[i].endTimestamp) {
                pool.lastRewardTimestamp = rewardInfo[i].endTimestamp;
            } else {
                pool.lastRewardTimestamp = block.timestamp;
            }

            uint256 tokenReward = (timeElapsed * rewardInfo[i].rewardPerSec);

            pool.accTokenPerShare += ((tokenReward * ACC_TOKEN_PRECISION) /
                lpSupply);
        }

        poolInfo[pid] = pool;

        emit UpdatePool(
            pid,
            pool.lastRewardTimestamp,
            lpSupply,
            pool.accTokenPerShare
        );

        return pool;
    }

    // Update reward vairables for all pools. Be careful of gas spending!
    function massUpdatePools() public nonReentrant {
        _massUpdatePools();
    }

    // Update reward vairables for all pools. Be careful of gas spending!
    function _massUpdatePools() internal {
        uint256 length = poolIds.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            _updatePool(poolIds[pid]);
        }
    }

    /// @notice Function called by SolarDistributorV2 whenever staker claims SOLAR harvest. Allows staker to also receive a 2nd reward token.
    /// @param _user Address of user
    /// @param _amount Number of LP tokens the user has
    function onSolarReward(
        uint256 _pid,
        address _user,
        uint256 _amount
    ) external override onlyDistributorV2 nonReentrant {
        PoolInfo memory pool = _updatePool(_pid);
        UserInfo storage user = userInfo[_pid][_user];

        uint256 pending = 0;
        uint256 rewardBalance = 0;

        if (isNative) {
            rewardBalance = address(this).balance;
        } else {
            rewardBalance = rewardToken.balanceOf(address(this));
        }

        if (user.amount > 0) {
            pending = (((user.amount * pool.accTokenPerShare) /
                ACC_TOKEN_PRECISION) - user.rewardDebt);

            if (pending > 0) {
                if (isNative) {
                    if (pending > rewardBalance) {
                        (bool success, ) = _user.call{value: rewardBalance}("");
                        require(success, "Transfer failed");
                    } else {
                        (bool success, ) = _user.call{value: pending}("");
                        require(success, "Transfer failed");
                    }
                } else {
                    if (pending > rewardBalance) {
                        rewardToken.safeTransfer(_user, rewardBalance);
                    } else {
                        rewardToken.safeTransfer(_user, pending);
                    }
                }
            }
        }

        user.amount = _amount;

        user.rewardDebt =
            (user.amount * pool.accTokenPerShare) /
            ACC_TOKEN_PRECISION;

        emit OnReward(_user, pending);
    }

    /// @notice View function to see pending Reward on frontend.
    function pendingTokens(uint256 _pid, address _user)
        external
        view
        override
        returns (uint256)
    {
        return
            _pendingTokens(
                _pid,
                userInfo[_pid][_user].amount,
                userInfo[_pid][_user].rewardDebt
            );
    }

    function _pendingTokens(
        uint256 _pid,
        uint256 _amount,
        uint256 _rewardDebt
    ) internal view returns (uint256 pending) {
        PoolInfo memory pool = poolInfo[_pid];
        RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];

        uint256 accTokenPerShare = pool.accTokenPerShare;
        uint256 lpSupply = distributorV2.poolTotalLp(_pid);

        if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
            uint256 cursor = pool.lastRewardTimestamp;

            for (uint256 i = 0; i < rewardInfo.length; ++i) {
                uint256 timeElapsed = _getTimeElapsed(
                    cursor,
                    block.timestamp,
                    rewardInfo[i].endTimestamp
                );
                if (timeElapsed == 0) continue;
                cursor = rewardInfo[i].endTimestamp;

                uint256 tokenReward = (timeElapsed *
                    rewardInfo[i].rewardPerSec);

                accTokenPerShare +=
                    (tokenReward * ACC_TOKEN_PRECISION) /
                    lpSupply;
            }
        }

        pending = (((_amount * accTokenPerShare) / ACC_TOKEN_PRECISION) -
            _rewardDebt);
    }

    function _rewardPerSecOf(uint256 _pid, uint256 _blockTimestamp)
        internal
        view
        returns (uint256)
    {
        RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
        PoolInfo storage pool = poolInfo[_pid];
        uint256 len = rewardInfo.length;
        if (len == 0) {
            return 0;
        }
        if (pool.startTimestamp > _blockTimestamp) {
            return 0;
        }        
        for (uint256 i = 0; i < len; ++i) {
            if (_blockTimestamp <= rewardInfo[i].endTimestamp)
                return rewardInfo[i].rewardPerSec;
        }
        /// @dev when couldn't find any reward info, it means that timestamp exceed endblock
        /// so return 0
        return 0;
    }

    /// @notice View function to see pool rewards per sec
    function poolRewardsPerSec(uint256 _pid)
        external
        view
        override
        returns (uint256)
    {
        return _rewardPerSecOf(_pid, block.timestamp);
    }

    /// @notice Withdraw reward. EMERGENCY ONLY.
    function emergencyRewardWithdraw(
        uint256 _pid,
        uint256 _amount,
        address _beneficiary
    ) external onlyOwner nonReentrant {
        PoolInfo storage pool = poolInfo[_pid];
        uint256 lpSupply = distributorV2.poolTotalLp(_pid);

        uint256 currentStakingPendingReward = _pendingTokens(_pid, lpSupply, 0);

        require(
            currentStakingPendingReward + _amount <= pool.totalRewards,
            "emergency reward withdraw: not enough reward token"
        );
        pool.totalRewards -= _amount;

        if (!isNative) {
            rewardToken.safeTransfer(_beneficiary, _amount);
        } else {
            (bool sent, ) = _beneficiary.call{value: _amount}("");
            require(sent, "emergency reward withdraw: failed to send");
        }
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract IBoringERC20","name":"_rewardToken","type":"address"},{"internalType":"contract ISolarDistributorV2","name":"_distributorV2","type":"address"},{"internalType":"bool","name":"_isNative","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"phase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"name":"AddRewardInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"RewardRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accTokenPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"_getTimeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"_updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct ComplexRewarderPerSecV3.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_rewardPerSec","type":"uint256"}],"name":"addRewardInfo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"currentEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributorV2","outputs":[{"internalType":"contract ISolarDistributorV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onSolarReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolRewardInfo","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardInfoLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct ComplexRewarderPerSecV3.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]

610120604052603460e0523480156200001757600080fd5b5060405162003020380380620030208339810160408190526200003a9162000371565b620000453362000252565b600180819055506200006283620002a260201b62001ccb1760201c565b620000cf5760405162461bcd60e51b815260206004820152603260248201527f636f6e7374727563746f723a2072657761726420746f6b656e206d7573742062604482015271194818481d985b1a590818dbdb9d1c9858dd60721b60648201526084015b60405180910390fd5b620000e582620002a260201b62001ccb1760201c565b620001595760405162461bcd60e51b815260206004820152603860248201527f636f6e7374727563746f723a20536f6c61724469737472696275746f7256322060448201527f6d75737420626520612076616c696420636f6e747261637400000000000000006064820152608401620000c6565b6001600160601b0319606084811b821660805283901b1660a05280151560f81b60c052600081620001a957620001a3846001600160a01b0316620002a860201b62001cd11760201c565b620001ac565b60125b60ff169050601e8110620002295760405162461bcd60e51b815260206004820152603960248201527f636f6e7374727563746f723a2072657761726420746f6b656e20646563696d6160448201527f6c73206d75737420626520696e666572696f7220746f203330000000000000006064820152608401620000c6565b6200023681601e6200053a565b6200024390600a6200047c565b61010052506200058392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3b151590565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691620002f09190620003f5565b600060405180830381855afa9150503d80600081146200032d576040519150601f19603f3d011682016040523d82523d6000602084013e62000332565b606091505b509150915081801562000346575080516020145b6200035357601262000369565b80806020019051810190620003699190620003c9565b949350505050565b6000806000606084860312156200038757600080fd5b835162000394816200056a565b6020850151909350620003a7816200056a565b60408501519092508015158114620003be57600080fd5b809150509250925092565b600060208284031215620003dc57600080fd5b815160ff81168114620003ee57600080fd5b9392505050565b6000825160005b81811015620004185760208186018101518583015201620003fc565b8181111562000428576000828501525b509190910192915050565b600181815b808511156200047457816000190482111562000458576200045862000554565b808516156200046657918102915b93841c939080029062000438565b509250929050565b6000620003ee8383600082620004955750600162000534565b81620004a45750600062000534565b8160018114620004bd5760028114620004c857620004e8565b600191505062000534565b60ff841115620004dc57620004dc62000554565b50506001821b62000534565b5060208310610133831016604e8410600b84101617156200050d575081810a62000534565b62000519838362000433565b806000190482111562000530576200053062000554565b0290505b92915050565b6000828210156200054f576200054f62000554565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146200058057600080fd5b50565b60805160601c60a05160601c60c05160f81c60e051610100516129d16200064f60003960008181611591015281816119fc01528181611bf801528181611fe3015261203701526000818161018b0152610a5e0152600081816103830152818161085701528181610d07015281816118ff0152611a430152600081816103e7015281816106fe015281816113c5015281816117a00152611eb001526000818161051f0152818161089601528181610d440152818161195801528181611b840152611bca01526129d16000f3fe6080604052600436106101745760003560e01c806373cfc6b2116100cb5780639e494bee1161007f578063f7c618c111610059578063f7c618c11461050d578063fe8343fb14610541578063ffcd42631461056157600080fd5b80639e494bee146104ad578063d4aa89b5146104cd578063f2fde38b146104ed57600080fd5b80637d0d9d5f116100b05780637d0d9d5f146103d55780638da5cb5b1461042e57806393f1a40b1461045957600080fd5b806373cfc6b214610371578063771602f7146103b557600080fd5b8063465e81ec1161012d57806369883b4e1161010757806369883b4e1461031c578063715018a61461033c578063723336311461035157600080fd5b8063465e81ec1461029457806351eb05a6146102b4578063630b5ba11461030757600080fd5b80631526fe271161015e5780631526fe27146101fb5780631d1231311461025f5780632ea807c51461028157600080fd5b8062d74850146101795780630832cfbf146101c0575b600080fd5b34801561018557600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101cc57600080fd5b506101e06101db36600461277c565b610581565b604080519384526020840192909252908201526060016101b7565b34801561020757600080fd5b5061023f6102163660046126e9565b600260208190526000918252604090912080546001820154928201546003909201549092919084565b6040805194855260208501939093529183015260608201526080016101b7565b34801561026b57600080fd5b5061027f61027a36600461279e565b6105c3565b005b61027f61028f3660046127d3565b6109c0565b3480156102a057600080fd5b506101ad6102af3660046126e9565b610eb2565b3480156102c057600080fd5b506102d46102cf3660046126e9565b610ec4565b6040516101b791908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561031357600080fd5b5061027f610f74565b34801561032857600080fd5b506101ad6103373660046126e9565b610ff4565b34801561034857600080fd5b5061027f611015565b34801561035d57600080fd5b506101ad61036c3660046127d3565b6110a2565b34801561037d57600080fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016101b7565b3480156103c157600080fd5b5061027f6103d036600461277c565b6110eb565b3480156103e157600080fd5b506104097f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b34801561043a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610409565b34801561046557600080fd5b5061049861047436600461271b565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101b7565b3480156104b957600080fd5b506101ad6104c83660046126e9565b611295565b3480156104d957600080fd5b506102d46104e83660046126e9565b6112a1565b3480156104f957600080fd5b5061027f6105083660046126ac565b611658565b34801561051957600080fd5b506104097f000000000000000000000000000000000000000000000000000000000000000081565b34801561054d57600080fd5b5061027f61055c366004612747565b611788565b34801561056d57600080fd5b506101ad61057c36600461271b565b611c89565b6003602052816000526040600020818154811061059d57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b60005473ffffffffffffffffffffffffffffffffffffffff163314610649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600260015414156106b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b600260018190556000848152602091909152604080822090517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018690529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561075557600080fd5b505afa158015610769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078d9190612702565b9050600061079d86836000611dcc565b60038401549091506107af868361285d565b111561083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f656d657267656e6379207265776172642077697468647261773a206e6f74206560448201527f6e6f7567682072657761726420746f6b656e00000000000000000000000000006064820152608401610640565b8483600301600082825461085191906128ed565b909155507f000000000000000000000000000000000000000000000000000000000000000090506108c2576108bd73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168587612080565b6109b4565b60008473ffffffffffffffffffffffffffffffffffffffff168660405160006040518083038185875af1925050503d806000811461091c576040519150601f19603f3d011682016040523d82523d6000602084013e610921565b606091505b50509050806109b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e6379207265776172642077697468647261773a206661696c6560448201527f6420746f2073656e6400000000000000000000000000000000000000000000006064820152608401610640565b505b50506001805550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6000838152600360209081526040808320600290925290912081547f000000000000000000000000000000000000000000000000000000000000000011610b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60448201527f677468206578636565647320746865206c696d697400000000000000000000006064820152608401610640565b81541580610b4a5750815442908390610b25906001906128ed565b81548110610b3557610b3561296c565b90600052602060002090600302016001015410155b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6164642072657761726420696e666f3a2072657761726420706572696f64206560448201527f6e646564000000000000000000000000000000000000000000000000000000006064820152608401610640565b81541580610c145750815484908390610bf0906001906128ed565b81548110610c0057610c0061296c565b906000526020600020906003020160010154105b610ca0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560448201527f7374616d700000000000000000000000000000000000000000000000000000006064820152608401610640565b815460009015610ce15782548390610cba906001906128ed565b81548110610cca57610cca61296c565b906000526020600020906003020160010154610ce7565b81600101545b90506000610cf582876128ed565b90506000610d0386836128b0565b90507f0000000000000000000000000000000000000000000000000000000000000000610d7157610d6c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846121f0565b610e00565b803414610e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460448201527f7320746f207472616e73666572000000000000000000000000000000000000006064820152608401610640565b80846003016000828254610e14919061285d565b90915550506040805160608101825284815260208082018a8152928201898152885460018181018b5560008b8152939093209351600390910290930192835592518282015591516002909101558554610e6d91906128ed565b60408051898152602081018990528a917fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc2910160405180910390a35050505050505050565b6000610ebe8242612369565b92915050565b610eef6040518060800160405280600081526020016000815260200160008152602001600081525090565b60026001541415610f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600155610f6a826112a1565b6001805592915050565b60026001541415610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600155610fee612499565b60018055565b6004818154811061100457600080fd5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff163314611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6110a060006124e2565b565b600081841015806110b257508284115b156110bf575060006110e4565b8183116110d7576110d084846128ed565b90506110e4565b6110e184836128ed565b90505b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b60008281526002602081905260409091200154156111e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20616c726561647920657869737473000000000000000000000000006044820152606401610640565b6040805160808101825260008082526020808301858152838501868152606085018481528885526002938490528685209551865591516001808701919091559051928501929092555160039093019290925560048054928301815581527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101849055905183917f6f92874181ba07c8e988c53b7d3c2fdcff7154a3500137bf6a350ebac65c087091a25050565b6000610ebe8242612557565b6112cc6040518060800160405280600081526020016000815260200160008152602001600081525090565b50600081815260026020818152604080842081516080810183528154815260018201548185015293810154848301526003908101546060850152858552825280842080548251818502810185019093528083529394939192909190849084015b8282101561137c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250508152602001906001019061132c565b505050509050816040015142116113935750919050565b6040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561141c57600080fd5b505afa158015611430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114549190612702565b9050806114bf576114658442612557565b4211156114b85742604084810182905284518151928352602083018490529082015284907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46906060015b60405180910390a25b5050919050565b60005b82518110156115e55760006114f98560400151428685815181106114e8576114e861296c565b6020026020010151602001516110a2565b90508061150657506115d5565b8382815181106115185761151861296c565b6020026020010151602001514211156115575783828151811061153d5761153d61296c565b60200260200101516020015185604001818152505061155e565b4260408601525b60008483815181106115725761157261296c565b6020026020010151604001518261158991906128b0565b9050836115b67f0000000000000000000000000000000000000000000000000000000000000000836128b0565b6115c09190612875565b865187906115cf90839061285d565b90525050505b6115de81612904565b90506114c2565b5060008481526002602081815260409283902086518082558783015160018301558785015193820184905560608089015160039093019290925584519384529183018590529282015285917f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f4691016114af565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b73ffffffffffffffffffffffffffffffffffffffff811661177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610640565b611785816124e2565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f6f6e6c794469737472696275746f7256323a206f6e6c7920446973747269627560448201527f746f7256322063616e2063616c6c20746869732066756e6374696f6e000000006064820152608401610640565b600260015414156118ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b600260015560006118ca846112a1565b600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684529091528120919250807f00000000000000000000000000000000000000000000000000000000000000001561192a5750476119ea565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156119af57600080fd5b505afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190612702565b90505b825415611bf1576001830154845184547f000000000000000000000000000000000000000000000000000000000000000091611a25916128b0565b611a2f9190612875565b611a3991906128ed565b91508115611bf1577f000000000000000000000000000000000000000000000000000000000000000015611b625780821115611b405760008673ffffffffffffffffffffffffffffffffffffffff16826040515b60006040518083038185875af1925050503d8060008114611aca576040519150601f19603f3d011682016040523d82523d6000602084013e611acf565b606091505b5050905080611b3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610640565b50611bf1565b60008673ffffffffffffffffffffffffffffffffffffffff1683604051611a8d565b80821115611bb057611bab73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783612080565b611bf1565b611bf173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168784612080565b84835583517f000000000000000000000000000000000000000000000000000000000000000090611c2290876128b0565b611c2c9190612875565b600184015560405182815273ffffffffffffffffffffffffffffffffffffffff8716907fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b49060200160405180910390a25050600180555050505050565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152812080546001909101546110e4918591611dcc565b3b151590565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691611d529190612822565b600060405180830381855afa9150503d8060008114611d8d576040519150601f19603f3d011682016040523d82523d6000602084013e611d92565b606091505b5091509150818015611da5575080516020145b611db0576012611dc4565b80806020019051810190611dc491906127ff565b949350505050565b600083815260026020818152604080842081516080810183528154815260018201548185015293810154848301526003908101546060850152878552825280842080548251818502810185019093528083528593849084015b82821015611e755783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611e25565b505084516040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018b905293945092600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063654c9ece9060240160206040518083038186803b158015611f0857600080fd5b505afa158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190612702565b9050836040015142118015611f5457508015155b1561203457604084015160005b8451811015612031576000611f8383428885815181106114e8576114e861296c565b905080611f905750612021565b858281518110611fa257611fa261296c565b60200260200101516020015192506000868381518110611fc457611fc461296c565b60200260200101516040015182611fdb91906128b0565b9050846120087f0000000000000000000000000000000000000000000000000000000000000000836128b0565b6120129190612875565b61201c908761285d565b955050505b61202a81612904565b9050611f61565b50505b857f0000000000000000000000000000000000000000000000000000000000000000612060848a6128b0565b61206a9190612875565b61207491906128ed565b98975050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121179190612822565b6000604051808303816000865af19150503d8060008114612154576040519150601f19603f3d011682016040523d82523d6000602084013e612159565b606091505b509150915081801561218357508051158061218357508080602001905181019061218391906126c7565b6121e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610640565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161228f9190612822565b6000604051808303816000865af19150503d80600081146122cc576040519150601f19603f3d011682016040523d82523d6000602084013e6122d1565b606091505b50915091508180156122fb5750805115806122fb5750808060200190518101906122fb91906126c7565b612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610640565b505050505050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156123e25783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612392565b505050600086815260026020526040902082519293509190508061240c5760009350505050610ebe565b84826001015411156124245760009350505050610ebe565b60005b8181101561248c578381815181106124415761244161296c565b602002602001015160200151861161247c578381815181106124655761246561296c565b602002602001015160400151945050505050610ebe565b61248581612904565b9050612427565b5060009695505050505050565b60045460005b818110156124de576124cd600482815481106124bd576124bd61296c565b90600052602060002001546112a1565b506124d781612904565b905061249f565b5050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156125d05783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612580565b505082519293505050806125e957600092505050610ebe565b60005b81811015612650578281815181106126065761260661296c565b60200260200101516020015185116126405782818151811061262a5761262a61296c565b6020026020010151602001519350505050610ebe565b61264981612904565b90506125ec565b508161265d6001836128ed565b8151811061266d5761266d61296c565b6020026020010151602001519250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146126a757600080fd5b919050565b6000602082840312156126be57600080fd5b6110e482612683565b6000602082840312156126d957600080fd5b815180151581146110e457600080fd5b6000602082840312156126fb57600080fd5b5035919050565b60006020828403121561271457600080fd5b5051919050565b6000806040838503121561272e57600080fd5b8235915061273e60208401612683565b90509250929050565b60008060006060848603121561275c57600080fd5b8335925061276c60208501612683565b9150604084013590509250925092565b6000806040838503121561278f57600080fd5b50508035926020909101359150565b6000806000606084860312156127b357600080fd5b83359250602084013591506127ca60408501612683565b90509250925092565b6000806000606084860312156127e857600080fd5b505081359360208301359350604090920135919050565b60006020828403121561281157600080fd5b815160ff811681146110e457600080fd5b6000825160005b818110156128435760208186018101518583015201612829565b81811115612852576000828501525b509190910192915050565b600082198211156128705761287061293d565b500190565b6000826128ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128e8576128e861293d565b500290565b6000828210156128ff576128ff61293d565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129365761293661293d565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d358124710e02f4aa4a4d267f81d662ca03a1b0761539e1433665854b7df7dce64736f6c6343000807003300000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f0000000000000000000000000000000000000000000000000000000000000001

Deployed ByteCode Sourcemap

19546:16664:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21547:45;;;;;;;;;;;;;;;;;;11123:25:1;;;11111:2;11096:18;21547:45:0;;;;;;;;21238:54;;;;;;;;;;-1:-1:-1;21238:54:0;;;;;:::i;:::-;;:::i;:::-;;;;11614:25:1;;;11670:2;11655:18;;11648:34;;;;11698:18;;;11691:34;11602:2;11587:18;21238:54:0;11412:319:1;21025:44:0;;;;;;;;;;-1:-1:-1;21025:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11967:25:1;;;12023:2;12008:18;;12001:34;;;;12051:18;;;12044:34;12109:2;12094:18;;12087:34;11954:3;11939:19;21025:44:0;11736:391:1;35383:824:0;;;;;;;;;;-1:-1:-1;35383:824:0;;;;;:::i;:::-;;:::i;:::-;;24003:1894;;;;;;:::i;:::-;;:::i;35138:187::-;;;;;;;;;;-1:-1:-1;35138:187:0;;;;;:::i;:::-;;:::i;27433:162::-;;;;;;;;;;-1:-1:-1;27433:162:0;;;;;:::i;:::-;;:::i;:::-;;;;;;10763:13:1;;10745:32;;10833:4;10821:17;;;10815:24;10793:20;;;10786:54;10896:4;10884:17;;;10878:24;10856:20;;;10849:54;10959:4;10947:17;;;10941:24;10919:20;;;10912:54;;;;10732:3;10717:19;;10548:424;30418:84:0;;;;;;;;;;;;;:::i;21301:24::-;;;;;;;;;;-1:-1:-1;21301:24:0;;;;;:::i;:::-;;:::i;10173:94::-;;;;;;;;;;;;;:::i;26888:360::-;;;;;;;;;;-1:-1:-1;26888:360:0;;;;;:::i;:::-;;:::i;19789:30::-;;;;;;;;;;;;;;;;;;4569:14:1;;4562:22;4544:41;;4532:2;4517:18;19789:30:0;4404:187:1;23433:431:0;;;;;;;;;;-1:-1:-1;23433:431:0;;;;;:::i;:::-;;:::i;19732:50::-;;;;;;;;;;;;;;;;;;3644:42:1;3632:55;;;3614:74;;3602:2;3587:18;19732:50:0;3468:226:1;9522:87:0;;;;;;;;;;-1:-1:-1;9568:7:0;9595:6;;;9522:87;;21392:64;;;;;;;;;;-1:-1:-1;21392:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11333:25:1;;;11389:2;11374:18;;11367:34;;;;11306:18;21392:64:0;11159:248:1;26660:139:0;;;;;;;;;;-1:-1:-1;26660:139:0;;;;;:::i;:::-;;:::i;27779:2556::-;;;;;;;;;;-1:-1:-1;27779:2556:0;;;;;:::i;:::-;;:::i;10422:192::-;;;;;;;;;;-1:-1:-1;10422:192:0;;;;;:::i;:::-;;:::i;19675:50::-;;;;;;;;;;;;;;;31023:1629;;;;;;;;;;-1:-1:-1;31023:1629:0;;;;;:::i;:::-;;:::i;32726:323::-;;;;;;;;;;-1:-1:-1;32726:323:0;;;;;:::i;:::-;;:::i;21238:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21238:54:0;;-1:-1:-1;21238:54:0;:::o;35383:824::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;;;;;;;;;12457:1:::1;13053:7;;:19;;13045:63;;;::::0;::::1;::::0;;9976:2:1;13045:63:0::1;::::0;::::1;9958:21:1::0;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0::1;9774:355:1::0;13045:63:0::1;12457:1;13186:7;:18:::0;;;35546:21:::2;35570:14:::0;;;::::2;::::0;;;;;;;;35614:31;;;;;::::2;::::0;::::2;11123:25:1::0;;;35570:14:0;;35546:21;35614:13:::2;:25;;::::0;::::2;::::0;11096:18:1;;35614:31:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35595:50;;35658:35;35696:33;35711:4;35717:8;35727:1;35696:14;:33::i;:::-;35805:17;::::0;::::2;::::0;35658:71;;-1:-1:-1;35764:37:0::2;35794:7:::0;35658:71;35764:37:::2;:::i;:::-;:58;;35742:158;;;::::0;::::2;::::0;;6825:2:1;35742:158:0::2;::::0;::::2;6807:21:1::0;6864:2;6844:18;;;6837:30;6903:34;6883:18;;;6876:62;6974:20;6954:18;;;6947:48;7012:19;;35742:158:0::2;6623:414:1::0;35742:158:0::2;35932:7;35911:4;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;35957:8:0::2;::::0;-1:-1:-1;35952:248:0::2;;35982:47;:24;:11;:24;36007:12:::0;36021:7;35982:24:::2;:47::i;:::-;35952:248;;;36063:9;36078:12;:17;;36103:7;36078:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36062:53;;;36138:4;36130:58;;;::::0;::::2;::::0;;6415:2:1;36130:58:0::2;::::0;::::2;6397:21:1::0;6454:2;6434:18;;;6427:30;6493:34;6473:18;;;6466:62;6564:11;6544:18;;;6537:39;6593:19;;36130:58:0::2;6213:405:1::0;36130:58:0::2;36047:153;35952:248;-1:-1:-1::0;;12413:1:0::1;13365:22:::0;;-1:-1:-1;;;;35383:824:0:o;24003:1894::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;24158:31:::1;24192:20:::0;;;:14:::1;:20;::::0;;;;;;;24247:8:::1;:14:::0;;;;;;24294:17;;24314:15:::1;-1:-1:-1::0;24272:138:0::1;;;::::0;::::1;::::0;;9193:2:1;24272:138:0::1;::::0;::::1;9175:21:1::0;9232:2;9212:18;;;9205:30;9271:34;9251:18;;;9244:62;9342:23;9322:18;;;9315:51;9383:19;;24272:138:0::1;8991:417:1::0;24272:138:0::1;24443:17:::0;;:22;;:125:::1;;-1:-1:-1::0;24497:17:0;;24553:15:::1;::::0;24486:10;;24497:21:::1;::::0;24517:1:::1;::::0;24497:21:::1;:::i;:::-;24486:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:82;;24443:125;24421:211;;;::::0;::::1;::::0;;8034:2:1;24421:211:0::1;::::0;::::1;8016:21:1::0;8073:2;8053:18;;;8046:30;8112:34;8092:18;;;8085:62;8183:6;8163:18;;;8156:34;8207:19;;24421:211:0::1;7832:400:1::0;24421:211:0::1;24665:17:::0;;:22;;:105:::1;;-1:-1:-1::0;24719:17:0;;24757:13;;24708:10;;24719:21:::1;::::0;24739:1:::1;::::0;24719:21:::1;:::i;:::-;24708:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:62;24665:105;24643:192;;;::::0;::::1;::::0;;8787:2:1;24643:192:0::1;::::0;::::1;8769:21:1::0;8826:2;8806:18;;;8799:30;8865:34;8845:18;;;8838:62;8936:7;8916:18;;;8909:35;8961:19;;24643:192:0::1;8585:401:1::0;24643:192:0::1;24873:17:::0;;24848:22:::1;::::0;24873;:119:::1;;24957:17:::0;;24946:10;;24957:21:::1;::::0;24977:1:::1;::::0;24957:21:::1;:::i;:::-;24946:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;24873:119;;;24911:4;:19;;;24873:119;24848:144:::0;-1:-1:-1;25005:17:0::1;25025:30;24848:144:::0;25025:13;:30:::1;:::i;:::-;25005:50:::0;-1:-1:-1;25066:20:0::1;25089:25;25101:13:::0;25005:50;25089:25:::1;:::i;:::-;25066:48;;25132:8;25127:342;;25157:135;:28;:11;:28;25204:10;25241:4;25265:12:::0;25157:28:::1;:135::i;:::-;25127:342;;;25364:12;25351:9;:25;25325:132;;;::::0;::::1;::::0;;10336:2:1;25325:132:0::1;::::0;::::1;10318:21:1::0;10375:2;10355:18;;;10348:30;10414:34;10394:18;;;10387:62;10485:15;10465:18;;;10458:43;10518:19;;25325:132:0::1;10134:409:1::0;25325:132:0::1;25502:12;25481:4;:17;;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25557:168:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;25527:209;;::::1;::::0;;::::1;::::0;;-1:-1:-1;25527:209:0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;25801:17;;:21:::1;::::0;25527:209;25801:21:::1;:::i;:::-;25754:135;::::0;;11333:25:1;;;11389:2;11374:18;;11367:34;;;25782:4:0;;25754:135:::1;::::0;11306:18:1;25754:135:0::1;;;;;;;24147:1750;;;;;24003:1894:::0;;;:::o;35138:187::-;35247:7;35279:38;35295:4;35301:15;35279;:38::i;:::-;35272:45;35138:187;-1:-1:-1;;35138:187:0:o;27433:162::-;27525:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27525:20:0;12457:1;13053:7;;:19;;13045:63;;;;;;;9976:2:1;13045:63:0;;;9958:21:1;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0;9774:355:1;13045:63:0;12457:1;13186:7;:18;27570:17:::1;27582:4:::0;27570:11:::1;:17::i;:::-;12413:1:::0;13365:22;;27563:24;27433:162;-1:-1:-1;;27433:162:0:o;30418:84::-;12457:1;13053:7;;:19;;13045:63;;;;;;;9976:2:1;13045:63:0;;;9958:21:1;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0;9774:355:1;13045:63:0;12457:1;13186:7;:18;30476::::1;:16;:18::i;:::-;12413:1:::0;13365:22;;30418:84::o;21301:24::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21301:24:0;:::o;10173:94::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;10238:21:::1;10256:1;10238:9;:21::i;:::-;10173:94::o:0;26888:360::-;27019:7;27053:13;27044:5;:22;;27043:41;;;;27080:3;27072:5;:11;27043:41;27039:82;;;-1:-1:-1;27108:1:0;27101:8;;27039:82;27142:13;27135:3;:20;27131:71;;27179:11;27185:5;27179:3;:11;:::i;:::-;27172:18;;;;27131:71;27219:21;27235:5;27219:13;:21;:::i;:::-;27212:28;;26888:360;;;;;;:::o;23433:431::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;23521:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:34:::1;::::0;:39;23513:71:::1;;;::::0;::::1;::::0;;8439:2:1;23513:71:0::1;::::0;::::1;8421:21:1::0;8478:2;8458:18;;;8451:30;8517:21;8497:18;;;8490:49;8556:18;;23513:71:0::1;8237:343:1::0;23513:71:0::1;23614:182;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;23614:182:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;23597:14;;;:8:::1;:14:::0;;;;;;;:199;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;23809:7:::1;:18:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;23843:13;;23606:4;;23843:13:::1;::::0;::::1;23433:431:::0;;:::o;26660:139::-;26726:7;26753:38;26769:4;26775:15;26753;:38::i;27779:2556::-;27829:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27829:20:0;-1:-1:-1;27869:13:0;;;;:8;:13;;;;;;;;27862:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27926:19;;;;;;;;27893:52;;;;;;;;;;;;;;;;;27862:20;;27869:13;27893:52;;27926:19;;27893:52;27869:13;;27893:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27981:4;:24;;;27962:15;:43;27958:87;;28022:11;27779:2556;;;:::o;27958:87::-;28076:30;;;;;;;;11123:25:1;;;28057:16:0;;28076:13;:25;;;;;11096:18:1;;28076:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28057:49;-1:-1:-1;28123:13:0;28119:751;;28514:37;28530:3;28535:15;28514;:37::i;:::-;28496:15;:55;28492:339;;;28599:15;28572:24;;;;:42;;;28775:21;;28638:177;;11614:25:1;;;11670:2;11655:18;;11648:34;;;11698:18;;;11691:34;28671:3:0;;28638:177;;11602:2:1;11587:18;28638:177:0;;;;;;;;28492:339;28847:11;;27779:2556;;;:::o;28119:751::-;28926:9;28921:1195;28945:10;:17;28941:1;:21;28921:1195;;;29238:19;29260:152;29294:4;:24;;;29337:15;29371:10;29382:1;29371:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29260:15;:152::i;:::-;29238:174;-1:-1:-1;29431:16:0;29427:30;;29449:8;;;29427:30;29718:10;29729:1;29718:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29700:15;:44;29696:221;;;29792:10;29803:1;29792:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29765:4;:24;;:53;;;;;29696:221;;;29886:15;29859:24;;;:42;29696:221;29933:19;29970:10;29981:1;29970:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29956:11;:40;;;;:::i;:::-;29933:64;-1:-1:-1;30095:8:0;30041:33;30055:19;29933:64;30041:33;:::i;:::-;30040:63;;;;:::i;:::-;30014:90;;:4;;:90;;;;;:::i;:::-;;;-1:-1:-1;;;28921:1195:0;28964:3;;;:::i;:::-;;;28921:1195;;;-1:-1:-1;30128:13:0;;;;:8;:13;;;;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30166:137;;11614:25:1;;;11655:18;;;11648:34;;;11698:18;;;11691:34;30128:13:0;;30166:137;;11587:18:1;30166:137:0;11412:319:1;10422:192:0;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;10511:22:::1;::::0;::::1;10503:73;;;::::0;::::1;::::0;;5664:2:1;10503:73:0::1;::::0;::::1;5646:21:1::0;5703:2;5683:18;;;5676:30;5742:34;5722:18;;;5715:62;5813:8;5793:18;;;5786:36;5839:19;;10503:73:0::1;5462:402:1::0;10503:73:0::1;10587:19;10597:8;10587:9;:19::i;:::-;10422:192:::0;:::o;31023:1629::-;22236:10;:36;22258:13;22236:36;;22214:146;;;;;;;7244:2:1;22214:146:0;;;7226:21:1;7283:2;7263:18;;;7256:30;7322:34;7302:18;;;7295:62;7393:30;7373:18;;;7366:58;7441:19;;22214:146:0;7042:424:1;22214:146:0;12457:1:::1;13053:7;;:19;;13045:63;;;::::0;::::1;::::0;;9976:2:1;13045:63:0::1;::::0;::::1;9958:21:1::0;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0::1;9774:355:1::0;13045:63:0::1;12457:1;13186:7;:18:::0;31186:20:::2;31209:17;31221:4:::0;31209:11:::2;:17::i;:::-;31237:21;31261:14:::0;;;:8:::2;:14;::::0;;;;;;;:21:::2;::::0;::::2;::::0;;;;;;;31186:40;;-1:-1:-1;31237:21:0;31367:8:::2;31363:163;;;-1:-1:-1::0;31408:21:0::2;31363:163;;;31478:36;::::0;;;;31508:4:::2;31478:36;::::0;::::2;3614:74:1::0;31478:11:0::2;:21;;::::0;::::2;::::0;3587:18:1;;31478:36:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31462:52;;31363:163;31542:11:::0;;:15;31538:915:::2;;31666:15;::::0;::::2;::::0;31601:21;;31587:11;;31643:19:::2;::::0;31587:35:::2;::::0;::::2;:::i;:::-;31586:76;;;;:::i;:::-;31585:96;;;;:::i;:::-;31574:108:::0;-1:-1:-1;31703:11:0;;31699:743:::2;;31739:8;31735:692;;;31786:13;31776:7;:23;31772:365;;;31829:12;31847:5;:10;;31865:13;31847:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31828:55;;;31918:7;31910:35;;;::::0;::::2;::::0;;6071:2:1;31910:35:0::2;::::0;::::2;6053:21:1::0;6110:2;6090:18;;;6083:30;6149:17;6129:18;;;6122:45;6184:18;;31910:35:0::2;5869:339:1::0;31910:35:0::2;31801:168;31735:692;;31772:365;32003:12;32021:5;:10;;32039:7;32021:30;;;3258:205:1::0;31735:692:0::2;32199:13;32189:7;:23;32185:223;;;32241:46;:24;:11;:24;32266:5:::0;32273:13;32241:24:::2;:46::i;:::-;32185:223;;;32344:40;:24;:11;:24;32369:5:::0;32376:7;32344:24:::2;:40::i;:::-;32465:21:::0;;;32545;;32583:19:::2;::::0;32531:35:::2;::::0;32479:7;32531:35:::2;:::i;:::-;32530:72;;;;:::i;:::-;32499:15;::::0;::::2;:103:::0;32620:24:::2;::::0;11123:25:1;;;32620:24:0::2;::::0;::::2;::::0;::::2;::::0;11111:2:1;11096:18;32620:24:0::2;;;;;;;-1:-1:-1::0;;12413:1:0::1;13365:22:::0;;-1:-1:-1;;;;;31023:1629:0:o;32726:323::-;32846:7;32947:14;;;:8;:14;;;;;;;;:21;;;;;;;;;;:28;;32994:32;;;;;32891:150;;32947:14;;32891;:150::i;741:387::-;1064:20;1112:8;;;741:387::o;17302:293::-;17461:36;;;;;;;;;;;;;;;;;;17484:12;17461:36;;;17421:87;;17367:5;;;;;;17421:25;;;;:87;;17461:36;17421:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17385:123;;;;17526:7;:28;;;;;17537:4;:11;17552:2;17537:17;17526:28;:61;;17585:2;17526:61;;;17568:4;17557:25;;;;;;;;;;;;:::i;:::-;17519:68;17302:293;-1:-1:-1;;;;17302:293:0:o;33057:1250::-;33190:15;33241:14;;;:8;:14;;;;;;;;33218:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33299:20;;;;;;;;33266:53;;;;;;;;;;;;;;;;;33190:15;;;;33266:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33359:21:0;;33410:31;;;;;;;;11123:25:1;;;33266:53:0;;-1:-1:-1;33359:21:0;33332:24;;-1:-1:-1;33410:13:0;:25;;;-1:-1:-1;33410:25:0;;11096:18:1;;33410:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33391:50;;33476:4;:24;;;33458:15;:42;:59;;;;-1:-1:-1;33504:13:0;;;33458:59;33454:742;;;33551:24;;;;33534:14;33592:593;33616:10;:17;33612:1;:21;33592:593;;;33659:19;33681:150;33719:6;33748:15;33786:10;33797:1;33786:13;;;;;;;;:::i;33681:150::-;33659:172;-1:-1:-1;33854:16:0;33850:30;;33872:8;;;33850:30;33908:10;33919:1;33908:13;;;;;;;;:::i;:::-;;;;;;;:26;;;33899:35;;33955:19;34013:10;34024:1;34013:13;;;;;;;;:::i;:::-;;;;;;;:26;;;33978:11;:61;;;;:::i;:::-;33955:85;-1:-1:-1;34161:8:0;34103:33;34117:19;33955:85;34103:33;:::i;:::-;34102:67;;;;:::i;:::-;34061:108;;;;:::i;:::-;;;33640:545;;33592:593;33635:3;;;:::i;:::-;;;33592:593;;;;33519:677;33454:742;34287:11;34251:19;34221:26;34231:16;34221:7;:26;:::i;:::-;34220:50;;;;:::i;:::-;34219:79;;;;:::i;:::-;34208:91;33057:1250;-1:-1:-1;;;;;;;;33057:1250:0:o;17871:407::-;18065:48;;;18031:19;4294:55:1;;;18065:48:0;;;4276:74:1;4366:18;;;;4359:34;;;18065:48:0;;;;;;;;;;4249:18:1;;;;18065:48:0;;;;;;;;;18088:12;18065:48;;;18031:93;;-1:-1:-1;;;;18031:19:0;;;;:93;;18065:48;18031:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17995:129;;;;18157:7;:57;;;;-1:-1:-1;18169:11:0;;:16;;:44;;;18200:4;18189:24;;;;;;;;;;;;:::i;:::-;18135:135;;;;;;;5307:2:1;18135:135:0;;;5289:21:1;5346:2;5326:18;;;5319:30;5385;5365:18;;;5358:58;5433:18;;18135:135:0;5105:352:1;18135:135:0;17984:294;;17871:407;;;:::o;18601:449::-;18822:59;;;18788:19;3980:15:1;;;18822:59:0;;;3962:34:1;4032:15;;;4012:18;;;4005:43;4064:18;;;;4057:34;;;18822:59:0;;;;;;;;;;3874:18:1;;;;18822:59:0;;;;;;;;;18845:17;18822:59;;;18788:104;;-1:-1:-1;;;;18788:19:0;;;;:104;;18822:59;18788:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18752:140;;;;18925:7;:57;;;;-1:-1:-1;18937:11:0;;:16;;:44;;;18968:4;18957:24;;;;;;;;;;;;:::i;:::-;18903:139;;;;;;;9615:2:1;18903:139:0;;;9597:21:1;;;9634:18;;;9627:30;9693:34;9673:18;;;9666:62;9745:18;;18903:139:0;9413:356:1;18903:139:0;18741:309;;18601:449;;;;:::o;34315:756::-;34429:7;34487:20;;;:14;:20;;;;;;;;34454:53;;;;;;;;;;;;;;;;;34429:7;;;;34454:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34518:21:0;34542:14;;;:8;:14;;;;;34581:17;;34454:53;;-1:-1:-1;34542:14:0;34581:17;-1:-1:-1;34613:8:0;34609:49;;34645:1;34638:8;;;;;;;34609:49;34694:15;34672:4;:19;;;:37;34668:78;;;34733:1;34726:8;;;;;;;34668:78;34769:9;34764:162;34788:3;34784:1;:7;34764:162;;;34836:10;34847:1;34836:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34817:15;:45;34813:101;;34888:10;34899:1;34888:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34881:33;;;;;;;;34813:101;34793:3;;;:::i;:::-;;;34764:162;;;-1:-1:-1;35062:1:0;;34315:756;-1:-1:-1;;;;;;34315:756:0:o;30585:192::-;30650:7;:14;30633;30675:95;30703:6;30697:3;:12;30675:95;;;30733:25;30745:7;30753:3;30745:12;;;;;;;;:::i;:::-;;;;;;;;;30733:11;:25::i;:::-;-1:-1:-1;30711:5:0;;;:::i;:::-;;;30675:95;;;;30622:155;30585:192::o;10622:173::-;10678:16;10697:6;;;10714:17;;;;;;;;;;10747:40;;10697:6;;;;;;;10747:40;;10678:16;10747:40;10667:128;10622:173;:::o;25905:661::-;26014:7;26072:20;;;:14;:20;;;;;;;;26039:53;;;;;;;;;;;;;;;;;26014:7;;;;26039:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26117:17:0;;26039:53;;-1:-1:-1;;;26149:8:0;26145:49;;26181:1;26174:8;;;;;;26145:49;26209:9;26204:157;26228:3;26224:1;:7;26204:157;;;26271:10;26282:1;26271:13;;;;;;;;:::i;:::-;;;;;;;:26;;;26257:10;:40;26253:96;;26323:10;26334:1;26323:13;;;;;;;;:::i;:::-;;;;;;;:26;;;26316:33;;;;;;;26253:96;26233:3;;;:::i;:::-;;;26204:157;;;-1:-1:-1;26526:10:0;26537:7;26543:1;26537:3;:7;:::i;:::-;26526:19;;;;;;;;:::i;:::-;;;;;;;:32;;;26519:39;;;;25905:661;;;;:::o;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:277::-;473:6;526:2;514:9;505:7;501:23;497:32;494:52;;;542:1;539;532:12;494:52;574:9;568:16;627:5;620:13;613:21;606:5;603:32;593:60;;649:1;646;639:12;688:180;747:6;800:2;788:9;779:7;775:23;771:32;768:52;;;816:1;813;806:12;768:52;-1:-1:-1;839:23:1;;688:180;-1:-1:-1;688:180:1:o;873:184::-;943:6;996:2;984:9;975:7;971:23;967:32;964:52;;;1012:1;1009;1002:12;964:52;-1:-1:-1;1035:16:1;;873:184;-1:-1:-1;873:184:1:o;1062:254::-;1130:6;1138;1191:2;1179:9;1170:7;1166:23;1162:32;1159:52;;;1207:1;1204;1197:12;1159:52;1243:9;1230:23;1220:33;;1272:38;1306:2;1295:9;1291:18;1272:38;:::i;:::-;1262:48;;1062:254;;;;;:::o;1321:322::-;1398:6;1406;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1519:9;1506:23;1496:33;;1548:38;1582:2;1571:9;1567:18;1548:38;:::i;:::-;1538:48;;1633:2;1622:9;1618:18;1605:32;1595:42;;1321:322;;;;;:::o;1648:248::-;1716:6;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;-1:-1:-1;;1816:23:1;;;1886:2;1871:18;;;1858:32;;-1:-1:-1;1648:248:1:o;1901:322::-;1978:6;1986;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2099:9;2086:23;2076:33;;2156:2;2145:9;2141:18;2128:32;2118:42;;2179:38;2213:2;2202:9;2198:18;2179:38;:::i;:::-;2169:48;;1901:322;;;;;:::o;2228:316::-;2305:6;2313;2321;2374:2;2362:9;2353:7;2349:23;2345:32;2342:52;;;2390:1;2387;2380:12;2342:52;-1:-1:-1;;2413:23:1;;;2483:2;2468:18;;2455:32;;-1:-1:-1;2534:2:1;2519:18;;;2506:32;;2228:316;-1:-1:-1;2228:316:1:o;2549:273::-;2617:6;2670:2;2658:9;2649:7;2645:23;2641:32;2638:52;;;2686:1;2683;2676:12;2638:52;2718:9;2712:16;2768:4;2761:5;2757:16;2750:5;2747:27;2737:55;;2788:1;2785;2778:12;2827:426;2956:3;2994:6;2988:13;3019:1;3029:129;3043:6;3040:1;3037:13;3029:129;;;3141:4;3125:14;;;3121:25;;3115:32;3102:11;;;3095:53;3058:12;3029:129;;;3176:6;3173:1;3170:13;3167:48;;;3211:1;3202:6;3197:3;3193:16;3186:27;3167:48;-1:-1:-1;3231:16:1;;;;;2827:426;-1:-1:-1;;2827:426:1:o;12132:128::-;12172:3;12203:1;12199:6;12196:1;12193:13;12190:39;;;12209:18;;:::i;:::-;-1:-1:-1;12245:9:1;;12132:128::o;12265:274::-;12305:1;12331;12321:189;;12366:77;12363:1;12356:88;12467:4;12464:1;12457:15;12495:4;12492:1;12485:15;12321:189;-1:-1:-1;12524:9:1;;12265:274::o;12544:228::-;12584:7;12710:1;12642:66;12638:74;12635:1;12632:81;12627:1;12620:9;12613:17;12609:105;12606:131;;;12717:18;;:::i;:::-;-1:-1:-1;12757:9:1;;12544:228::o;12777:125::-;12817:4;12845:1;12842;12839:8;12836:34;;;12850:18;;:::i;:::-;-1:-1:-1;12887:9:1;;12777:125::o;12907:195::-;12946:3;12977:66;12970:5;12967:77;12964:103;;;13047:18;;:::i;:::-;-1:-1:-1;13094:1:1;13083:13;;12907:195::o;13107:184::-;13159:77;13156:1;13149:88;13256:4;13253:1;13246:15;13280:4;13277:1;13270:15;13296:184;13348:77;13345:1;13338:88;13445:4;13442:1;13435:15;13469:4;13466:1;13459:15

Swarm Source

ipfs://d358124710e02f4aa4a4d267f81d662ca03a1b0761539e1433665854b7df7dce
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.