Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
StakingContract
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Standard Json-Input format)
// 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; } }
// 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); }
// 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; }
// 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); }
// 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; } }
// 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); }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 10000 }, "evmVersion": "istanbul", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.