ETH Price: $3,838.22 (+0.91%)

Contract

0x36afCD1083eE9186A2b984E10d75C1E14b99B75e

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Lock1284966712024-11-26 3:35:199 days ago1732592119IN
0x36afCD10...14b99B75e
0 ETH0.0000034137550.0010004
Unstake1283930512024-11-23 18:01:1912 days ago1732384879IN
0x36afCD10...14b99B75e
0 ETH0.0000002503550.00010209
Unstake1280427692024-11-15 15:25:1520 days ago1731684315IN
0x36afCD10...14b99B75e
0 ETH0.0000006586530.00010082
Unstake1277522442024-11-08 22:01:0527 days ago1731103265IN
0x36afCD10...14b99B75e
0 ETH0.0000001149770.00010066
Unstake1276565182024-11-06 16:50:1329 days ago1730911813IN
0x36afCD10...14b99B75e
0 ETH0.0000012996280.0001003
Unstake1266674282024-10-14 19:20:3352 days ago1728933633IN
0x36afCD10...14b99B75e
0 ETH0.0000115927490.02920063
Lock1264906332024-10-10 17:07:2356 days ago1728580043IN
0x36afCD10...14b99B75e
0 ETH0.0000023457770.01636244
Unstake1264473892024-10-09 17:05:5557 days ago1728493555IN
0x36afCD10...14b99B75e
0 ETH0.000003321780.0052914
Lock1240335222024-08-14 20:03:41113 days ago1723665821IN
0x36afCD10...14b99B75e
0 ETH0.0000002737280.00118131
Stake1236652702024-08-06 7:28:37121 days ago1722929317IN
0x36afCD10...14b99B75e
0 ETH0.0000002582020.0013971
Unstake1236149862024-08-05 3:32:29122 days ago1722828749IN
0x36afCD10...14b99B75e
0 ETH0.0000173113180.06467583
Lock1233974482024-07-31 2:41:13127 days ago1722393673IN
0x36afCD10...14b99B75e
0 ETH0.0000001430480.00064388
Stake1228594972024-07-18 15:49:31140 days ago1721317771IN
0x36afCD10...14b99B75e
0 ETH0.0000152692530.0607752
Stake1219476342024-06-27 13:14:05161 days ago1719494045IN
0x36afCD10...14b99B75e
0 ETH0.0000004952150.00589701
Stake1218788662024-06-25 23:01:49163 days ago1719356509IN
0x36afCD10...14b99B75e
0 ETH0.0000122678330.06128933

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
1218776882024-06-25 22:22:33163 days ago1719354153  Contract Creation0 ETH

Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x7e803F4e...04379C24b
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
BoostedStaker

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2024-06-25
*/

// SPDX-License-Identifier: AGPL-3.0
pragma solidity 0.8.25;

interface IFactory {
    function owner() external view returns (address);

    function isLockingEnabled() external view returns (bool);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @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 or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * 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.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @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`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev An operation with an ERC20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

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

        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
    }
}
/**
    @notice Boosted Staker
    @author Yearn (with edits by defidotmoney)
 */
contract BoostedStaker {
    using SafeERC20 for IERC20;

    uint256 private constant MAX_EPOCHS = 65535;
    uint16 private immutable MAX_EPOCH_BIT;
    uint256 public immutable STAKE_GROWTH_EPOCHS;
    uint256 public immutable MAX_WEIGHT_MULTIPLIER;
    uint256 public immutable START_TIME;
    uint256 public immutable EPOCH_LENGTH;
    IERC20 public immutable STAKE_TOKEN;
    IFactory public immutable FACTORY;

    // Account weight tracking state vars.
    mapping(address account => AccountData data) private accountData;
    mapping(address account => uint128[MAX_EPOCHS]) private accountEpochWeights;
    mapping(address account => ToRealize[MAX_EPOCHS] weight) private accountEpochToRealize;

    mapping(address account => mapping(address caller => bool approvalStatus)) public isApprovedUnstaker;

    // Global weight tracking stats vars.
    uint128[MAX_EPOCHS] private globalEpochWeights;
    uint128[MAX_EPOCHS] public globalEpochToRealize;
    uint112 public globalGrowthRate;
    uint16 public globalLastUpdateEpoch;

    uint120 public totalSupply;

    bool private locksEnabled;

    struct AccountData {
        uint112 realizedStake; // Amount of stake that has fully realized weight.
        uint112 pendingStake; // Amount of stake that has not yet fully realized weight.
        uint112 lockedStake; // Amount of stake that has fully realized weight, but cannot be withdrawn.
        uint16 lastUpdateEpoch; // Epoch of last sync.
        // Two byte member to represent epochs in which an account has pending weight changes.
        // A bit is set to true when the account has a non-zero token balance to be realized in
        // the corresponding epoch. We use this as a "map", allowing us to reduce gas consumption
        // by avoiding unnecessary lookups on epochs which an account has zero pending stake.
        //
        // Example: 0100000000000101
        // The least significant bit represents the first epoch of pendingStake.
        // Therefore, we can see that account has stake updates to process only in epochs 1, 3 and 15.
        uint16 updateEpochBitmap;
    }

    struct ToRealize {
        uint128 pending;
        uint128 locked;
    }

    struct AccountView {
        uint256 balance;
        uint256 weight;
        uint256 realizedStake;
        uint256 pendingStake;
        uint256 lockedStake;
    }

    struct FutureRealizedStake {
        uint256 epochsToMaturity;
        uint256 timestampAtMaturity;
        uint256 pendingStake;
        uint256 lockedStake;
    }

    event Staked(address indexed account, uint256 indexed epoch, uint256 amount, uint256 weightAdded, bool isLocked);
    event Unstaked(address indexed account, uint256 indexed epoch, uint256 amount, uint256 weightRemoved);
    event AccountWeightUpdated(address indexed account, uint256 indexed epoch, uint256 timestamp, uint256 newWeight);
    event ApprovedUnstakerSet(address indexed account, address indexed caller, bool isApproved);
    event LocksDisabled();

    /**
        @dev Not intended for direct deployment, use `StakerFactory.deployBoostedStaker`
    */
    constructor(
        IERC20 token,
        uint256 stakeGrowthEpochs,
        uint256 maxWeightMultiplier,
        uint256 startTime,
        uint256 epochDays
    ) {
        FACTORY = IFactory(msg.sender);
        STAKE_TOKEN = token;
        STAKE_GROWTH_EPOCHS = stakeGrowthEpochs;
        MAX_WEIGHT_MULTIPLIER = maxWeightMultiplier;
        MAX_EPOCH_BIT = uint16(1 << STAKE_GROWTH_EPOCHS);
        EPOCH_LENGTH = epochDays * 1 days;
        START_TIME = startTime;

        locksEnabled = true;
    }

    modifier onlyOwner() {
        require(msg.sender == FACTORY.owner(), "DFM:BS Not authorized");
        _;
    }

    /// ----- External view functions -----

    function getEpoch() public view returns (uint256 epoch) {
        unchecked {
            return (block.timestamp - START_TIME) / EPOCH_LENGTH;
        }
    }

    function isLockingEnabled() public view returns (bool) {
        if (!locksEnabled) return false;
        return FACTORY.isLockingEnabled();
    }

    /**
        @notice Returns the balance of underlying staked tokens for an account
        @param _account Account to query balance.
        @return balance of account.
    */
    function balanceOf(address _account) external view returns (uint256) {
        AccountData memory acctData = accountData[_account];
        return (acctData.pendingStake + acctData.realizedStake + acctData.lockedStake);
    }

    /**
        @notice View function to get the current weight for an account
    */
    function getAccountWeight(address account) external view returns (uint256) {
        return getAccountWeightAt(account, getEpoch());
    }

    /**
        @notice Get the weight for an account in a given epoch
    */
    function getAccountWeightAt(address _account, uint256 _epoch) public view returns (uint256) {
        if (_epoch > getEpoch()) return 0;

        AccountData memory acctData = accountData[_account];

        uint16 lastUpdateEpoch = acctData.lastUpdateEpoch;

        if (lastUpdateEpoch >= _epoch) return accountEpochWeights[_account][_epoch];

        uint256 weight = accountEpochWeights[_account][lastUpdateEpoch];

        uint256 pending = uint256(acctData.pendingStake);
        if (pending == 0) return weight;

        uint16 bitmap = acctData.updateEpochBitmap;

        while (lastUpdateEpoch < _epoch) {
            // Populate data for missed epochs
            unchecked {
                lastUpdateEpoch++;
            }
            weight += _getWeightGrowth(pending, 1);

            // Our bitmap is used to determine if epoch has any amount to realize.
            bitmap = bitmap << 1;
            if (bitmap & MAX_EPOCH_BIT == MAX_EPOCH_BIT) {
                // If left-most bit is true, we have something to realize; push pending to realized.
                pending -= accountEpochToRealize[_account][lastUpdateEpoch].pending;
                if (pending == 0) break; // All pending has now been realized, let's exit.
            }
        }

        return weight;
    }

    /**
        @notice Get a detailed view of staked balances and weight for `account`
        @return accountView Detailed information on account weight and balances:
                 * total deposited balance
                 * current weight
                 * realized stake (balance receiving maximum weight)
                 * pending stake (balance where weight is still increasing)
                 * locked stake (max weight, but cannot be withdrawn)
        @return futureRealizedStake Array detailing pending and locked stake balances:
                 * number of epochs remaining until balances convert to realized
                 * timestamp when balances are realized
                 * pending balance to be realized in this epoch
                 * locked balance to be realized in this epoch
     */
    function getAccountFullView(
        address account
    ) external view returns (AccountView memory accountView, FutureRealizedStake[] memory futureRealizedStake) {
        uint256 systemEpoch = getEpoch();

        AccountData storage acctData = accountData[account];
        uint256 lastUpdateEpoch = acctData.lastUpdateEpoch;

        accountView.pendingStake = acctData.pendingStake;
        accountView.lockedStake = acctData.lockedStake;
        accountView.realizedStake = acctData.realizedStake;
        accountView.weight = accountEpochWeights[account][lastUpdateEpoch];
        accountView.balance = acctData.pendingStake + acctData.lockedStake + acctData.realizedStake;

        if (accountView.lockedStake > 0 && !isLockingEnabled()) {
            accountView.realizedStake += accountView.lockedStake;
            accountView.lockedStake = 0;
        }

        if (accountView.pendingStake + accountView.lockedStake > 0) {
            uint16 bitmap = acctData.updateEpochBitmap;
            uint256 targetSyncEpoch = min(systemEpoch, lastUpdateEpoch + STAKE_GROWTH_EPOCHS);

            // Populate data for missed epochs
            while (lastUpdateEpoch < targetSyncEpoch) {
                unchecked {
                    lastUpdateEpoch++;
                }
                accountView.weight += _getWeightGrowth(accountView.pendingStake, 1);

                // Shift left on bitmap as we pass over each epoch.
                bitmap = bitmap << 1;
                if (bitmap & MAX_EPOCH_BIT == MAX_EPOCH_BIT) {
                    // If left-most bit is true, we have something to realize; push pending to realized.
                    // Do any updates needed to realize an amount for an account.
                    ToRealize memory epochRealized = accountEpochToRealize[account][lastUpdateEpoch];
                    accountView.pendingStake -= epochRealized.pending;
                    accountView.realizedStake += epochRealized.pending;

                    if (accountView.lockedStake > 0) {
                        // skip if `locked == 0` to avoid issues after disabling locks
                        accountView.lockedStake -= epochRealized.locked;
                        accountView.realizedStake += epochRealized.locked;
                    }

                    if (accountView.pendingStake == 0 && accountView.lockedStake == 0) break;
                }
            }

            lastUpdateEpoch = systemEpoch;
            futureRealizedStake = new FutureRealizedStake[](STAKE_GROWTH_EPOCHS);
            uint256 length = 0;
            while (bitmap != 0) {
                lastUpdateEpoch++;
                bitmap = bitmap << 1;
                if (bitmap & MAX_EPOCH_BIT == MAX_EPOCH_BIT) {
                    ToRealize memory epochRealized = accountEpochToRealize[account][lastUpdateEpoch];
                    futureRealizedStake[length] = FutureRealizedStake({
                        epochsToMaturity: lastUpdateEpoch - systemEpoch,
                        timestampAtMaturity: START_TIME + (lastUpdateEpoch * EPOCH_LENGTH),
                        pendingStake: epochRealized.pending,
                        lockedStake: epochRealized.locked
                    });
                    length++;
                }
            }
            // reduce length of `futureRealizedStake` prior to returning
            assembly {
                mstore(futureRealizedStake, length)
            }
        }
    }

    /**
        @notice Get the system weight for current epoch.
    */
    function getGlobalWeight() external view returns (uint256) {
        return getGlobalWeightAt(getEpoch());
    }

    /**
        @notice Get the system weight for a specified epoch in the past.
        @dev querying a epoch in the future will always return 0.
        @param epoch the epoch number to query global weight for.
    */
    function getGlobalWeightAt(uint256 epoch) public view returns (uint256) {
        uint256 systemEpoch = getEpoch();
        if (epoch > systemEpoch) return 0;

        // Read these together since they are packed in the same slot.
        uint16 lastUpdateEpoch = globalLastUpdateEpoch;
        uint256 rate = globalGrowthRate;

        if (epoch <= lastUpdateEpoch) return globalEpochWeights[epoch];

        uint256 weight = globalEpochWeights[lastUpdateEpoch];
        if (rate == 0) {
            return weight;
        }

        while (lastUpdateEpoch < epoch) {
            unchecked {
                lastUpdateEpoch++;
            }

            weight += _getWeightGrowth(rate, 1);
            rate -= globalEpochToRealize[lastUpdateEpoch];
        }

        return weight;
    }

    /// ----- Unguarded nonpayable functions -----

    /**
        @notice Allow another address to unstake on behalf of the caller.
                Useful for zaps and other functionality.
        @param _caller Address of the caller to approve or unapprove.
        @param isApproved is `_caller` approved?
    */
    function setApprovedUnstaker(address _caller, bool isApproved) external {
        isApprovedUnstaker[msg.sender][_caller] = isApproved;
        emit ApprovedUnstakerSet(msg.sender, _caller, isApproved);
    }

    /**
        @notice Stake tokens into the staking contract.
        @param _amount Amount of tokens to stake.
    */
    function stake(address _account, uint256 _amount) external {
        _stake(_account, _amount, false);
    }

    /**
        @notice Lock tokens in the staking contract.
        @dev Locked tokens receive maximum boost immediately, but cannot be
             withdrawn until `STAKE_GROWTH_EPOCHS` have passed. The only
             exception is if the contract owner disables locks.
        @param _amount Amount of tokens to lock.
    */
    function lock(address _account, uint256 _amount) external {
        require(isLockingEnabled(), "DFM:BS Locks are disabled");
        _stake(_account, _amount, true);
    }

    /**
        @notice Unstake tokens from the contract.
        @dev In a partial restake, tokens giving the least weight are withdrawn first.
    */
    function unstake(address _account, uint256 _amount, address _receiver) external {
        require(_amount > 0, "DFM:BS Cannot unstake 0");

        if (msg.sender != _account) {
            require(isApprovedUnstaker[_account][msg.sender], "DFM:BS Not approved unstaker");
        }

        // Before going further, let's sync our account and global weights
        uint256 systemEpoch = getEpoch();
        (AccountData memory acctData, ) = _checkpointAccount(_account, systemEpoch);
        _checkpointGlobal(systemEpoch);

        require(acctData.realizedStake + acctData.pendingStake >= _amount, "DFM:BS Insufficient balance");

        // Here we do work to pull from most recent (least weighted) stake first
        uint16 bitmap = acctData.updateEpochBitmap;
        uint256 weightToRemove;

        uint128 amountNeeded = uint128(_amount);
        ToRealize[MAX_EPOCHS] storage epochToRealize = accountEpochToRealize[_account];

        if (bitmap > 0) {
            for (uint128 epochIndex; epochIndex < STAKE_GROWTH_EPOCHS; ) {
                // Move right to left, checking each bit if there's an update for corresponding epoch.
                uint16 mask = uint16(1 << epochIndex);
                if (bitmap & mask == mask) {
                    uint256 epochToCheck = systemEpoch + STAKE_GROWTH_EPOCHS - epochIndex;
                    uint128 pending = epochToRealize[epochToCheck].pending;
                    if (pending > 0) {
                        if (amountNeeded > pending) {
                            weightToRemove += _getWeight(pending, epochIndex);
                            epochToRealize[epochToCheck].pending = 0;
                            globalEpochToRealize[epochToCheck] -= pending;
                            amountNeeded -= pending;
                            if (epochToRealize[epochToCheck].locked == 0) bitmap = bitmap ^ mask;
                        } else {
                            // handle the case where we have more pending than needed
                            weightToRemove += _getWeight(amountNeeded, epochIndex);
                            epochToRealize[epochToCheck].pending = pending - amountNeeded;
                            globalEpochToRealize[epochToCheck] -= amountNeeded;
                            if (amountNeeded == pending && epochToRealize[epochToCheck].locked == 0) {
                                bitmap = bitmap ^ mask;
                            }
                            amountNeeded = 0;
                            break;
                        }
                    }
                }
                unchecked {
                    epochIndex++;
                }
            }
            acctData.updateEpochBitmap = bitmap;
        }

        uint256 pendingRemoved = _amount - amountNeeded;
        if (amountNeeded > 0) {
            weightToRemove += _getWeight(amountNeeded, STAKE_GROWTH_EPOCHS);
            acctData.realizedStake -= uint112(amountNeeded);
            acctData.pendingStake = 0;
        } else {
            acctData.pendingStake -= uint112(pendingRemoved);
        }

        accountData[_account] = acctData;

        uint256 newAccountWeight = accountEpochWeights[_account][systemEpoch];
        if (newAccountWeight < weightToRemove) weightToRemove = newAccountWeight;
        newAccountWeight = newAccountWeight - weightToRemove;
        accountEpochWeights[_account][systemEpoch] = uint128(newAccountWeight);

        globalGrowthRate -= uint112(pendingRemoved);
        globalEpochWeights[systemEpoch] -= uint128(weightToRemove);

        totalSupply -= uint120(_amount);

        emit Unstaked(_account, systemEpoch, _amount, weightToRemove);
        emit AccountWeightUpdated(_account, systemEpoch, block.timestamp, newAccountWeight);

        STAKE_TOKEN.safeTransfer(_receiver, _amount);
    }

    /**
        @notice Checkpoint an account and get the account's current weight
        @dev Prefer to use this function over it's view counterpart for
             contract -> contract interactions.
        @param _account Account to checkpoint.
        @return weight Most current account weight.

    */
    function checkpointAccount(address _account) external returns (uint256 weight) {
        AccountData memory acctData;
        (acctData, weight) = _checkpointAccount(_account, getEpoch());
        accountData[_account] = acctData;
        return weight;
    }

    /**
        @notice Checkpoint an account using a specified epoch limit.
        @dev    To use in the event that significant number of epochs have passed since last
                checkpoint and single call becomes too expensive.
        @param _account Account to checkpoint.
        @param _epoch Epoch which we want to checkpoint to.
        @return weight Account weight at most recently checkpointed epoch.
                       If the account weight was checkpointed more recently than
                       `_epoch` this value will be the current weight, not the
                       weight at _epoch`.
    */
    function checkpointAccountWithLimit(address _account, uint256 _epoch) external returns (uint256 weight) {
        uint256 systemEpoch = getEpoch();
        if (_epoch >= systemEpoch) _epoch = systemEpoch;
        AccountData memory acctData;
        (acctData, weight) = _checkpointAccount(_account, _epoch);
        accountData[_account] = acctData;
        return weight;
    }

    /**
        @notice Checkpoint the total system weight using a specified epoch limit.
        @dev    To use in the event that significant number of epochs have passed since last
                checkpoint and single call becomes too expensive.
        @param _epoch Epoch which we want to checkpoint to.
        @return weight Total system weight at most recently checkpointed epoch.
                       If the system weight was checkpointed more recently than
                       `_epoch` this value will be the current weight, not the
                       weight at _epoch`.
    */
    function checkpointGlobalWithLimit(uint256 _epoch) external returns (uint256 weight) {
        uint256 systemEpoch = getEpoch();
        if (_epoch > systemEpoch) _epoch = systemEpoch;
        return _checkpointGlobal(_epoch);
    }

    /**
        @notice Get the current total system weight
        @dev Also updates local storage values for total weights. Using
             this function over it's `view` counterpart is preferred for
             contract -> contract interactions.
    */
    function checkpointGlobal() external returns (uint256) {
        uint256 systemEpoch = getEpoch();
        return _checkpointGlobal(systemEpoch);
    }

    /// ----- Owner-only nonpayable functions -----

    /**
        @notice Disable locks in this contract
        @dev Allows immediate withdrawal for all depositors. Cannot be undone.
     */
    function disableLocks() external onlyOwner {
        locksEnabled = false;
        emit LocksDisabled();
    }

    function sweep(IERC20 token, address receiver) external onlyOwner {
        uint256 amount = token.balanceOf(address(this));
        if (token == STAKE_TOKEN) {
            amount = amount - totalSupply;
        }
        if (amount > 0) token.safeTransfer(receiver, amount);
    }

    /// ----- Internal functions -----

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /** @dev The increased weight from `amount` after a number of epochs has passed */
    function _getWeightGrowth(uint256 amount, uint256 epochs) internal view returns (uint128 growth) {
        amount *= MAX_WEIGHT_MULTIPLIER - 1;
        // division before multiplication is intentional to ensure consistent rounding loss each epoch
        // otherwise there is a possibility for an underflow when the last user unstakes
        return uint128((amount / STAKE_GROWTH_EPOCHS) * epochs);
    }

    /** @dev The total weight of `amount` after a number of epochs has passed */
    function _getWeight(uint256 amount, uint256 epochs) internal view returns (uint256 weight) {
        uint256 growth = _getWeightGrowth(amount, epochs);
        return amount + growth;
    }

    function _stake(address _account, uint256 _amount, bool isLocked) internal {
        require(_amount > 0, "DFM:BS Cannot stake 0");

        uint256 newTotalSupply = totalSupply + _amount;
        require(newTotalSupply < type(uint112).max, "DFM:BS Amount too large");
        totalSupply = uint120(newTotalSupply);

        // Before going further, let's sync our account and global weights
        uint256 systemEpoch = getEpoch();
        (AccountData memory acctData, uint256 accountWeight) = _checkpointAccount(_account, systemEpoch);
        uint128 globalWeight = uint128(_checkpointGlobal(systemEpoch));

        uint256 realizeEpoch = systemEpoch + STAKE_GROWTH_EPOCHS;

        uint256 weight;
        if (isLocked) {
            weight = _getWeight(_amount, STAKE_GROWTH_EPOCHS);
            acctData.lockedStake += uint112(_amount);

            accountEpochToRealize[_account][realizeEpoch].locked += uint128(_amount);
        } else {
            weight = _amount;
            acctData.pendingStake += uint112(_amount);
            globalGrowthRate += uint112(_amount);

            accountEpochToRealize[_account][realizeEpoch].pending += uint128(_amount);
            globalEpochToRealize[realizeEpoch] += uint128(_amount);
        }

        accountEpochWeights[_account][systemEpoch] = uint128(accountWeight + weight);
        globalEpochWeights[systemEpoch] = uint128(globalWeight + weight);

        acctData.updateEpochBitmap |= 1; // Use bitwise or to ensure bit is flipped at least weighted position.
        accountData[_account] = acctData;

        STAKE_TOKEN.safeTransferFrom(msg.sender, address(this), uint256(_amount));

        emit Staked(_account, systemEpoch, _amount, weight, isLocked);
        emit AccountWeightUpdated(_account, systemEpoch, block.timestamp, accountWeight + weight);
    }

    function _checkpointAccount(
        address _account,
        uint256 _systemEpoch
    ) internal returns (AccountData memory acctData, uint128 weight) {
        acctData = accountData[_account];
        uint256 lastUpdateEpoch = acctData.lastUpdateEpoch;
        uint128[MAX_EPOCHS] storage epochWeights = accountEpochWeights[_account];

        uint256 pending = acctData.pendingStake;
        uint256 locked = acctData.lockedStake;
        uint256 realized = acctData.realizedStake;

        if (locked > 0 && !isLockingEnabled()) {
            realized += locked;
            locked = 0;
            acctData.realizedStake = uint112(realized);
            acctData.lockedStake = 0;
        }

        if (_systemEpoch <= lastUpdateEpoch) {
            return (acctData, epochWeights[lastUpdateEpoch]);
        }

        if (pending == 0 && locked == 0) {
            if (realized != 0) {
                weight = epochWeights[lastUpdateEpoch];
                while (lastUpdateEpoch < _systemEpoch) {
                    unchecked {
                        lastUpdateEpoch++;
                    }
                    // Fill in any missing epochs
                    epochWeights[lastUpdateEpoch] = weight;
                }
            }
            accountData[_account].lastUpdateEpoch = uint16(_systemEpoch);
            acctData.lastUpdateEpoch = uint16(_systemEpoch);
            return (acctData, weight);
        }

        weight = epochWeights[lastUpdateEpoch];
        uint16 bitmap = acctData.updateEpochBitmap;
        uint256 targetSyncEpoch = min(_systemEpoch, lastUpdateEpoch + STAKE_GROWTH_EPOCHS);

        // Populate data for missed epochs
        while (lastUpdateEpoch < targetSyncEpoch) {
            unchecked {
                lastUpdateEpoch++;
            }
            weight += _getWeightGrowth(pending, 1);
            epochWeights[lastUpdateEpoch] = weight;

            // Shift left on bitmap as we pass over each epoch.
            bitmap = bitmap << 1;
            if (bitmap & MAX_EPOCH_BIT == MAX_EPOCH_BIT) {
                // If left-most bit is true, we have something to realize; push pending to realized.
                // Do any updates needed to realize an amount for an account.
                ToRealize memory epochRealized = accountEpochToRealize[_account][lastUpdateEpoch];
                pending -= epochRealized.pending;
                realized += epochRealized.pending;

                if (locked > 0) {
                    // skip if `locked == 0` to avoid issues after disabling locks
                    locked -= epochRealized.locked;
                    realized += epochRealized.locked;
                }

                if (pending == 0 && locked == 0) break; // All pending has been realized. No need to continue.
            }
        }

        // Fill in any missed epochs.
        while (lastUpdateEpoch < _systemEpoch) {
            unchecked {
                lastUpdateEpoch++;
            }
            epochWeights[lastUpdateEpoch] = weight;
        }

        // Write new account data to storage.
        acctData = AccountData({
            updateEpochBitmap: bitmap,
            pendingStake: uint112(pending),
            realizedStake: uint112(realized),
            lockedStake: uint112(locked),
            lastUpdateEpoch: uint16(_systemEpoch)
        });
    }

    function _checkpointGlobal(uint256 systemEpoch) internal returns (uint256) {
        // These two share a storage slot.
        uint16 lastUpdateEpoch = globalLastUpdateEpoch;
        uint256 rate = globalGrowthRate;

        uint128 weight = globalEpochWeights[lastUpdateEpoch];

        if (lastUpdateEpoch >= systemEpoch) return weight;

        if (weight == 0) {
            globalLastUpdateEpoch = uint16(systemEpoch);
            return 0;
        }

        while (lastUpdateEpoch < systemEpoch) {
            unchecked {
                lastUpdateEpoch++;
            }
            weight += _getWeightGrowth(rate, 1);
            globalEpochWeights[lastUpdateEpoch] = weight;
            rate -= globalEpochToRealize[lastUpdateEpoch];
        }

        globalGrowthRate = uint112(rate);
        globalLastUpdateEpoch = uint16(systemEpoch);

        return weight;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"stakeGrowthEpochs","type":"uint256"},{"internalType":"uint256","name":"maxWeightMultiplier","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"epochDays","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"AccountWeightUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"ApprovedUnstakerSet","type":"event"},{"anonymous":false,"inputs":[],"name":"LocksDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weightAdded","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLocked","type":"bool"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weightRemoved","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"EPOCH_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"contract IFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WEIGHT_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_GROWTH_EPOCHS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"checkpointAccount","outputs":[{"internalType":"uint256","name":"weight","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_epoch","type":"uint256"}],"name":"checkpointAccountWithLimit","outputs":[{"internalType":"uint256","name":"weight","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpointGlobal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_epoch","type":"uint256"}],"name":"checkpointGlobalWithLimit","outputs":[{"internalType":"uint256","name":"weight","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountFullView","outputs":[{"components":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"realizedStake","type":"uint256"},{"internalType":"uint256","name":"pendingStake","type":"uint256"},{"internalType":"uint256","name":"lockedStake","type":"uint256"}],"internalType":"struct BoostedStaker.AccountView","name":"accountView","type":"tuple"},{"components":[{"internalType":"uint256","name":"epochsToMaturity","type":"uint256"},{"internalType":"uint256","name":"timestampAtMaturity","type":"uint256"},{"internalType":"uint256","name":"pendingStake","type":"uint256"},{"internalType":"uint256","name":"lockedStake","type":"uint256"}],"internalType":"struct BoostedStaker.FutureRealizedStake[]","name":"futureRealizedStake","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_epoch","type":"uint256"}],"name":"getAccountWeightAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEpoch","outputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getGlobalWeightAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"globalEpochToRealize","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalGrowthRate","outputs":[{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLastUpdateEpoch","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"isApprovedUnstaker","outputs":[{"internalType":"bool","name":"approvalStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLockingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"bool","name":"isApproved","type":"bool"}],"name":"setApprovedUnstaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637db2997411610104578063ac4746ab116100a2578063ddaa26ad11610071578063ddaa26ad1461049e578063e7fcc306146104c5578063f226d421146104d8578063f5810336146104eb57600080fd5b8063ac4746ab14610449578063adc9772e14610470578063b48e951914610483578063b8dc491b1461048b57600080fd5b806383b2e6fd116100de57806383b2e6fd146103c8578063926e31d6146103f657806395255285146104095780639e94080e1461043657600080fd5b80637db29974146103a0578063802c4a0f146103a857806382e49e44146103b057600080fd5b80632dd310001161017157806347befd5e1161014b57806347befd5e146103475780634b3b140a1461037257806370a0823114610385578063757991a81461039857600080fd5b80632dd31000146102e65780633ea01b341461030d578063473dc7421461032057600080fd5b806318160ddd116101ad57806318160ddd146102375780631c39b6721461026b578063282d3fdf146102aa5780632c11ca75146102bf57600080fd5b806307f93a38146101d4578063100e4110146101fa57806312cf9dad14610224575b600080fd5b6101e76101e2366004612dcc565b61050c565b6040519081526020015b60405180910390f35b620100045461021190600160701b900461ffff1681565b60405161ffff90911681526020016101f1565b6101e7610232366004612dcc565b610765565b620100045461025390600160801b90046001600160781b031681565b6040516001600160781b0390911681526020016101f1565b6102927f0000000000000000000000008f63ccd329d4ba07a3c6703d94d3137a9cfbfc6c81565b6040516001600160a01b0390911681526020016101f1565b6102bd6102b8366004612dcc565b610863565b005b6101e77f000000000000000000000000000000000000000000000000000000000000000281565b6102927f00000000000000000000000023ad11cc9fda4d4768669d4ab1fa4c40e937ce2b81565b6101e761031b366004612df8565b6108cc565b6101e77f000000000000000000000000000000000000000000000000000000000000000a81565b61035a610355366004612e15565b6108da565b6040516001600160801b0390911681526020016101f1565b6101e7610380366004612e15565b61090f565b6101e7610393366004612df8565b610a6e565b6101e7610afe565b6102bd610b57565b6101e7610c6d565b6103b8610c7f565b60405190151581526020016101f1565b6103b86103d6366004612e2e565b600360209081526000928352604080842090915290825290205460ff1681565b6102bd610404366004612e67565b610d1d565b620100045461041e906001600160701b031681565b6040516001600160701b0390911681526020016101f1565b6101e7610444366004612df8565b611605565b6101e77f000000000000000000000000000000000000000000000000000000000003f48081565b6102bd61047e366004612dcc565b6116ec565b6101e76116f8565b6102bd610499366004612e2e565b611714565b6101e77f00000000000000000000000000000000000000000000000000000000667ab14081565b6101e76104d3366004612e15565b6118d5565b6102bd6104e6366004612eb7565b6118fe565b6104fe6104f9366004612df8565b61196a565b6040516101f1929190612ee5565b6000610516610afe565b8211156105255750600061075f565b6001600160a01b03831660009081526020818152604091829020825160a08101845281546001600160701b038082168352600160701b918290048116948301949094526001909201549283169381019390935261ffff908204811660608401819052600160801b9092041660808301528381106105f7576001600160a01b03851660009081526001602052604090208461ffff81106105c6576105c6612f7a565b600291828204019190066010029054906101000a90046001600160801b03166001600160801b03169250505061075f565b6001600160a01b038516600090815260016020526040812061ffff80841690811061062457610624612f7a565b600291828204019190066010029054906101000a90046001600160801b03166001600160801b03169050600083602001516001600160701b03169050806000036106735750925061075f915050565b60808401515b868461ffff16101561075757600193840193610696908390611ef2565b6106a9906001600160801b031684612fa6565b925060018161ffff16901b90507f000000000000000000000000000000000000000000000000000000000000040061ffff167f0000000000000000000000000000000000000000000000000000000000000400821661ffff1603610752576001600160a01b038816600090815260026020526040902061ffff80861690811061073457610734612f7a565b0154610749906001600160801b031683612fb9565b91508115610757575b610679565b509093505050505b92915050565b600080610770610afe565b905080831061077d578092505b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526107b28585611f60565b6001600160a01b03969096166000908152602081815260409182902083518154928501516001600160701b039182166001600160e01b031990941693909317600160701b938216840217825592840151600190910180546060860151608090960151929094166001600160801b03199094169390931761ffff9485169092029190911761ffff60801b1916600160801b939091169290920291909117905550506001600160801b0390921692915050565b61086b610c7f565b6108bc5760405162461bcd60e51b815260206004820152601960248201527f44464d3a4253204c6f636b73206172652064697361626c65640000000000000060448201526064015b60405180910390fd5b6108c88282600161242e565b5050565b600061075f826101e2610afe565b6180048161ffff81106108ec57600080fd5b60029182820401919006601002915054906101000a90046001600160801b031681565b60008061091a610afe565b90508083111561092d5750600092915050565b620100045461ffff600160701b820416906001600160701b031681851161098b5760048561ffff811061096257610962612f7a565b60028104919091015460019091166010026101000a90046001600160801b031695945050505050565b600060048361ffff1661ffff81106109a5576109a5612f7a565b600291828204019190066010029054906101000a90046001600160801b03166001600160801b03169050816000036109e05795945050505050565b858361ffff161015610a65576001928301926109fd908390611ef2565b610a10906001600160801b031682612fa6565b90506180048361ffff1661ffff8110610a2b57610a2b612f7a565b600291828204019190066010029054906101000a90046001600160801b03166001600160801b031682610a5e9190612fb9565b91506109e0565b95945050505050565b6001600160a01b038116600090815260208181526040808320815160a08101835281546001600160701b03808216808452600160701b92839004821696840187905260019094015490811694830185905261ffff91810482166060840152600160801b900416608082015292610ae49190612fcc565b610aee9190612fcc565b6001600160701b03169392505050565b60007f000000000000000000000000000000000000000000000000000000000003f4807f00000000000000000000000000000000000000000000000000000000667ab140420381610b5157610b51612ff3565b04905090565b7f00000000000000000000000023ad11cc9fda4d4768669d4ab1fa4c40e937ce2b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd99190613009565b6001600160a01b0316336001600160a01b031614610c315760405162461bcd60e51b81526020600482015260156024820152741111934e9094c8139bdd08185d5d1a1bdc9a5e9959605a1b60448201526064016108b3565b6201000480546001600160f81b031690556040517fcb24fc4f673e79aa46c680ebfe65c71676c55b8e89317a77161ebee069628a2190600090a1565b6000610c7a610380610afe565b905090565b6201000454600090600160f81b900460ff16610c9b5750600090565b7f00000000000000000000000023ad11cc9fda4d4768669d4ab1fa4c40e937ce2b6001600160a01b03166382e49e446040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7a9190613026565b60008211610d6d5760405162461bcd60e51b815260206004820152601760248201527f44464d3a42532043616e6e6f7420756e7374616b65203000000000000000000060448201526064016108b3565b336001600160a01b03841614610df0576001600160a01b038316600090815260036020908152604080832033845290915290205460ff16610df05760405162461bcd60e51b815260206004820152601c60248201527f44464d3a4253204e6f7420617070726f76656420756e7374616b65720000000060448201526064016108b3565b6000610dfa610afe565b90506000610e088583611f60565b509050610e14826129b8565b50602081015181518591610e2791612fcc565b6001600160701b03161015610e7e5760405162461bcd60e51b815260206004820152601b60248201527f44464d3a425320496e73756666696369656e742062616c616e6365000000000060448201526064016108b3565b60808101516001600160a01b0386166000908152600260205260408120869061ffff8416156111be5760005b7f000000000000000000000000000000000000000000000000000000000000000a816001600160801b031610156111b25760016001600160801b0382161b61ffff808216878316909116036111a95760006001600160801b038316610f2f7f000000000000000000000000000000000000000000000000000000000000000a8b612fa6565b610f399190612fb9565b90506000848261ffff8110610f5057610f50612f7a565b01546001600160801b0316905080156111a657806001600160801b0316866001600160801b0316111561108357610f99816001600160801b0316856001600160801b0316612b6c565b610fa39088612fa6565b96506000858361ffff8110610fba57610fba612f7a565b0180546001600160801b0319166001600160801b0392909216919091179055806180048361ffff8110610fef57610fef612f7a565b600291828204019190066010028282829054906101000a90046001600160801b031661101b9190613043565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550808661104b9190613043565b9550848261ffff811061106057611060612f7a565b0154600160801b90046001600160801b031660000361107e57968218965b6111a6565b61109f866001600160801b0316856001600160801b0316612b6c565b6110a99088612fa6565b96506110b58682613043565b858361ffff81106110c8576110c8612f7a565b0180546001600160801b0319166001600160801b0392909216919091179055856180048361ffff81106110fd576110fd612f7a565b600291828204019190066010028282829054906101000a90046001600160801b03166111299190613043565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550806001600160801b0316866001600160801b03161480156111905750848261ffff811061117c5761117c612f7a565b0154600160801b90046001600160801b0316155b1561119a57968218965b600095505050506111b2565b50505b50600101610eaa565b5061ffff841660808601525b60006111d36001600160801b0384168a612fb9565b90506001600160801b0383161561124d57611217836001600160801b03167f000000000000000000000000000000000000000000000000000000000000000a612b6c565b6112219085612fa6565b935082866000018181516112359190613063565b6001600160701b03169052506000602087015261126c565b808660200181815161125f9190613063565b6001600160701b03169052505b856000808c6001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160701b0302191690836001600160701b03160217905550602082015181600001600e6101000a8154816001600160701b0302191690836001600160701b0316021790555060408201518160010160006101000a8154816001600160701b0302191690836001600160701b03160217905550606082015181600101600e6101000a81548161ffff021916908361ffff16021790555060808201518160010160106101000a81548161ffff021916908361ffff1602179055509050506000600160008c6001600160a01b03166001600160a01b031681526020019081526020016000208861ffff811061139a5761139a612f7a565b600291828204019190066010029054906101000a90046001600160801b03166001600160801b03169050848110156113d0578094505b6113da8582612fb9565b6001600160a01b038c16600090815260016020526040902090915081908961ffff811061140957611409612f7a565b600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b03160217905550816201000460008282829054906101000a90046001600160701b031661145e9190613063565b92506101000a8154816001600160701b0302191690836001600160701b031602179055508460048961ffff811061149757611497612f7a565b600291828204019190066010028282829054906101000a90046001600160801b03166114c39190613043565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550896201000460108282829054906101000a90046001600160781b031661150d9190613083565b92506101000a8154816001600160781b0302191690836001600160781b03160217905550878b6001600160a01b03167f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de008c88604051611576929190918252602082015260400190565b60405180910390a3604080514281526020810183905289916001600160a01b038e16917f2696eab7c8b917cdda7ba33aab3361916f0304ea9a5e1bf536c26929584e7d15910160405180910390a36115f86001600160a01b037f0000000000000000000000008f63ccd329d4ba07a3c6703d94d3137a9cfbfc6c168a8c612b96565b5050505050505050505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081018290526116408361163b610afe565b611f60565b6001600160a01b03949094166000908152602081815260409182902083518154928501516001600160701b039182166001600160e01b031990941693909317600160701b938216840217825592840151600190910180546060860151608090960151929094166001600160801b03199094169390931761ffff9485169092029190911761ffff60801b1916600160801b939091169290920291909117905550506001600160801b031690565b6108c88282600061242e565b600080611703610afe565b905061170e816129b8565b91505090565b7f00000000000000000000000023ad11cc9fda4d4768669d4ab1fa4c40e937ce2b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611772573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117969190613009565b6001600160a01b0316336001600160a01b0316146117ee5760405162461bcd60e51b81526020600482015260156024820152741111934e9094c8139bdd08185d5d1a1bdc9a5e9959605a1b60448201526064016108b3565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611835573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185991906130a3565b90507f0000000000000000000000008f63ccd329d4ba07a3c6703d94d3137a9cfbfc6c6001600160a01b0316836001600160a01b0316036118b65762010004546118b390600160801b90046001600160781b031682612fb9565b90505b80156118d0576118d06001600160a01b0384168383612b96565b505050565b6000806118e0610afe565b9050808311156118ee578092505b6118f7836129b8565b9392505050565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f13d8fe2846991e51915fda469ac8fe5d9ae71372cbbc35da42480b751482fe32910160405180910390a35050565b61199c6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b606060006119a8610afe565b6001600160a01b03851660008181526020818152604080832060018082015482546001600160701b03600160701b808304821660608f015281841660808f015291168c86015296865293529220939450909261ffff9290910482169182908110611a1457611a14612f7a565b60028104909101546001600160801b0360106001938416026101000a9091041660208701528254908301546001600160701b0380831692611a6092821691600160701b90910416612fcc565b611a6a9190612fcc565b6001600160701b03168552608085015115801590611a8d5750611a8b610c7f565b155b15611ab357846080015185604001818151611aa89190612fa6565b905250600060808601525b600085608001518660600151611ac99190612fa6565b1115611eea576001820154600160801b900461ffff166000611b1485611b0f7f000000000000000000000000000000000000000000000000000000000000000a86612fa6565b612bf5565b90505b80831015611cb7576060870151600193840193611b349190611ef2565b6001600160801b031687602001818151611b4e9190612fa6565b9150818152505060018261ffff16901b91507f000000000000000000000000000000000000000000000000000000000000040061ffff167f0000000000000000000000000000000000000000000000000000000000000400831661ffff1603611cb2576001600160a01b03881660009081526002602052604081208461ffff8110611bdb57611bdb612f7a565b604080518082019091529101546001600160801b03808216808452600160801b90920416602083015260608a0180519293509091611c1a908390612fb9565b90525080516040890180516001600160801b0390921691611c3c908390612fa6565b905250608088015115611c915780602001516001600160801b031688608001818151611c689190612fb9565b90525060208101516040890180516001600160801b0390921691611c8d908390612fa6565b9052505b6060880151158015611ca557506080880151155b15611cb05750611cb7565b505b611b17565b8492507f000000000000000000000000000000000000000000000000000000000000000a67ffffffffffffffff811115611cf357611cf36130bc565b604051908082528060200260200182016040528015611d4f57816020015b611d3c6040518060800160405280600081526020016000815260200160008152602001600081525090565b815260200190600190039081611d115790505b50955060005b61ffff831615611ee55783611d69816130d2565b94505060018361ffff16901b92507f000000000000000000000000000000000000000000000000000000000000040061ffff167f0000000000000000000000000000000000000000000000000000000000000400841661ffff1603611ee0576001600160a01b03891660009081526002602052604081208561ffff8110611df257611df2612f7a565b60408051808201825291909201546001600160801b038082168352600160801b909104166020820152815160808101909252915080611e318988612fb9565b8152602001611e607f000000000000000000000000000000000000000000000000000000000003f480886130eb565b611e8a907f00000000000000000000000000000000000000000000000000000000667ab140612fa6565b815260200182600001516001600160801b0316815260200182602001516001600160801b0316815250888381518110611ec557611ec5612f7a565b60200260200101819052508180611edb906130d2565b925050505b611d55565b865250505b505050915091565b6000611f1f60017f0000000000000000000000000000000000000000000000000000000000000002612fb9565b611f2990846130eb565b925081611f567f000000000000000000000000000000000000000000000000000000000000000a85613102565b6118f791906130eb565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b038216600081815260208181526040808320815160a08101835281546001600160701b038082168352600160701b91829004811683870190815260019485015480831685880190815293810461ffff90811660608701819052600160801b9092041660808601529888529390955292852091519251815191969492938316929081169116811580159061202b5750612029610c7f565b155b156120545761203a8282612fa6565b6001600160701b0381168852600060408901819052925090505b84881161209c5786848661ffff811061206f5761206f612f7a565b600291828204019190066010029054906101000a90046001600160801b0316965096505050505050612427565b821580156120a8575081155b1561218657801561213e57838561ffff81106120c6576120c6612f7a565b600291828204019190066010029054906101000a90046001600160801b031695505b8785101561213e5760019094019385848661ffff811061210a5761210a612f7a565b600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b031602179055506120e8565b505050506001600160a01b0385166000908152602081905260409020600101805461ffff60701b1916600160701b61ffff871690810291909117909155606084015250612427565b838561ffff811061219957612199612f7a565b600291828204019190066010029054906101000a90046001600160801b0316955060008760800151905060006121f58a7f000000000000000000000000000000000000000000000000000000000000000a89611b0f9190612fa6565b90505b8087101561239057600196870196612211908690611ef2565b61221b9089613124565b975087868861ffff811061223157612231612f7a565b600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b0316021790555060018261ffff16901b91507f000000000000000000000000000000000000000000000000000000000000040061ffff167f0000000000000000000000000000000000000000000000000000000000000400831661ffff160361238b576001600160a01b038b1660009081526002602052604081208861ffff81106122e6576122e6612f7a565b604080518082019091529101546001600160801b03808216808452600160801b90920416602083015290915061231c9087612fb9565b8151909650612334906001600160801b031685612fa6565b93508415612372576020810151612354906001600160801b031686612fb9565b945080602001516001600160801b03168461236f9190612fa6565b93505b8515801561237e575084155b156123895750612390565b505b6121f8565b898710156123e65760019096019587868861ffff81106123b2576123b2612f7a565b600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b03160217905550612390565b506040805160a0810182526001600160701b0393841681529483166020860152929091169183019190915261ffff8088166060840152166080820152935050505b9250929050565b600082116124765760405162461bcd60e51b8152602060048201526015602482015274044464d3a42532043616e6e6f74207374616b65203605c1b60448201526064016108b3565b6201000454600090612499908490600160801b90046001600160781b0316612fa6565b90506001600160701b0381106124f15760405162461bcd60e51b815260206004820152601760248201527f44464d3a425320416d6f756e7420746f6f206c6172676500000000000000000060448201526064016108b3565b6201000480546effffffffffffffffffffffffffffff60801b1916600160801b6001600160781b038416021790556000612529610afe565b90506000806125388784611f60565b6001600160801b0316915091506000612550846129b8565b9050600061257e7f000000000000000000000000000000000000000000000000000000000000000a86612fa6565b905060008715612648576125b2897f000000000000000000000000000000000000000000000000000000000000000a612b6c565b905088856040018181516125c69190612fcc565b6001600160701b03169052506001600160a01b038a16600090815260026020526040902089908361ffff81106125fe576125fe612f7a565b01805460109061261f908490600160801b90046001600160801b0316613124565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550612786565b889050888560200181815161265d9190612fcc565b6001600160701b039081169091526201000480548c9350909160009161268591859116612fcc565b92506101000a8154816001600160701b0302191690836001600160701b0316021790555088600260008c6001600160a01b03166001600160a01b031681526020019081526020016000208361ffff81106126e1576126e1612f7a565b0180546000906126fb9084906001600160801b0316613124565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550886180048361ffff811061273557612735612f7a565b600291828204019190066010028282829054906101000a90046001600160801b03166127619190613124565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6127908185612fa6565b6001600160a01b038b1660009081526001602052604090208761ffff81106127ba576127ba612f7a565b600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b0316021790555080836001600160801b03166127fe9190612fa6565b60048761ffff811061281257612812612f7a565b6002810490910180546001600160801b0393841660106001948516026101000a908102940219169290921790915560808601805161ffff908317811682526001600160a01b03808e16600090815260208181526040918290208b518154928d01516001600160701b03908116600160701b9081026001600160e01b031990951692821692909217939093178255928c01519601805460608d015196518616600160801b0261ffff60801b19979096169093026001600160801b0319909316969091169590951717929092161790915561290f907f0000000000000000000000008f63ccd329d4ba07a3c6703d94d3137a9cfbfc6c1633308c612c0b565b604080518a81526020810183905289151581830152905187916001600160a01b038d16917f830141583677d950fe61a27b93001edff66b597c666b2c90f5fb6e79a4befd0e9181900360600190a3856001600160a01b038b167f2696eab7c8b917cdda7ba33aab3361916f0304ea9a5e1bf536c26929584e7d15426129948589612fa6565b6040805192835260208301919091520160405180910390a350505050505050505050565b620100045460009061ffff600160701b82048116916001600160701b0316908390600490849081106129ec576129ec612f7a565b600291828204019190066010029054906101000a90046001600160801b03169050848361ffff1610612a29576001600160801b0316949350505050565b806001600160801b0316600003612a6757505062010004805461ffff909416600160701b0261ffff60701b1990941693909317909255506000919050565b848361ffff161015612b2b57600192830192612a84908390611ef2565b612a8e9082613124565b90508060048461ffff1661ffff8110612aa957612aa9612f7a565b600291828204019190066010026101000a8154816001600160801b0302191690836001600160801b031602179055506180048361ffff1661ffff8110612af157612af1612f7a565b600291828204019190066010029054906101000a90046001600160801b03166001600160801b031682612b249190612fb9565b9150612a67565b62010004805461ffff909616600160701b026001600160801b03199096166001600160701b039093169290921794909417905550506001600160801b031690565b600080612b798484611ef2565b6001600160801b03169050612b8e8185612fa6565b949350505050565b6040516001600160a01b038381166024830152604482018390526118d091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612c4a565b6000818310612c0457816118f7565b5090919050565b6040516001600160a01b038481166024830152838116604483015260648201839052612c449186918216906323b872dd90608401612bc3565b50505050565b6000612c5f6001600160a01b03841683612cad565b90508051600014158015612c84575080806020019051810190612c829190613026565b155b156118d057604051635274afe760e01b81526001600160a01b03841660048201526024016108b3565b60606118f78383600084600080856001600160a01b03168486604051612cd39190613144565b60006040518083038185875af1925050503d8060008114612d10576040519150601f19603f3d011682016040523d82523d6000602084013e612d15565b606091505b5091509150612d25868383612d2f565b9695505050505050565b606082612d4457612d3f82612d8b565b6118f7565b8151158015612d5b57506001600160a01b0384163b155b15612d8457604051639996b31560e01b81526001600160a01b03851660048201526024016108b3565b50806118f7565b805115612d9b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6001600160a01b0381168114612db457600080fd5b60008060408385031215612ddf57600080fd5b8235612dea81612db7565b946020939093013593505050565b600060208284031215612e0a57600080fd5b81356118f781612db7565b600060208284031215612e2757600080fd5b5035919050565b60008060408385031215612e4157600080fd5b8235612e4c81612db7565b91506020830135612e5c81612db7565b809150509250929050565b600080600060608486031215612e7c57600080fd5b8335612e8781612db7565b9250602084013591506040840135612e9e81612db7565b809150509250925092565b8015158114612db457600080fd5b60008060408385031215612eca57600080fd5b8235612ed581612db7565b91506020830135612e5c81612ea9565b600060c08201845183526020808601518185015260408087015160408601526060808801516060870152608080890151608088015260c060a088015284885180875260e089019150858a01965060005b81811015612f6a5787518051845287810151888501528681015187850152850151858401529686019691830191600101612f35565b50909a9950505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561075f5761075f612f90565b8181038181111561075f5761075f612f90565b6001600160701b03818116838216019080821115612fec57612fec612f90565b5092915050565b634e487b7160e01b600052601260045260246000fd5b60006020828403121561301b57600080fd5b81516118f781612db7565b60006020828403121561303857600080fd5b81516118f781612ea9565b6001600160801b03828116828216039080821115612fec57612fec612f90565b6001600160701b03828116828216039080821115612fec57612fec612f90565b6001600160781b03828116828216039080821115612fec57612fec612f90565b6000602082840312156130b557600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6000600182016130e4576130e4612f90565b5060010190565b808202811582820484141761075f5761075f612f90565b60008261311f57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160801b03818116838216019080821115612fec57612fec612f90565b6000825160005b81811015613165576020818601810151858301520161314b565b50600092019182525091905056fea26469706673582212204265b15885de4e38a54a512002b9d63f5b9b9b46298ae3ce1bafa5bf115c095f64736f6c63430008190033

Deployed Bytecode Sourcemap

15416:27976:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20369:1328;;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;20369:1328:0;;;;;;;;16439:35;;;;;-1:-1:-1;;;16439:35:0;;;;;;;;;826:6:1;814:19;;;796:38;;784:2;769:18;16439:35:0;652:188:1;33928:386:0;;;;;;:::i;:::-;;:::i;16483:26::-;;;;;-1:-1:-1;;;16483:26:0;;-1:-1:-1;;;;;16483:26:0;;;;;;-1:-1:-1;;;;;1009:45:1;;;991:64;;979:2;964:18;16483:26:0;845:216:1;15766:35:0;;;;;;;;-1:-1:-1;;;;;1244:32:1;;;1226:51;;1214:2;1199:18;15766:35:0;1066:217:1;28440:175:0;;;;;;:::i;:::-;;:::i;:::-;;15627:46;;;;;15808:33;;;;;20140:140;;;;;;:::i;:::-;;:::i;15576:44::-;;;;;16347:47;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2112:47:1;;;2094:66;;2082:2;2067:18;16347:47:0;1948:218:1;26493:815:0;;;;;;:::i;:::-;;:::i;19815:228::-;;;;;;:::i;:::-;;:::i;19302:163::-;;;:::i;35802:113::-;;;:::i;26146:114::-;;;:::i;19473:149::-;;;:::i;:::-;;;2336:14:1;;2329:22;2311:41;;2299:2;2284:18;19473:149:0;2171:187:1;16142:100:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;28779:3913;;;;;;:::i;:::-;;:::i;16401:31::-;;;;;-1:-1:-1;;;;;16401:31:0;;;;;;-1:-1:-1;;;;;3381:43:1;;;3363:62;;3351:2;3336:18;16401:31:0;3217:214:1;33018:264:0;;;;;;:::i;:::-;;:::i;15722:37::-;;;;;27985:110;;;;;;:::i;:::-;;:::i;35439:154::-;;;:::i;35923:287::-;;;;;;:::i;:::-;;:::i;15680:35::-;;;;;34929:236;;;;;;:::i;:::-;;:::i;27641:211::-;;;;;;:::i;:::-;;:::i;22539:3524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;20369:1328::-;20452:7;20485:10;:8;:10::i;:::-;20476:6;:19;20472:33;;;-1:-1:-1;20504:1:0;20497:8;;20472:33;-1:-1:-1;;;;;20548:21:0;;20518:27;20548:21;;;;;;;;;;;;20518:51;;;;;;;;;-1:-1:-1;;;;;20518:51:0;;;;;-1:-1:-1;;;20518:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20518:51:0;;;;;;;;20648:25;;;20644:75;;-1:-1:-1;;;;;20682:29:0;;;;;;:19;:29;;;;;20712:6;20682:37;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20682:37:0;-1:-1:-1;;;;;20675:44:0;;;;;;;20644:75;-1:-1:-1;;;;;20749:29:0;;20732:14;20749:29;;;:19;:29;;;;;:46;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20749:46:0;-1:-1:-1;;;;;20732:63:0;;;20808:15;20834:8;:21;;;-1:-1:-1;;;;;20826:30:0;20808:48;;20871:7;20882:1;20871:12;20867:31;;-1:-1:-1;20892:6:0;-1:-1:-1;20885:13:0;;-1:-1:-1;;20885:13:0;20867:31;20927:26;;;;20966:698;20991:6;20973:15;:24;;;20966:698;;;21091:17;;;;;21148:28;;21165:7;;21148:16;:28::i;:::-;21138:38;;-1:-1:-1;;;;;21138:38:0;;;:::i;:::-;;;21296:1;21286:6;:11;;;;21277:20;;21342:13;21316:39;;21325:13;21316:6;:22;:39;;;21312:341;;-1:-1:-1;;;;;21489:31:0;;;;;;:21;:31;;;;;:48;;;;;;;;;;;:::i;:::-;;:56;21478:67;;-1:-1:-1;;;;;21489:56:0;21478:67;;:::i;:::-;;-1:-1:-1;21564:23:0;;21582:5;21564:23;;20966:698;;;-1:-1:-1;21683:6:0;;-1:-1:-1;;;;20369:1328:0;;;;;:::o;33928:386::-;34016:14;34043:19;34065:10;:8;:10::i;:::-;34043:32;;34100:11;34090:6;:21;34086:47;;34122:11;34113:20;;34086:47;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34203:36:0;34222:8;34232:6;34203:18;:36::i;:::-;-1:-1:-1;;;;;34250:21:0;;;;:11;:21;;;;;;;;;;;;:32;;;;;;;;-1:-1:-1;;;;;34250:32:0;;;-1:-1:-1;;;;;;34250:32:0;;;;;;;-1:-1:-1;;;34250:32:0;;;;;;;;;;;;-1:-1:-1;34250:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34250:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;34250:32:0;-1:-1:-1;;;34250:32:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;;34182:57:0;;;;33928:386;-1:-1:-1;;33928:386:0:o;28440:175::-;28517:18;:16;:18::i;:::-;28509:56;;;;-1:-1:-1;;;28509:56:0;;6439:2:1;28509:56:0;;;6421:21:1;6478:2;6458:18;;;6451:30;6517:27;6497:18;;;6490:55;6562:18;;28509:56:0;;;;;;;;;28576:31;28583:8;28593:7;28602:4;28576:6;:31::i;:::-;28440:175;;:::o;20140:140::-;20206:7;20233:39;20252:7;20261:10;:8;:10::i;16347:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16347:47:0;;:::o;26493:815::-;26556:7;26576:19;26598:10;:8;:10::i;:::-;26576:32;;26631:11;26623:5;:19;26619:33;;;-1:-1:-1;26651:1:0;;26493:815;-1:-1:-1;;26493:815:0:o;26619:33::-;26762:21;;;-1:-1:-1;;;26762:21:0;;;;-1:-1:-1;;;;;26809:16:0;26842:24;;;26838:62;;26875:18;26894:5;26875:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26875:25:0;;;-1:-1:-1;;;;;26493:815:0:o;26838:62::-;26913:14;26930:18;26949:15;26930:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26930:35:0;-1:-1:-1;;;;;26913:52:0;;;26980:4;26988:1;26980:9;26976:55;;27013:6;26493:815;-1:-1:-1;;;;;26493:815:0:o;26976:55::-;27068:5;27050:15;:23;;;27043:232;;;27119:17;;;;;27178:25;;27195:4;;27178:16;:25::i;:::-;27168:35;;-1:-1:-1;;;;;27168:35:0;;;:::i;:::-;;;27226:20;27247:15;27226:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27226:37:0;-1:-1:-1;;;;;27218:45:0;;;;;;:::i;:::-;;;27043:232;;;27294:6;26493:815;-1:-1:-1;;;;;26493:815:0:o;19815:228::-;-1:-1:-1;;;;;19925:21:0;;19875:7;19925:21;;;;;;;;;;;19895:51;;;;;;;;;-1:-1:-1;;;;;19895:51:0;;;;;;-1:-1:-1;;;19895:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19895:51:0;;;;;;;;19965:46;;19895:51;19965:46;:::i;:::-;:69;;;;:::i;:::-;-1:-1:-1;;;;;19957:78:0;;19815:228;-1:-1:-1;;;19815:228:0:o;19302:163::-;19343:13;19434:12;19420:10;19402:15;:28;19401:45;;;;;:::i;:::-;;19394:52;;19302:163;:::o;35802:113::-;19186:7;-1:-1:-1;;;;;19186:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19172:29:0;:10;-1:-1:-1;;;;;19172:29:0;;19164:63;;;;-1:-1:-1;;;19164:63:0;;7379:2:1;19164:63:0;;;7361:21:1;7418:2;7398:18;;;7391:30;-1:-1:-1;;;7437:18:1;;;7430:51;7498:18;;19164:63:0;7177:345:1;19164:63:0;35856:12:::1;:20:::0;;-1:-1:-1;;;;;35856:20:0::1;::::0;;35892:15:::1;::::0;::::1;::::0;35871:5:::1;::::0;35892:15:::1;35802:113::o:0;26146:114::-;26196:7;26223:29;26241:10;:8;:10::i;26223:29::-;26216:36;;26146:114;:::o;19473:149::-;19544:12;;19522:4;;-1:-1:-1;;;19544:12:0;;;;19539:31;;-1:-1:-1;19565:5:0;;19473:149::o;19539:31::-;19588:7;-1:-1:-1;;;;;19588:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28779:3913::-;28888:1;28878:7;:11;28870:47;;;;-1:-1:-1;;;28870:47:0;;7979:2:1;28870:47:0;;;7961:21:1;8018:2;7998:18;;;7991:30;8057:25;8037:18;;;8030:53;8100:18;;28870:47:0;7777:347:1;28870:47:0;28934:10;-1:-1:-1;;;;;28934:22:0;;;28930:136;;-1:-1:-1;;;;;28981:28:0;;;;;;:18;:28;;;;;;;;29010:10;28981:40;;;;;;;;;;28973:81;;;;-1:-1:-1;;;28973:81:0;;8331:2:1;28973:81:0;;;8313:21:1;8370:2;8350:18;;;8343:30;8409;8389:18;;;8382:58;8457:18;;28973:81:0;8129:352:1;28973:81:0;29154:19;29176:10;:8;:10::i;:::-;29154:32;;29198:27;29231:41;29250:8;29260:11;29231:18;:41::i;:::-;29197:75;;;29283:30;29301:11;29283:17;:30::i;:::-;-1:-1:-1;29359:21:0;;;;29334:22;;29384:7;;29334:46;;;:::i;:::-;-1:-1:-1;;;;;29334:57:0;;;29326:97;;;;-1:-1:-1;;;29326:97:0;;8688:2:1;29326:97:0;;;8670:21:1;8727:2;8707:18;;;8700:30;8766:29;8746:18;;;8739:57;8813:18;;29326:97:0;8486:351:1;29326:97:0;29534:26;;;;-1:-1:-1;;;;;29703:31:0;;29518:13;29703:31;;;:21;:31;;;;;29637:7;;29751:10;;;;29747:1825;;29783:18;29778:1733;29816:19;29803:10;-1:-1:-1;;;;;29803:32:0;;29778:1733;;;29983:1;-1:-1:-1;;;;;29983:15:0;;;30022:21;;;;:13;;;:21;;;;30018:1395;;30068:20;-1:-1:-1;;;;;30091:46:0;;:33;30105:19;30091:11;:33;:::i;:::-;:46;;;;:::i;:::-;30068:69;;30160:15;30178:14;30193:12;30178:28;;;;;;;:::i;:::-;;:36;-1:-1:-1;;;;;30178:36:0;;-1:-1:-1;30241:11:0;;30237:1157;;30300:7;-1:-1:-1;;;;;30285:22:0;:12;-1:-1:-1;;;;;30285:22:0;;30281:1090;;;30358:31;30369:7;-1:-1:-1;;;;;30358:31:0;30378:10;-1:-1:-1;;;;;30358:31:0;:10;:31::i;:::-;30340:49;;;;:::i;:::-;;;30459:1;30420:14;30435:12;30420:28;;;;;;;:::i;:::-;;:40;;-1:-1:-1;;;;;;30420:40:0;-1:-1:-1;;;;;30420:40:0;;;;;;;;;;30529:7;30491:20;30512:12;30491:34;;;;;;;:::i;:::-;;;;;;;;;;;;:45;;;;;;;;;;-1:-1:-1;;;;;30491:45:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;30491:45:0;;;;;-1:-1:-1;;;;;30491:45:0;;;;;;30583:7;30567:23;;;;;:::i;:::-;;;30625:14;30640:12;30625:28;;;;;;;:::i;:::-;;:35;-1:-1:-1;;;30625:35:0;;-1:-1:-1;;;;;30625:35:0;;:40;30621:68;;30676:13;;;;30621:68;30281:1090;;;30859:36;30870:12;-1:-1:-1;;;;;30859:36:0;30884:10;-1:-1:-1;;;;;30859:36:0;:10;:36::i;:::-;30841:54;;;;:::i;:::-;;-1:-1:-1;30965:22:0;30975:12;30965:7;:22;:::i;:::-;30926:14;30941:12;30926:28;;;;;;;:::i;:::-;;:61;;-1:-1:-1;;;;;;30926:61:0;-1:-1:-1;;;;;30926:61:0;;;;;;;;;;31056:12;31018:20;31039:12;31018:34;;;;;;;:::i;:::-;;;;;;;;;;;;:50;;;;;;;;;;-1:-1:-1;;;;;31018:50:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;31018:50:0;;;;;-1:-1:-1;;;;;31018:50:0;;;;;;31119:7;-1:-1:-1;;;;;31103:23:0;:12;-1:-1:-1;;;;;31103:23:0;;:67;;;;;31130:14;31145:12;31130:28;;;;;;;:::i;:::-;;:35;-1:-1:-1;;;31130:35:0;;-1:-1:-1;;;;;31130:35:0;:40;31103:67;31099:162;;;31216:13;;;;31099:162;31306:1;31291:16;;31338:5;;;;;30281:1090;30045:1368;;30018:1395;-1:-1:-1;31464:12:0;;29778:1733;;;-1:-1:-1;31525:35:0;;;:26;;;:35;29747:1825;31584:22;31609;-1:-1:-1;;;;;31609:22:0;;:7;:22;:::i;:::-;31584:47;-1:-1:-1;;;;;;31646:16:0;;;31642:295;;31697:45;31708:12;-1:-1:-1;;;;;31697:45:0;31722:19;31697:10;:45::i;:::-;31679:63;;;;:::i;:::-;;;31791:12;31757:8;:22;;:47;;;;;;;:::i;:::-;-1:-1:-1;;;;;31757:47:0;;;-1:-1:-1;31843:1:0;31819:21;;;:25;31642:295;;;31910:14;31877:8;:21;;:48;;;;;;;:::i;:::-;-1:-1:-1;;;;;31877:48:0;;;-1:-1:-1;31642:295:0;31973:8;31949:11;:21;31961:8;-1:-1:-1;;;;;31949:21:0;-1:-1:-1;;;;;31949:21:0;;;;;;;;;;;;:32;;;;;;;;;;;;;-1:-1:-1;;;;;31949:32:0;;;;;-1:-1:-1;;;;;31949:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31949:32:0;;;;;-1:-1:-1;;;;;31949:32:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31949:32:0;;;;;-1:-1:-1;;;;;31949:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31994:24;32021:19;:29;32041:8;-1:-1:-1;;;;;32021:29:0;-1:-1:-1;;;;;32021:29:0;;;;;;;;;;;;32051:11;32021:42;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32021:42:0;-1:-1:-1;;;;;31994:69:0;;;32097:14;32078:16;:33;32074:72;;;32130:16;32113:33;;32074:72;32176:33;32195:14;32176:16;:33;:::i;:::-;-1:-1:-1;;;;;32220:29:0;;;;;;:19;:29;;;;;32157:52;;-1:-1:-1;32157:52:0;;32250:11;32220:42;;;;;;;:::i;:::-;;;;;;;;;;;;:70;;;;;-1:-1:-1;;;;;32220:70:0;;;;;-1:-1:-1;;;;;32220:70:0;;;;;;32331:14;32303:16;;:43;;;;;;;;;;-1:-1:-1;;;;;32303:43:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;32303:43:0;;;;;-1:-1:-1;;;;;32303:43:0;;;;;;32400:14;32357:18;32376:11;32357:31;;;;;;;:::i;:::-;;;;;;;;;;;;:58;;;;;;;;;;-1:-1:-1;;;;;32357:58:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;32357:58:0;;;;;-1:-1:-1;;;;;32357:58:0;;;;;;32451:7;32428:11;;:31;;;;;;;;;;-1:-1:-1;;;;;32428:31:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;32428:31:0;;;;;-1:-1:-1;;;;;32428:31:0;;;;;;32496:11;32486:8;-1:-1:-1;;;;;32477:56:0;;32509:7;32518:14;32477:56;;;;;;9625:25:1;;;9681:2;9666:18;;9659:34;9613:2;9598:18;;9451:248;32477:56:0;;;;;;;;32549:78;;;32593:15;9625:25:1;;9681:2;9666:18;;9659:34;;;32580:11:0;;-1:-1:-1;;;;;32549:78:0;;;;;9598:18:1;32549:78:0;;;;;;;32640:44;-1:-1:-1;;;;;32640:11:0;:24;32665:9;32676:7;32640:24;:44::i;:::-;28859:3833;;;;;;;;28779:3913;;;:::o;33018:264::-;-1:-1:-1;;;;;;;;33081:14:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;33167:40:0;33186:8;33196:10;:8;:10::i;:::-;33167:18;:40::i;:::-;-1:-1:-1;;;;;33218:21:0;;;;:11;:21;;;;;;;;;;;;:32;;;;;;;;-1:-1:-1;;;;;33218:32:0;;;-1:-1:-1;;;;;;33218:32:0;;;;;;;-1:-1:-1;;;33218:32:0;;;;;;;;;;;;-1:-1:-1;33218:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33218:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;33218:32:0;-1:-1:-1;;;33218:32:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;;33146:61:0;;33018:264::o;27985:110::-;28055:32;28062:8;28072:7;28081:5;28055:6;:32::i;35439:154::-;35485:7;35505:19;35527:10;:8;:10::i;:::-;35505:32;;35555:30;35573:11;35555:17;:30::i;:::-;35548:37;;;35439:154;:::o;35923:287::-;19186:7;-1:-1:-1;;;;;19186:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19172:29:0;:10;-1:-1:-1;;;;;19172:29:0;;19164:63;;;;-1:-1:-1;;;19164:63:0;;7379:2:1;19164:63:0;;;7361:21:1;7418:2;7398:18;;;7391:30;-1:-1:-1;;;7437:18:1;;;7430:51;7498:18;;19164:63:0;7177:345:1;19164:63:0;36017:30:::1;::::0;-1:-1:-1;;;36017:30:0;;36041:4:::1;36017:30;::::0;::::1;1226:51:1::0;36000:14:0::1;::::0;-1:-1:-1;;;;;36017:15:0;::::1;::::0;::::1;::::0;1199:18:1;;36017:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36000:47;;36071:11;-1:-1:-1::0;;;;;36062:20:0::1;:5;-1:-1:-1::0;;;;;36062:20:0::1;::::0;36058:82:::1;;36117:11;::::0;36108:20:::1;::::0;-1:-1:-1;;;36117:11:0;::::1;-1:-1:-1::0;;;;;36117:11:0::1;36108:6:::0;:20:::1;:::i;:::-;36099:29;;36058:82;36154:10:::0;;36150:52:::1;;36166:36;-1:-1:-1::0;;;;;36166:18:0;::::1;36185:8:::0;36195:6;36166:18:::1;:36::i;:::-;35989:221;35923:287:::0;;:::o;34929:236::-;34998:14;35025:19;35047:10;:8;:10::i;:::-;35025:32;;35081:11;35072:6;:20;35068:46;;;35103:11;35094:20;;35068:46;35132:25;35150:6;35132:17;:25::i;:::-;35125:32;34929:236;-1:-1:-1;;;34929:236:0:o;27641:211::-;27743:10;27724:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;27724:39:0;;;;;;;;;;;;:52;;-1:-1:-1;;27724:52:0;;;;;;;;;;27792;;2311:41:1;;;27724:39:0;;27743:10;27792:52;;2284:18:1;27792:52:0;;;;;;;27641:211;;:::o;22539:3524::-;22623:30;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22623:30:0;22655:48;22716:19;22738:10;:8;:10::i;:::-;-1:-1:-1;;;;;22792:20:0;;22761:28;22792:20;;;;;;;;;;;22849:24;;;;;22913:21;;-1:-1:-1;;;;;;;;22913:21:0;;;;;22886:24;;;:48;22971:20;;;22945:23;;;:46;23030:22;;23002:25;;;:50;23084:28;;;;;;;22716:32;;-1:-1:-1;22792:20:0;;22849:24;;;;;;;;;;23084:45;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;23084:45:0;;;;;;;;;;;;23063:18;;;:66;23209:22;;23186:20;;;;-1:-1:-1;;;;;23209:22:0;;;;23162:44;;23186:20;;;-1:-1:-1;;;23162:21:0;;;;:44;:::i;:::-;:69;;;;:::i;:::-;-1:-1:-1;;;;;23140:91:0;;;23248:23;;;;:27;;;;:50;;;23280:18;:16;:18::i;:::-;23279:19;23248:50;23244:177;;;23344:11;:23;;;23315:11;:25;;:52;;;;;;;:::i;:::-;;;-1:-1:-1;23408:1:0;23382:23;;;:27;23244:177;23490:1;23464:11;:23;;;23437:11;:24;;;:50;;;;:::i;:::-;:54;23433:2623;;;23524:26;;;;-1:-1:-1;;;23524:26:0;;;;23508:13;23591:55;23595:11;23608:37;23626:19;23608:15;:37;:::i;:::-;23591:3;:55::i;:::-;23565:81;;23711:1278;23736:15;23718;:33;23711:1278;;;23899:24;;;;23805:17;;;;;23882:45;;23899:24;23882:16;:45::i;:::-;-1:-1:-1;;;;;23860:67:0;:11;:18;;:67;;;;;;;:::i;:::-;;;;;;;;24036:1;24026:6;:11;;;;24017:20;;24086:13;24060:39;;24069:13;24060:6;:22;:39;;;24056:918;;-1:-1:-1;;;;;24346:30:0;;24313;24346;;;:21;:30;;;;;24377:15;24346:47;;;;;;;:::i;:::-;24313:80;;;;;;;;;24346:47;;24313:80;-1:-1:-1;;;;;24313:80:0;;;;;;-1:-1:-1;;;24313:80:0;;;;;;;;24416:24;;;:49;;24313:80;;-1:-1:-1;24313:80:0;;24416:49;;24313:80;;24416:49;:::i;:::-;;;-1:-1:-1;24517:21:0;;24488:25;;;:50;;-1:-1:-1;;;;;24488:50:0;;;;;;;;;:::i;:::-;;;-1:-1:-1;24567:23:0;;;;:27;24563:295;;24738:13;:20;;;-1:-1:-1;;;;;24711:47:0;:11;:23;;:47;;;;;;;:::i;:::-;;;-1:-1:-1;24814:20:0;;;;24785:25;;;:49;;-1:-1:-1;;;;;24785:49:0;;;;;;;;;:::i;:::-;;;-1:-1:-1;24563:295:0;24886:24;;;;:29;:61;;;;-1:-1:-1;24919:23:0;;;;:28;24886:61;24882:72;;;24949:5;;;24882:72;24101:873;24056:918;23711:1278;;;25023:11;25005:29;;25097:19;25071:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25071:46:0;;;;;;;;;;;;;;;;;25049:68;;25132:14;25165:714;25172:11;;;;25165:714;;25204:17;;;;:::i;:::-;;;;25259:1;25249:6;:11;;;;25240:20;;25309:13;25283:39;;25292:13;25283:6;:22;:39;;;25279:585;;-1:-1:-1;;;;;25380:30:0;;25347;25380;;;:21;:30;;;;;25411:15;25380:47;;;;;;;:::i;:::-;25347:80;;;;;;;;25380:47;;;;25347:80;-1:-1:-1;;;;;25347:80:0;;;;;-1:-1:-1;;;25347:80:0;;;;;;;;25480:333;;;;;;;;25347:80;-1:-1:-1;25480:333:0;25545:29;25563:11;25545:15;:29;:::i;:::-;25480:333;;;;25636:30;25654:12;25636:15;:30;:::i;:::-;25622:45;;:10;:45;:::i;:::-;25480:333;;;;25708:13;:21;;;-1:-1:-1;;;;;25480:333:0;;;;;25769:13;:20;;;-1:-1:-1;;;;;25480:333:0;;;;25450:19;25470:6;25450:27;;;;;;;;:::i;:::-;;;;;;:363;;;;25836:8;;;;;:::i;:::-;;;;25324:540;25279:585;25165:714;;;25995:35;;-1:-1:-1;;23433:2623:0;22705:3358;;;22539:3524;;;:::o;36462:411::-;36543:14;36580:25;36604:1;36580:21;:25;:::i;:::-;36570:35;;;;:::i;:::-;;-1:-1:-1;36858:6:0;36826:28;36835:19;36570:35;36826:28;:::i;:::-;36825:39;;;;:::i;39036:3438::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39214:21:0;;39176:14;39214:21;;;;;;;;;;;39203:32;;;;;;;;;-1:-1:-1;;;;;39203:32:0;;;;;-1:-1:-1;;;39203:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39203:32:0;;;;;;;;39350:29;;;;;;;;;;39410:21;;39459:20;;39509:22;;39203:32;;;39350:29;;39392:39;;;39442:37;;;;39490:41;39548:10;;;;;:33;;;39563:18;:16;:18::i;:::-;39562:19;39548:33;39544:205;;;39598:18;39610:6;39598:18;;:::i;:::-;-1:-1:-1;;;;;39656:42:0;;;;39640:1;39713:20;;;:24;;;39640:1;-1:-1:-1;39598:18:0;-1:-1:-1;39544:205:0;39781:15;39765:12;:31;39761:112;;39821:8;39831:12;39844:15;39831:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39831:29:0;39813:48;;;;;;;;;;;39761:112;39889:12;;:27;;;;-1:-1:-1;39905:11:0;;39889:27;39885:617;;;39937:13;;39933:381;;39980:12;39993:15;39980:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39980:29:0;39971:38;;40028:271;40053:12;40035:15;:30;40028:271;;;40127:17;;;;;40273:6;40241:12;40127:17;40241:29;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;;-1:-1:-1;;;;;40241:38:0;;;;;-1:-1:-1;;;;;40241:38:0;;;;;;40028:271;;;-1:-1:-1;;;;;;;;;40328:21:0;;:11;:21;;;;;;;;;;:37;;:60;;-1:-1:-1;;;;40328:60:0;-1:-1:-1;;;40328:60:0;;;;;;;;;;;;;40403:24;;;:47;-1:-1:-1;40465:25:0;;39885:617;40523:12;40536:15;40523:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40523:29:0;40514:38;;40563:13;40579:8;:26;;;40563:42;;40616:23;40642:56;40646:12;40678:19;40660:15;:37;;;;:::i;40642:56::-;40616:82;;40755:1159;40780:15;40762;:33;40755:1159;;;40841:17;;;;;40898:28;;40915:7;;40898:16;:28::i;:::-;40888:38;;;;:::i;:::-;;;40973:6;40941:12;40954:15;40941:29;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;;-1:-1:-1;;;;;40941:38:0;;;;;-1:-1:-1;;;;;40941:38:0;;;;;;41080:1;41070:6;:11;;;;41061:20;;41126:13;41100:39;;41109:13;41100:6;:22;:39;;;41096:807;;-1:-1:-1;;;;;41374:31:0;;41341:30;41374:31;;;:21;:31;;;;;41406:15;41374:48;;;;;;;:::i;:::-;41341:81;;;;;;;;;41374:48;;41341:81;-1:-1:-1;;;;;41341:81:0;;;;;;-1:-1:-1;;;41341:81:0;;;;;;;;;;-1:-1:-1;41441:32:0;;;;:::i;:::-;41504:21;;41441:32;;-1:-1:-1;41492:33:0;;-1:-1:-1;;;;;41492:33:0;;;:::i;:::-;;-1:-1:-1;41550:10:0;;41546:228;;41679:20;;;;41669:30;;-1:-1:-1;;;;;41669:30:0;;;:::i;:::-;;;41734:13;:20;;;-1:-1:-1;;;;;41722:32:0;;;;;;:::i;:::-;;;41546:228;41798:12;;:27;;;;-1:-1:-1;41814:11:0;;41798:27;41794:38;;;41827:5;;;41794:38;41141:762;41096:807;40755:1159;;;41990:12;41972:15;:30;41965:180;;;42048:17;;;;;42127:6;42095:12;42048:17;42095:29;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;;-1:-1:-1;;;;;42095:38:0;;;;;-1:-1:-1;;;;;42095:38:0;;;;;;41965:180;;;-1:-1:-1;42215:251:0;;;;;;;;-1:-1:-1;;;;;42215:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39036:3438:0;;;;;;:::o;37163:1865::-;37267:1;37257:7;:11;37249:45;;;;-1:-1:-1;;;37249:45:0;;11172:2:1;37249:45:0;;;11154:21:1;11211:2;11191:18;;;11184:30;-1:-1:-1;;;11230:18:1;;;11223:51;11291:18;;37249:45:0;10970:345:1;37249:45:0;37332:11;;37307:22;;37332:21;;37346:7;;-1:-1:-1;;;37332:11:0;;-1:-1:-1;;;;;37332:11:0;:21;:::i;:::-;37307:46;-1:-1:-1;;;;;;37372:34:0;;37364:70;;;;-1:-1:-1;;;37364:70:0;;11522:2:1;37364:70:0;;;11504:21:1;11561:2;11541:18;;;11534:30;11600:25;11580:18;;;11573:53;11643:18;;37364:70:0;11320:347:1;37364:70:0;37445:11;:37;;-1:-1:-1;;;;37445:37:0;-1:-1:-1;;;;;;;;37445:37:0;;;;;;-1:-1:-1;37593:10:0;:8;:10::i;:::-;37571:32;;37615:27;37644:21;37669:41;37688:8;37698:11;37669:18;:41::i;:::-;-1:-1:-1;;;;;37614:96:0;;;;;37721:20;37752:30;37770:11;37752:17;:30::i;:::-;37721:62;-1:-1:-1;37796:20:0;37819:33;37833:19;37819:11;:33;:::i;:::-;37796:56;;37865:14;37894:8;37890:549;;;37928:40;37939:7;37948:19;37928:10;:40::i;:::-;37919:49;;38015:7;37983:8;:20;;:40;;;;;;;:::i;:::-;-1:-1:-1;;;;;37983:40:0;;;-1:-1:-1;;;;;;38040:31:0;;;;;;:21;:31;;;;;38104:7;;38072:12;38040:45;;;;;;;:::i;:::-;;:72;;:52;;:72;;;;-1:-1:-1;;;38040:72:0;;-1:-1:-1;;;;;38040:72:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38040:72:0;;;;;-1:-1:-1;;;;;38040:72:0;;;;;;37890:549;;;38154:7;38145:16;;38209:7;38176:8;:21;;:41;;;;;;;:::i;:::-;-1:-1:-1;;;;;38176:41:0;;;;;;38232:16;:36;;38260:7;;-1:-1:-1;38232:16:0;;;;:36;;38260:7;;38232:36;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38232:36:0;;;;;-1:-1:-1;;;;;38232:36:0;;;;;;38350:7;38285:21;:31;38307:8;-1:-1:-1;;;;;38285:31:0;-1:-1:-1;;;;;38285:31:0;;;;;;;;;;;;38317:12;38285:45;;;;;;;:::i;:::-;;:73;;:53;;:73;;;;-1:-1:-1;;;;;38285:73:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38285:73:0;;;;;-1:-1:-1;;;;;38285:73:0;;;;;;38419:7;38373:20;38394:12;38373:34;;;;;;;:::i;:::-;;;;;;;;;;;;:54;;;;;;;;;;-1:-1:-1;;;;;38373:54:0;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;38373:54:0;;;;;-1:-1:-1;;;;;38373:54:0;;;;;;37890:549;38504:22;38520:6;38504:13;:22;:::i;:::-;-1:-1:-1;;;;;38451:29:0;;;;;;:19;:29;;;;;38481:11;38451:42;;;;;;;:::i;:::-;;;;;;;;;;;;:76;;;;;-1:-1:-1;;;;;38451:76:0;;;;;-1:-1:-1;;;;;38451:76:0;;;;;;38595:6;38580:12;-1:-1:-1;;;;;38580:21:0;;;;;:::i;:::-;38538:18;38557:11;38538:31;;;;;;;:::i;:::-;;;;;;;:64;;-1:-1:-1;;;;;38538:64:0;;;:31;;;;;;:64;;;;;;;;;;;;;;;;38615:26;;;:31;;;;;;;;;;-1:-1:-1;;;;;38728:21:0;;;-1:-1:-1;38728:21:0;;;;;;;;;;;;:32;;;;;;;;-1:-1:-1;;;;;38728:32:0;;;-1:-1:-1;;;38728:32:0;;;-1:-1:-1;;;;;;38728:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38728:32:0;-1:-1:-1;;;;38728:32:0;;;;;;;-1:-1:-1;;;;;;38728:32:0;;;;;;;;;;;;;;;;;;;;38773:73;;:11;:28;38802:10;38822:4;38837:7;38773:28;:73::i;:::-;38864:56;;;11868:25:1;;;11924:2;11909:18;;11902:34;;;11979:14;;11972:22;11952:18;;;11945:50;38864:56:0;;38881:11;;-1:-1:-1;;;;;38864:56:0;;;;;;;;11856:2:1;38864:56:0;;;38967:11;-1:-1:-1;;;;;38936:84:0;;;38980:15;38997:22;39013:6;38997:13;:22;:::i;:::-;38936:84;;;9625:25:1;;;9681:2;9666:18;;9659:34;;;;9598:18;38936:84:0;;;;;;;37238:1790;;;;;;;37163:1865;;;:::o;42482:907::-;42637:21;;42548:7;;42637:21;-1:-1:-1;;;42637:21:0;;;;;-1:-1:-1;;;;;42684:16:0;;42548:7;;42730:18;;42637:21;;42730:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42730:35:0;42713:52;;42801:11;42782:15;:30;;;42778:49;;-1:-1:-1;;;;;42814:13:0;;42482:907;-1:-1:-1;;;;42482:907:0:o;42778:49::-;42844:6;-1:-1:-1;;;;;42844:11:0;42854:1;42844:11;42840:110;;-1:-1:-1;;42872:21:0;:43;;;;;;-1:-1:-1;;;42872:43:0;-1:-1:-1;;;;42872:43:0;;;;;;;;;;-1:-1:-1;;;42482:907:0;-1:-1:-1;42482:907:0:o;42840:110::-;42987:11;42969:15;:29;;;42962:295;;;43044:17;;;;;43101:25;;43118:4;;43101:16;:25::i;:::-;43091:35;;;;:::i;:::-;;;43179:6;43141:18;43160:15;43141:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;:44;;;;;-1:-1:-1;;;;;43141:44:0;;;;;-1:-1:-1;;;;;43141:44:0;;;;;;43208:20;43229:15;43208:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43208:37:0;-1:-1:-1;;;;;43200:45:0;;;;;;:::i;:::-;;;42962:295;;;43269:16;:32;;43312:43;;;;-1:-1:-1;;;43312:43:0;-1:-1:-1;;;;;;43312:43:0;;;-1:-1:-1;;;;;43269:32:0;;;43312:43;;;;;;;;;;-1:-1:-1;;;;;;;43368:13:0;;42482:907::o;36963:192::-;37038:14;37065;37082:32;37099:6;37107;37082:16;:32::i;:::-;-1:-1:-1;;;;;37065:49:0;;-1:-1:-1;37132:15:0;37065:49;37132:6;:15;:::i;:::-;37125:22;36963:192;-1:-1:-1;;;;36963:192:0:o;10780:162::-;10890:43;;-1:-1:-1;;;;;12198:32:1;;;10890:43:0;;;12180:51:1;12247:18;;;12240:34;;;10863:71:0;;10883:5;;10905:14;;;;;12153:18:1;;10890:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10890:43:0;;;;;;;;;;;10863:19;:71::i;36260:106::-;36318:7;36349:1;36345;:5;:13;;36357:1;36345:13;;;-1:-1:-1;36353:1:0;;36260:106;-1:-1:-1;36260:106:0:o;11187:190::-;11315:53;;-1:-1:-1;;;;;12543:15:1;;;11315:53:0;;;12525:34:1;12595:15;;;12575:18;;;12568:43;12627:18;;;12620:34;;;11288:81:0;;11308:5;;11330:18;;;;;12460::1;;11315:53:0;12285:375:1;11288:81:0;11187:190;;;;:::o;13591:638::-;14015:23;14041:33;-1:-1:-1;;;;;14041:27:0;;14069:4;14041:27;:33::i;:::-;14015:59;;14089:10;:17;14110:1;14089:22;;:57;;;;;14127:10;14116:30;;;;;;;;;;;;:::i;:::-;14115:31;14089:57;14085:137;;;14170:40;;-1:-1:-1;;;14170:40:0;;-1:-1:-1;;;;;1244:32:1;;14170:40:0;;;1226:51:1;1199:18;;14170:40:0;1066:217:1;2854:153:0;2929:12;2961:38;2983:6;2991:4;2997:1;2929:12;3587;3601:23;3628:6;-1:-1:-1;;;;;3628:11:0;3647:5;3654:4;3628:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3586:73;;;;3677:55;3704:6;3712:7;3721:10;3677:26;:55::i;:::-;3670:62;3342:398;-1:-1:-1;;;;;;3342:398:0:o;4818:597::-;4966:12;4996:7;4991:417;;5020:19;5028:10;5020:7;:19::i;:::-;4991:417;;;5248:17;;:22;:49;;;;-1:-1:-1;;;;;;5274:18:0;;;:23;5248:49;5244:121;;;5325:24;;-1:-1:-1;;;5325:24:0;;-1:-1:-1;;;;;1244:32:1;;5325:24:0;;;1226:51:1;1199:18;;5325:24:0;1066:217:1;5244:121:0;-1:-1:-1;5386:10:0;5379:17;;5968:528;6101:17;;:21;6097:392;;6333:10;6327:17;6390:15;6377:10;6373:2;6369:19;6362:44;6097:392;6460:17;;-1:-1:-1;;;6460:17:0;;;;;;;;;;;6097:392;5968:528;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;1511:247::-;1570:6;1623:2;1611:9;1602:7;1598:23;1594:32;1591:52;;;1639:1;1636;1629:12;1591:52;1678:9;1665:23;1697:31;1722:5;1697:31;:::i;1763:180::-;1822:6;1875:2;1863:9;1854:7;1850:23;1846:32;1843:52;;;1891:1;1888;1881:12;1843:52;-1:-1:-1;1914:23:1;;1763:180;-1:-1:-1;1763:180:1:o;2363:388::-;2431:6;2439;2492:2;2480:9;2471:7;2467:23;2463:32;2460:52;;;2508:1;2505;2498:12;2460:52;2547:9;2534:23;2566:31;2591:5;2566:31;:::i;:::-;2616:5;-1:-1:-1;2673:2:1;2658:18;;2645:32;2686:33;2645:32;2686:33;:::i;:::-;2738:7;2728:17;;;2363:388;;;;;:::o;2756:456::-;2833:6;2841;2849;2902:2;2890:9;2881:7;2877:23;2873:32;2870:52;;;2918:1;2915;2908:12;2870:52;2957:9;2944:23;2976:31;3001:5;2976:31;:::i;:::-;3026:5;-1:-1:-1;3078:2:1;3063:18;;3050:32;;-1:-1:-1;3134:2:1;3119:18;;3106:32;3147:33;3106:32;3147:33;:::i;:::-;3199:7;3189:17;;;2756:456;;;;;:::o;3843:118::-;3929:5;3922:13;3915:21;3908:5;3905:32;3895:60;;3951:1;3948;3941:12;3966:382;4031:6;4039;4092:2;4080:9;4071:7;4067:23;4063:32;4060:52;;;4108:1;4105;4098:12;4060:52;4147:9;4134:23;4166:31;4191:5;4166:31;:::i;:::-;4216:5;-1:-1:-1;4273:2:1;4258:18;;4245:32;4286:30;4245:32;4286:30;:::i;4353:1352::-;4651:4;4699:3;4688:9;4684:19;4736:6;4730:13;4719:9;4712:32;4763:4;4821:2;4813:6;4809:15;4803:22;4798:2;4787:9;4783:18;4776:50;4845:4;4905;4897:6;4893:17;4887:24;4880:4;4869:9;4865:20;4858:54;4931:4;4991;4983:6;4979:17;4973:24;4966:4;4955:9;4951:20;4944:54;5017:4;5077;5069:6;5065:17;5059:24;5052:4;5041:9;5037:20;5030:54;5121:3;5115;5104:9;5100:19;5093:32;5145:6;5180;5174:13;5211:6;5203;5196:22;5249:3;5238:9;5234:19;5227:26;;5288:2;5280:6;5276:15;5262:29;;5309:1;5319:360;5333:6;5330:1;5327:13;5319:360;;;5392:13;;5430:9;;5418:22;;5480:11;;;5474:18;5460:12;;;5453:40;5533:11;;;5527:18;5513:12;;;5506:40;5586:11;;5580:18;5566:12;;;5559:40;5654:15;;;;5619:12;;;;5355:1;5348:9;5319:360;;;-1:-1:-1;5696:3:1;;4353:1352;-1:-1:-1;;;;;;;;;;4353:1352:1:o;5710:127::-;5771:10;5766:3;5762:20;5759:1;5752:31;5802:4;5799:1;5792:15;5826:4;5823:1;5816:15;5842:127;5903:10;5898:3;5894:20;5891:1;5884:31;5934:4;5931:1;5924:15;5958:4;5955:1;5948:15;5974:125;6039:9;;;6060:10;;;6057:36;;;6073:18;;:::i;6104:128::-;6171:9;;;6192:11;;;6189:37;;;6206:18;;:::i;6591:193::-;-1:-1:-1;;;;;6709:10:1;;;6721;;;6705:27;;6744:11;;;6741:37;;;6758:18;;:::i;:::-;6741:37;6591:193;;;;:::o;6789:127::-;6850:10;6845:3;6841:20;6838:1;6831:31;6881:4;6878:1;6871:15;6905:4;6902:1;6895:15;6921:251;6991:6;7044:2;7032:9;7023:7;7019:23;7015:32;7012:52;;;7060:1;7057;7050:12;7012:52;7092:9;7086:16;7111:31;7136:5;7111:31;:::i;7527:245::-;7594:6;7647:2;7635:9;7626:7;7622:23;7618:32;7615:52;;;7663:1;7660;7653:12;7615:52;7695:9;7689:16;7714:28;7736:5;7714:28;:::i;8842:200::-;-1:-1:-1;;;;;8978:10:1;;;8966;;;8962:27;;9001:12;;;8998:38;;;9016:18;;:::i;9047:196::-;-1:-1:-1;;;;;9179:10:1;;;9167;;;9163:27;;9202:12;;;9199:38;;;9217:18;;:::i;9248:198::-;-1:-1:-1;;;;;9382:10:1;;;9370;;;9366:27;;9405:12;;;9402:38;;;9420:18;;:::i;9912:184::-;9982:6;10035:2;10023:9;10014:7;10010:23;10006:32;10003:52;;;10051:1;10048;10041:12;10003:52;-1:-1:-1;10074:16:1;;9912:184;-1:-1:-1;9912:184:1:o;10101:127::-;10162:10;10157:3;10153:20;10150:1;10143:31;10193:4;10190:1;10183:15;10217:4;10214:1;10207:15;10233:135;10272:3;10293:17;;;10290:43;;10313:18;;:::i;:::-;-1:-1:-1;10360:1:1;10349:13;;10233:135::o;10373:168::-;10446:9;;;10477;;10494:15;;;10488:22;;10474:37;10464:71;;10515:18;;:::i;10546:217::-;10586:1;10612;10602:132;;10656:10;10651:3;10647:20;10644:1;10637:31;10691:4;10688:1;10681:15;10719:4;10716:1;10709:15;10602:132;-1:-1:-1;10748:9:1;;10546:217::o;10768:197::-;-1:-1:-1;;;;;10890:10:1;;;10902;;;10886:27;;10925:11;;;10922:37;;;10939:18;;:::i;12665:412::-;12794:3;12832:6;12826:13;12857:1;12867:129;12881:6;12878:1;12875:13;12867:129;;;12979:4;12963:14;;;12959:25;;12953:32;12940:11;;;12933:53;12896:12;12867:129;;;-1:-1:-1;13051:1:1;13015:16;;13040:13;;;-1:-1:-1;13015:16:1;12665:412;-1:-1:-1;12665:412:1:o

Swarm Source

ipfs://4265b15885de4e38a54a512002b9d63f5b9b9b46298ae3ce1bafa5bf115c095f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.