Contract 0xeeae6791f684117b7028b48cb5dd21186df80b9c

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x417a5047d6773000f1d4562af41cba2c25ee12ddaa889c84c0f100f848e849a5Unstake406670322023-03-23 7:42:2317 hrs 17 mins ago0xaefd30de084f04429542bdb8931acdbbab99af8a IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.033892601475 155.876069759
0x489cc8f0615781a381b66680ce009d0e664ceab58c8f76ae8042e91fd1bb8007Stake406366992023-03-22 12:25:241 day 12 hrs ago0x810be4c061ad114a61949e6c48baa97d5b52ca55 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.041250412886 203.920236527
0x8bb93810c0ad14379247a3be4cc0dbc02aea8fea8460acadb0c84bbf19854ab5Withdraw406306822023-03-22 8:26:501 day 16 hrs ago0x949f597c5c2d7b52be84e4de8d58e77c057a2627 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.006079536216
0x6e6f83928fe544434236e26fd2d1bef7a6cb6fc1543c4d1896d21ff18c69281cWithdraw406306812023-03-22 8:26:481 day 16 hrs ago0x949f597c5c2d7b52be84e4de8d58e77c057a2627 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.01239056185
0x50be026d1c55b71355df8016b2b6e7951e7a5ca0f550b43b12674532e23561a0Unstake405485202023-03-20 2:10:083 days 22 hrs ago0x35198a5a7bdbe586e41040475e376f296bae5f43 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.019305177735 86.873777617
0xeb5b55468109320a91df1cc3a466754df4c16e972dce6464589796b4acf4b1faUnstake405110172023-03-19 2:03:514 days 22 hrs ago0x59d2824a12ad5c70c764e705bd8ba2cc2c617b31 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.018210618438 83.748159021
0x4fa1e6317284bd5128e7ca865aa4c08657f2e0da5de8d4367ffb3da14a0d703dUnstake404985612023-03-18 18:10:585 days 6 hrs ago0xc4f845e15ca39fc7dbc0239e73542f874e1a91f9 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.025815454699 118.721767341
0x928a4536a1c4d062f7930b9c6f0bf295e117f6bb68baa72d0180a6b258828463Unstake404702642023-03-18 0:36:546 days 22 mins ago0x745ff91681173a6109dfa58e84e425eff490be6e IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.027320713223 122.943885695
0x60f461ec79ed3f49abd437f7b14214c548aa1654f5737f0bb2523cc4358bea3aUnstake404294082023-03-16 23:24:167 days 1 hr ago0x3d726623456e34e8a7f5567f6249ec4d72cc3595 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.0220232100
0x134766b21b24006190b30449c62f6f3300477c7730eb62d6eb4ab3db5c50692bWithdraw403973822023-03-16 3:56:087 days 21 hrs ago0x59b6f2cb225a69acab047bc78e5f541ddd9647fc IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.003467108096 51.766425234
0x05287229fcbc135584bb4696ce5e2c93ba4077a8c7b4531e905c2a1731db1636Stake403946932023-03-16 2:04:097 days 22 hrs ago0xbfb17c94e73d028cd35f6c948486d94ec0cf40e4 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.0202311100
0x1c83cb0b4c2a48f8ed54a07e0d515770ecc72026a1d1425a6d8f940feea9119cStake403941022023-03-16 1:39:417 days 23 hrs ago0xbfb17c94e73d028cd35f6c948486d94ec0cf40e4 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.01813621891989.645243806
0x250448262f4c14c9edf3a4b80f42dac6bc76add1783fe9a13fa8cf24ced1cb17Withdraw403399202023-03-14 15:11:169 days 9 hrs ago0x536c86062263966cea8f39b33a503383311dfb47 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.011371728228
0xd4f1cbff56a4fa1ece1046019514337a9cbf88b61be816c3b020c4801ec3c211Stake403380432023-03-14 14:00:299 days 10 hrs ago0x5db9f666e2ec540bc85c5d009fd44ed233dd0a73 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.1011435500
0xc514fcd258fc56af020bdbb52a6a764f6547a7965cebe7e5bb4048ffbb536186Unstake403280002023-03-14 7:41:499 days 17 hrs ago0x58542e5c05bafa222bc15ce4ba39c491233a3974 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.03266593761 150.226207136
0xad868bbe19af660ea2bae7f3b7bd96a44841acd14b030bf204602d84fcab5027Withdraw402943212023-03-13 10:20:0310 days 14 hrs ago0x96a66500baaf982191f1b81416fd43cfb6f23087 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.008774440446 131.008726202
0x2f0d383e928db6da0e84fb82faa7d27e87779e28acee9fb22cda1b5209839020Unstake402806732023-03-13 1:44:3510 days 23 hrs ago0x17fe98a222c41217c51c823352537dc542ad06ef IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.048230808219
0xfe5237cd40c92eb1925bf4efc4c231000b5756a2289bfd879bacaf7af72e3951Withdraw402768392023-03-12 23:19:4711 days 1 hr ago0x9aa7eb9c5f68ea20f0517b760e96c017dc5887a7 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.012524512187
0x31961df7bb58292f07c658b7aaa7f6de3b4954c4a70ef3887821786bdfc1ffa1Stake402458512023-03-12 3:51:5911 days 21 hrs ago0x4c98028ebdcab0b84dbe2c7715baec91925b766f IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.049360956244
0xae0e67a246a4d2f91e2c51df1a5434b1ff729139d5f8277e90764f74b84f25a3Withdraw402079182023-03-11 4:27:4812 days 20 hrs ago0xeb307bacbb04373538392e4440094cd5e9eeed86 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.020246644348 302.297007118
0xba5047eb5c0da4b5fedc60d7f86a1ec0fe28bc506130f0e2f4eeeeba0bb478c9Unstake401582082023-03-09 20:35:5214 days 4 hrs ago0x45766bf351288c6e3edeceb82c4148db4752c07d IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.032639717988 146.863677423
0x07fdc264fede2ad533e9f2b0dae31e9b8d54ca5706c6c131f3e742507ba4073fStake401310392023-03-09 3:28:5214 days 21 hrs ago0xaefd30de084f04429542bdb8931acdbbab99af8a IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.033937985102 143.501600865
0x8e14a1db0b0568b16e696dd92767fdbc813022787532ab410d666f3a64c685b5Stake400993412023-03-08 7:15:0315 days 17 hrs ago0x405c06bd9b64bc4def1fe2148ff8b6bc0be94a21 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.032770494162
0xb3b12cf4cd4693c20cb4161f0954021316db05be860f419ef88b95c4329642c1Unstake400927762023-03-08 3:07:4815 days 21 hrs ago0x949f597c5c2d7b52be84e4de8d58e77c057a2627 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.02739807126
0xefa81153768f775c0a55c926190de2247697414568042bfc45268e532b57f06bUnstake400892552023-03-08 0:57:1416 days 2 mins ago0xf0db4646e4be8e2094cd6d7c6d253a87eec7af58 IN  0xeeae6791f684117b7028b48cb5dd21186df80b9c0 MATIC0.020003827588 90.840603377
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingContract

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 10000 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 6 : StakingContract.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "@openzeppelin/contracts/math/SafeMath.sol";

import "./IStakingContract.sol";
import "./IStakeChangeNotifier.sol";

/// @title Orbs staking smart contract.
contract StakingContract is IStakingContract, IMigratableStakingContract {
    using SafeMath for uint256;

    struct Stake {
        uint256 amount;
        uint256 cooldownAmount;
        uint256 cooldownEndTime;
    }

    struct WithdrawResult {
        uint256 withdrawnAmount;
        uint256 stakedAmount;
        uint256 stakedAmountDiff;
    }

    // The version of the smart contract.
    uint public constant VERSION = 1;

    // The maximum number of approved staking contracts as migration destinations.
    uint public constant MAX_APPROVED_STAKING_CONTRACTS = 10;

    // The mapping between stake owners and their data.
    mapping(address => Stake) internal stakes;

    // Total amount of staked tokens (not including unstaked tokes in cooldown or pending withdrawal).
    uint256 internal totalStakedTokens;

    // The period (in seconds) between a stake owner's request to stop staking and being able to withdraw them.
    uint256 public cooldownPeriodInSec;

    // The address responsible for managing migration to a new staking contract.
    address public migrationManager;

    // The address responsible for emergency operations and graceful return of staked tokens back to their owners.
    address public emergencyManager;

    // The list of staking contracts that are approved by this contract. It would be only allowed to migrate a stake to
    // one of these contracts.
    IMigratableStakingContract[] public approvedStakingContracts;

    // The address of the contract responsible for publishing stake change notifications.
    IStakeChangeNotifier public notifier;

    // The address of the ORBS token.
    IERC20 internal token;

    // Represents whether the contract accepts new staking requests. Please note, that even when it's turned off,
    // it'd be still possible to unstake or withdraw tokens.
    //
    // Note: This can be turned off only once by the emergency manager of the contract.
    bool public acceptingNewStakes = true;

    // Represents whether this staking contract allows releasing all unstaked tokens unconditionally. When it's turned
    // on, stake owners could release their staked tokens, without explicitly requesting to unstake them, and their
    // previously unstaked tokens, regardless of the cooldown period. This also stops the contract from accepting new
    // stakes.
    //
    // Note: This can be turned off only once by the emergency manager of the contract.
    bool public releasingAllStakes = false;

    event MigrationManagerUpdated(address indexed migrationManager);
    event MigrationDestinationAdded(IMigratableStakingContract indexed stakingContract);
    event MigrationDestinationRemoved(IMigratableStakingContract indexed stakingContract);
    event EmergencyManagerUpdated(address indexed emergencyManager);
    event StakeChangeNotifierUpdated(IStakeChangeNotifier indexed notifier);
    event StoppedAcceptingNewStake();
    event ReleasedAllStakes();

    modifier onlyMigrationManager() {
        require(msg.sender == migrationManager, "StakingContract: caller is not the migration manager");

        _;
    }

    modifier onlyEmergencyManager() {
        require(msg.sender == emergencyManager, "StakingContract: caller is not the emergency manager");

        _;
    }

    modifier onlyWhenAcceptingNewStakes() {
        require(acceptingNewStakes && !releasingAllStakes, "StakingContract: not accepting new stakes");

        _;
    }

    modifier onlyWhenStakesReleased() {
        require(releasingAllStakes, "StakingContract: not releasing all stakes");

        _;
    }

    modifier onlyWhenStakesNotReleased() {
        require(!releasingAllStakes, "StakingContract: releasing all stakes");

        _;
    }

    /// @dev Initializes the staking contract.
    /// @param _cooldownPeriodInSec uint256 The period (in seconds) between a stake owner's request to stop staking and being
    /// able to withdraw them.
    /// @param _migrationManager address The address responsible for managing migration to a new staking contract.
    /// @param _emergencyManager address The address responsible for emergency operations and graceful return of staked
    /// tokens back to their owners.
    /// @param _token IERC20 The address of the ORBS token.
    constructor(uint256 _cooldownPeriodInSec, address _migrationManager, address _emergencyManager, IERC20 _token) public {
        require(_cooldownPeriodInSec > 0, "StakingContract::ctor - cooldown period must be greater than 0");
        require(_migrationManager != address(0), "StakingContract::ctor - migration manager must not be 0");
        require(_emergencyManager != address(0), "StakingContract::ctor - emergency manager must not be 0");
        require(address(_token) != address(0), "StakingContract::ctor - ORBS token must not be 0");

        cooldownPeriodInSec = _cooldownPeriodInSec;
        migrationManager = _migrationManager;
        emergencyManager = _emergencyManager;
        token = _token;
    }

    /// @dev Sets the address of the migration manager.
    /// @param _newMigrationManager address The address of the new migration manager.
    function setMigrationManager(address _newMigrationManager) external onlyMigrationManager {
        require(_newMigrationManager != address(0), "StakingContract::setMigrationManager - address must not be 0");
        require(migrationManager != _newMigrationManager,
            "StakingContract::setMigrationManager - address must be different than the current address");

        migrationManager = _newMigrationManager;

        emit MigrationManagerUpdated(_newMigrationManager);
    }

    /// @dev Sets the address of the emergency manager.
    /// @param _newEmergencyManager address The address of the new emergency manager.
    function setEmergencyManager(address _newEmergencyManager) external onlyEmergencyManager {
        require(_newEmergencyManager != address(0), "StakingContract::setEmergencyManager - address must not be 0");
        require(emergencyManager != _newEmergencyManager,
            "StakingContract::setEmergencyManager - address must be different than the current address");

        emergencyManager = _newEmergencyManager;

        emit EmergencyManagerUpdated(_newEmergencyManager);
    }

    /// @dev Sets the address of the stake change notifier contract.
    /// @param _newNotifier IStakeChangeNotifier The address of the new stake change notifier contract.
    ///
    /// Note: it's allowed to reset the notifier to a zero address.
    function setStakeChangeNotifier(IStakeChangeNotifier _newNotifier) external onlyMigrationManager {
        require(notifier != _newNotifier,
            "StakingContract::setStakeChangeNotifier - address must be different than the current address");

        notifier = _newNotifier;

        emit StakeChangeNotifierUpdated(notifier);
    }

    /// @dev Adds a new contract to the list of approved staking contract migration destinations.
    /// @param _newStakingContract IMigratableStakingContract The new contract to add.
    function addMigrationDestination(IMigratableStakingContract _newStakingContract) external onlyMigrationManager {
        require(address(_newStakingContract) != address(0),
            "StakingContract::addMigrationDestination - address must not be 0");

        uint length = approvedStakingContracts.length;
        require(length + 1 <= MAX_APPROVED_STAKING_CONTRACTS,
            "StakingContract::addMigrationDestination - can't add more staking contracts");

        // Check for duplicates.
        for (uint i = 0; i < length; ++i) {
            require(approvedStakingContracts[i] != _newStakingContract,
                "StakingContract::addMigrationDestination - can't add a duplicate staking contract");
        }

        approvedStakingContracts.push(_newStakingContract);

        emit MigrationDestinationAdded(_newStakingContract);
    }

    /// @dev Removes a contract from the list of approved staking contract migration destinations.
    /// @param _stakingContract IMigratableStakingContract The contract to remove.
    function removeMigrationDestination(IMigratableStakingContract _stakingContract) external onlyMigrationManager {
        require(address(_stakingContract) != address(0),
            "StakingContract::removeMigrationDestination - address must not be 0");

        // Check for existence.
        (uint i, bool exists) = findApprovedStakingContractIndex(_stakingContract);
        require(exists, "StakingContract::removeMigrationDestination - staking contract doesn't exist");

        // Swap the requested element with the last element and then delete it using pop/
        approvedStakingContracts[i] = approvedStakingContracts[approvedStakingContracts.length - 1];
        approvedStakingContracts.pop();

        emit MigrationDestinationRemoved(_stakingContract);
    }

    /// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
    /// the required amount using ERC20 approve.
    /// @param _amount uint256 The amount of tokens to stake.
    function stake(uint256 _amount) external override onlyWhenAcceptingNewStakes {
        address stakeOwner = msg.sender;

        uint256 totalStakedAmount = stake(stakeOwner, _amount);

        emit Staked(stakeOwner, _amount, totalStakedAmount);

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeChange(stakeOwner, _amount, true, totalStakedAmount);
    }

    /// @dev Unstakes ORBS tokens from msg.sender. If successful, this will start the cooldown period, after which
    /// msg.sender would be able to withdraw all of his tokens.
    /// @param _amount uint256 The amount of tokens to unstake.
    function unstake(uint256 _amount) external override {
        require(_amount > 0, "StakingContract::unstake - amount must be greater than 0");

        address stakeOwner = msg.sender;
        Stake storage stakeData = stakes[stakeOwner];
        uint256 stakedAmount = stakeData.amount;
        uint256 cooldownAmount = stakeData.cooldownAmount;
        uint256 cooldownEndTime = stakeData.cooldownEndTime;

        require(_amount <= stakedAmount, "StakingContract::unstake - can't unstake more than the current stake");

        // If any tokens in cooldown are ready for withdrawal - revert. Stake owner should withdraw their unstaked
        // tokens first.
        require(cooldownAmount == 0 || cooldownEndTime > now,
            "StakingContract::unstake - unable to unstake when there are tokens pending withdrawal");

        // Update the amount of tokens in cooldown. Please note that this will also restart the cooldown period of all
        // tokens in cooldown.
        stakeData.amount = stakedAmount.sub(_amount);
        stakeData.cooldownAmount = cooldownAmount.add(_amount);
        stakeData.cooldownEndTime = now.add(cooldownPeriodInSec);

        totalStakedTokens = totalStakedTokens.sub(_amount);

        uint256 totalStakedAmount = stakeData.amount;

        emit Unstaked(stakeOwner, _amount, totalStakedAmount);

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeChange(stakeOwner, _amount, false, totalStakedAmount);
    }

    /// @dev Requests to withdraw all of staked ORBS tokens back to msg.sender. Stake owners can withdraw their ORBS
    /// tokens only after previously unstaking them and after the cooldown period has passed (unless the contract was
    /// requested to release all stakes).
    function withdraw() external override {
        address stakeOwner = msg.sender;

        WithdrawResult memory res = withdraw(stakeOwner);

        emit Withdrew(stakeOwner, res.withdrawnAmount, res.stakedAmount);

        // Trigger staking state change notifications only if the staking amount was changed.
        if (res.stakedAmountDiff == 0) {
            return;
        }

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeChange(stakeOwner, res.stakedAmountDiff, false, res.stakedAmount);
    }

    /// @dev Restakes unstaked ORBS tokens (in or after cooldown) for msg.sender.
    function restake() external override onlyWhenAcceptingNewStakes {
        address stakeOwner = msg.sender;
        Stake storage stakeData = stakes[stakeOwner];
        uint256 cooldownAmount = stakeData.cooldownAmount;

        require(cooldownAmount > 0, "StakingContract::restake - no unstaked tokens");

        stakeData.amount = stakeData.amount.add(cooldownAmount);
        stakeData.cooldownAmount = 0;
        stakeData.cooldownEndTime = 0;

        totalStakedTokens = totalStakedTokens.add(cooldownAmount);

        uint256 totalStakedAmount = stakeData.amount;

        emit Restaked(stakeOwner, cooldownAmount, totalStakedAmount);

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeChange(stakeOwner, cooldownAmount, true, totalStakedAmount);
    }

    /// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
    /// the required amount using ERC20 approve.
    /// @param _stakeOwner address The specified stake owner.
    /// @param _amount uint256 The amount of tokens to stake.
    function acceptMigration(address _stakeOwner, uint256 _amount) external override onlyWhenAcceptingNewStakes {
        uint256 totalStakedAmount = stake(_stakeOwner, _amount);

        emit AcceptedMigration(_stakeOwner, _amount, totalStakedAmount);

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeChange(_stakeOwner, _amount, true, totalStakedAmount);
    }

    /// @dev Migrates the stake of msg.sender from this staking contract to a new approved staking contract.
    /// @param _newStakingContract IMigratableStakingContract The new staking contract which supports stake migration.
    /// @param _amount uint256 The amount of tokens to migrate.
    function migrateStakedTokens(IMigratableStakingContract _newStakingContract, uint256 _amount) external override
        onlyWhenStakesNotReleased {
        require(isApprovedStakingContract(_newStakingContract),
            "StakingContract::migrateStakedTokens - migration destination wasn't approved");
        require(_amount > 0, "StakingContract::migrateStakedTokens - amount must be greater than 0");

        address stakeOwner = msg.sender;
        Stake storage stakeData = stakes[stakeOwner];
        uint256 stakedAmount = stakeData.amount;

        require(stakedAmount > 0, "StakingContract::migrateStakedTokens - no staked tokens");
        require(_amount <= stakedAmount, "StakingContract::migrateStakedTokens - amount exceeds staked token balance");

        stakeData.amount = stakedAmount.sub(_amount);

        totalStakedTokens = totalStakedTokens.sub(_amount);

        require(_newStakingContract.getToken() == token,
            "StakingContract::migrateStakedTokens - staked tokens must be the same");
        require(token.approve(address(_newStakingContract), _amount),
            "StakingContract::migrateStakedTokens - couldn't approve transfer");

        emit MigratedStake(stakeOwner, _amount, stakeData.amount);

        _newStakingContract.acceptMigration(stakeOwner, _amount);

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeMigration(stakeOwner, _amount);
    }

    /// @dev Distributes staking rewards to a list of addresses by directly adding rewards to their stakes. This method
    /// assumes that the user has already approved at least the required amount using ERC20 approve. Since this is a
    /// convenience method, we aren't concerned about reaching block gas limit by using large lists. We assume that
    /// callers will be able to batch/paginate their requests properly.
    /// @param _totalAmount uint256 The total amount of rewards to distribute.
    /// @param _stakeOwners address[] The addresses of the stake owners.
    /// @param _amounts uint256[] The amounts of the rewards.
    function distributeRewards(uint256 _totalAmount, address[] calldata _stakeOwners, uint256[] calldata _amounts) external override
        onlyWhenAcceptingNewStakes {
        require(_totalAmount > 0, "StakingContract::distributeRewards - total amount must be greater than 0");

        uint256 stakeOwnersLength = _stakeOwners.length;
        uint256 amountsLength = _amounts.length;

        require(stakeOwnersLength > 0 && amountsLength > 0,
            "StakingContract::distributeRewards - lists can't be empty");
        require(stakeOwnersLength == amountsLength,
            "StakingContract::distributeRewards - lists must be of the same size");

        // Transfer all the tokens to the smart contract and update the stake owners list accordingly.
        require(token.transferFrom(msg.sender, address(this), _totalAmount),
            "StakingContract::distributeRewards - insufficient allowance");

        bool[] memory signs = new bool[](amountsLength);
        uint256[] memory totalStakedAmounts = new uint256[](amountsLength);

        uint256 expectedTotalAmount = 0;
        for (uint i = 0; i < stakeOwnersLength; ++i) {
            address stakeOwner = _stakeOwners[i];
            uint256 amount = _amounts[i];

            require(stakeOwner != address(0), "StakingContract::distributeRewards - stake owner can't be 0");
            require(amount > 0, "StakingContract::distributeRewards - amount must be greater than 0");

            Stake storage stakeData = stakes[stakeOwner];
            stakeData.amount = stakeData.amount.add(amount);

            expectedTotalAmount = expectedTotalAmount.add(amount);

            uint256 totalStakedAmount = stakeData.amount;
            signs[i] = true;
            totalStakedAmounts[i] = totalStakedAmount;

            emit Staked(stakeOwner, amount, totalStakedAmount);
        }

        require(_totalAmount == expectedTotalAmount, "StakingContract::distributeRewards - incorrect total amount");

        totalStakedTokens = totalStakedTokens.add(_totalAmount);

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeChangeBatch(_stakeOwners, _amounts, signs, totalStakedAmounts);
    }

    /// @dev Returns the stake of the specified stake owner (excluding unstaked tokens).
    /// @param _stakeOwner address The address to check.
    /// @return uint256 The stake of the stake owner.
    function getStakeBalanceOf(address _stakeOwner) external override view returns (uint256) {
        return stakes[_stakeOwner].amount;
    }

    /// @dev Returns the total amount staked tokens (excluding unstaked tokens).
    /// @return uint256 The total staked tokens of all stake owners.
    function getTotalStakedTokens() external override view returns (uint256) {
        return totalStakedTokens;
    }

    /// @dev Returns the time that the cooldown period ends (or ended) and the amount of tokens to be released.
    /// @param _stakeOwner address The address to check.
    /// @return cooldownAmount uint256 The total tokens in cooldown.
    /// @return cooldownEndTime uint256 The time when the cooldown period ends (in seconds).
    function getUnstakeStatus(address _stakeOwner) external override view returns (uint256 cooldownAmount,
        uint256 cooldownEndTime) {
        Stake memory stakeData = stakes[_stakeOwner];
        cooldownAmount = stakeData.cooldownAmount;
        cooldownEndTime = stakeData.cooldownEndTime;
    }

    /// @dev Returns the address of the underlying staked token.
    /// @return IERC20 The address of the token.
    function getToken() external override view returns (IERC20) {
        return token;
    }

    /// @dev Requests the contract to stop accepting new staking requests.
    function stopAcceptingNewStakes() external onlyEmergencyManager onlyWhenAcceptingNewStakes {
        acceptingNewStakes = false;

        emit StoppedAcceptingNewStake();
    }

    /// @dev Requests the contract to release all stakes.
    function releaseAllStakes() external onlyEmergencyManager onlyWhenStakesNotReleased {
        releasingAllStakes = true;

        emit ReleasedAllStakes();
    }

    /// @dev Requests withdraw of released tokens for a list of addresses.
    /// @param _stakeOwners address[] The addresses of the stake owners.
    function withdrawReleasedStakes(address[] calldata _stakeOwners) external onlyWhenStakesReleased {
        uint256 stakeOwnersLength = _stakeOwners.length;
        uint256[] memory stakedAmountDiffs = new uint256[](stakeOwnersLength);
        bool[] memory signs = new bool[](stakeOwnersLength);
        uint256[] memory totalStakedAmounts = new uint256[](stakeOwnersLength);

        for (uint i = 0; i < stakeOwnersLength; ++i) {
            address stakeOwner = _stakeOwners[i];

            WithdrawResult memory res = withdraw(stakeOwner);
            stakedAmountDiffs[i] = res.stakedAmountDiff;
            signs[i] = false;
            totalStakedAmounts[i] = res.stakedAmount;

            emit Withdrew(stakeOwner, res.withdrawnAmount, res.stakedAmount);
        }

        // Note: we aren't concerned with reentrancy since:
        //   1. At this point, due to the CEI pattern, a reentrant notifier can't affect the effects of this method.
        //   2. The notifier is set and managed by the migration manager.
        stakeChangeBatch(_stakeOwners, stakedAmountDiffs, signs, totalStakedAmounts);
    }

    /// @dev Returns whether a specific staking contract was approved as a migration destination.
    /// @param _stakingContract IMigratableStakingContract The staking contract to look for.
    /// @return exists bool The approval status.
    function isApprovedStakingContract(IMigratableStakingContract _stakingContract) public view returns (bool exists) {
        (, exists) = findApprovedStakingContractIndex(_stakingContract);
    }

    /// @dev Returns whether stake change notification is enabled.
    function shouldNotifyStakeChange() view internal returns (bool) {
        return address(notifier) != address(0);
    }

    /// @dev Notifies of stake change events.
    /// @param _stakeOwner address The address of the subject stake owner.
    /// @param _amount int256 The difference in the total staked amount.
    /// @param _sign bool The sign of the added (true) or subtracted (false) amount.
    /// @param _updatedStake uint256 The updated total staked amount.
    function stakeChange(address _stakeOwner, uint256 _amount, bool _sign, uint256 _updatedStake) internal {
        if (!shouldNotifyStakeChange()) {
            return;
        }

        notifier.stakeChange(_stakeOwner, _amount, _sign, _updatedStake);
    }

    /// @dev Notifies of multiple stake change events.
    /// @param _stakeOwners address[] The addresses of subject stake owners.
    /// @param _amounts uint256[] The differences in total staked amounts.
    /// @param _signs bool[] The signs of the added (true) or subtracted (false) amounts.
    /// @param _updatedStakes uint256[] The updated total staked amounts.
    function stakeChangeBatch(address[] memory _stakeOwners, uint256[] memory _amounts, bool[] memory _signs,
        uint256[] memory _updatedStakes) internal {
        if (!shouldNotifyStakeChange()) {
            return;
        }

        notifier.stakeChangeBatch(_stakeOwners, _amounts, _signs, _updatedStakes);
    }

    /// @dev Notifies of stake migration event.
    /// @param _stakeOwner address The address of the subject stake owner.
    /// @param _amount uint256 The migrated amount.
    function stakeMigration(address _stakeOwner, uint256 _amount) internal {
        if (!shouldNotifyStakeChange()) {
            return;
        }

        notifier.stakeMigration(_stakeOwner, _amount);
    }

    /// @dev Stakes amount of ORBS tokens on behalf of the specified stake owner.
    /// @param _stakeOwner address The specified stake owner.
    /// @param _amount uint256 The amount of tokens to stake.
    /// @return totalStakedAmount uint256 The total stake of the stake owner.
    function stake(address _stakeOwner, uint256 _amount) private returns (uint256 totalStakedAmount) {
        require(_stakeOwner != address(0), "StakingContract::stake - stake owner can't be 0");
        require(_amount > 0, "StakingContract::stake - amount must be greater than 0");

        Stake storage stakeData = stakes[_stakeOwner];
        stakeData.amount = stakeData.amount.add(_amount);

        totalStakedTokens = totalStakedTokens.add(_amount);

        totalStakedAmount = stakeData.amount;

        // Transfer the tokens to the smart contract and update the stake owners list accordingly.
        require(token.transferFrom(msg.sender, address(this), _amount),
            "StakingContract::stake - insufficient allowance");
    }

    /// @dev Requests to withdraw all of staked ORBS tokens back to the specified stake owner. Stake owners can withdraw
    /// their ORBS tokens only after previously unstaking them and after the cooldown period has passed (unless the
    /// contract was requested to release all stakes).
    /// @return res WithdrawResult The result of the withdraw operation.
    function withdraw(address _stakeOwner) private returns (WithdrawResult memory res) {
        require(_stakeOwner != address(0), "StakingContract::withdraw - stake owner can't be 0");

        Stake storage stakeData = stakes[_stakeOwner];
        res.stakedAmount = stakeData.amount;
        res.withdrawnAmount = stakeData.cooldownAmount;
        res.stakedAmountDiff = 0;

        if (!releasingAllStakes) {
            require(res.withdrawnAmount > 0, "StakingContract::withdraw - no unstaked tokens");
            require(stakeData.cooldownEndTime <= now, "StakingContract::withdraw - tokens are still in cooldown");
        } else {
            // If the contract was requested to release all stakes - allow to withdraw all staked and unstaked tokens.
            res.withdrawnAmount = res.withdrawnAmount.add(res.stakedAmount);
            res.stakedAmountDiff = res.stakedAmount;

            require(res.withdrawnAmount > 0, "StakingContract::withdraw - no staked or unstaked tokens");

            stakeData.amount = 0;

            totalStakedTokens = totalStakedTokens.sub(res.stakedAmount);

            res.stakedAmount = 0;
        }

        stakeData.cooldownAmount = 0;
        stakeData.cooldownEndTime = 0;

        require(token.transfer(_stakeOwner, res.withdrawnAmount),
            "StakingContract::withdraw - couldn't transfer stake");
    }

    /// @dev Returns an index of an existing approved staking contract.
    /// @param _stakingContract IMigratableStakingContract The staking contract to look for.
    /// @return index uint The index of the located staking contract (in the case that it was found).
    /// @return exists bool The search result.
    function findApprovedStakingContractIndex(IMigratableStakingContract _stakingContract) private view returns
        (uint index, bool exists) {
        uint length = approvedStakingContracts.length;
        for (index = 0; index < length; ++index) {
            if (approvedStakingContracts[index] == _stakingContract) {
                exists = true;
                return (index, exists);
            }
        }

        exists = false;
    }
}

File 2 of 6 : IMigratableStakingContract.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/// @title An interface for staking contracts which support stake migration.
interface IMigratableStakingContract {
    /// @dev Returns the address of the underlying staked token.
    /// @return IERC20 The address of the token.
    function getToken() external view returns (IERC20);

    /// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
    /// the required amount using ERC20 approve.
    /// @param _stakeOwner address The specified stake owner.
    /// @param _amount uint256 The number of tokens to stake.
    function acceptMigration(address _stakeOwner, uint256 _amount) external;

    event AcceptedMigration(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
}

File 3 of 6 : IStakeChangeNotifier.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/// @title An interface for notifying of stake change events (e.g., stake, unstake, partial unstake, restate, etc.).
interface IStakeChangeNotifier {
    /// @dev Notifies of stake change event.
    /// @param _stakeOwner address The address of the subject stake owner.
    /// @param _amount uint256 The difference in the total staked amount.
    /// @param _sign bool The sign of the added (true) or subtracted (false) amount.
    /// @param _updatedStake uint256 The updated total staked amount.
    function stakeChange(address _stakeOwner, uint256 _amount, bool _sign, uint256 _updatedStake) external;

    /// @dev Notifies of multiple stake change events.
    /// @param _stakeOwners address[] The addresses of subject stake owners.
    /// @param _amounts uint256[] The differences in total staked amounts.
    /// @param _signs bool[] The signs of the added (true) or subtracted (false) amounts.
    /// @param _updatedStakes uint256[] The updated total staked amounts.
    function stakeChangeBatch(address[] calldata _stakeOwners, uint256[] calldata _amounts, bool[] calldata _signs,
        uint256[] calldata _updatedStakes) external;

    /// @dev Notifies of stake migration event.
    /// @param _stakeOwner address The address of the subject stake owner.
    /// @param _amount uint256 The migrated amount.
    function stakeMigration(address _stakeOwner, uint256 _amount) external;
}

File 4 of 6 : IStakingContract.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "./IMigratableStakingContract.sol";

/// @title An interface for staking contracts.
interface IStakingContract {
    /// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
    /// the required amount using ERC20 approve.
    /// @param _amount uint256 The amount of tokens to stake.
    function stake(uint256 _amount) external;

    /// @dev Unstakes ORBS tokens from msg.sender. If successful, this will start the cooldown period, after which
    /// msg.sender would be able to withdraw all of his tokens.
    /// @param _amount uint256 The amount of tokens to unstake.
    function unstake(uint256 _amount) external;

    /// @dev Requests to withdraw all of staked ORBS tokens back to msg.sender. Stake owners can withdraw their ORBS
    /// tokens only after previously unstaking them and after the cooldown period has passed (unless the contract was
    /// requested to release all stakes).
    function withdraw() external;

    /// @dev Restakes unstaked ORBS tokens (in or after cooldown) for msg.sender.
    function restake() external;

    /// @dev Distributes staking rewards to a list of addresses by directly adding rewards to their stakes. This method
    /// assumes that the user has already approved at least the required amount using ERC20 approve. Since this is a
    /// convenience method, we aren't concerned about reaching block gas limit by using large lists. We assume that
    /// callers will be able to properly batch/paginate their requests.
    /// @param _totalAmount uint256 The total amount of rewards to distribute.
    /// @param _stakeOwners address[] The addresses of the stake owners.
    /// @param _amounts uint256[] The amounts of the rewards.
    function distributeRewards(uint256 _totalAmount, address[] calldata _stakeOwners, uint256[] calldata _amounts) external;

    /// @dev Returns the stake of the specified stake owner (excluding unstaked tokens).
    /// @param _stakeOwner address The address to check.
    /// @return uint256 The total stake.
    function getStakeBalanceOf(address _stakeOwner) external view returns (uint256);

    /// @dev Returns the total amount staked tokens (excluding unstaked tokens).
    /// @return uint256 The total staked tokens of all stake owners.
    function getTotalStakedTokens() external view returns (uint256);

    /// @dev Returns the time that the cooldown period ends (or ended) and the amount of tokens to be released.
    /// @param _stakeOwner address The address to check.
    /// @return cooldownAmount uint256 The total tokens in cooldown.
    /// @return cooldownEndTime uint256 The time when the cooldown period ends (in seconds).
    function getUnstakeStatus(address _stakeOwner) external view returns (uint256 cooldownAmount,
        uint256 cooldownEndTime);

    /// @dev Migrates the stake of msg.sender from this staking contract to a new approved staking contract.
    /// @param _newStakingContract IMigratableStakingContract The new staking contract which supports stake migration.
    /// @param _amount uint256 The amount of tokens to migrate.
    function migrateStakedTokens(IMigratableStakingContract _newStakingContract, uint256 _amount) external;

    event Staked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event Unstaked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event Withdrew(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event Restaked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event MigratedStake(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
}

File 5 of 6 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 6 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "evmVersion": "istanbul",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_cooldownPeriodInSec","type":"uint256"},{"internalType":"address","name":"_migrationManager","type":"address"},{"internalType":"address","name":"_emergencyManager","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"name":"AcceptedMigration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"emergencyManager","type":"address"}],"name":"EmergencyManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"name":"MigratedStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IMigratableStakingContract","name":"stakingContract","type":"address"}],"name":"MigrationDestinationAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IMigratableStakingContract","name":"stakingContract","type":"address"}],"name":"MigrationDestinationRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"migrationManager","type":"address"}],"name":"MigrationManagerUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"ReleasedAllStakes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"name":"Restaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IStakeChangeNotifier","name":"notifier","type":"address"}],"name":"StakeChangeNotifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[],"name":"StoppedAcceptingNewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStakedAmount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"MAX_APPROVED_STAKING_CONTRACTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeOwner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"acceptMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptingNewStakes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMigratableStakingContract","name":"_newStakingContract","type":"address"}],"name":"addMigrationDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedStakingContracts","outputs":[{"internalType":"contract IMigratableStakingContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownPeriodInSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalAmount","type":"uint256"},{"internalType":"address[]","name":"_stakeOwners","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"distributeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeOwner","type":"address"}],"name":"getStakeBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeOwner","type":"address"}],"name":"getUnstakeStatus","outputs":[{"internalType":"uint256","name":"cooldownAmount","type":"uint256"},{"internalType":"uint256","name":"cooldownEndTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMigratableStakingContract","name":"_stakingContract","type":"address"}],"name":"isApprovedStakingContract","outputs":[{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMigratableStakingContract","name":"_newStakingContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"migrateStakedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notifier","outputs":[{"internalType":"contract IStakeChangeNotifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseAllStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releasingAllStakes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMigratableStakingContract","name":"_stakingContract","type":"address"}],"name":"removeMigrationDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newEmergencyManager","type":"address"}],"name":"setEmergencyManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMigrationManager","type":"address"}],"name":"setMigrationManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStakeChangeNotifier","name":"_newNotifier","type":"address"}],"name":"setStakeChangeNotifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopAcceptingNewStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_stakeOwners","type":"address[]"}],"name":"withdrawReleasedStakes","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526007805460ff60a81b1960ff60a01b19909116600160a01b171690553480156200002d57600080fd5b506040516200364d3803806200364d833981810160405260808110156200005357600080fd5b508051602082015160408301516060909301519192909183620000a85760405162461bcd60e51b815260040180806020018281038252603e815260200180620035a1603e913960400191505060405180910390fd5b6001600160a01b038316620000ef5760405162461bcd60e51b8152600401808060200182810382526037815260200180620036166037913960400191505060405180910390fd5b6001600160a01b038216620001365760405162461bcd60e51b8152600401808060200182810382526037815260200180620035df6037913960400191505060405180910390fd5b6001600160a01b0381166200017d5760405162461bcd60e51b8152600401808060200182810382526030815260200180620035716030913960400191505060405180910390fd5b600293909355600380546001600160a01b03199081166001600160a01b03948516179091556004805482169284169290921790915560078054909116919092161790556133a180620001d06000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063826cc8fc11610104578063bb82dd17116100a2578063df3f2f8a11610071578063df3f2f8a14610557578063e9aea8c814610583578063fa5b7c70146105a9578063ffa1ad74146105b1576101cf565b8063bb82dd17146104dd578063cced4f2014610503578063d0532d9114610529578063d2c18f591461054f576101cf565b80639db3c9ee116100de5780639db3c9ee146103fe578063a53acf6114610424578063a694fc3a14610450578063b5bab0151461046d576101cf565b8063826cc8fc146103c85780638cfc430e146103d057806396690c9e146103f6576101cf565b80633ccfd60b1161017157806351d185981161014b57806351d185981461034857806353a5b1bb146103505780636ef9abeb1461038f5780636fb974bc146103ac576101cf565b80633ccfd60b146103305780634b5d1f8b146103385780634f91440d14610340576101cf565b806319d6a88d116101ad57806319d6a88d1461022857806320fc287d146102f157806321df0da71461030b5780632e17de7814610313576101cf565b8063025cf89f146101d457806309276ea4146101fc578063187ac4cb14610220575b600080fd5b6101fa600480360360208110156101ea57600080fd5b50356001600160a01b03166105b9565b005b6102046106f6565b604080516001600160a01b039092168252519081900360200190f35b610204610705565b6101fa6004803603606081101561023e57600080fd5b8135919081019060408101602082013564010000000081111561026057600080fd5b82018360208201111561027257600080fd5b8035906020019184602083028401116401000000008311171561029457600080fd5b9193909290916020810190356401000000008111156102b257600080fd5b8201836020820111156102c457600080fd5b803590602001918460208302840111640100000000831117156102e657600080fd5b509092509050610714565b6102f9610c22565b60408051918252519081900360200190f35b610204610c28565b6101fa6004803603602081101561032957600080fd5b5035610c37565b6101fa610db0565b6102f9610e39565b6101fa610e3e565b6102f9610f95565b6103766004803603602081101561036657600080fd5b50356001600160a01b0316610f9b565b6040805192835260208301919091528051918290030190f35b610204600480360360208110156103a557600080fd5b5035610fe7565b6103b461100e565b604080519115158252519081900360200190f35b6101fa61102f565b6101fa600480360360208110156103e657600080fd5b50356001600160a01b031661114c565b6101fa611346565b6103b46004803603602081101561041457600080fd5b50356001600160a01b0316611455565b6101fa6004803603604081101561043a57600080fd5b506001600160a01b038135169060200135611467565b6101fa6004803603602081101561046657600080fd5b5035611551565b6101fa6004803603602081101561048357600080fd5b81019060208101813564010000000081111561049e57600080fd5b8201836020820111156104b057600080fd5b803590602001918460208302840111640100000000831117156104d257600080fd5b509092509050611637565b6101fa600480360360208110156104f357600080fd5b50356001600160a01b0316611896565b6101fa6004803603602081101561051957600080fd5b50356001600160a01b0316611a78565b6101fa6004803603602081101561053f57600080fd5b50356001600160a01b0316611b76565b610204611cb3565b6101fa6004803603604081101561056d57600080fd5b506001600160a01b038135169060200135611cc2565b6102f96004803603602081101561059957600080fd5b50356001600160a01b03166120b6565b6103b46120d1565b6102f96120f3565b6003546001600160a01b031633146106025760405162461bcd60e51b81526004018080602001828103825260348152602001806129ba6034913960400191505060405180910390fd5b6001600160a01b0381166106475760405162461bcd60e51b815260040180806020018281038252603c815260200180613180603c913960400191505060405180910390fd5b6003546001600160a01b03828116911614156106945760405162461bcd60e51b81526004018080602001828103825260598152602001806132e46059913960600191505060405180910390fd5b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fe06b7cc06400e2218f11a21ba24cb110fd587a695a09f36d42c4f7b21566937f90600090a250565b6006546001600160a01b031681565b6003546001600160a01b031681565b60075474010000000000000000000000000000000000000000900460ff16801561075a57506007547501000000000000000000000000000000000000000000900460ff16155b6107955760405162461bcd60e51b8152600401808060200182810382526029815260200180612ef46029913960400191505060405180910390fd5b600085116107d45760405162461bcd60e51b81526004018080602001828103825260488152602001806130156048913960600191505060405180910390fd5b828181158015906107e55750600081115b6108205760405162461bcd60e51b815260040180806020018281038252603981526020018061320d6039913960400191505060405180910390fd5b80821461085e5760405162461bcd60e51b815260040180806020018281038252604381526020018061305d6043913960600191505060405180910390fd5b600754604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156108d157600080fd5b505af11580156108e5573d6000803e3d6000fd5b505050506040513d60208110156108fb57600080fd5b50516109385760405162461bcd60e51b815260040180806020018281038252603b815260200180612b2c603b913960400191505060405180910390fd5b60608167ffffffffffffffff8111801561095157600080fd5b5060405190808252806020026020018201604052801561097b578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561099757600080fd5b506040519080825280602002602001820160405280156109c1578160200160208202803683370190505b5090506000805b85811015610b595760008a8a838181106109de57fe5b905060200201356001600160a01b0316905060008989848181106109fe57fe5b60200291909101359150506001600160a01b038216610a4e5760405162461bcd60e51b815260040180806020018281038252603b815260200180612a22603b913960400191505060405180910390fd5b60008111610a8d5760405162461bcd60e51b8152600401808060200182810382526042815260200180612e126042913960600191505060405180910390fd5b6001600160a01b03821660009081526020819052604090208054610ab190836120f8565b8155610abd85836120f8565b94506000816000015490506001888681518110610ad657fe5b60200260200101901515908115158152505080878681518110610af557fe5b602002602001018181525050836001600160a01b03167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee908483604051808381526020018281526020019250505060405180910390a2505050508060010190506109c8565b50808a14610b985760405162461bcd60e51b815260040180806020018281038252603b8152602001806130e0603b913960400191505060405180910390fd5b600154610ba5908b6120f8565b600155604080516020808b0282810182019093528a8252610c16928c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508892508791506121529050565b50505050505050505050565b60025481565b6007546001600160a01b031690565b60008111610c765760405162461bcd60e51b8152600401808060200182810382526038815260200180612dda6038913960400191505060405180910390fd5b33600081815260208190526040902080546001820154600283015482861115610cd05760405162461bcd60e51b8152600401808060200182810382526044815260200180612fd16044913960600191505060405180910390fd5b811580610cdc57504281115b610d175760405162461bcd60e51b8152600401808060200182810382526055815260200180612c0f6055913960600191505060405180910390fd5b610d2183876122fb565b8455610d2d82876120f8565b6001850155600254610d409042906120f8565b6002850155600154610d5290876122fb565b6001558354604080518881526020810183905281516001600160a01b038916927f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e928290030190a2610da7868860008461233d565b50505050505050565b33610db9612998565b610dc2826123cb565b8051602080830151604080519384529183015280519293506001600160a01b038516927fadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee59281900390910190a26040810151610e1f575050610e37565b610e348282604001516000846020015161233d565b50505b565b600a81565b60075474010000000000000000000000000000000000000000900460ff168015610e8457506007547501000000000000000000000000000000000000000000900460ff16155b610ebf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612ef46029913960400191505060405180910390fd5b336000818152602081905260409020600181015480610f0f5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d38602d913960400191505060405180910390fd5b8154610f1b90826120f8565b825560006001808401829055600284019190915554610f3a90826120f8565b6001558154604080518381526020810183905281516001600160a01b038716927fa217c421e0e9357b7b1815d752952b142ddc0e23f9f14ecb8233f8f83d563c4d928290030190a2610f8f848360018461233d565b50505050565b60015490565b600080610fa6612998565b5050506001600160a01b0316600090815260208181526040918290208251606081018452815481526001820154928101839052600290910154920182905291565b60058181548110610ff457fe5b6000918252602090912001546001600160a01b0316905081565b60075474010000000000000000000000000000000000000000900460ff1681565b6004546001600160a01b031633146110785760405162461bcd60e51b81526004018080602001828103825260348152602001806129ee6034913960400191505060405180910390fd5b60075474010000000000000000000000000000000000000000900460ff1680156110be57506007547501000000000000000000000000000000000000000000900460ff16155b6110f95760405162461bcd60e51b8152600401808060200182810382526029815260200180612ef46029913960400191505060405180910390fd5b600780547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fbdbd7b3d2870b142b863f835ac06bf8aa59717f4295c2d0f4d9636fb4e5bb41890600090a1565b6003546001600160a01b031633146111955760405162461bcd60e51b81526004018080602001828103825260348152602001806129ba6034913960400191505060405180910390fd5b6001600160a01b0381166111da5760405162461bcd60e51b8152600401808060200182810382526043815260200180612d656043913960600191505060405180910390fd5b6000806111e683612658565b91509150806112265760405162461bcd60e51b815260040180806020018281038252604c815260200180612ae0604c913960600191505060405180910390fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061125657fe5b600091825260209091200154600580546001600160a01b03909216918490811061127c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060058054806112b557fe5b60008281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559091019091556040516001600160a01b038516917f8510e225439ac2e1e619dffc86503855de99ded73d69499cadb36719ab7ac35491a2505050565b6004546001600160a01b0316331461138f5760405162461bcd60e51b81526004018080602001828103825260348152602001806129ee6034913960400191505060405180910390fd5b6007547501000000000000000000000000000000000000000000900460ff16156113ea5760405162461bcd60e51b81526004018080602001828103825260258152602001806132756025913960400191505060405180910390fd5b600780547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040517f44562777dd33a811a41558cd3e94176385d383dfbef2e7daf1f568fb2a3a50b490600090a1565b600061146082612658565b9392505050565b60075474010000000000000000000000000000000000000000900460ff1680156114ad57506007547501000000000000000000000000000000000000000000900460ff16155b6114e85760405162461bcd60e51b8152600401808060200182810382526029815260200180612ef46029913960400191505060405180910390fd5b60006114f483836126bb565b9050826001600160a01b03167f81db9529cc03da6115de53b27832a9a0dde26bd573e99f76b23960f6be62b0c98383604051808381526020018281526020019250505060405180910390a261154c838360018461233d565b505050565b60075474010000000000000000000000000000000000000000900460ff16801561159757506007547501000000000000000000000000000000000000000000900460ff16155b6115d25760405162461bcd60e51b8152600401808060200182810382526029815260200180612ef46029913960400191505060405180910390fd5b3360006115df82846126bb565b9050816001600160a01b03167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee908483604051808381526020018281526020019250505060405180910390a261154c828460018461233d565b6007547501000000000000000000000000000000000000000000900460ff166116915760405162461bcd60e51b8152600401808060200182810382526029815260200180612be66029913960400191505060405180910390fd5b8060608167ffffffffffffffff811180156116ab57600080fd5b506040519080825280602002602001820160405280156116d5578160200160208202803683370190505b50905060608267ffffffffffffffff811180156116f157600080fd5b5060405190808252806020026020018201604052801561171b578160200160208202803683370190505b50905060608367ffffffffffffffff8111801561173757600080fd5b50604051908082528060200260200182016040528015611761578160200160208202803683370190505b50905060005b8481101561184c57600087878381811061177d57fe5b905060200201356001600160a01b03169050611797612998565b6117a0826123cb565b905080604001518684815181106117b357fe5b60200260200101818152505060008584815181106117cd57fe5b91151560209283029190910182015281015184518590859081106117ed57fe5b602090810291909101810191909152815182820151604080519283529282015281516001600160a01b038516927fadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5928290030190a25050600101611767565b5061188e868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250869150859050612152565b505050505050565b6003546001600160a01b031633146118df5760405162461bcd60e51b81526004018080602001828103825260348152602001806129ba6034913960400191505060405180910390fd5b6001600160a01b0381166119245760405162461bcd60e51b8152600401808060200182810382526040815260200180612f1d6040913960400191505060405180910390fd5b600554600a60018201111561196a5760405162461bcd60e51b815260040180806020018281038252604b815260200180612a95604b913960600191505060405180910390fd5b60005b818110156119e657826001600160a01b03166005828154811061198c57fe5b6000918252602090912001546001600160a01b031614156119de5760405162461bcd60e51b81526004018080602001828103825260518152602001806131bc6051913960600191505060405180910390fd5b60010161196d565b506005805460018101825560009182527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03851690811790915560405190917fc580726bc117ebe54aaf7f71f680c52208316d7dafdd4e165a4e402c032bbc6091a25050565b6003546001600160a01b03163314611ac15760405162461bcd60e51b81526004018080602001828103825260348152602001806129ba6034913960400191505060405180910390fd5b6006546001600160a01b0382811691161415611b0e5760405162461bcd60e51b815260040180806020018281038252605c815260200180612e54605c913960600191505060405180910390fd5b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691909117918290556040519116907fbf46e3bdb5dd635a9a0d027fbb3c05e2b2f0e7c28a99fc6cd4bf5a7e3413d3be90600090a250565b6004546001600160a01b03163314611bbf5760405162461bcd60e51b81526004018080602001828103825260348152602001806129ee6034913960400191505060405180910390fd5b6001600160a01b038116611c045760405162461bcd60e51b815260040180806020018281038252603c815260200180612f5d603c913960400191505060405180910390fd5b6004546001600160a01b0382811691161415611c515760405162461bcd60e51b8152600401808060200182810382526059815260200180612cdf6059913960600191505060405180910390fd5b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fabe3ea374ec13aa47e312b4ed42fb5e9d47324c0d167dc4836aa048b8e5279ae90600090a250565b6004546001600160a01b031681565b6007547501000000000000000000000000000000000000000000900460ff1615611d1d5760405162461bcd60e51b81526004018080602001828103825260258152602001806132756025913960400191505060405180910390fd5b611d2682611455565b611d615760405162461bcd60e51b815260040180806020018281038252604c815260200180612b9a604c913960600191505060405180910390fd5b60008111611da05760405162461bcd60e51b8152600401808060200182810382526044815260200180612eb06044913960600191505060405180910390fd5b336000818152602081905260409020805480611ded5760405162461bcd60e51b81526004018080602001828103825260378152602001806131496037913960400191505060405180910390fd5b80841115611e2c5760405162461bcd60e51b815260040180806020018281038252604a81526020018061329a604a913960600191505060405180910390fd5b611e3681856122fb565b8255600154611e4590856122fb565b600155600754604080517f21df0da700000000000000000000000000000000000000000000000000000000815290516001600160a01b03928316928816916321df0da7916004808301926020929190829003018186803b158015611ea857600080fd5b505afa158015611ebc573d6000803e3d6000fd5b505050506040513d6020811015611ed257600080fd5b50516001600160a01b031614611f195760405162461bcd60e51b8152600401808060200182810382526045815260200180612c9a6045913960600191505060405180910390fd5b600754604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018890529151919092169163095ea7b39160448083019260209291908290030181600087803b158015611f8857600080fd5b505af1158015611f9c573d6000803e3d6000fd5b505050506040513d6020811015611fb257600080fd5b5051611fef5760405162461bcd60e51b81526004018080602001828103825260408152602001806130a06040913960400191505060405180910390fd5b815460408051868152602081019290925280516001600160a01b038616927f9571cc7fab3ada3041abcbb4d26ead1cf5757f940f1096da3713584afc4b75cb92908290030190a2846001600160a01b031663a53acf6184866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561208d57600080fd5b505af11580156120a1573d6000803e3d6000fd5b505050506120af838561285d565b5050505050565b6001600160a01b031660009081526020819052604090205490565b6007547501000000000000000000000000000000000000000000900460ff1681565b600181565b600082820183811015611460576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61215a6128f0565b61216357610f8f565b6006546040517f90ef9d3f0000000000000000000000000000000000000000000000000000000081526080600482019081528651608483015286516001600160a01b03909316926390ef9d3f92889288928892889291829160248101916044820191606481019160a4909101906020808c01910280838360005b838110156121f55781810151838201526020016121dd565b50505050905001858103845288818151815260200191508051906020019060200280838360005b8381101561223457818101518382015260200161221c565b50505050905001858103835287818151815260200191508051906020019060200280838360005b8381101561227357818101518382015260200161225b565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156122b257818101518382015260200161229a565b5050505090500198505050505050505050600060405180830381600087803b1580156122dd57600080fd5b505af11580156122f1573d6000803e3d6000fd5b5050505050505050565b600061146083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612901565b6123456128f0565b61234e57610f8f565b600654604080517f0e3b7c950000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301526024820187905285151560448301526064820185905291519190921691630e3b7c9591608480830192600092919082900301818387803b1580156122dd57600080fd5b6123d3612998565b6001600160a01b0382166124185760405162461bcd60e51b8152600401808060200182810382526032815260200180612da86032913960400191505060405180910390fd5b6001600160a01b038216600090815260208181526040808320805492850192909252600182015484528301919091526007547501000000000000000000000000000000000000000000900460ff166124ef5781516124a75760405162461bcd60e51b815260040180806020018281038252602e81526020018061311b602e913960400191505060405180910390fd5b42816002015411156124ea5760405162461bcd60e51b8152600401808060200182810382526038815260200180612f996038913960400191505060405180910390fd5b612567565b602082015182516124ff916120f8565b808352602083015160408401526125475760405162461bcd60e51b8152600401808060200182810382526038815260200180612a5d6038913960400191505060405180910390fd5b60008155602082015160015461255c916122fb565b600155600060208301525b600060018201819055600282018190556007548351604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201939093529051919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156125eb57600080fd5b505af11580156125ff573d6000803e3d6000fd5b505050506040513d602081101561261557600080fd5b50516126525760405162461bcd60e51b8152600401808060200182810382526033815260200180612b676033913960400191505060405180910390fd5b50919050565b60055460009081905b808310156126b057836001600160a01b03166005848154811061268057fe5b6000918252602090912001546001600160a01b031614156126a55760019150506126b6565b826001019250612661565b60009150505b915091565b60006001600160a01b0383166127025760405162461bcd60e51b815260040180806020018281038252602f81526020018061333d602f913960400191505060405180910390fd5b600082116127415760405162461bcd60e51b8152600401808060200182810382526036815260200180612c646036913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020805461276590846120f8565b815560015461277490846120f8565b6001558054600754604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810187905290519294506001600160a01b03909116916323b872dd916064808201926020929091908290030181600087803b1580156127ef57600080fd5b505af1158015612803573d6000803e3d6000fd5b505050506040513d602081101561281957600080fd5b50516128565760405162461bcd60e51b815260040180806020018281038252602f815260200180613246602f913960400191505060405180910390fd5b5092915050565b6128656128f0565b61286e57610e34565b600654604080517fce257ab80000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529151919092169163ce257ab891604480830192600092919082900301818387803b1580156128dc57600080fd5b505af115801561188e573d6000803e3d6000fd5b6006546001600160a01b0316151590565b600081848411156129905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561295557818101518382015260200161293d565b50505050905090810190601f1680156129825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040518060600160405280600081526020016000815260200160008152509056fe5374616b696e67436f6e74726163743a2063616c6c6572206973206e6f7420746865206d6967726174696f6e206d616e616765725374616b696e67436f6e74726163743a2063616c6c6572206973206e6f742074686520656d657267656e6379206d616e616765725374616b696e67436f6e74726163743a3a6469737472696275746552657761726473202d207374616b65206f776e65722063616e277420626520305374616b696e67436f6e74726163743a3a7769746864726177202d206e6f207374616b6564206f7220756e7374616b656420746f6b656e735374616b696e67436f6e74726163743a3a6164644d6967726174696f6e44657374696e6174696f6e202d2063616e277420616464206d6f7265207374616b696e6720636f6e7472616374735374616b696e67436f6e74726163743a3a72656d6f76654d6967726174696f6e44657374696e6174696f6e202d207374616b696e6720636f6e747261637420646f65736e27742065786973745374616b696e67436f6e74726163743a3a6469737472696275746552657761726473202d20696e73756666696369656e7420616c6c6f77616e63655374616b696e67436f6e74726163743a3a7769746864726177202d20636f756c646e2774207472616e73666572207374616b655374616b696e67436f6e74726163743a3a6d6967726174655374616b6564546f6b656e73202d206d6967726174696f6e2064657374696e6174696f6e207761736e277420617070726f7665645374616b696e67436f6e74726163743a206e6f742072656c656173696e6720616c6c207374616b65735374616b696e67436f6e74726163743a3a756e7374616b65202d20756e61626c6520746f20756e7374616b65207768656e2074686572652061726520746f6b656e732070656e64696e67207769746864726177616c5374616b696e67436f6e74726163743a3a7374616b65202d20616d6f756e74206d7573742062652067726561746572207468616e20305374616b696e67436f6e74726163743a3a6d6967726174655374616b6564546f6b656e73202d207374616b656420746f6b656e73206d757374206265207468652073616d655374616b696e67436f6e74726163743a3a736574456d657267656e63794d616e61676572202d2061646472657373206d75737420626520646966666572656e74207468616e207468652063757272656e7420616464726573735374616b696e67436f6e74726163743a3a72657374616b65202d206e6f20756e7374616b656420746f6b656e735374616b696e67436f6e74726163743a3a72656d6f76654d6967726174696f6e44657374696e6174696f6e202d2061646472657373206d757374206e6f7420626520305374616b696e67436f6e74726163743a3a7769746864726177202d207374616b65206f776e65722063616e277420626520305374616b696e67436f6e74726163743a3a756e7374616b65202d20616d6f756e74206d7573742062652067726561746572207468616e20305374616b696e67436f6e74726163743a3a6469737472696275746552657761726473202d20616d6f756e74206d7573742062652067726561746572207468616e20305374616b696e67436f6e74726163743a3a7365745374616b654368616e67654e6f746966696572202d2061646472657373206d75737420626520646966666572656e74207468616e207468652063757272656e7420616464726573735374616b696e67436f6e74726163743a3a6d6967726174655374616b6564546f6b656e73202d20616d6f756e74206d7573742062652067726561746572207468616e20305374616b696e67436f6e74726163743a206e6f7420616363657074696e67206e6577207374616b65735374616b696e67436f6e74726163743a3a6164644d6967726174696f6e44657374696e6174696f6e202d2061646472657373206d757374206e6f7420626520305374616b696e67436f6e74726163743a3a736574456d657267656e63794d616e61676572202d2061646472657373206d757374206e6f7420626520305374616b696e67436f6e74726163743a3a7769746864726177202d20746f6b656e7320617265207374696c6c20696e20636f6f6c646f776e5374616b696e67436f6e74726163743a3a756e7374616b65202d2063616e277420756e7374616b65206d6f7265207468616e207468652063757272656e74207374616b655374616b696e67436f6e74726163743a3a6469737472696275746552657761726473202d20746f74616c20616d6f756e74206d7573742062652067726561746572207468616e20305374616b696e67436f6e74726163743a3a6469737472696275746552657761726473202d206c69737473206d757374206265206f66207468652073616d652073697a655374616b696e67436f6e74726163743a3a6d6967726174655374616b6564546f6b656e73202d20636f756c646e277420617070726f7665207472616e736665725374616b696e67436f6e74726163743a3a6469737472696275746552657761726473202d20696e636f727265637420746f74616c20616d6f756e745374616b696e67436f6e74726163743a3a7769746864726177202d206e6f20756e7374616b656420746f6b656e735374616b696e67436f6e74726163743a3a6d6967726174655374616b6564546f6b656e73202d206e6f207374616b656420746f6b656e735374616b696e67436f6e74726163743a3a7365744d6967726174696f6e4d616e61676572202d2061646472657373206d757374206e6f7420626520305374616b696e67436f6e74726163743a3a6164644d6967726174696f6e44657374696e6174696f6e202d2063616e2774206164642061206475706c6963617465207374616b696e6720636f6e74726163745374616b696e67436f6e74726163743a3a6469737472696275746552657761726473202d206c697374732063616e277420626520656d7074795374616b696e67436f6e74726163743a3a7374616b65202d20696e73756666696369656e7420616c6c6f77616e63655374616b696e67436f6e74726163743a2072656c656173696e6720616c6c207374616b65735374616b696e67436f6e74726163743a3a6d6967726174655374616b6564546f6b656e73202d20616d6f756e742065786365656473207374616b656420746f6b656e2062616c616e63655374616b696e67436f6e74726163743a3a7365744d6967726174696f6e4d616e61676572202d2061646472657373206d75737420626520646966666572656e74207468616e207468652063757272656e7420616464726573735374616b696e67436f6e74726163743a3a7374616b65202d207374616b65206f776e65722063616e27742062652030a2646970667358221220bd2a08f3f3797a16551c10401240093f8b3bbaa1aec3e85ad8a0930cef6c050e64736f6c634300060c00335374616b696e67436f6e74726163743a3a63746f72202d204f52425320746f6b656e206d757374206e6f7420626520305374616b696e67436f6e74726163743a3a63746f72202d20636f6f6c646f776e20706572696f64206d7573742062652067726561746572207468616e20305374616b696e67436f6e74726163743a3a63746f72202d20656d657267656e6379206d616e61676572206d757374206e6f7420626520305374616b696e67436f6e74726163743a3a63746f72202d206d6967726174696f6e206d616e61676572206d757374206e6f7420626520300000000000000000000000000000000000000000000000000000000000127500000000000000000000000000b7d1068f267ab092973108f0f8cd914830cc1795000000000000000000000000b7d1068f267ab092973108f0f8cd914830cc1795000000000000000000000000614389eaae0a6821dc49062d56bda3d9d45fa2ff

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

0000000000000000000000000000000000000000000000000000000000127500000000000000000000000000b7d1068f267ab092973108f0f8cd914830cc1795000000000000000000000000b7d1068f267ab092973108f0f8cd914830cc1795000000000000000000000000614389eaae0a6821dc49062d56bda3d9d45fa2ff

-----Decoded View---------------
Arg [0] : _cooldownPeriodInSec (uint256): 1209600
Arg [1] : _migrationManager (address): 0xb7d1068f267ab092973108f0f8cd914830cc1795
Arg [2] : _emergencyManager (address): 0xb7d1068f267ab092973108f0f8cd914830cc1795
Arg [3] : _token (address): 0x614389eaae0a6821dc49062d56bda3d9d45fa2ff

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000127500
Arg [1] : 000000000000000000000000b7d1068f267ab092973108f0f8cd914830cc1795
Arg [2] : 000000000000000000000000b7d1068f267ab092973108f0f8cd914830cc1795
Arg [3] : 000000000000000000000000614389eaae0a6821dc49062d56bda3d9d45fa2ff


Deployed ByteCode Sourcemap

222:28548:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5364:488;;;;;;;;;;;;;;;;-1:-1:-1;5364:488:5;-1:-1:-1;;;;;5364:488:5;;:::i;:::-;;1789:36;;;:::i;:::-;;;;-1:-1:-1;;;;;1789:36:5;;;;;;;;;;;;;;1290:31;;;:::i;17314:2373::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17314:2373:5;;-1:-1:-1;17314:2373:5;-1:-1:-1;17314:2373:5;:::i;1168:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;21060:89;;;:::i;10149:1669::-;;;;;;;;;;;;;;;;-1:-1:-1;10149:1669:5;;:::i;12101:718::-;;;:::i;745:56::-;;;:::i;12907:975::-;;;:::i;20188:114::-;;;:::i;20639:301::-;;;;;;;;;;;;;;;;-1:-1:-1;20639:301:5;-1:-1:-1;;;;;20639:301:5;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1632:60;;;;;;;;;;;;;;;;-1:-1:-1;1632:60:5;;:::i;2168:37::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;21230:176;;;:::i;8317:774::-;;;;;;;;;;;;;;;;-1:-1:-1;8317:774:5;-1:-1:-1;;;;;8317:774:5;;:::i;21470:161::-;;;:::i;23149:194::-;;;;;;;;;;;;;;;;-1:-1:-1;23149:194:5;-1:-1:-1;;;;;23149:194:5;;:::i;14182:574::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14182:574:5;;;;;;;;:::i;9329:571::-;;;;;;;;;;;;;;;;-1:-1:-1;9329:571:5;;:::i;21785:1118::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21785:1118:5;;-1:-1:-1;21785:1118:5;-1:-1:-1;21785:1118:5;:::i;7275:854::-;;;;;;;;;;;;;;;;-1:-1:-1;7275:854:5;-1:-1:-1;;;;;7275:854:5;;:::i;6743:341::-;;;;;;;;;;;;;;;;-1:-1:-1;6743:341:5;-1:-1:-1;;;;;6743:341:5;;:::i;6000:488::-;;;;;;;;;;;;;;;;-1:-1:-1;6000:488:5;-1:-1:-1;;;;;6000:488:5;;:::i;1443:31::-;;;:::i;15054:1615::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15054:1615:5;;;;;;;;:::i;19893:139::-;;;;;;;;;;;;;;;;-1:-1:-1;19893:139:5;-1:-1:-1;;;;;19893:139:5;;:::i;2675:38::-;;;:::i;623:32::-;;;:::i;5364:488::-;3249:16;;-1:-1:-1;;;;;3249:16:5;3235:10;:30;3227:95;;;;-1:-1:-1;;;3227:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5471:34:5;::::1;5463:107;;;;-1:-1:-1::0;;;5463:107:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5588:16;::::0;-1:-1:-1;;;;;5588:40:5;;::::1;:16:::0;::::1;:40;;5580:154;;;;-1:-1:-1::0;;;5580:154:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5745:16;:39:::0;;;::::1;-1:-1:-1::0;;;;;5745:39:5;::::1;::::0;;::::1;::::0;;;5800:45:::1;::::0;::::1;::::0;-1:-1:-1;;5800:45:5::1;5364:488:::0;:::o;1789:36::-;;;-1:-1:-1;;;;;1789:36:5;;:::o;1290:31::-;;;-1:-1:-1;;;;;1290:31:5;;:::o;17314:2373::-;3565:18;;;;;;;:41;;;;-1:-1:-1;3588:18:5;;;;;;;3587:19;3565:41;3557:95;;;;-1:-1:-1;;;3557:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17511:1:::1;17496:12;:16;17488:101;;;;-1:-1:-1::0;;;17488:101:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17628:12:::0;17681:8;17715:21;;;;;:42:::1;;;17756:1;17740:13;:17;17715:42;17707:124;;;;-1:-1:-1::0;;;17707:124:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17870:13;17849:17;:34;17841:126;;;;-1:-1:-1::0;;;17841:126:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18089:5;::::0;:59:::1;::::0;;;;;18108:10:::1;18089:59;::::0;::::1;::::0;18128:4:::1;18089:59:::0;;;;;;;;;;;;-1:-1:-1;;;;;18089:5:5;;::::1;::::0;:18:::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18089:59:5;18081:143:::1;;;;-1:-1:-1::0;;;18081:143:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18235:19;18268:13;18257:25;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;18257:25:5::1;;18235:47;;18292:35;18344:13;18330:28;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;18330:28:5::1;;18292:66;;18369:27;18415:6:::0;18410:758:::1;18431:17;18427:1;:21;18410:758;;;18469:18;18490:12;;18503:1;18490:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;18490:15:5::1;18469:36;;18519:14;18536:8;;18545:1;18536:11;;;;;;;;;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;;18570:24:5;::::1;18562:96;;;;-1:-1:-1::0;;;18562:96:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18689:1;18680:6;:10;18672:89;;;;-1:-1:-1::0;;;18672:89:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18802:18:5;::::1;18776:23;18802:18:::0;;;::::1;::::0;;;;;;18853:16;;:28:::1;::::0;18874:6;18853:20:::1;:28::i;:::-;18834:47:::0;;18918:31:::1;:19:::0;18942:6;18918:23:::1;:31::i;:::-;18896:53;;18964:25;18992:9;:16;;;18964:44;;19033:4;19022:5;19028:1;19022:8;;;;;;;;;;;;;:15;;;;;;;;;::::0;::::1;19075:17;19051:18;19070:1;19051:21;;;;;;;;;;;;;:41;;;::::0;::::1;19119:10;-1:-1:-1::0;;;;;19112:45:5::1;;19131:6;19139:17;19112:45;;;;;;;;;;;;;;;;;;;;;;;;18410:758;;;;18450:3;;;;;18410:758;;;;19202:19;19186:12;:35;19178:107;;;;-1:-1:-1::0;;;19178:107:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19316:17;::::0;:35:::1;::::0;19338:12;19316:21:::1;:35::i;:::-;19296:17;:55:::0;19613:67:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;19630:12;;;;;;19613:67;::::1;::::0;19630:12;;19613:67;19630:12;19613:67;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;19613:67:5::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;19644:8:5;;-1:-1:-1;19644:8:5;;;;19613:67;::::1;::::0;19644:8;;19613:67;19644:8;19613:67;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;19654:5:5;;-1:-1:-1;19661:18:5;;-1:-1:-1;19613:16:5::1;::::0;-1:-1:-1;19613:67:5:i:1;:::-;3663:1;;;;;17314:2373:::0;;;;;:::o;1168:34::-;;;;:::o;21060:89::-;21137:5;;-1:-1:-1;;;;;21137:5:5;21060:89;:::o;10149:1669::-;10229:1;10219:7;:11;10211:80;;;;-1:-1:-1;;;10211:80:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10323:10;10302:18;10369;;;;;;;;;;10420:16;;10471:24;;;;10531:25;;;;10575:23;;;;10567:104;;;;-1:-1:-1;;;10567:104:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10830:19;;;:44;;;10871:3;10853:15;:21;10830:44;10822:154;;;;-1:-1:-1;;;10822:154:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11156:25;:12;11173:7;11156:16;:25::i;:::-;11137:44;;11218:27;:14;11237:7;11218:18;:27::i;:::-;11191:24;;;:54;11291:19;;11283:28;;:3;;:7;:28::i;:::-;11255:25;;;:56;11342:17;;:30;;11364:7;11342:21;:30::i;:::-;11322:17;:50;11411:16;;11443:48;;;;;;;;;;;;;;-1:-1:-1;;;;;11443:48:5;;;;;;;;;;;11753:58;11765:10;11777:7;11786:5;11793:17;11753:11;:58::i;:::-;10149:1669;;;;;;;:::o;12101:718::-;12170:10;12191:25;;:::i;:::-;12219:20;12228:10;12219:8;:20::i;:::-;12276:19;;12297:16;;;;;12255:59;;;;;;;;;;;;12191:48;;-1:-1:-1;;;;;;12255:59:5;;;;;;;;;;;;;12423:20;;;;12419:62;;12464:7;;;;12419:62;12742:70;12754:10;12766:3;:20;;;12788:5;12795:3;:16;;;12742:11;:70::i;:::-;12101:718;;;:::o;745:56::-;799:2;745:56;:::o;12907:975::-;3565:18;;;;;;;:41;;;;-1:-1:-1;3588:18:5;;;;;;;3587:19;3565:41;3557:95;;;;-1:-1:-1;;;3557:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13002:10:::1;12981:18;13048::::0;;;::::1;::::0;;;;;;13101:24:::1;::::0;::::1;::::0;13144:18;13136:76:::1;;;;-1:-1:-1::0;;;13136:76:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13242:16:::0;;:36:::1;::::0;13263:14;13242:20:::1;:36::i;:::-;13223:55:::0;;:16:::1;13288:24;::::0;;::::1;:28:::0;;;13326:25:::1;::::0;::::1;:29:::0;;;;13386:17;:37:::1;::::0;13408:14;13386:21:::1;:37::i;:::-;13366:17;:57:::0;13462:16;;13494:55:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;13494:55:5;::::1;::::0;::::1;::::0;;;;;;::::1;13811:64;13823:10;13835:14;13851:4;13857:17;13811:11;:64::i;:::-;3663:1;;;;12907:975::o:0;20188:114::-;20278:17;;20188:114;:::o;20639:301::-;20718:22;20750:23;20785:22;;:::i;:::-;-1:-1:-1;;;;;;;;20810:19:5;:6;:19;;;;;;;;;;;;20785:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20639:301::o;1632:60::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1632:60:5;;-1:-1:-1;1632:60:5;:::o;2168:37::-;;;;;;;;;:::o;21230:176::-;3411:16;;-1:-1:-1;;;;;3411:16:5;3397:10;:30;3389:95;;;;-1:-1:-1;;;3389:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3565:18:::1;::::0;;;::::1;;;:41:::0;::::1;;;-1:-1:-1::0;3588:18:5::1;::::0;;;::::1;;;3587:19;3565:41;3557:95;;;;-1:-1:-1::0;;;3557:95:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21331:18:::2;:26:::0;;;::::2;::::0;;21373::::2;::::0;::::2;::::0;21352:5:::2;::::0;21373:26:::2;21230:176::o:0;8317:774::-;3249:16;;-1:-1:-1;;;;;3249:16:5;3235:10;:30;3227:95;;;;-1:-1:-1;;;3227:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8446:39:5;::::1;8438:131;;;;-1:-1:-1::0;;;8438:131:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8613:6;8621:11:::0;8636:50:::1;8669:16;8636:32;:50::i;:::-;8612:74;;;;8704:6;8696:95;;;;-1:-1:-1::0;;;8696:95:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8922:24;8947:31:::0;;:35;;;;8922:61;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;8892:24:::1;:27:::0;;-1:-1:-1;;;;;8922:61:5;;::::1;::::0;8917:1;;8892:27;::::1;;;;;;;;;;;;;:91;;;;;-1:-1:-1::0;;;;;8892:91:5::1;;;;;-1:-1:-1::0;;;;;8892:91:5::1;;;;;;8993:24;:30;;;;;;;;::::0;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;;9039:45:::1;::::0;-1:-1:-1;;;;;9039:45:5;::::1;::::0;::::1;::::0;::::1;3333:1;;8317:774:::0;:::o;21470:161::-;3411:16;;-1:-1:-1;;;;;3411:16:5;3397:10;:30;3389:95;;;;-1:-1:-1;;;3389:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3874:18:::1;::::0;;;::::1;;;3873:19;3865:69;;;;-1:-1:-1::0;;;3865:69:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21564:18:::2;:25:::0;;;::::2;::::0;::::2;::::0;;21605:19:::2;::::0;::::2;::::0;21564:25;;21605:19:::2;21470:161::o:0;23149:194::-;23250:11;23286:50;23319:16;23286:32;:50::i;:::-;23273:63;23149:194;-1:-1:-1;;;23149:194:5:o;14182:574::-;3565:18;;;;;;;:41;;;;-1:-1:-1;3588:18:5;;;;;;;3587:19;3565:41;3557:95;;;;-1:-1:-1;;;3557:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14300:25:::1;14328:27;14334:11;14347:7;14328:5;:27::i;:::-;14300:55;;14389:11;-1:-1:-1::0;;;;;14371:58:5::1;;14402:7;14411:17;14371:58;;;;;;;;;;;;;;;;;;;;;;;;14691;14703:11;14716:7;14725:4;14731:17;14691:11;:58::i;:::-;3663:1;14182:574:::0;;:::o;9329:571::-;3565:18;;;;;;;:41;;;;-1:-1:-1;3588:18:5;;;;;;;3587:19;3565:41;3557:95;;;;-1:-1:-1;;;3557:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9437:10:::1;9416:18;9486:26;9437:10:::0;9504:7;9486:5:::1;:26::i;:::-;9458:54;;9535:10;-1:-1:-1::0;;;;;9528:46:5::1;;9547:7;9556:17;9528:46;;;;;;;;;;;;;;;;;;;;;;;;9836:57;9848:10;9860:7;9869:4;9875:17;9836:11;:57::i;21785:1118::-:0;3729:18;;;;;;;3721:72;;;;-1:-1:-1;;;3721:72:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21920:12;21949:34:::1;21920:12:::0;21986:32:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;21986:32:5::1;;21949:69;;22028:19;22061:17;22050:29;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;22050:29:5::1;;22028:51;;22089:35;22141:17;22127:32;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;22127:32:5::1;;22089:70;;22175:6;22170:389;22191:17;22187:1;:21;22170:389;;;22229:18;22250:12;;22263:1;22250:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;22250:15:5::1;22229:36;;22280:25;;:::i;:::-;22308:20;22317:10;22308:8;:20::i;:::-;22280:48;;22365:3;:20;;;22342:17;22360:1;22342:20;;;;;;;;;;;;;:43;;;::::0;::::1;22410:5;22399;22405:1;22399:8;;;;;;;;:16:::0;::::1;;:8;::::0;;::::1;::::0;;;;;;:16;22453;::::1;::::0;22429:21;;:18;;22448:1;;22429:21;::::1;;;;;;::::0;;::::1;::::0;;;;;;:40;;;;22510:19;;22531:16;;::::1;::::0;22489:59:::1;::::0;;;;;;;::::1;::::0;;;-1:-1:-1;;;;;22489:59:5;::::1;::::0;::::1;::::0;;;;;;::::1;-1:-1:-1::0;;22210:3:5::1;;22170:389;;;;22820:76;22837:12;;22820:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22851:17:5;;-1:-1:-1;22870:5:5;;-1:-1:-1;22877:18:5;;-1:-1:-1;22820:16:5::1;:76::i;:::-;3804:1;;;;21785:1118:::0;;:::o;7275:854::-;3249:16;;-1:-1:-1;;;;;3249:16:5;3235:10;:30;3227:95;;;;-1:-1:-1;;;3227:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7404:42:5;::::1;7396:131;;;;-1:-1:-1::0;;;7396:131:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7552:24;:31:::0;799:2:::1;7610:1;7601:10:::0;::::1;:44;;7593:144;;;;-1:-1:-1::0;;;7593:144:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7786:6;7781:219;7802:6;7798:1;:10;7781:219;;;7868:19;-1:-1:-1::0;;;;;7837:50:5::1;:24;7862:1;7837:27;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;7837:27:5::1;:50;;7829:160;;;;-1:-1:-1::0;;;7829:160:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7810:3;;7781:219;;;-1:-1:-1::0;8010:24:5::1;:50:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;8010:50:5;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;8010:50:5;::::1;::::0;;::::1;::::0;;;8076:46:::1;::::0;8010:50;;8076:46:::1;::::0;::::1;3333:1;7275:854:::0;:::o;6743:341::-;3249:16;;-1:-1:-1;;;;;3249:16:5;3235:10;:30;3227:95;;;;-1:-1:-1;;;3227:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6858:8:::1;::::0;-1:-1:-1;;;;;6858:24:5;;::::1;:8:::0;::::1;:24;;6850:141;;;;-1:-1:-1::0;;;6850:141:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7002:8;:23:::0;;;::::1;-1:-1:-1::0;;;;;7002:23:5;;::::1;::::0;;;::::1;::::0;;;;7041:36:::1;::::0;7068:8;::::1;::::0;7041:36:::1;::::0;-1:-1:-1;;7041:36:5::1;6743:341:::0;:::o;6000:488::-;3411:16;;-1:-1:-1;;;;;3411:16:5;3397:10;:30;3389:95;;;;-1:-1:-1;;;3389:95:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6107:34:5;::::1;6099:107;;;;-1:-1:-1::0;;;6099:107:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6224:16;::::0;-1:-1:-1;;;;;6224:40:5;;::::1;:16:::0;::::1;:40;;6216:154;;;;-1:-1:-1::0;;;6216:154:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6381:16;:39:::0;;;::::1;-1:-1:-1::0;;;;;6381:39:5;::::1;::::0;;::::1;::::0;;;6436:45:::1;::::0;::::1;::::0;-1:-1:-1;;6436:45:5::1;6000:488:::0;:::o;1443:31::-;;;-1:-1:-1;;;;;1443:31:5;;:::o;15054:1615::-;3874:18;;;;;;;3873:19;3865:69;;;;-1:-1:-1;;;3865:69:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15218:46:::1;15244:19;15218:25;:46::i;:::-;15210:147;;;;-1:-1:-1::0;;;15210:147:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15385:1;15375:7;:11;15367:92;;;;-1:-1:-1::0;;;15367:92:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15491:10;15470:18;15537::::0;;;::::1;::::0;;;;;;15588:16;;15623;15615:84:::1;;;;-1:-1:-1::0;;;15615:84:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15728:12;15717:7;:23;;15709:110;;;;-1:-1:-1::0;;;15709:110:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15849:25;:12:::0;15866:7;15849:16:::1;:25::i;:::-;15830:44:::0;;15905:17:::1;::::0;:30:::1;::::0;15927:7;15905:21:::1;:30::i;:::-;15885:17;:50:::0;15988:5:::1;::::0;15954:30:::1;::::0;;;;;;;-1:-1:-1;;;;;15988:5:5;;::::1;::::0;15954:28;::::1;::::0;::::1;::::0;:30:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:28;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15954:30:5;-1:-1:-1;;;;;15954:39:5::1;;15946:133;;;;-1:-1:-1::0;;;15946:133:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16097:5;::::0;:52:::1;::::0;;;;;-1:-1:-1;;;;;16097:52:5;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:13:::1;::::0;:52;;;;;::::1;::::0;;;;;;;;:5:::1;::::0;:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;16097:52:5;16089:141:::1;;;;-1:-1:-1::0;;;16089:141:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16281:16:::0;;16246:52:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;;;;16246:52:5;::::1;::::0;::::1;::::0;;;;;;;::::1;16309:19;-1:-1:-1::0;;;;;16309:35:5::1;;16345:10;16357:7;16309:56;;;;;;;;;;;;;-1:-1:-1::0;;;;;16309:56:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16627:35;16642:10;16654:7;16627:14;:35::i;:::-;3945:1;;;15054:1615:::0;;:::o;19893:139::-;-1:-1:-1;;;;;19999:19:5;19973:7;19999:19;;;;;;;;;;:26;;19893:139::o;2675:38::-;;;;;;;;;:::o;623:32::-;654:1;623:32;:::o;874:176:0:-;932:7;963:5;;;986:6;;;;978:46;;;;;-1:-1:-1;;;978:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24524:319:5;24695:25;:23;:25::i;:::-;24690:63;;24736:7;;24690:63;24763:8;;:73;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24763:8:5;;;;:25;;24789:12;;24803:8;;24813:6;;24821:14;;24763:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24524:319;;;;:::o;1321:134:0:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;23890:257:5:-;24008:25;:23;:25::i;:::-;24003:63;;24049:7;;24003:63;24076:8;;:64;;;;;;-1:-1:-1;;;;;24076:64:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;;;;;:20;;:64;;;;;:8;;:64;;;;;;;:8;;:64;;;;;;;;;;26636:1366;26692:25;;:::i;:::-;-1:-1:-1;;;;;26737:25:5;;26729:88;;;;-1:-1:-1;;;26729:88:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26854:19:5;;26828:23;26854:19;;;;;;;;;;;26902:16;;26883;;;:35;;;;26950:24;;;;26928:46;;26984:20;;:24;;;;27024:18;;;;;;;27019:764;;27066:19;;27058:82;;;;-1:-1:-1;;;27058:82:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27191:3;27162:9;:25;;;:32;;27154:101;;;;-1:-1:-1;;;27154:101:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27019:764;;;27451:16;;;;27427:19;;:41;;:23;:41::i;:::-;27405:63;;;27505:16;;;;27482:20;;;:39;27536:92;;;;-1:-1:-1;;;27536:92:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27662:1;27643:20;;27720:16;;;;27698:17;;:39;;:21;:39::i;:::-;27678:17;:59;27771:1;27752:16;;;:20;27019:764;27820:1;27793:24;;;:28;;;27831:25;;;:29;;;27879:5;;27907:19;;27879:48;;;;;;-1:-1:-1;;;;;27879:48:5;;;;;;;;;;;;;;;;:5;;;;;:14;;:48;;;;;;;;;;;;;;;;;;:5;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27879:48:5;27871:124;;;;-1:-1:-1;;;27871:124:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26636:1366;;;;:::o;28322:446::-;28488:24;:31;28439:10;;;;28529:208;28553:6;28545:5;:14;28529:208;;;28623:16;-1:-1:-1;;;;;28588:51:5;:24;28613:5;28588:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28588:31:5;:51;28584:143;;;28668:4;28659:13;;28690:22;;;28584:143;28561:7;;;;;28529:208;;;28756:5;28747:14;;28322:446;;;;;:::o;25520:745::-;25590:25;-1:-1:-1;;;;;25635:25:5;;25627:85;;;;-1:-1:-1;;;25627:85:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25740:1;25730:7;:11;25722:78;;;;-1:-1:-1;;;25722:78:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25837:19:5;;25811:23;25837:19;;;;;;;;;;25885:16;;:29;;25906:7;25885:20;:29::i;:::-;25866:48;;25945:17;;:30;;25967:7;25945:21;:30::i;:::-;25925:17;:50;26006:16;;26140:5;;:54;;;;;;26159:10;26140:54;;;;26179:4;26140:54;;;;;;;;;;;;26006:16;;-1:-1:-1;;;;;;26140:5:5;;;;:18;;:54;;;;;;;;;;;;;;;26006:16;26140:5;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26140:54:5;26132:126;;;;-1:-1:-1;;;26132:126:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25520:745;;;;;:::o;25024:206::-;25110:25;:23;:25::i;:::-;25105:63;;25151:7;;25105:63;25178:8;;:45;;;;;;-1:-1:-1;;;;;25178:45:5;;;;;;;;;;;;;;;:8;;;;;:23;;:45;;;;;:8;;:45;;;;;;;:8;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;23416:119;23505:8;;-1:-1:-1;;;;;23505:8:5;23497:31;;23416:119;:::o;1746:187:0:-;1832:7;1867:12;1859:6;;;;1851:29;;;;-1:-1:-1;;;1851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1902:5:0;;;1746:187::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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