Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
StakingContractV2
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-18 */ // Sources flattened with hardhat v2.13.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File contracts/StakingContractV2.sol pragma solidity ^0.8.0; // custom errors error StakingFailed(address caller); error UnstakingFailed(address caller); error WithdrawingFailed(); contract StakingContractV2 is Ownable { IERC20 public sFSToken; address public fsTokenAddress; // holds the factors responsible for calculating rewards struct CalculationFactors { uint256[] lockupPeriods; // period for which token will be locked e.g. 0 is 30 days, 1 is 180 days, and so on uint256[] rewardFactors; // will be used to calculate reward e.g. 0 is 331 (for an APY of 3000% and locked for 30 days) } // holds information about a stake struct Stake { uint256 poolIndex; // 0 if staked for pool at index 0 uint8 lockIndex; // 0 if locked for 30, 1 if locked for 180 days, and so on uint256 lockedAmount; // amount of tokens locked e.g., fs, pgk uint256 sFSLockedAmount; // amount of sFS locked e.g., sFS uint256 reward; // amount of tokens user will receive as reward uint256 timestamp; // time at which user staked tokens uint256 unstakeTimestamp; // time at which user can unstake tokens bool unstake; // true, if user unstaked their locked tokens } // array of stakes Stake[] public stakes; // holds information about pool struct Pool { IERC20 depositToken; IERC20 rewardToken; uint256 stakedSoFar; // token staked so far uint256 maxStake; // maximum amount of token that can be staked CalculationFactors calculationFactors; // factors that will influence reward bool pausePool; // will pause the pool and stop accepting new stakers uint256 rewardsToBePaid; // amount of rewward token that needs to be paid } // array of pools Pool[] public pools; // maps address with the pools mapping(address => uint256[]) public poolsOfAddress; // maps address with the stakes mapping(address => uint256[]) public stakesOfAddress; // maps index of stake with owner mapping(uint256 => address) public ownerOfIndex; // maps addresses with pool mapping(uint256 => address[]) public stakersOfPool; // events event tokenStaked( address indexed staker, uint256 indexed poolIndex, uint256 amountStaked, uint256 claimableReward, uint256 unstakeTimestamp ); event tokenUnstaked( address indexed staker, uint256 stakeIndex, uint256 indexed poolIndex, uint256 reward ); event rewardsWithdrawn( address indexed owner, uint256 indexed poolIndex, uint256 timestamp, uint256 withdrawnAmount ); event poolInitialized( uint256 indexed poolIndex, address depositToken, address rewardToken, uint256 maxStake, uint256[] lockupPeriods, uint256[] rewardFactors ); constructor(IERC20 _sFSToken, address _fsTokenAddress) { sFSToken = _sFSToken; fsTokenAddress = _fsTokenAddress; // dead stack stakes.push( Stake({ poolIndex: 0, lockIndex: 0, lockedAmount: 0, sFSLockedAmount: 0, reward: 0, timestamp: block.timestamp, unstakeTimestamp: block.timestamp, unstake: true }) ); } /// @dev Allows owner to add new reward pool /// @param _depositToken deposit token contract /// @param _rewardToken reward token contract /// @param _maxStake max amount of token that can be staked in the pool /// @param _lockupPeriods array of lockup periods eg. 0 is 30 days, 1 is 90 days, and so on /// @param _rewardFactors array of reward factors eg. 0 is 3313, 1 is 13596, and so on (for APY 3000%) function initializePool( IERC20 _depositToken, IERC20 _rewardToken, uint256 _maxStake, uint256[] memory _lockupPeriods, uint256[] memory _rewardFactors ) public onlyOwner { require( _lockupPeriods.length == _rewardFactors.length, "Lockup Periods and Reward Factors must have same length!" ); pools.push( Pool({ depositToken: _depositToken, rewardToken: _rewardToken, stakedSoFar: 0, maxStake: _maxStake, calculationFactors: CalculationFactors({ lockupPeriods: _lockupPeriods, rewardFactors: _rewardFactors }), pausePool: false, rewardsToBePaid: 0 }) ); // emit event emit poolInitialized( pools.length - 1, address(_depositToken), address(_rewardToken), _maxStake, _lockupPeriods, _rewardFactors ); } /// @dev Throws if pool is not valid modifier isValidPool(uint256 _poolIndex) { require(_poolIndex < pools.length, "Not a valid pool index!"); _; } /// @dev Throws if lockup period index is not valid for the pool modifier isValidLockupPeriod(uint256 _poolIndex, uint8 _lockIndex) { require( _lockIndex < pools[_poolIndex].calculationFactors.lockupPeriods.length, "Doesn't match a valid lockup period!" ); _; } /// @dev Throws if someone is already staking in the given pool modifier noOneStaked(uint256 _poolIndex) { require(pools[_poolIndex].stakedSoFar == 0, "Staking Started!"); _; } /* Checks */ /// @dev Allows user to check if user is staking in the pool /// @param _poolIndex index of the pool /// @param _user address of the user /// @return returns true if user is staking, else false function isStakingIn( uint256 _poolIndex, address _user ) public view returns (bool) { uint256[] memory _pools = poolsOfAddress[_user]; for (uint256 index = 0; index < _pools.length; index++) { if (_pools[index] == _poolIndex) { uint256 stakeIndex = stakesOfAddress[_user][index]; Stake memory stake = stakes[stakeIndex]; if (!stake.unstake) { return true; } } } return false; } /// @dev Checks if tokenAddress is the address of FS token /// @param _tokenAddress address of the token /// @return returns true if tokenAddress is the address of FS token, else false function isFSToken(address _tokenAddress) public view returns (bool) { return _tokenAddress == fsTokenAddress; } /* Setters */ /// @dev Allows owner to updates the maximum amount of tokens that can be staked for a given pool /// @param _poolIndex index of the pool /// @param _maxStake amount to which maxStake will get initialized to function updateMaxStake( uint256 _poolIndex, uint256 _maxStake ) external onlyOwner isValidPool(_poolIndex) noOneStaked(_poolIndex) { pools[_poolIndex].maxStake = _maxStake; } /// @dev Allows owner to update the lockupPeriods and rewardFactors for the given pool /// @param _poolIndex index of the pool /// @param _lockupPeriods array of lockup periods eg. 0 is 30 days, 1 is 90 days, and so on /// @param _rewardFactors array of reward factors eg. 0 is 3313, 1 is 13596, and so on (for APY 3000%) function updateCalculationFactors( uint256 _poolIndex, uint256[] memory _lockupPeriods, uint256[] memory _rewardFactors ) public onlyOwner isValidPool(_poolIndex) noOneStaked(_poolIndex) { require( _lockupPeriods.length == _rewardFactors.length, "Lockup Periods and Reward Factors must have same length!" ); pools[_poolIndex].calculationFactors = CalculationFactors({ lockupPeriods: _lockupPeriods, rewardFactors: _rewardFactors }); } /// @dev Allows owner to toggle pause for the given pool /// @param _poolIndex index of the pool function togglePausePoolFor( uint256 _poolIndex ) public onlyOwner isValidPool(_poolIndex) { pools[_poolIndex].pausePool = !pools[_poolIndex].pausePool; } /* Getters */ /// @dev Returns array of pools /// @return pools array of pools function getPools() public view returns (Pool[] memory) { return pools; } /// @dev Returns address of all the staker who has staked their tokens /// @param _poolIndex index of the pool /// @return stakers array of addresses function getStakersOf( uint256 _poolIndex ) public view returns (address[] memory) { return stakersOfPool[_poolIndex]; } /// @dev Returns stake infos for a staker /// @param _staker address for which stake info is returned /// @return _stakes stakes of the user function getStakesOf(address _staker) public view returns (Stake[] memory) { uint256[] memory _stakeIndexs = stakesOfAddress[_staker]; Stake[] memory _stakes = new Stake[](_stakeIndexs.length); for (uint256 index = 0; index < _stakes.length; index++) { _stakes[index] = stakes[_stakeIndexs[index]]; } return _stakes; } /// @dev Returns max reward token required for the given pool /// @param _poolIndex index of the pool /// @return maxReward amount of reward token that might need for the pool function getMaxRewards( uint256 _poolIndex ) public view isValidPool(_poolIndex) returns (uint256) { uint256 maxReward = calculateReward( pools[_poolIndex].maxStake, _poolIndex, uint8(pools[_poolIndex].calculationFactors.rewardFactors.length - 1) ); return maxReward; } /// @dev Allows user to return the index of stake in stakes for the given pool /// @param _poolIndex index of the pool /// @param _user address of the user /// @return stakeIndex the return variables of a contract’s function state variable function getStakeIndex( uint256 _poolIndex, address _user ) public view returns (uint256) { uint256[] memory stakeIndexes = stakesOfAddress[_user]; require(stakeIndexes.length != 0, "Haven't staked any tokens!"); uint256[] memory _pools = poolsOfAddress[_user]; uint256 stakeIndex; for (uint256 index = 0; index < _pools.length; index++) { if (_pools[index] == _poolIndex) { stakeIndex = stakeIndexes[index]; } } return stakeIndex; } /* Business Logic */ /// @dev Calculates and returns rewards that user can get for the given pool /// @param _amount amount of tokens for which rewards will be calculated /// @param _poolIndex amount of tokens for which rewards will be calculated /// @param _lockIndex index in lockupPeriods[], and rewardFactors[] eg. for 0 lockupPeriod is 30 days and rewardFactor is 3313(for APY 3000%) /// @return reward amount of token user can get function calculateReward( uint256 _amount, uint256 _poolIndex, uint8 _lockIndex ) public view isValidPool(_poolIndex) isValidLockupPeriod(_poolIndex, _lockIndex) returns (uint256) { uint256 rewardFactor = pools[_poolIndex] .calculationFactors .rewardFactors[_lockIndex]; return (_amount * rewardFactor) / 10000; } /// @dev Allow user to stake tokens for a selected period for the given pool /// @param _amount amount of token user will stake /// @param _poolIndex index of the pool /// @param _lockIndex selected period index in lockupPeriods[] eg. 0 is 30 days function stakeTokens( uint256 _amount, uint256 _sFSAmount, uint256 _poolIndex, uint8 _lockIndex ) public isValidPool(_poolIndex) isValidLockupPeriod(_poolIndex, _lockIndex) { // checks require(_amount > 0, "Cannot stake 0 tokens!"); require(!isStakingIn(_poolIndex, msg.sender), "Can't stake twice!"); require( pools[_poolIndex].stakedSoFar + _amount < pools[_poolIndex].maxStake, "Staking limit reached!" ); if (!isFSToken(address(pools[_poolIndex].depositToken))) { _sFSAmount = 0; } // calculations uint256 _lockingPeriod = pools[_poolIndex] .calculationFactors .lockupPeriods[_lockIndex]; uint256 _reward = calculateReward(_amount, _poolIndex, _lockIndex); Stake memory stake = Stake({ poolIndex: _poolIndex, lockIndex: _lockIndex, lockedAmount: _amount, sFSLockedAmount: _sFSAmount, reward: _reward, timestamp: block.timestamp, unstakeTimestamp: block.timestamp + _lockingPeriod * (1 days), unstake: false }); stakersOfPool[_poolIndex].push(msg.sender); poolsOfAddress[msg.sender].push(_poolIndex); stakesOfAddress[msg.sender].push(stakes.length); ownerOfIndex[stakes.length] = msg.sender; stakes.push(stake); pools[_poolIndex].stakedSoFar += _amount; pools[_poolIndex].rewardsToBePaid += _reward; // transfer deposit token if (_sFSAmount > 0) { bool sFSSuccess = sFSToken.transferFrom( msg.sender, address(this), _sFSAmount ); if (!sFSSuccess) { revert StakingFailed(msg.sender); } } bool success = pools[_poolIndex].depositToken.transferFrom( msg.sender, address(this), _amount - _sFSAmount ); if (!success) { revert StakingFailed(msg.sender); } emit tokenStaked( msg.sender, _poolIndex, _amount, _reward, block.timestamp + _lockingPeriod * (1 days) ); } /// @dev Allows user to unstake deposited tokens and withdraw rewards once lockup period is finished for the given pool /// @param _poolIndex index of the pool function unstakeTokens(uint256 _poolIndex) public isValidPool(_poolIndex) { // checks require( isStakingIn(_poolIndex, msg.sender), "Haven't staked any tokens!" ); uint256 stakeIndex = getStakeIndex(_poolIndex, msg.sender); require( msg.sender == ownerOfIndex[stakeIndex], "You're not the owner of the stake!" ); Stake storage _stake = stakes[stakeIndex]; require( _stake.unstakeTimestamp < block.timestamp, "Lockup period not finished!" ); // update state uint256 _reward = _stake.reward; uint256 _lockedAmount = _stake.lockedAmount; uint256 _sFSLockedAmount = _stake.sFSLockedAmount; _stake.unstake = true; pools[_poolIndex].rewardsToBePaid -= _reward; // transfer tokens if (_sFSLockedAmount > 0) { bool sFSSuccess = sFSToken.transfer(msg.sender, _sFSLockedAmount); if (!sFSSuccess) { revert UnstakingFailed(msg.sender); } } bool success = (pools[_poolIndex].depositToken.transfer( msg.sender, _lockedAmount - _sFSLockedAmount ) && pools[_poolIndex].rewardToken.transfer(msg.sender, _reward)); if (!success) { revert UnstakingFailed(msg.sender); } emit tokenUnstaked(msg.sender, stakeIndex, _poolIndex, _reward); } /// @dev Allows owner to withdraw rewards by substracting rewards that needs to be paid, and pause staking /// @param _poolIndex index of the pool function withdrawRewards( uint256 _poolIndex ) external onlyOwner isValidPool(_poolIndex) { uint256 _balance = pools[_poolIndex].rewardToken.balanceOf( address(this) ) - pools[_poolIndex].rewardsToBePaid; require( _balance > 0, "Balance is less or equal to rewards to be paid!" ); // pause staking if (!pools[_poolIndex].pausePool) { togglePausePoolFor(_poolIndex); } // transfer bool success = pools[_poolIndex].rewardToken.transfer( msg.sender, _balance ); if (!success) { revert WithdrawingFailed(); } emit rewardsWithdrawn( msg.sender, _poolIndex, block.timestamp, _balance ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_sFSToken","type":"address"},{"internalType":"address","name":"_fsTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"StakingFailed","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"UnstakingFailed","type":"error"},{"inputs":[],"name":"WithdrawingFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"depositToken","type":"address"},{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxStake","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"lockupPeriods","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"rewardFactors","type":"uint256[]"}],"name":"poolInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"}],"name":"rewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimableReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeTimestamp","type":"uint256"}],"name":"tokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"tokenUnstaked","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint8","name":"_lockIndex","type":"uint8"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fsTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"getMaxRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPools","outputs":[{"components":[{"internalType":"contract IERC20","name":"depositToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"stakedSoFar","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardFactors","type":"uint256[]"}],"internalType":"struct StakingContractV2.CalculationFactors","name":"calculationFactors","type":"tuple"},{"internalType":"bool","name":"pausePool","type":"bool"},{"internalType":"uint256","name":"rewardsToBePaid","type":"uint256"}],"internalType":"struct StakingContractV2.Pool[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getStakeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"getStakersOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getStakesOf","outputs":[{"components":[{"internalType":"uint256","name":"poolIndex","type":"uint256"},{"internalType":"uint8","name":"lockIndex","type":"uint8"},{"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"internalType":"uint256","name":"sFSLockedAmount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"unstakeTimestamp","type":"uint256"},{"internalType":"bool","name":"unstake","type":"bool"}],"internalType":"struct StakingContractV2.Stake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_depositToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_maxStake","type":"uint256"},{"internalType":"uint256[]","name":"_lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"_rewardFactors","type":"uint256[]"}],"name":"initializePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"isFSToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"isStakingIn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOfIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"contract IERC20","name":"depositToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"stakedSoFar","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardFactors","type":"uint256[]"}],"internalType":"struct StakingContractV2.CalculationFactors","name":"calculationFactors","type":"tuple"},{"internalType":"bool","name":"pausePool","type":"bool"},{"internalType":"uint256","name":"rewardsToBePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolsOfAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sFSToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_sFSAmount","type":"uint256"},{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint8","name":"_lockIndex","type":"uint8"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakersOfPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"poolIndex","type":"uint256"},{"internalType":"uint8","name":"lockIndex","type":"uint8"},{"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"internalType":"uint256","name":"sFSLockedAmount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"unstakeTimestamp","type":"uint256"},{"internalType":"bool","name":"unstake","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakesOfAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"togglePausePoolFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"unstakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint256[]","name":"_lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"_rewardFactors","type":"uint256[]"}],"name":"updateCalculationFactors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint256","name":"_maxStake","type":"uint256"}],"name":"updateMaxStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002cb138038062002cb1833981016040819052620000349162000280565b6200003f3362000217565b600180546001600160a01b039384166001600160a01b03199182161782556002805493909416921691909117909155604080516101008101825260008082526020820181815292820181815260608301828152608084018381524260a0860181815260c0870191825260e08701898152600380549a8b018155909652955160089098027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b81019890985595517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8801805460ff9290921660ff1992831617905592517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d88015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e870155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f86015591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f86085015591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f86184015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f862909201805492151592909116919091179055620002bf565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200027d57600080fd5b50565b600080604083850312156200029457600080fd5b8251620002a18162000267565b6020840151909250620002b48162000267565b809150509250929050565b6129e280620002cf6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063914b0d67116100de578063b8514d7011610097578063d29e769711610071578063d29e7697146103ac578063d5a44f86146103bf578063f2fde38b14610411578063fafc08c41461042457600080fd5b8063b8514d701461035d578063b96437b414610370578063c32daa271461038357600080fd5b8063914b0d67146102cb5780639342c8f4146102de578063a7916e80146102f1578063ac4afa3814610304578063b50e98441461032a578063b77865521461034a57600080fd5b8063674b5e511161014b5780637eedbf32116101255780637eedbf3214610281578063850877ba1461029457806388b3685c146102a75780638da5cb5b146102ba57600080fd5b8063674b5e5114610226578063715018a61461025857806376a25c5c1461026057600080fd5b80631c59601a146101935780632185d3e3146101a85780634cb5e40a146101bb57806351411307146101ce578063608e4dd0146101fe578063673a2a1f14610211575b600080fd5b6101a66101a136600461225f565b610444565b005b6101a66101b636600461234f565b610b33565b6101a66101c93660046123bc565b610c5f565b6002546101e1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a661020c3660046123de565b610d21565b610219611147565b6040516101f59190612469565b610248610234366004612539565b6002546001600160a01b0391821691161490565b60405190151581526020016101f5565b6101a66112b2565b61027361026e36600461255d565b6112c6565b6040519081526020016101f5565b6101a661028f366004612592565b6113a5565b6101a66102a23660046123de565b6115c1565b6102736102b5366004612625565b611658565b6000546001600160a01b03166101e1565b6102736102d9366004612625565b611689565b6101a66102ec3660046123de565b6116a5565b6102736102ff366004612651565b611930565b6103176103123660046123de565b611ab8565b6040516101f59796959493929190612681565b61033d6103383660046123de565b611bc8565b6040516101f591906126d1565b6101e16103583660046123bc565b611c34565b61024861036b366004612651565b611c6c565b6001546101e1906001600160a01b031681565b6101e16103913660046123de565b6007602052600090815260409020546001600160a01b031681565b6102736103ba3660046123de565b611df3565b6103d26103cd3660046123de565b611e7f565b6040805198895260ff9097166020890152958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100016101f5565b6101a661041f366004612539565b611edc565b610437610432366004612539565b611f55565b6040516101f5919061271e565b600454829081106104705760405162461bcd60e51b8152600401610467906127b0565b60405180910390fd5b828260048281548110610485576104856127e7565b600091825260209091206004600890920201015460ff8216106104ba5760405162461bcd60e51b8152600401610467906127fd565b600087116105035760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74207374616b65203020746f6b656e732160501b6044820152606401610467565b61050d8533611c6c565b1561054f5760405162461bcd60e51b815260206004820152601260248201527143616e2774207374616b652074776963652160701b6044820152606401610467565b60048581548110610562576105626127e7565b9060005260206000209060080201600301548760048781548110610588576105886127e7565b9060005260206000209060080201600201546105a49190612857565b106105ea5760405162461bcd60e51b81526020600482015260166024820152755374616b696e67206c696d697420726561636865642160501b6044820152606401610467565b61062560048681548110610600576106006127e7565b60009182526020909120600890910201546002546001600160a01b0390811691161490565b61062e57600095505b600060048681548110610643576106436127e7565b90600052602060002090600802016004016000018560ff168154811061066b5761066b6127e7565b9060005260206000200154905060006106858988886112c6565b905060006040518061010001604052808981526020018860ff1681526020018b81526020018a815260200183815260200142815260200184620151806106cb919061286a565b6106d59042612857565b815260200160001515815250905060086000898152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060056000336001600160a01b03166001600160a01b0316815260200190815260200160002088908060018154018082558091505060019003906000526020600020016000909190919091505560066000336001600160a01b03166001600160a01b0316815260200190815260200160002060038054905090806001815401808255809150506001900390600052602060002001600090919091909150553360076000600380549050815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038190806001815401808255809150506001900390600052602060002090600802016000909190919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908315150217905550505089600489815481106108d6576108d66127e7565b906000526020600020906008020160020160008282546108f69190612857565b925050819055508160048981548110610911576109116127e7565b906000526020600020906008020160070160008282546109319190612857565b909155505088156109dc576001546040516323b872dd60e01b8152336004820152306024820152604481018b90526000916001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190612881565b9050806109da5760405163321ac46360e21b8152336004820152602401610467565b505b6000600489815481106109f1576109f16127e7565b906000526020600020906008020160000160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd33308d8f610a3291906128a3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa9190612881565b905080610acc5760405163321ac46360e21b8152336004820152602401610467565b88337f623a52ead62bbd868a56635a27a328daa4f25aca7c858db37bafd648d3222d088d86610afe896201518061286a565b610b089042612857565b6040805193845260208401929092529082015260600160405180910390a35050505050505050505050565b610b3b61213f565b60045483908110610b5e5760405162461bcd60e51b8152600401610467906127b0565b8360048181548110610b7257610b726127e7565b906000526020600020906008020160020154600014610bc65760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8251845114610be75760405162461bcd60e51b8152600401610467906128b6565b60405180604001604052808581526020018481525060048681548110610c0f57610c0f6127e7565b90600052602060002090600802016004016000820151816000019080519060200190610c3c9291906121e9565b506020828101518051610c5592600185019201906121e9565b5050505050505050565b610c6761213f565b60045482908110610c8a5760405162461bcd60e51b8152600401610467906127b0565b8260048181548110610c9e57610c9e6127e7565b906000526020600020906008020160020154600014610cf25760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8260048581548110610d0657610d066127e7565b90600052602060002090600802016003018190555050505050565b60045481908110610d445760405162461bcd60e51b8152600401610467906127b0565b610d4e8233611c6c565b610d9a5760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6000610da68333611930565b6000818152600760205260409020549091506001600160a01b03163314610e1a5760405162461bcd60e51b815260206004820152602260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865207374616b604482015261652160f01b6064820152608401610467565b600060038281548110610e2f57610e2f6127e7565b9060005260206000209060080201905042816006015410610e925760405162461bcd60e51b815260206004820152601b60248201527f4c6f636b757020706572696f64206e6f742066696e69736865642100000000006044820152606401610467565b6004808201546002830154600384015460078501805460ff191660011790558354929391929091849189908110610ecb57610ecb6127e7565b90600052602060002090600802016007016000828254610eeb91906128a3565b90915550508015610f905760015460405163a9059cbb60e01b8152336004820152602481018390526000916001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612881565b905080610f8e576040516306eebc9160e41b8152336004820152602401610467565b505b600060048881548110610fa557610fa56127e7565b60009182526020909120600890910201546001600160a01b031663a9059cbb33610fcf85876128a3565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190612881565b80156110de575060048881548110611058576110586127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018690526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156110ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110de9190612881565b905080611100576040516306eebc9160e41b8152336004820152602401610467565b6040805187815260208101869052899133917f38e08fefabca105df8107822c6ebaebecb9e77dec2fd3b2e1ef075b32ffa0f47910160405180910390a35050505050505050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156112a95760008481526020908190206040805160e0810182526008860290920180546001600160a01b0390811684526001820154168385015260028101548383015260038101546060808501919091528251600483018054968702820183018552938101868152949592946080870194919391928492849184018282801561121657602002820191906000526020600020905b815481526020019060010190808311611202575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561126e57602002820191906000526020600020905b81548152602001906001019080831161125a575b505050919092525050508152600682015460ff161515602080830191909152600790920154604090910152908252600192909201910161116b565b50505050905090565b6112ba61213f565b6112c46000612199565b565b600454600090839081106112ec5760405162461bcd60e51b8152600401610467906127b0565b838360048281548110611301576113016127e7565b600091825260209091206004600890920201015460ff8216106113365760405162461bcd60e51b8152600401610467906127fd565b60006004878154811061134b5761134b6127e7565b90600052602060002090600802016004016001018660ff1681548110611373576113736127e7565b90600052602060002001549050612710818961138f919061286a565b6113999190612913565b98975050505050505050565b6113ad61213f565b80518251146113ce5760405162461bcd60e51b8152600401610467906128b6565b6040805160e0810182526001600160a01b03808816825286811660208084019182526000848601818152606086018a815287518089019098528988528784018990526080870197885260a0870183905260c08701839052600480546001810182559352865160089093027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180549488166001600160a01b031995861617815595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c8201805491909816941693909317909555517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8401559351805180519495929491937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f019261152c928492909101906121e9565b50602082810151805161154592600185019201906121e9565b50505060a082015160068201805460ff191691151591909117905560c09091015160079091015560045461157b906001906128a3565b7fbba45e87f800dd9fa0cce76cb99a81e5458db6733b8505e248dae3e4ebcdd99c86868686866040516115b2959493929190612935565b60405180910390a25050505050565b6115c961213f565b600454819081106115ec5760405162461bcd60e51b8152600401610467906127b0565b600482815481106115ff576115ff6127e7565b906000526020600020906008020160060160009054906101000a900460ff161560048381548110611632576116326127e7565b60009182526020909120600890910201600601805460ff19169115159190911790555050565b6006602052816000526040600020818154811061167457600080fd5b90600052602060002001600091509150505481565b6005602052816000526040600020818154811061167457600080fd5b6116ad61213f565b600454819081106116d05760405162461bcd60e51b8152600401610467906127b0565b6000600483815481106116e5576116e56127e7565b9060005260206000209060080201600701546004848154811061170a5761170a6127e7565b60009182526020909120600890910201600101546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611763573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611787919061297a565b61179191906128a3565b9050600081116117fb5760405162461bcd60e51b815260206004820152602f60248201527f42616c616e6365206973206c657373206f7220657175616c20746f207265776160448201526e72647320746f20626520706169642160881b6064820152608401610467565b6004838154811061180e5761180e6127e7565b600091825260209091206006600890920201015460ff1661183257611832836115c1565b600060048481548110611847576118476127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156118a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cd9190612881565b9050806118ed57604051636415e05160e01b815260040160405180910390fd5b6040805142815260208101849052859133917f13ccef0d32e8b13efb514a5943610a8397131b1baf329cc70f8db5944c5a882b910160405180910390a350505050565b6001600160a01b03811660009081526006602090815260408083208054825181850281018501909352808352849383018282801561198d57602002820191906000526020600020905b815481526020019060010190808311611979575b5050505050905080516000036119e55760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6001600160a01b038316600090815260056020908152604080832080548251818502810185019093528083529192909190830182828015611a4557602002820191906000526020600020905b815481526020019060010190808311611a31575b50505050509050600080600090505b8251811015611aac5786838281518110611a7057611a706127e7565b602002602001015103611a9a57838181518110611a8f57611a8f6127e7565b602002602001015191505b80611aa481612993565b915050611a54565b50925050505b92915050565b60048181548110611ac857600080fd5b6000918252602091829020600890910201805460018201546002830154600384015460408051600487018054606099810283018a0184529282018381526001600160a01b039788169a509590961697939692959294909384928491840182828015611b5257602002820191906000526020600020905b815481526020019060010190808311611b3e575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611baa57602002820191906000526020600020905b815481526020019060010190808311611b96575b505050919092525050506006820154600790920154909160ff169087565b600081815260086020908152604091829020805483518184028101840190945280845260609392830182828015611c2857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0a575b50505050509050919050565b60086020528160005260406000208181548110611c5057600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083528493830182828015611cc957602002820191906000526020600020905b815481526020019060010190808311611cb5575b5050505050905060005b8151811015611de85784828281518110611cef57611cef6127e7565b602002602001015103611dd6576001600160a01b0384166000908152600660205260408120805483908110611d2657611d266127e7565b90600052602060002001549050600060038281548110611d4857611d486127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201819052909150611dd3576001945050505050611ab2565b50505b80611de081612993565b915050611cd3565b506000949350505050565b60045460009082908110611e195760405162461bcd60e51b8152600401610467906127b0565b6000611e7760048581548110611e3157611e316127e7565b90600052602060002090600802016003015485600160048881548110611e5957611e596127e7565b600091825260209091206005600890920201015461026e91906128a3565b949350505050565b60038181548110611e8f57600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015495975060ff94851696939592949193909290911688565b611ee461213f565b6001600160a01b038116611f495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610467565b611f5281612199565b50565b6001600160a01b0381166000908152600660209081526040808320805482518185028101850190935280835260609493830182828015611fb457602002820191906000526020600020905b815481526020019060010190808311611fa0575b505050505090506000815167ffffffffffffffff811115611fd757611fd761229e565b60405190808252806020026020018201604052801561205557816020015b61204260405180610100016040528060008152602001600060ff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b815260200190600190039081611ff55790505b50905060005b8151811015612137576003838281518110612078576120786127e7565b602002602001015181548110612090576120906127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201528251839083908110612119576121196127e7565b6020026020010181905250808061212f90612993565b91505061205b565b509392505050565b6000546001600160a01b031633146112c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610467565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215612224579160200282015b82811115612224578251825591602001919060010190612209565b50612230929150612234565b5090565b5b808211156122305760008155600101612235565b803560ff8116811461225a57600080fd5b919050565b6000806000806080858703121561227557600080fd5b84359350602085013592506040850135915061229360608601612249565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122c557600080fd5b8135602067ffffffffffffffff808311156122e2576122e261229e565b8260051b604051601f19603f830116810181811084821117156123075761230761229e565b60405293845285810183019383810192508785111561232557600080fd5b83870191505b848210156123445781358352918301919083019061232b565b979650505050505050565b60008060006060848603121561236457600080fd5b83359250602084013567ffffffffffffffff8082111561238357600080fd5b61238f878388016122b4565b935060408601359150808211156123a557600080fd5b506123b2868287016122b4565b9150509250925092565b600080604083850312156123cf57600080fd5b50508035926020909101359150565b6000602082840312156123f057600080fd5b5035919050565b600081518084526020808501945080840160005b838110156124275781518752958201959082019060010161240b565b509495945050505050565b600081516040845261244760408501826123f7565b90506020830151848203602086015261246082826123f7565b95945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561251657888303603f19018552815180516001600160a01b03908116855288820151168885015286810151878501526060808201519085015260808082015160e082870181905291906124e983880182612432565b60a08581015115159089015260c09485015194909701939093525050509386019390860190600101612490565b509098975050505050505050565b6001600160a01b0381168114611f5257600080fd5b60006020828403121561254b57600080fd5b813561255681612524565b9392505050565b60008060006060848603121561257257600080fd5b833592506020840135915061258960408501612249565b90509250925092565b600080600080600060a086880312156125aa57600080fd5b85356125b581612524565b945060208601356125c581612524565b935060408601359250606086013567ffffffffffffffff808211156125e957600080fd5b6125f589838a016122b4565b9350608088013591508082111561260b57600080fd5b50612618888289016122b4565b9150509295509295909350565b6000806040838503121561263857600080fd5b823561264381612524565b946020939093013593505050565b6000806040838503121561266457600080fd5b82359150602083013561267681612524565b809150509250929050565b6001600160a01b03888116825287166020820152604081018690526060810185905260e0608082018190526000906126bb90830186612432565b93151560a08301525060c0015295945050505050565b6020808252825182820181905260009190848201906040850190845b818110156127125783516001600160a01b0316835292840192918401916001016126ed565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156127a3578151805185528681015160ff16878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e090810151151590850152610100909301929085019060010161273b565b5091979650505050505050565b60208082526017908201527f4e6f7420612076616c696420706f6f6c20696e64657821000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f446f65736e2774206d6174636820612076616c6964206c6f636b757020706572604082015263696f642160e01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115611ab257611ab2612841565b8082028115828204841417611ab257611ab2612841565b60006020828403121561289357600080fd5b8151801515811461255657600080fd5b81810381811115611ab257611ab2612841565b60208082526038908201527f4c6f636b757020506572696f647320616e642052657761726420466163746f7260408201527f73206d75737420686176652073616d65206c656e677468210000000000000000606082015260800190565b60008261293057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090612968908301856123f7565b828103608084015261139981856123f7565b60006020828403121561298c57600080fd5b5051919050565b6000600182016129a5576129a5612841565b506001019056fea2646970667358221220d66d6a7264e80ccb0bd4b84a8926e01e1857808ddd54550249e2e5b5c671b5fd64736f6c63430008120033000000000000000000000000a81b289dc053c242b43aed38f2b77e30dd459ec1000000000000000000000000bc0d0650412ef353d672c0bbd12efff90591b251
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063914b0d67116100de578063b8514d7011610097578063d29e769711610071578063d29e7697146103ac578063d5a44f86146103bf578063f2fde38b14610411578063fafc08c41461042457600080fd5b8063b8514d701461035d578063b96437b414610370578063c32daa271461038357600080fd5b8063914b0d67146102cb5780639342c8f4146102de578063a7916e80146102f1578063ac4afa3814610304578063b50e98441461032a578063b77865521461034a57600080fd5b8063674b5e511161014b5780637eedbf32116101255780637eedbf3214610281578063850877ba1461029457806388b3685c146102a75780638da5cb5b146102ba57600080fd5b8063674b5e5114610226578063715018a61461025857806376a25c5c1461026057600080fd5b80631c59601a146101935780632185d3e3146101a85780634cb5e40a146101bb57806351411307146101ce578063608e4dd0146101fe578063673a2a1f14610211575b600080fd5b6101a66101a136600461225f565b610444565b005b6101a66101b636600461234f565b610b33565b6101a66101c93660046123bc565b610c5f565b6002546101e1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a661020c3660046123de565b610d21565b610219611147565b6040516101f59190612469565b610248610234366004612539565b6002546001600160a01b0391821691161490565b60405190151581526020016101f5565b6101a66112b2565b61027361026e36600461255d565b6112c6565b6040519081526020016101f5565b6101a661028f366004612592565b6113a5565b6101a66102a23660046123de565b6115c1565b6102736102b5366004612625565b611658565b6000546001600160a01b03166101e1565b6102736102d9366004612625565b611689565b6101a66102ec3660046123de565b6116a5565b6102736102ff366004612651565b611930565b6103176103123660046123de565b611ab8565b6040516101f59796959493929190612681565b61033d6103383660046123de565b611bc8565b6040516101f591906126d1565b6101e16103583660046123bc565b611c34565b61024861036b366004612651565b611c6c565b6001546101e1906001600160a01b031681565b6101e16103913660046123de565b6007602052600090815260409020546001600160a01b031681565b6102736103ba3660046123de565b611df3565b6103d26103cd3660046123de565b611e7f565b6040805198895260ff9097166020890152958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100016101f5565b6101a661041f366004612539565b611edc565b610437610432366004612539565b611f55565b6040516101f5919061271e565b600454829081106104705760405162461bcd60e51b8152600401610467906127b0565b60405180910390fd5b828260048281548110610485576104856127e7565b600091825260209091206004600890920201015460ff8216106104ba5760405162461bcd60e51b8152600401610467906127fd565b600087116105035760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74207374616b65203020746f6b656e732160501b6044820152606401610467565b61050d8533611c6c565b1561054f5760405162461bcd60e51b815260206004820152601260248201527143616e2774207374616b652074776963652160701b6044820152606401610467565b60048581548110610562576105626127e7565b9060005260206000209060080201600301548760048781548110610588576105886127e7565b9060005260206000209060080201600201546105a49190612857565b106105ea5760405162461bcd60e51b81526020600482015260166024820152755374616b696e67206c696d697420726561636865642160501b6044820152606401610467565b61062560048681548110610600576106006127e7565b60009182526020909120600890910201546002546001600160a01b0390811691161490565b61062e57600095505b600060048681548110610643576106436127e7565b90600052602060002090600802016004016000018560ff168154811061066b5761066b6127e7565b9060005260206000200154905060006106858988886112c6565b905060006040518061010001604052808981526020018860ff1681526020018b81526020018a815260200183815260200142815260200184620151806106cb919061286a565b6106d59042612857565b815260200160001515815250905060086000898152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060056000336001600160a01b03166001600160a01b0316815260200190815260200160002088908060018154018082558091505060019003906000526020600020016000909190919091505560066000336001600160a01b03166001600160a01b0316815260200190815260200160002060038054905090806001815401808255809150506001900390600052602060002001600090919091909150553360076000600380549050815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038190806001815401808255809150506001900390600052602060002090600802016000909190919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908315150217905550505089600489815481106108d6576108d66127e7565b906000526020600020906008020160020160008282546108f69190612857565b925050819055508160048981548110610911576109116127e7565b906000526020600020906008020160070160008282546109319190612857565b909155505088156109dc576001546040516323b872dd60e01b8152336004820152306024820152604481018b90526000916001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190612881565b9050806109da5760405163321ac46360e21b8152336004820152602401610467565b505b6000600489815481106109f1576109f16127e7565b906000526020600020906008020160000160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd33308d8f610a3291906128a3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa9190612881565b905080610acc5760405163321ac46360e21b8152336004820152602401610467565b88337f623a52ead62bbd868a56635a27a328daa4f25aca7c858db37bafd648d3222d088d86610afe896201518061286a565b610b089042612857565b6040805193845260208401929092529082015260600160405180910390a35050505050505050505050565b610b3b61213f565b60045483908110610b5e5760405162461bcd60e51b8152600401610467906127b0565b8360048181548110610b7257610b726127e7565b906000526020600020906008020160020154600014610bc65760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8251845114610be75760405162461bcd60e51b8152600401610467906128b6565b60405180604001604052808581526020018481525060048681548110610c0f57610c0f6127e7565b90600052602060002090600802016004016000820151816000019080519060200190610c3c9291906121e9565b506020828101518051610c5592600185019201906121e9565b5050505050505050565b610c6761213f565b60045482908110610c8a5760405162461bcd60e51b8152600401610467906127b0565b8260048181548110610c9e57610c9e6127e7565b906000526020600020906008020160020154600014610cf25760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8260048581548110610d0657610d066127e7565b90600052602060002090600802016003018190555050505050565b60045481908110610d445760405162461bcd60e51b8152600401610467906127b0565b610d4e8233611c6c565b610d9a5760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6000610da68333611930565b6000818152600760205260409020549091506001600160a01b03163314610e1a5760405162461bcd60e51b815260206004820152602260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865207374616b604482015261652160f01b6064820152608401610467565b600060038281548110610e2f57610e2f6127e7565b9060005260206000209060080201905042816006015410610e925760405162461bcd60e51b815260206004820152601b60248201527f4c6f636b757020706572696f64206e6f742066696e69736865642100000000006044820152606401610467565b6004808201546002830154600384015460078501805460ff191660011790558354929391929091849189908110610ecb57610ecb6127e7565b90600052602060002090600802016007016000828254610eeb91906128a3565b90915550508015610f905760015460405163a9059cbb60e01b8152336004820152602481018390526000916001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612881565b905080610f8e576040516306eebc9160e41b8152336004820152602401610467565b505b600060048881548110610fa557610fa56127e7565b60009182526020909120600890910201546001600160a01b031663a9059cbb33610fcf85876128a3565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190612881565b80156110de575060048881548110611058576110586127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018690526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156110ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110de9190612881565b905080611100576040516306eebc9160e41b8152336004820152602401610467565b6040805187815260208101869052899133917f38e08fefabca105df8107822c6ebaebecb9e77dec2fd3b2e1ef075b32ffa0f47910160405180910390a35050505050505050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156112a95760008481526020908190206040805160e0810182526008860290920180546001600160a01b0390811684526001820154168385015260028101548383015260038101546060808501919091528251600483018054968702820183018552938101868152949592946080870194919391928492849184018282801561121657602002820191906000526020600020905b815481526020019060010190808311611202575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561126e57602002820191906000526020600020905b81548152602001906001019080831161125a575b505050919092525050508152600682015460ff161515602080830191909152600790920154604090910152908252600192909201910161116b565b50505050905090565b6112ba61213f565b6112c46000612199565b565b600454600090839081106112ec5760405162461bcd60e51b8152600401610467906127b0565b838360048281548110611301576113016127e7565b600091825260209091206004600890920201015460ff8216106113365760405162461bcd60e51b8152600401610467906127fd565b60006004878154811061134b5761134b6127e7565b90600052602060002090600802016004016001018660ff1681548110611373576113736127e7565b90600052602060002001549050612710818961138f919061286a565b6113999190612913565b98975050505050505050565b6113ad61213f565b80518251146113ce5760405162461bcd60e51b8152600401610467906128b6565b6040805160e0810182526001600160a01b03808816825286811660208084019182526000848601818152606086018a815287518089019098528988528784018990526080870197885260a0870183905260c08701839052600480546001810182559352865160089093027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180549488166001600160a01b031995861617815595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c8201805491909816941693909317909555517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8401559351805180519495929491937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f019261152c928492909101906121e9565b50602082810151805161154592600185019201906121e9565b50505060a082015160068201805460ff191691151591909117905560c09091015160079091015560045461157b906001906128a3565b7fbba45e87f800dd9fa0cce76cb99a81e5458db6733b8505e248dae3e4ebcdd99c86868686866040516115b2959493929190612935565b60405180910390a25050505050565b6115c961213f565b600454819081106115ec5760405162461bcd60e51b8152600401610467906127b0565b600482815481106115ff576115ff6127e7565b906000526020600020906008020160060160009054906101000a900460ff161560048381548110611632576116326127e7565b60009182526020909120600890910201600601805460ff19169115159190911790555050565b6006602052816000526040600020818154811061167457600080fd5b90600052602060002001600091509150505481565b6005602052816000526040600020818154811061167457600080fd5b6116ad61213f565b600454819081106116d05760405162461bcd60e51b8152600401610467906127b0565b6000600483815481106116e5576116e56127e7565b9060005260206000209060080201600701546004848154811061170a5761170a6127e7565b60009182526020909120600890910201600101546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611763573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611787919061297a565b61179191906128a3565b9050600081116117fb5760405162461bcd60e51b815260206004820152602f60248201527f42616c616e6365206973206c657373206f7220657175616c20746f207265776160448201526e72647320746f20626520706169642160881b6064820152608401610467565b6004838154811061180e5761180e6127e7565b600091825260209091206006600890920201015460ff1661183257611832836115c1565b600060048481548110611847576118476127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156118a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cd9190612881565b9050806118ed57604051636415e05160e01b815260040160405180910390fd5b6040805142815260208101849052859133917f13ccef0d32e8b13efb514a5943610a8397131b1baf329cc70f8db5944c5a882b910160405180910390a350505050565b6001600160a01b03811660009081526006602090815260408083208054825181850281018501909352808352849383018282801561198d57602002820191906000526020600020905b815481526020019060010190808311611979575b5050505050905080516000036119e55760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6001600160a01b038316600090815260056020908152604080832080548251818502810185019093528083529192909190830182828015611a4557602002820191906000526020600020905b815481526020019060010190808311611a31575b50505050509050600080600090505b8251811015611aac5786838281518110611a7057611a706127e7565b602002602001015103611a9a57838181518110611a8f57611a8f6127e7565b602002602001015191505b80611aa481612993565b915050611a54565b50925050505b92915050565b60048181548110611ac857600080fd5b6000918252602091829020600890910201805460018201546002830154600384015460408051600487018054606099810283018a0184529282018381526001600160a01b039788169a509590961697939692959294909384928491840182828015611b5257602002820191906000526020600020905b815481526020019060010190808311611b3e575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611baa57602002820191906000526020600020905b815481526020019060010190808311611b96575b505050919092525050506006820154600790920154909160ff169087565b600081815260086020908152604091829020805483518184028101840190945280845260609392830182828015611c2857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0a575b50505050509050919050565b60086020528160005260406000208181548110611c5057600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083528493830182828015611cc957602002820191906000526020600020905b815481526020019060010190808311611cb5575b5050505050905060005b8151811015611de85784828281518110611cef57611cef6127e7565b602002602001015103611dd6576001600160a01b0384166000908152600660205260408120805483908110611d2657611d266127e7565b90600052602060002001549050600060038281548110611d4857611d486127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201819052909150611dd3576001945050505050611ab2565b50505b80611de081612993565b915050611cd3565b506000949350505050565b60045460009082908110611e195760405162461bcd60e51b8152600401610467906127b0565b6000611e7760048581548110611e3157611e316127e7565b90600052602060002090600802016003015485600160048881548110611e5957611e596127e7565b600091825260209091206005600890920201015461026e91906128a3565b949350505050565b60038181548110611e8f57600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015495975060ff94851696939592949193909290911688565b611ee461213f565b6001600160a01b038116611f495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610467565b611f5281612199565b50565b6001600160a01b0381166000908152600660209081526040808320805482518185028101850190935280835260609493830182828015611fb457602002820191906000526020600020905b815481526020019060010190808311611fa0575b505050505090506000815167ffffffffffffffff811115611fd757611fd761229e565b60405190808252806020026020018201604052801561205557816020015b61204260405180610100016040528060008152602001600060ff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b815260200190600190039081611ff55790505b50905060005b8151811015612137576003838281518110612078576120786127e7565b602002602001015181548110612090576120906127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201528251839083908110612119576121196127e7565b6020026020010181905250808061212f90612993565b91505061205b565b509392505050565b6000546001600160a01b031633146112c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610467565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215612224579160200282015b82811115612224578251825591602001919060010190612209565b50612230929150612234565b5090565b5b808211156122305760008155600101612235565b803560ff8116811461225a57600080fd5b919050565b6000806000806080858703121561227557600080fd5b84359350602085013592506040850135915061229360608601612249565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122c557600080fd5b8135602067ffffffffffffffff808311156122e2576122e261229e565b8260051b604051601f19603f830116810181811084821117156123075761230761229e565b60405293845285810183019383810192508785111561232557600080fd5b83870191505b848210156123445781358352918301919083019061232b565b979650505050505050565b60008060006060848603121561236457600080fd5b83359250602084013567ffffffffffffffff8082111561238357600080fd5b61238f878388016122b4565b935060408601359150808211156123a557600080fd5b506123b2868287016122b4565b9150509250925092565b600080604083850312156123cf57600080fd5b50508035926020909101359150565b6000602082840312156123f057600080fd5b5035919050565b600081518084526020808501945080840160005b838110156124275781518752958201959082019060010161240b565b509495945050505050565b600081516040845261244760408501826123f7565b90506020830151848203602086015261246082826123f7565b95945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561251657888303603f19018552815180516001600160a01b03908116855288820151168885015286810151878501526060808201519085015260808082015160e082870181905291906124e983880182612432565b60a08581015115159089015260c09485015194909701939093525050509386019390860190600101612490565b509098975050505050505050565b6001600160a01b0381168114611f5257600080fd5b60006020828403121561254b57600080fd5b813561255681612524565b9392505050565b60008060006060848603121561257257600080fd5b833592506020840135915061258960408501612249565b90509250925092565b600080600080600060a086880312156125aa57600080fd5b85356125b581612524565b945060208601356125c581612524565b935060408601359250606086013567ffffffffffffffff808211156125e957600080fd5b6125f589838a016122b4565b9350608088013591508082111561260b57600080fd5b50612618888289016122b4565b9150509295509295909350565b6000806040838503121561263857600080fd5b823561264381612524565b946020939093013593505050565b6000806040838503121561266457600080fd5b82359150602083013561267681612524565b809150509250929050565b6001600160a01b03888116825287166020820152604081018690526060810185905260e0608082018190526000906126bb90830186612432565b93151560a08301525060c0015295945050505050565b6020808252825182820181905260009190848201906040850190845b818110156127125783516001600160a01b0316835292840192918401916001016126ed565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156127a3578151805185528681015160ff16878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e090810151151590850152610100909301929085019060010161273b565b5091979650505050505050565b60208082526017908201527f4e6f7420612076616c696420706f6f6c20696e64657821000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f446f65736e2774206d6174636820612076616c6964206c6f636b757020706572604082015263696f642160e01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115611ab257611ab2612841565b8082028115828204841417611ab257611ab2612841565b60006020828403121561289357600080fd5b8151801515811461255657600080fd5b81810381811115611ab257611ab2612841565b60208082526038908201527f4c6f636b757020506572696f647320616e642052657761726420466163746f7260408201527f73206d75737420686176652073616d65206c656e677468210000000000000000606082015260800190565b60008261293057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090612968908301856123f7565b828103608084015261139981856123f7565b60006020828403121561298c57600080fd5b5051919050565b6000600182016129a5576129a5612841565b506001019056fea2646970667358221220d66d6a7264e80ccb0bd4b84a8926e01e1857808ddd54550249e2e5b5c671b5fd64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a81b289dc053c242b43aed38f2b77e30dd459ec1000000000000000000000000bc0d0650412ef353d672c0bbd12efff90591b251
-----Decoded View---------------
Arg [0] : _sFSToken (address): 0xa81b289dc053c242B43aed38F2B77E30dd459Ec1
Arg [1] : _fsTokenAddress (address): 0xBC0d0650412EF353D672c0Bbd12eFFF90591B251
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a81b289dc053c242b43aed38f2b77e30dd459ec1
Arg [1] : 000000000000000000000000bc0d0650412ef353d672c0bbd12efff90591b251
Deployed Bytecode Sourcemap
6784:17242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18894:2414;;;;;;:::i;:::-;;:::i;:::-;;14398:559;;;;;;:::i;:::-;;:::i;13836:212::-;;;;;;:::i;:::-;;:::i;6858:29::-;;;;;-1:-1:-1;;;;;6858:29:0;;;;;;-1:-1:-1;;;;;2691:32:1;;;2673:51;;2661:2;2646:18;6858:29:0;;;;;;;;21486:1502;;;;;;:::i;:::-;;:::i;15356:87::-;;;:::i;:::-;;;;;;;:::i;13460:126::-;;;;;;:::i;:::-;13564:14;;-1:-1:-1;;;;;13547:31:0;;;13564:14;;13547:31;;13460:126;;;;5907:14:1;;5900:22;5882:41;;5870:2;5855:18;13460:126:0;5742:187:1;2882:103:0;;;:::i;18174:444::-;;;;;;:::i;:::-;;:::i;:::-;;;6403:25:1;;;6391:2;6376:18;18174:444:0;6257:177:1;10585:1126:0;;;;;;:::i;:::-;;:::i;15072:182::-;;;;;;:::i;:::-;;:::i;8611:52::-;;;;;;:::i;:::-;;:::i;2234:87::-;2280:7;2307:6;-1:-1:-1;;;;;2307:6:0;2234:87;;8516:51;;;;;;:::i;:::-;;:::i;23153:870::-;;;;;;:::i;:::-;;:::i;17132:567::-;;;;;;:::i;:::-;;:::i;8452:19::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;15616:148::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8796:50::-;;;;;;:::i;:::-;;:::i;12695:557::-;;;;;;:::i;:::-;;:::i;6829:22::-;;;;;-1:-1:-1;;;;;6829:22:0;;;8709:47;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;8709:47:0;;;16508:354;;;;;;:::i;:::-;;:::i;7905:21::-;;;;;;:::i;:::-;;:::i;:::-;;;;10090:25:1;;;10163:4;10151:17;;;10146:2;10131:18;;10124:45;10185:18;;;10178:34;;;;10243:2;10228:18;;10221:34;;;;10286:3;10271:19;;10264:35;10330:3;10315:19;;10308:35;10374:3;10359:19;;10352:35;10431:14;10424:22;10418:3;10403:19;;10396:51;10077:3;10062:19;7905:21:0;9757:696:1;3140:201:0;;;;;;:::i;:::-;;:::i;15928:381::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18894:2414::-;11834:5;:12;19070:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;;;;;;;;;19111:10:::1;19123;12102:5;12108:10;12102:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:17;::::0;;::::1;;:36;:57:::0;12072:87:::1;::::0;::::1;;12050:173;;;;-1:-1:-1::0;;;12050:173:0::1;;;;;;;:::i;:::-;19188:1:::2;19178:7;:11;19170:46;;;::::0;-1:-1:-1;;;19170:46:0;;12820:2:1;19170:46:0::2;::::0;::::2;12802:21:1::0;12859:2;12839:18;;;12832:30;-1:-1:-1;;;12878:18:1;;;12871:52;12940:18;;19170:46:0::2;12618:346:1::0;19170:46:0::2;19236:35;19248:10;19260;19236:11;:35::i;:::-;19235:36;19227:67;;;::::0;-1:-1:-1;;;19227:67:0;;13171:2:1;19227:67:0::2;::::0;::::2;13153:21:1::0;13210:2;13190:18;;;13183:30;-1:-1:-1;;;13229:18:1;;;13222:48;13287:18;;19227:67:0::2;12969:342:1::0;19227:67:0::2;19386:5;19392:10;19386:17;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;19359:7;19327:5;19333:10;19327:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;:39;;;;:::i;:::-;:85;19305:157;;;::::0;-1:-1:-1;;;19305:157:0;;13780:2:1;19305:157:0::2;::::0;::::2;13762:21:1::0;13819:2;13799:18;;;13792:30;-1:-1:-1;;;13838:18:1;;;13831:52;13900:18;;19305:157:0::2;13578:346:1::0;19305:157:0::2;19478:50;19496:5;19502:10;19496:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:30:::0;13564:14;;-1:-1:-1;;;;;13564:14:0;;;19496:30;::::2;13547:31:::0;;13460:126;19478:50:::2;19473:98;;19558:1;19545:14;;19473:98;19606:22;19631:5;19637:10;19631:17;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;:78;;19710:10;19631:90;;;;;;;;;;:::i;:::-;;;;;;;;;19606:115;;19732:15;19750:48;19766:7;19775:10;19787;19750:15;:48::i;:::-;19732:66;;19809:18;19830:344;;;;;;;;19862:10;19830:344;;;;19898:10;19830:344;;;;;;19937:7;19830:344;;;;19976:10;19830:344;;;;20009:7;19830:344;;;;20042:15;19830:344;;;;20108:14;20126:6;20108:25;;;;:::i;:::-;20090:43;::::0;:15:::2;:43;:::i;:::-;19830:344;;;;20157:5;19830:344;;;;::::0;19809:365:::2;;20185:13;:25;20199:10;20185:25;;;;;;;;;;;20216:10;20185:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20185:42:0::2;;;;;-1:-1:-1::0;;;;;20185:42:0::2;;;;;;20238:14;:26;20253:10;-1:-1:-1::0;;;;;20238:26:0::2;-1:-1:-1::0;;;;;20238:26:0::2;;;;;;;;;;;;20270:10;20238:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20292:15;:27;20308:10;-1:-1:-1::0;;;;;20292:27:0::2;-1:-1:-1::0;;;;;20292:27:0::2;;;;;;;;;;;;20325:6;:13;;;;20292:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20380:10;20350:12;:27;20363:6;:13;;;;20350:27;;;;;;;;;;;;:40;;;;;-1:-1:-1::0;;;;;20350:40:0::2;;;;;-1:-1:-1::0;;;;;20350:40:0::2;;;;;;20401:6;20413:5;20401:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20463:7;20430:5;20436:10;20430:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;20518:7;20481:5;20487:10;20481:17;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:44;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20575:14:0;;20571:289:::2;;20624:8;::::0;:126:::2;::::0;-1:-1:-1;;;20624:126:0;;20664:10:::2;20624:126;::::0;::::2;14342:34:1::0;20701:4:0::2;14392:18:1::0;;;14385:43;14444:18;;;14437:34;;;20606:15:0::2;::::0;-1:-1:-1;;;;;20624:8:0::2;::::0;:21:::2;::::0;14277:18:1;;20624:126:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20606:144;;20770:10;20765:84;;20808:25;::::0;-1:-1:-1;;;20808:25:0;;20822:10:::2;20808:25;::::0;::::2;2673:51:1::0;2646:18;;20808:25:0::2;2527:203:1::0;20765:84:0::2;20591:269;20571:289;20870:12;20885:5;20891:10;20885:17;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;;;;;;;;-1:-1:-1::0;;;;;20885:30:0::2;-1:-1:-1::0;;;;;20885:43:0::2;;20943:10;20976:4;21006:10;20996:7;:20;;;;:::i;:::-;20885:142;::::0;-1:-1:-1;;;;;;20885:142:0::2;::::0;;;;;;-1:-1:-1;;;;;14360:15:1;;;20885:142:0::2;::::0;::::2;14342:34:1::0;14412:15;;;;14392:18;;;14385:43;14444:18;;;14437:34;14277:18;;20885:142:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20870:157;;21043:7;21038:73;;21074:25;::::0;-1:-1:-1;;;21074:25:0;;21088:10:::2;21074:25;::::0;::::2;2673:51:1::0;2646:18;;21074:25:0::2;2527:203:1::0;21038:73:0::2;21177:10:::0;21152::::2;21126:174;21202:7:::0;21224;21264:25:::2;:14:::0;21282:6:::2;21264:25;:::i;:::-;21246:43;::::0;:15:::2;:43;:::i;:::-;21126:174;::::0;;15099:25:1;;;15155:2;15140:18;;15133:34;;;;15183:18;;;15176:34;15087:2;15072:18;21126:174:0::2;;;;;;;19140:2168;;;;11885:1:::1;;18894:2414:::0;;;;;:::o;14398:559::-;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;14581:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;14605:10:::2;12380:5;12386:10;12380:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;12413:1;12380:34;12372:63;;;::::0;-1:-1:-1;;;12372:63:0;;15423:2:1;12372:63:0::2;::::0;::::2;15405:21:1::0;15462:2;15442:18;;;15435:30;-1:-1:-1;;;15481:18:1;;;15474:46;15537:18;;12372:63:0::2;15221:340:1::0;12372:63:0::2;14675:14:::3;:21;14650:14;:21;:46;14628:152;;;;-1:-1:-1::0;;;14628:152:0::3;;;;;;;:::i;:::-;14830:119;;;;;;;;14879:14;14830:119;;;;14923:14;14830:119;;::::0;14791:5:::3;14797:10;14791:17;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;:158;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;14791:158:0::3;::::0;;::::3;::::0;;;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;:::i;:::-;-1:-1:-1::0;;;;;;;;14398:559:0:o;13836:212::-;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;13955:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;13979:10:::2;12380:5;12386:10;12380:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;12413:1;12380:34;12372:63;;;::::0;-1:-1:-1;;;12372:63:0;;15423:2:1;12372:63:0::2;::::0;::::2;15405:21:1::0;15462:2;15442:18;;;15435:30;-1:-1:-1;;;15481:18:1;;;15474:46;15537:18;;12372:63:0::2;15221:340:1::0;12372:63:0::2;14031:9:::3;14002:5;14008:10;14002:17;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;:38;;;;11885:1:::2;2144::::1;13836:212:::0;;:::o;21486:1502::-;11834:5;:12;21548:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;21612:35:::1;21624:10;21636;21612:11;:35::i;:::-;21590:111;;;::::0;-1:-1:-1;;;21590:111:0;;16193:2:1;21590:111:0::1;::::0;::::1;16175:21:1::0;16232:2;16212:18;;;16205:30;16271:28;16251:18;;;16244:56;16317:18;;21590:111:0::1;15991:350:1::0;21590:111:0::1;21712:18;21733:37;21747:10;21759;21733:13;:37::i;:::-;21817:24;::::0;;;:12:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;;21817:24:0::1;21803:10;:38;21781:122;;;::::0;-1:-1:-1;;;21781:122:0;;16548:2:1;21781:122:0::1;::::0;::::1;16530:21:1::0;16587:2;16567:18;;;16560:30;16626:34;16606:18;;;16599:62;-1:-1:-1;;;16677:18:1;;;16670:32;16719:19;;21781:122:0::1;16346:398:1::0;21781:122:0::1;21914:20;21937:6;21944:10;21937:18;;;;;;;;:::i;:::-;;;;;;;;;;;21914:41;;22014:15;21988:6;:23;;;:41;21966:118;;;::::0;-1:-1:-1;;;21966:118:0;;16951:2:1;21966:118:0::1;::::0;::::1;16933:21:1::0;16990:2;16970:18;;;16963:30;17029:29;17009:18;;;17002:57;17076:18;;21966:118:0::1;16749:351:1::0;21966:118:0::1;22138:13;::::0;;::::1;::::0;22186:19:::1;::::0;::::1;::::0;22243:22:::1;::::0;::::1;::::0;22276:14:::1;::::0;::::1;:21:::0;;-1:-1:-1;;22276:21:0::1;22293:4;22276:21;::::0;;22308:17;;22138:13;;22186:19;;22243:22;;22138:13;;22314:10;;22308:17;::::1;;;;;:::i;:::-;;;;;;;;;;;:33;;;:44;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;22395:20:0;;22391:218:::1;;22450:8;::::0;:47:::1;::::0;-1:-1:-1;;;22450:47:0;;22468:10:::1;22450:47;::::0;::::1;17279:51:1::0;17346:18;;;17339:34;;;22432:15:0::1;::::0;-1:-1:-1;;;;;22450:8:0::1;::::0;:17:::1;::::0;17252:18:1;;22450:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22432:65;;22517:10;22512:86;;22555:27;::::0;-1:-1:-1;;;22555:27:0;;22571:10:::1;22555:27;::::0;::::1;2673:51:1::0;2646:18;;22555:27:0::1;2527:203:1::0;22512:86:0::1;22417:192;22391:218;22619:12;22635:5;22641:10;22635:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:30:::0;-1:-1:-1;;;;;22635:30:0::1;:39;22689:10;22714:32;22730:16:::0;22714:13;:32:::1;:::i;:::-;22635:122;::::0;-1:-1:-1;;;;;;22635:122:0::1;::::0;;;;;;-1:-1:-1;;;;;17297:32:1;;;22635:122:0::1;::::0;::::1;17279:51:1::0;17346:18;;;17339:34;17252:18;;22635:122:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:185;;;;;22761:5;22767:10;22761:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:29;;::::0;:59:::1;::::0;-1:-1:-1;;;22761:59:0;;22800:10:::1;22761:59;::::0;::::1;17279:51:1::0;17346:18;;;17339:34;;;-1:-1:-1;;;;;22761:29:0;;::::1;::::0;:38:::1;::::0;17252:18:1;;22761:59:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22619:202;;22837:7;22832:75;;22868:27;::::0;-1:-1:-1;;;22868:27:0;;22884:10:::1;22868:27;::::0;::::1;2673:51:1::0;2646:18;;22868:27:0::1;2527:203:1::0;22832:75:0::1;22922:58;::::0;;17558:25:1;;;17614:2;17599:18;;17592:34;;;22960:10:0;;22936::::1;::::0;22922:58:::1;::::0;17531:18:1;22922:58:0::1;;;;;;;21560:1428;;;;;;21486:1502:::0;;:::o;15356:87::-;15397:13;15430:5;15423:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15423:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15423:12:0;;;;-1:-1:-1;;;15423:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15356:87;:::o;2882:103::-;2120:13;:11;:13::i;:::-;2947:30:::1;2974:1;2947:18;:30::i;:::-;2882:103::o:0;18174:444::-;11834:5;:12;18422:7;;18339:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;18380:10:::1;18392;12102:5;12108:10;12102:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:17;::::0;;::::1;;:36;:57:::0;12072:87:::1;::::0;::::1;;12050:173;;;;-1:-1:-1::0;;;12050:173:0::1;;;;;;;:::i;:::-;18447:20:::2;18470:5;18476:10;18470:17;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;:78;;18549:10;18470:90;;;;;;;;;;:::i;:::-;;;;;;;;;18447:113;;18605:5;18589:12;18579:7;:22;;;;:::i;:::-;18578:32;;;;:::i;:::-;18571:39:::0;18174:444;-1:-1:-1;;;;;;;;18174:444:0:o;10585:1126::-;2120:13;:11;:13::i;:::-;10864:14:::1;:21;10839:14;:21;:46;10817:152;;;;-1:-1:-1::0;;;10817:152:0::1;;;;;;;:::i;:::-;11005:436;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;11005:436:0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;11005:436:0;;;;;;;;;;;;11210:143;;;;::::1;::::0;;;;;;;;::::1;::::0;;;11005:436;;;;;;;;;;;;;;;;;;10980:5:::1;:472:::0;;11005:436;10980:472;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;10980:472:0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;11005:436;;10980:472;;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;10980:472:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;10980:472:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;10980:472:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;11521:5:::1;:12:::0;:16:::1;::::0;-1:-1:-1;;11521:16:0::1;:::i;:::-;11491:212;11560:13;11597:12;11625:9;11649:14;11678;11491:212;;;;;;;;;;:::i;:::-;;;;;;;;10585:1126:::0;;;;;:::o;15072:182::-;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;15165:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;15219:5:::2;15225:10;15219:17;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;;;;;;;;;;15218:28;15188:5;15194:10;15188:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:27;;:58:::0;;-1:-1:-1;;15188:58:0::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;;15072:182:0:o;8611:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8516:51::-;;;;;;;;;;;;;;;;;;;;23153:870;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;23245:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;23268:16:::2;23368:5;23374:10;23368:17;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;23287:5;23293:10;23287:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:29;;::::0;:78:::2;::::0;-1:-1:-1;;;23287:78:0;;23349:4:::2;23287:78;::::0;::::2;2673:51:1::0;-1:-1:-1;;;;;23287:29:0;;::::2;::::0;:39:::2;::::0;2646:18:1;;23287:78:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:114;;;;:::i;:::-;23268:133;;23445:1;23434:8;:12;23412:109;;;::::0;-1:-1:-1;;;23412:109:0;;19432:2:1;23412:109:0::2;::::0;::::2;19414:21:1::0;19471:2;19451:18;;;19444:30;19510:34;19490:18;;;19483:62;-1:-1:-1;;;19561:18:1;;;19554:45;19616:19;;23412:109:0::2;19230:411:1::0;23412:109:0::2;23563:5;23569:10;23563:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:27:::2;:17;::::0;;::::2;;:27;::::0;::::2;;23558:91;;23607:30;23626:10;23607:18;:30::i;:::-;23680:12;23695:5;23701:10;23695:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:29;;::::0;:97:::2;::::0;-1:-1:-1;;;23695:97:0;;23748:10:::2;23695:97;::::0;::::2;17279:51:1::0;17346:18;;;17339:34;;;-1:-1:-1;;;;;23695:29:0;;::::2;::::0;:38:::2;::::0;17252:18:1;;23695:97:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23680:112;;23808:7;23803:67;;23839:19;;-1:-1:-1::0;;;23839:19:0::2;;;;;;;;;;;23803:67;23885:130;::::0;;23966:15:::2;17558:25:1::0;;17614:2;17599:18;;17592:34;;;23941:10:0;;23916::::2;::::0;23885:130:::2;::::0;17531:18:1;23885:130:0::2;;;;;;;23257:766;;2144:1:::1;23153:870:::0;:::o;17132:567::-;-1:-1:-1;;;;;17288:22:0;;17236:7;17288:22;;;:15;:22;;;;;;;;17256:54;;;;;;;;;;;;;;;;;17236:7;;17256:54;;17288:22;17256:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17329:12;:19;17352:1;17329:24;17321:63;;;;-1:-1:-1;;;17321:63:0;;16193:2:1;17321:63:0;;;16175:21:1;16232:2;16212:18;;;16205:30;16271:28;16251:18;;;16244:56;16317:18;;17321:63:0;15991:350:1;17321:63:0;-1:-1:-1;;;;;17421:21:0;;17395:23;17421:21;;;:14;:21;;;;;;;;17395:47;;;;;;;;;;;;;;;;;;;17421:21;;17395:47;;;17421:21;17395:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17453:18;17487:13;17503:1;17487:17;;17482:182;17514:6;:13;17506:5;:21;17482:182;;;17574:10;17557:6;17564:5;17557:13;;;;;;;;:::i;:::-;;;;;;;:27;17553:100;;17618:12;17631:5;17618:19;;;;;;;;:::i;:::-;;;;;;;17605:32;;17553:100;17529:7;;;;:::i;:::-;;;;17482:182;;;-1:-1:-1;17681:10:0;-1:-1:-1;;;17132:567:0;;;;;:::o;8452:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8452:19:0;;;;-1:-1:-1;8452:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8452:19:0;;;;-1:-1:-1;;;8452:19:0;;;;;;;;;;;;;;;:::o;15616:148::-;15731:25;;;;:13;:25;;;;;;;;;15724:32;;;;;;;;;;;;;;;;;15695:16;;15724:32;;;15731:25;15724:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15724:32:0;;;;;;;;;;;;;;;;;;;;;;;15616:148;;;:::o;8796:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8796:50:0;;-1:-1:-1;8796:50:0;;-1:-1:-1;8796:50:0:o;12695:557::-;-1:-1:-1;;;;;12840:21:0;;12797:4;12840:21;;;:14;:21;;;;;;;;12814:47;;;;;;;;;;;;;;;;;12797:4;;12814:47;;12840:21;12814:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12877:13;12872:350;12904:6;:13;12896:5;:21;12872:350;;;12964:10;12947:6;12954:5;12947:13;;;;;;;;:::i;:::-;;;;;;;:27;12943:268;;-1:-1:-1;;;;;13016:22:0;;12995:18;13016:22;;;:15;:22;;;;;:29;;13039:5;;13016:29;;;;;;:::i;:::-;;;;;;;;;12995:50;;13064:18;13085:6;13092:10;13085:18;;;;;;;;:::i;:::-;;;;;;;;;;13064:39;;;;;;;;13085:18;;;;;;;13064:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13122:74:0;;13172:4;13165:11;;;;;;;;13122:74;12976:235;;12943:268;12919:7;;;;:::i;:::-;;;;12872:350;;;-1:-1:-1;13239:5:0;;12695:557;-1:-1:-1;;;;12695:557:0:o;16508:354::-;11834:5;:12;16612:7;;16591:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;16632:17:::1;16652:175;16682:5;16688:10;16682:17;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;16723:10;16814:1;16754:5;16760:10;16754:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:50;:17:::1;::::0;;::::1;;:50:::0;:57;:61:::1;::::0;;::::1;:::i;16652:175::-;16632:195:::0;16508:354;-1:-1:-1;;;;16508:354:0:o;7905:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7905:21:0;;;;;;;;;;;;;;;;;:::o;3140:201::-;2120:13;:11;:13::i;:::-;-1:-1:-1;;;;;3229:22:0;::::1;3221:73;;;::::0;-1:-1:-1;;;3221:73:0;;19988:2:1;3221:73:0::1;::::0;::::1;19970:21:1::0;20027:2;20007:18;;;20000:30;20066:34;20046:18;;;20039:62;-1:-1:-1;;;20117:18:1;;;20110:36;20163:19;;3221:73:0::1;19786:402:1::0;3221:73:0::1;3305:28;3324:8;3305:18;:28::i;:::-;3140:201:::0;:::o;15928:381::-;-1:-1:-1;;;;;16046:24:0;;16014:29;16046:24;;;:15;:24;;;;;;;;16014:56;;;;;;;;;;;;;;;;;15987:14;;16014:29;:56;;16046:24;16014:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16081:22;16118:12;:19;16106:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16106:32:0;;;;;;;;;;;;;;;;;16081:57;;16154:13;16149:128;16181:7;:14;16173:5;:22;16149:128;;;16238:6;16245:12;16258:5;16245:19;;;;;;;;:::i;:::-;;;;;;;16238:27;;;;;;;;:::i;:::-;;;;;;;;;;16221:44;;;;;;;;16238:27;;;;;;;16221:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;;:7;;16229:5;;16221:14;;;;;;:::i;:::-;;;;;;:44;;;;16197:7;;;;;:::i;:::-;;;;16149:128;;;-1:-1:-1;16294:7:0;15928:381;-1:-1:-1;;;15928:381:0:o;2399:132::-;2280:7;2307:6;-1:-1:-1;;;;;2307:6:0;861:10;2463:23;2455:68;;;;-1:-1:-1;;;2455:68:0;;20395:2:1;2455:68:0;;;20377:21:1;;;20414:18;;;20407:30;20473:34;20453:18;;;20446:62;20525:18;;2455:68:0;20193:356:1;3501:191:0;3575:16;3594:6;;-1:-1:-1;;;;;3611:17:0;;;-1:-1:-1;;;;;;3611:17:0;;;;;;3644:40;;3594:6;;;;;;;3644:40;;3575:16;3644:40;3564:128;3501:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:156:1;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:387::-;259:6;267;275;283;336:3;324:9;315:7;311:23;307:33;304:53;;;353:1;350;343:12;304:53;389:9;376:23;366:33;;446:2;435:9;431:18;418:32;408:42;;497:2;486:9;482:18;469:32;459:42;;520:36;552:2;541:9;537:18;520:36;:::i;:::-;510:46;;175:387;;;;;;;:::o;567:127::-;628:10;623:3;619:20;616:1;609:31;659:4;656:1;649:15;683:4;680:1;673:15;699:902;753:5;806:3;799:4;791:6;787:17;783:27;773:55;;824:1;821;814:12;773:55;860:6;847:20;886:4;909:18;946:2;942;939:10;936:36;;;952:18;;:::i;:::-;998:2;995:1;991:10;1030:2;1024:9;1093:2;1089:7;1084:2;1080;1076:11;1072:25;1064:6;1060:38;1148:6;1136:10;1133:22;1128:2;1116:10;1113:18;1110:46;1107:72;;;1159:18;;:::i;:::-;1195:2;1188:22;1245:18;;;1321:15;;;1317:24;;;1279:15;;;;-1:-1:-1;1353:15:1;;;1350:35;;;1381:1;1378;1371:12;1350:35;1417:2;1409:6;1405:15;1394:26;;1429:142;1445:6;1440:3;1437:15;1429:142;;;1511:17;;1499:30;;1549:12;;;;1462;;;;1429:142;;;1589:6;699:902;-1:-1:-1;;;;;;;699:902:1:o;1606:663::-;1733:6;1741;1749;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1854:9;1841:23;1831:33;;1915:2;1904:9;1900:18;1887:32;1938:18;1979:2;1971:6;1968:14;1965:34;;;1995:1;1992;1985:12;1965:34;2018:61;2071:7;2062:6;2051:9;2047:22;2018:61;:::i;:::-;2008:71;;2132:2;2121:9;2117:18;2104:32;2088:48;;2161:2;2151:8;2148:16;2145:36;;;2177:1;2174;2167:12;2145:36;;2200:63;2255:7;2244:8;2233:9;2229:24;2200:63;:::i;:::-;2190:73;;;1606:663;;;;;:::o;2274:248::-;2342:6;2350;2403:2;2391:9;2382:7;2378:23;2374:32;2371:52;;;2419:1;2416;2409:12;2371:52;-1:-1:-1;;2442:23:1;;;2512:2;2497:18;;;2484:32;;-1:-1:-1;2274:248:1:o;2735:180::-;2794:6;2847:2;2835:9;2826:7;2822:23;2818:32;2815:52;;;2863:1;2860;2853:12;2815:52;-1:-1:-1;2886:23:1;;2735:180;-1:-1:-1;2735:180:1:o;2920:446::-;2984:3;3022:5;3016:12;3049:6;3044:3;3037:19;3075:4;3104:2;3099:3;3095:12;3088:19;;3141:2;3134:5;3130:14;3162:1;3172:169;3186:6;3183:1;3180:13;3172:169;;;3247:13;;3235:26;;3281:12;;;;3316:15;;;;3208:1;3201:9;3172:169;;;-1:-1:-1;3357:3:1;;2920:446;-1:-1:-1;;;;;2920:446:1:o;3371:411::-;3432:3;3476:5;3470:12;3503:4;3498:3;3491:17;3529:69;3592:4;3587:3;3583:14;3569:12;3529:69;:::i;:::-;3517:81;;3646:4;3639:5;3635:16;3629:23;3694:3;3688:4;3684:14;3677:4;3672:3;3668:14;3661:38;3715:61;3771:4;3755:14;3715:61;:::i;:::-;3708:68;3371:411;-1:-1:-1;;;;;3371:411:1:o;3787:1562::-;3971:4;4000:2;4040;4029:9;4025:18;4070:2;4059:9;4052:21;4093:6;4128;4122:13;4159:6;4151;4144:22;4185:2;4175:12;;4218:2;4207:9;4203:18;4196:25;;4280:2;4270:6;4267:1;4263:14;4252:9;4248:30;4244:39;4318:2;4310:6;4306:15;4339:1;4349:971;4363:6;4360:1;4357:13;4349:971;;;4428:22;;;-1:-1:-1;;4424:36:1;4412:49;;4484:13;;4598:9;;-1:-1:-1;;;;;4594:18:1;;;4579:34;;4660:11;;;4654:18;4650:27;4633:15;;;4626:52;4721:11;;;4715:18;4698:15;;;4691:43;4757:4;4804:11;;;4798:18;4781:15;;;4774:43;4840:4;4883:11;;;4877:18;4520:4;4915:15;;;4908:27;;;4520:4;4840;4962:67;5013:15;;;4877:18;4962:67;:::i;:::-;5052:4;5113:11;;;5107:18;5100:26;5093:34;5076:15;;;5069:59;5151:4;5198:11;;;5192:18;5175:15;;;;5168:43;;;;-1:-1:-1;;;5298:12:1;;;;5263:15;;;;4385:1;4378:9;4349:971;;;-1:-1:-1;5337:6:1;;3787:1562;-1:-1:-1;;;;;;;;3787:1562:1:o;5354:131::-;-1:-1:-1;;;;;5429:31:1;;5419:42;;5409:70;;5475:1;5472;5465:12;5490:247;5549:6;5602:2;5590:9;5581:7;5577:23;5573:32;5570:52;;;5618:1;5615;5608:12;5570:52;5657:9;5644:23;5676:31;5701:5;5676:31;:::i;:::-;5726:5;5490:247;-1:-1:-1;;;5490:247:1:o;5934:318::-;6009:6;6017;6025;6078:2;6066:9;6057:7;6053:23;6049:32;6046:52;;;6094:1;6091;6084:12;6046:52;6130:9;6117:23;6107:33;;6187:2;6176:9;6172:18;6159:32;6149:42;;6210:36;6242:2;6231:9;6227:18;6210:36;:::i;:::-;6200:46;;5934:318;;;;;:::o;6439:969::-;6612:6;6620;6628;6636;6644;6697:3;6685:9;6676:7;6672:23;6668:33;6665:53;;;6714:1;6711;6704:12;6665:53;6753:9;6740:23;6772:31;6797:5;6772:31;:::i;:::-;6822:5;-1:-1:-1;6879:2:1;6864:18;;6851:32;6892:33;6851:32;6892:33;:::i;:::-;6944:7;-1:-1:-1;6998:2:1;6983:18;;6970:32;;-1:-1:-1;7053:2:1;7038:18;;7025:32;7076:18;7106:14;;;7103:34;;;7133:1;7130;7123:12;7103:34;7156:61;7209:7;7200:6;7189:9;7185:22;7156:61;:::i;:::-;7146:71;;7270:3;7259:9;7255:19;7242:33;7226:49;;7300:2;7290:8;7287:16;7284:36;;;7316:1;7313;7306:12;7284:36;;7339:63;7394:7;7383:8;7372:9;7368:24;7339:63;:::i;:::-;7329:73;;;6439:969;;;;;;;;:::o;7413:315::-;7481:6;7489;7542:2;7530:9;7521:7;7517:23;7513:32;7510:52;;;7558:1;7555;7548:12;7510:52;7597:9;7584:23;7616:31;7641:5;7616:31;:::i;:::-;7666:5;7718:2;7703:18;;;;7690:32;;-1:-1:-1;;;7413:315:1:o;7733:::-;7801:6;7809;7862:2;7850:9;7841:7;7837:23;7833:32;7830:52;;;7878:1;7875;7868:12;7830:52;7914:9;7901:23;7891:33;;7974:2;7963:9;7959:18;7946:32;7987:31;8012:5;7987:31;:::i;:::-;8037:5;8027:15;;;7733:315;;;;;:::o;8053:814::-;-1:-1:-1;;;;;8480:15:1;;;8462:34;;8532:15;;8527:2;8512:18;;8505:43;8579:2;8564:18;;8557:34;;;8622:2;8607:18;;8600:34;;;8671:3;8665;8650:19;;8643:32;;;8405:4;;8692:65;;8737:19;;8729:6;8692:65;:::i;:::-;8801:14;;8794:22;8788:3;8773:19;;8766:51;-1:-1:-1;8848:3:1;8833:19;8826:35;8684:73;8053:814;-1:-1:-1;;;;;8053:814:1:o;8872:658::-;9043:2;9095:21;;;9165:13;;9068:18;;;9187:22;;;9014:4;;9043:2;9266:15;;;;9240:2;9225:18;;;9014:4;9309:195;9323:6;9320:1;9317:13;9309:195;;;9388:13;;-1:-1:-1;;;;;9384:39:1;9372:52;;9479:15;;;;9444:12;;;;9420:1;9338:9;9309:195;;;-1:-1:-1;9521:3:1;;8872:658;-1:-1:-1;;;;;;8872:658:1:o;10458:1266::-;10673:2;10725:21;;;10795:13;;10698:18;;;10817:22;;;10644:4;;10673:2;10858;;10876:18;;;;10917:15;;;10644:4;10960:738;10974:6;10971:1;10968:13;10960:738;;;11033:13;;11071:9;;11059:22;;11125:11;;;11119:18;11139:4;11115:29;11101:12;;;11094:51;11185:11;;;11179:18;11165:12;;;11158:40;11221:4;11265:11;;;11259:18;11245:12;;;11238:40;11301:4;11345:11;;;11339:18;11325:12;;;11318:40;11381:4;11425:11;;;11419:18;11405:12;;;11398:40;11461:4;11505:11;;;11499:18;11485:12;;;11478:40;11541:4;11599:11;;;11593:18;11586:26;11579:34;11565:12;;;11558:56;11643:6;11634:16;;;;11673:15;;;;10996:1;10989:9;10960:738;;;-1:-1:-1;11715:3:1;;10458:1266;-1:-1:-1;;;;;;;10458:1266:1:o;11729:347::-;11931:2;11913:21;;;11970:2;11950:18;;;11943:30;12009:25;12004:2;11989:18;;11982:53;12067:2;12052:18;;11729:347::o;12081:127::-;12142:10;12137:3;12133:20;12130:1;12123:31;12173:4;12170:1;12163:15;12197:4;12194:1;12187:15;12213:400;12415:2;12397:21;;;12454:2;12434:18;;;12427:30;12493:34;12488:2;12473:18;;12466:62;-1:-1:-1;;;12559:2:1;12544:18;;12537:34;12603:3;12588:19;;12213:400::o;13316:127::-;13377:10;13372:3;13368:20;13365:1;13358:31;13408:4;13405:1;13398:15;13432:4;13429:1;13422:15;13448:125;13513:9;;;13534:10;;;13531:36;;;13547:18;;:::i;13929:168::-;14002:9;;;14033;;14050:15;;;14044:22;;14030:37;14020:71;;14071:18;;:::i;14482:277::-;14549:6;14602:2;14590:9;14581:7;14577:23;14573:32;14570:52;;;14618:1;14615;14608:12;14570:52;14650:9;14644:16;14703:5;14696:13;14689:21;14682:5;14679:32;14669:60;;14725:1;14722;14715:12;14764:128;14831:9;;;14852:11;;;14849:37;;;14866:18;;:::i;15566:420::-;15768:2;15750:21;;;15807:2;15787:18;;;15780:30;15846:34;15841:2;15826:18;;15819:62;15917:26;15912:2;15897:18;;15890:54;15976:3;15961:19;;15566:420::o;17637:217::-;17677:1;17703;17693:132;;17747:10;17742:3;17738:20;17735:1;17728:31;17782:4;17779:1;17772:15;17810:4;17807:1;17800:15;17693:132;-1:-1:-1;17839:9:1;;17637:217::o;18299:737::-;-1:-1:-1;;;;;18678:15:1;;;18660:34;;18730:15;;18725:2;18710:18;;18703:43;18777:2;18762:18;;18755:34;;;18640:3;18820:2;18805:18;;18798:31;;;18603:4;;18852:57;;18889:19;;18881:6;18852:57;:::i;:::-;18958:9;18950:6;18946:22;18940:3;18929:9;18925:19;18918:51;18986:44;19023:6;19015;18986:44;:::i;19041:184::-;19111:6;19164:2;19152:9;19143:7;19139:23;19135:32;19132:52;;;19180:1;19177;19170:12;19132:52;-1:-1:-1;19203:16:1;;19041:184;-1:-1:-1;19041:184:1:o;19646:135::-;19685:3;19706:17;;;19703:43;;19726:18;;:::i;:::-;-1:-1:-1;19773:1:1;19762:13;;19646:135::o
Swarm Source
ipfs://d66d6a7264e80ccb0bd4b84a8926e01e1857808ddd54550249e2e5b5c671b5fd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.