More Info
Private Name Tags
Latest 25 from a total of 2,187 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Farmed ... | 11292305 | 1473 days ago | IN | 0 ETH | 0.00269589 | ||||
Yield | 11292305 | 1473 days ago | IN | 0.05 ETH | 0.0058692 | ||||
Withdraw Farmed ... | 11287853 | 1474 days ago | IN | 0 ETH | 0.00278756 | ||||
Add To Stake | 11285398 | 1474 days ago | IN | 0 ETH | 0.00512767 | ||||
Add To Stake | 11285387 | 1474 days ago | IN | 0 ETH | 0.00450316 | ||||
Add To Farm | 11285363 | 1474 days ago | IN | 0 ETH | 0.00359639 | ||||
Add To Farm | 11285349 | 1474 days ago | IN | 0 ETH | 0.00359639 | ||||
Add To Farm | 11278854 | 1475 days ago | IN | 0 ETH | 0.00745594 | ||||
Add To Farm | 11278842 | 1475 days ago | IN | 0 ETH | 0.00657877 | ||||
Add To Farm | 11278831 | 1475 days ago | IN | 0 ETH | 0.00657877 | ||||
Add To Farm | 11278824 | 1475 days ago | IN | 0 ETH | 0.00618994 | ||||
Stake | 11259585 | 1478 days ago | IN | 0 ETH | 0.00268725 | ||||
Yield | 11259567 | 1478 days ago | IN | 0.05 ETH | 0.00152164 | ||||
Withdraw Farmed ... | 11245856 | 1480 days ago | IN | 0 ETH | 0.00077908 | ||||
Yield | 11245856 | 1480 days ago | IN | 0.05 ETH | 0.00094426 | ||||
Claim Reward | 11245513 | 1481 days ago | IN | 0.01 ETH | 0.0058968 | ||||
Claim Staked Tok... | 11245499 | 1481 days ago | IN | 0 ETH | 0.0049845 | ||||
Claim Staked Tok... | 11245499 | 1481 days ago | IN | 0 ETH | 0.0049845 | ||||
Withdraw Farmed ... | 11236416 | 1482 days ago | IN | 0 ETH | 0.00244296 | ||||
Claim Staked Tok... | 11230319 | 1483 days ago | IN | 0 ETH | 0.0012053 | ||||
Claim Reward | 11230319 | 1483 days ago | IN | 0.01 ETH | 0.0017006 | ||||
Claim Staked Tok... | 11230319 | 1483 days ago | IN | 0 ETH | 0.00308594 | ||||
Claim Reward | 11230319 | 1483 days ago | IN | 0.01 ETH | 0.00170294 | ||||
Claim Reward | 11230187 | 1483 days ago | IN | 0.01 ETH | 0.00114621 | ||||
Claim Reward | 11230183 | 1483 days ago | IN | 0.01 ETH | 0.00334124 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11292305 | 1473 days ago | 0.05 ETH | ||||
11259567 | 1478 days ago | 0.05 ETH | ||||
11245856 | 1480 days ago | 0.05 ETH | ||||
11245513 | 1481 days ago | 0.01 ETH | ||||
11230183 | 1483 days ago | 0.01 ETH | ||||
11216568 | 1485 days ago | 0.01 ETH | ||||
11210351 | 1486 days ago | 0.05 ETH | ||||
11187149 | 1489 days ago | 0.05 ETH | ||||
11187133 | 1489 days ago | 0.05 ETH | ||||
11164077 | 1493 days ago | 0.01 ETH | ||||
11142464 | 1496 days ago | 0.01 ETH | ||||
11142454 | 1496 days ago | 0.01 ETH | ||||
11140938 | 1497 days ago | 0.05 ETH | ||||
11135809 | 1497 days ago | 0.01 ETH | ||||
11128939 | 1498 days ago | 0.05 ETH | ||||
11125131 | 1499 days ago | 0.05 ETH | ||||
11118434 | 1500 days ago | 0.01 ETH | ||||
11114719 | 1501 days ago | 0.01 ETH | ||||
11108053 | 1502 days ago | 0.05 ETH | ||||
11102206 | 1503 days ago | 0.05 ETH | ||||
11101612 | 1503 days ago | 0.01 ETH | ||||
11092448 | 1504 days ago | 0.05 ETH | ||||
11088029 | 1505 days ago | 0.01 ETH | ||||
11087220 | 1505 days ago | 0.01 ETH | ||||
11077255 | 1506 days ago | 0.01 ETH |
Loading...
Loading
Contract Name:
SYFP_STAKE_FARM
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-16 */ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.6.0; // ---------------------------------------------------------------------------- // Owned contract // ---------------------------------------------------------------------------- contract Owned { address payable public owner; event OwnershipTransferred(address indexed _from, address indexed _to); constructor() public { owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner); _; } function transferOwnership(address payable _newOwner) public onlyOwner { owner = _newOwner; emit OwnershipTransferred(msg.sender, _newOwner); } } // ---------------------------------------------------------------------------- // ERC Token Standard #20 Interface // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md // ---------------------------------------------------------------------------- abstract contract ERC20Interface { function totalSupply() public virtual view returns (uint); function balanceOf(address tokenOwner) public virtual view returns (uint256 balance); function allowance(address tokenOwner, address spender) public virtual view returns (uint256 remaining); function transfer(address to, uint256 tokens) public virtual returns (bool success); function approve(address spender, uint256 tokens) public virtual returns (bool success); function transferFrom(address from, address to, uint256 tokens) public virtual returns (bool success); event Transfer(address indexed from, address indexed to, uint256 tokens); event Approval(address indexed tokenOwner, address indexed spender, uint256 tokens); } /** * @title SafeMath * @dev Math operations with safety checks that throw on error * */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } function ceil(uint a, uint m) internal pure returns (uint r) { return (a + m - 1) / m * m; } } interface ISYFP{ function transferFrom(address from, address to, uint256 tokens) external returns (bool success); function transfer(address to, uint256 tokens) external returns (bool success); function mint(address to, uint256 _mint_amount) external; } contract SYFP_STAKE_FARM is Owned{ using SafeMath for uint256; uint256 public yieldCollectionFee = 0.05 ether; uint256 public stakingPeriod = 2 weeks; uint256 public stakeClaimFee = 0.01 ether; uint256 public totalYield; uint256 public totalRewards; address public SYFP = 0xC11396e14990ebE98a09F8639a082C03Eb9dB55a; struct Tokens{ bool exists; uint256 rate; uint256 stakedTokens; } mapping(address => Tokens) public tokens; address[] TokensAddresses; struct DepositedToken{ uint256 activeDeposit; uint256 totalDeposits; uint256 startTime; uint256 pendingGains; uint256 lastClaimedDate; uint256 totalGained; uint rate; uint period; } mapping(address => mapping(address => DepositedToken)) users; event TokenAdded(address indexed tokenAddress, uint256 indexed APY); event TokenRemoved(address indexed tokenAddress, uint256 indexed APY); event FarmingRateChanged(address indexed tokenAddress, uint256 indexed newAPY); event YieldCollectionFeeChanged(uint256 indexed yieldCollectionFee); event FarmingStarted(address indexed _tokenAddress, uint256 indexed _amount); event YieldCollected(address indexed _tokenAddress, uint256 indexed _yield); event AddedToExistingFarm(address indexed _tokenAddress, uint256 indexed tokens); event Staked(address indexed staker, uint256 indexed tokens); event AddedToExistingStake(address indexed staker, uint256 indexed tokens); event StakingRateChanged(uint256 indexed newAPY); event TokensClaimed(address indexed claimer, uint256 indexed stakedTokens); event RewardClaimed(address indexed claimer, uint256 indexed reward); constructor() public { owner = 0xf64df26Fb32Ce9142393C31f01BB1689Ff7b29f5; // add syfp token to ecosystem _addToken(0xC11396e14990ebE98a09F8639a082C03Eb9dB55a, 4000000); //SYFP _addToken(0xdAC17F958D2ee523a2206206994597C13D831ec7, 14200); // USDT _addToken(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, 14200); // USDC _addToken(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 5200000); // WETH _addToken(0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e, 297300000); // YFI _addToken(0x45f24BaEef268BB6d63AEe5129015d69702BCDfa, 230000); // YFV _addToken(0x96d62cdCD1cc49cb6eE99c867CB8812bea86B9FA, 300000); // yfp } //#########################################################################################################################################################// //####################################################FARMING EXTERNAL FUNCTIONS###########################################################################// //#########################################################################################################################################################// // ------------------------------------------------------------------------ // Add assets to farm // @param _tokenAddress address of the token asset // @param _amount amount of tokens to deposit // ------------------------------------------------------------------------ function Farm(address _tokenAddress, uint256 _amount) external{ require(_tokenAddress != SYFP, "Use staking instead"); // add to farm _newDeposit(_tokenAddress, _amount); // transfer tokens from user to the contract balance require(ISYFP(_tokenAddress).transferFrom(msg.sender, address(this), _amount)); emit FarmingStarted(_tokenAddress, _amount); } // ------------------------------------------------------------------------ // Add more deposits to already running farm // @param _tokenAddress address of the token asset // @param _amount amount of tokens to deposit // ------------------------------------------------------------------------ function AddToFarm(address _tokenAddress, uint256 _amount) external{ require(_tokenAddress != SYFP, "use staking instead"); _addToExisting(_tokenAddress, _amount); // move the tokens from the caller to the contract address require(ISYFP(_tokenAddress).transferFrom(msg.sender,address(this), _amount)); emit AddedToExistingFarm(_tokenAddress, _amount); } // ------------------------------------------------------------------------ // Withdraw accumulated yield // @param _tokenAddress address of the token asset // @required must pay yield claim fee // ------------------------------------------------------------------------ function Yield(address _tokenAddress) public payable { require(msg.value >= yieldCollectionFee, "should pay exact claim fee"); require(PendingYield(_tokenAddress, msg.sender) > 0, "No pending yield"); require(tokens[_tokenAddress].exists, "Token doesn't exist"); require(_tokenAddress != SYFP, "use staking instead"); uint256 _pendingYield = PendingYield(_tokenAddress, msg.sender); // Global stats update totalYield = totalYield.add(_pendingYield); // update the record users[msg.sender][_tokenAddress].totalGained = users[msg.sender][_tokenAddress].totalGained.add(_pendingYield); users[msg.sender][_tokenAddress].lastClaimedDate = now; users[msg.sender][_tokenAddress].pendingGains = 0; // transfer fee to the owner owner.transfer(msg.value); // mint more tokens inside token contract equivalent to _pendingYield ISYFP(SYFP).mint(msg.sender, _pendingYield); emit YieldCollected(_tokenAddress, _pendingYield); } // ------------------------------------------------------------------------ // Withdraw any amount of tokens, the contract will update the farming // @param _tokenAddress address of the token asset // @param _amount amount of tokens to deposit // ------------------------------------------------------------------------ function WithdrawFarmedTokens(address _tokenAddress, uint256 _amount) public { require(users[msg.sender][_tokenAddress].activeDeposit >= _amount, "insufficient amount in farming"); require(_tokenAddress != SYFP, "use withdraw of staking instead"); // update farming stats // check if we have any pending yield, add it to previousYield var users[msg.sender][_tokenAddress].pendingGains = PendingYield(_tokenAddress, msg.sender); tokens[_tokenAddress].stakedTokens = tokens[_tokenAddress].stakedTokens.sub(_amount); // update amount users[msg.sender][_tokenAddress].activeDeposit = users[msg.sender][_tokenAddress].activeDeposit.sub(_amount); // update farming start time -- new farming will begin from this time onwards users[msg.sender][_tokenAddress].startTime = now; // reset last claimed figure as well -- new farming will begin from this time onwards users[msg.sender][_tokenAddress].lastClaimedDate = now; // withdraw the tokens and move from contract to the caller require(ISYFP(_tokenAddress).transfer(msg.sender, _amount)); emit TokensClaimed(msg.sender, _amount); } function yieldWithdraw(address _tokenAddress) external { Yield(_tokenAddress); WithdrawFarmedTokens(_tokenAddress, users[msg.sender][_tokenAddress].activeDeposit); } //#########################################################################################################################################################// //####################################################STAKING EXTERNAL FUNCTIONS###########################################################################// //#########################################################################################################################################################// // ------------------------------------------------------------------------ // Start staking // @param _tokenAddress address of the token asset // @param _amount amount of tokens to deposit // ------------------------------------------------------------------------ function Stake(uint256 _amount) external { // add new stake _newDeposit(SYFP, _amount); // transfer tokens from user to the contract balance require(ISYFP(SYFP).transferFrom(msg.sender, address(this), _amount)); emit Staked(msg.sender, _amount); } // ------------------------------------------------------------------------ // Add more deposits to already running farm // @param _tokenAddress address of the token asset // @param _amount amount of tokens to deposit // ------------------------------------------------------------------------ function AddToStake(uint256 _amount) external { require(now - users[msg.sender][SYFP].startTime < users[msg.sender][SYFP].period, "current staking expired"); _addToExisting(SYFP, _amount); // move the tokens from the caller to the contract address require(ISYFP(SYFP).transferFrom(msg.sender,address(this), _amount)); emit AddedToExistingStake(msg.sender, _amount); } // ------------------------------------------------------------------------ // Claim reward and staked tokens // @required user must be a staker // @required must be claimable // ------------------------------------------------------------------------ function ClaimStakedTokens() public { require(users[msg.sender][SYFP].activeDeposit > 0, "no running stake"); require(users[msg.sender][SYFP].startTime.add(users[msg.sender][SYFP].period) < now, "not claimable before staking period"); uint256 _currentDeposit = users[msg.sender][SYFP].activeDeposit; // check if we have any pending reward, add it to pendingGains var users[msg.sender][SYFP].pendingGains = PendingReward(msg.sender); tokens[SYFP].stakedTokens = tokens[SYFP].stakedTokens.sub(users[msg.sender][SYFP].activeDeposit); // update amount users[msg.sender][SYFP].activeDeposit = 0; // transfer staked tokens require(ISYFP(SYFP).transfer(msg.sender, _currentDeposit)); emit TokensClaimed(msg.sender, _currentDeposit); } function ClaimUnStake() external { ClaimReward(); ClaimStakedTokens(); } // ------------------------------------------------------------------------ // Claim reward and staked tokens // @required user must be a staker // @required must be claimable // ------------------------------------------------------------------------ function ClaimReward() public payable { require(msg.value >= stakeClaimFee, "should pay exact claim fee"); require(PendingReward(msg.sender) > 0, "nothing pending to claim"); uint256 _pendingReward = PendingReward(msg.sender); // add claimed reward to global stats totalRewards = totalRewards.add(_pendingReward); // add the reward to total claimed rewards users[msg.sender][SYFP].totalGained = users[msg.sender][SYFP].totalGained.add(_pendingReward); // update lastClaim amount users[msg.sender][SYFP].lastClaimedDate = now; // reset previous rewards users[msg.sender][SYFP].pendingGains = 0; // transfer the claim fee to the owner owner.transfer(msg.value); // mint more tokens inside token contract ISYFP(SYFP).mint(msg.sender, _pendingReward); emit RewardClaimed(msg.sender, _pendingReward); } //#########################################################################################################################################################// //##########################################################FARMING QUERIES################################################################################// //#########################################################################################################################################################// // ------------------------------------------------------------------------ // Query to get the pending yield // @param _tokenAddress address of the token asset // ------------------------------------------------------------------------ function PendingYield(address _tokenAddress, address _caller) public view returns(uint256 _pendingRewardWeis){ uint256 _totalFarmingTime = now.sub(users[_caller][_tokenAddress].lastClaimedDate); uint256 _reward_token_second = ((tokens[_tokenAddress].rate).mul(10 ** 21)).div(365 days); // added extra 10^21 uint256 yield = ((users[_caller][_tokenAddress].activeDeposit).mul(_totalFarmingTime.mul(_reward_token_second))).div(10 ** 27); // remove extra 10^21 // 10^2 are for 100 (%) return yield.add(users[_caller][_tokenAddress].pendingGains); } // ------------------------------------------------------------------------ // Query to get the active farm of the user // @param farming asset/ token address // ------------------------------------------------------------------------ function ActiveFarmDeposit(address _tokenAddress, address _user) external view returns(uint256 _activeDeposit){ return users[_user][_tokenAddress].activeDeposit; } // ------------------------------------------------------------------------ // Query to get the total farming of the user // @param farming asset/ token address // ------------------------------------------------------------------------ function YourTotalFarmingTillToday(address _tokenAddress, address _user) external view returns(uint256 _totalFarming){ return users[_user][_tokenAddress].totalDeposits; } // ------------------------------------------------------------------------ // Query to get the time of last farming of user // ------------------------------------------------------------------------ function LastFarmedOn(address _tokenAddress, address _user) external view returns(uint256 _unixLastFarmedTime){ return users[_user][_tokenAddress].startTime; } // ------------------------------------------------------------------------ // Query to get total earned rewards from particular farming // @param farming asset/ token address // ------------------------------------------------------------------------ function TotalFarmingRewards(address _tokenAddress, address _user) external view returns(uint256 _totalEarned){ return users[_user][_tokenAddress].totalGained; } //#########################################################################################################################################################// //####################################################FARMING ONLY OWNER FUNCTIONS#########################################################################// //#########################################################################################################################################################// // ------------------------------------------------------------------------ // Add supported tokens // @param _tokenAddress address of the token asset // @param _farmingRate rate applied for farming yield to produce // @required only owner or governance contract // ------------------------------------------------------------------------ function AddToken(address _tokenAddress, uint256 _rate) public onlyOwner { _addToken(_tokenAddress, _rate); } // ------------------------------------------------------------------------ // Remove tokens if no longer supported // @param _tokenAddress address of the token asset // @required only owner or governance contract // ------------------------------------------------------------------------ function RemoveToken(address _tokenAddress) public onlyOwner { require(tokens[_tokenAddress].exists, "token doesn't exist"); tokens[_tokenAddress].exists = false; emit TokenRemoved(_tokenAddress, tokens[_tokenAddress].rate); } // ------------------------------------------------------------------------ // Change farming rate of the supported token // @param _tokenAddress address of the token asset // @param _newFarmingRate new rate applied for farming yield to produce // @required only owner or governance contract // ------------------------------------------------------------------------ function ChangeFarmingRate(address _tokenAddress, uint256 _newFarmingRate) public onlyOwner{ require(tokens[_tokenAddress].exists, "token doesn't exist"); tokens[_tokenAddress].rate = _newFarmingRate; emit FarmingRateChanged(_tokenAddress, _newFarmingRate); } // ------------------------------------------------------------------------ // Change Yield collection fee // @param _fee fee to claim the yield // @required only owner or governance contract // ------------------------------------------------------------------------ function SetYieldCollectionFee(uint256 _fee) public onlyOwner{ yieldCollectionFee = _fee; emit YieldCollectionFeeChanged(_fee); } //#########################################################################################################################################################// //####################################################STAKING QUERIES######################################################################################// //#########################################################################################################################################################// // ------------------------------------------------------------------------ // Query to get the pending reward // ------------------------------------------------------------------------ function PendingReward(address _caller) public view returns(uint256 _pendingReward){ uint256 _totalStakedTime = 0; uint256 expiryDate = (users[_caller][SYFP].period).add(users[_caller][SYFP].startTime); if(now < expiryDate) _totalStakedTime = now.sub(users[_caller][SYFP].lastClaimedDate); else{ if(users[_caller][SYFP].lastClaimedDate >= expiryDate) // if claimed after expirydate already _totalStakedTime = 0; else _totalStakedTime = expiryDate.sub(users[_caller][SYFP].lastClaimedDate); } uint256 _reward_token_second = ((users[_caller][SYFP].rate).mul(10 ** 21)); // added extra 10^21 uint256 reward = ((users[_caller][SYFP].activeDeposit).mul(_totalStakedTime.mul(_reward_token_second))).div(10 ** 27); // remove extra 10^21 // the two extra 10^2 is for 100 (%) // another two extra 10^4 is for decimals to be allowed reward = reward.div(365 days); return (reward.add(users[_caller][SYFP].pendingGains)); } // ------------------------------------------------------------------------ // Query to get the active stake of the user // ------------------------------------------------------------------------ function YourActiveStake(address _user) external view returns(uint256 _activeStake){ return users[_user][SYFP].activeDeposit; } // ------------------------------------------------------------------------ // Query to get the total stakes of the user // ------------------------------------------------------------------------ function YourTotalStakesTillToday(address _user) external view returns(uint256 _totalStakes){ return users[_user][SYFP].totalDeposits; } // ------------------------------------------------------------------------ // Query to get the time of last stake of user // ------------------------------------------------------------------------ function LastStakedOn(address _user) public view returns(uint256 _unixLastStakedTime){ return users[_user][SYFP].startTime; } // ------------------------------------------------------------------------ // Query to get total earned rewards from stake // ------------------------------------------------------------------------ function TotalStakeRewardsClaimedTillToday(address _user) external view returns(uint256 _totalEarned){ return users[_user][SYFP].totalGained; } // ------------------------------------------------------------------------ // Query to get the staking rate // ------------------------------------------------------------------------ function LatestStakingRate() external view returns(uint256 APY){ return tokens[SYFP].rate; } // ------------------------------------------------------------------------ // Query to get the staking rate you staked at // ------------------------------------------------------------------------ function YourStakingRate(address _user) external view returns(uint256 _stakingRate){ return users[_user][SYFP].rate; } // ------------------------------------------------------------------------ // Query to get the staking period you staked at // ------------------------------------------------------------------------ function YourStakingPeriod(address _user) external view returns(uint256 _stakingPeriod){ return users[_user][SYFP].period; } // ------------------------------------------------------------------------ // Query to get the staking time left // ------------------------------------------------------------------------ function StakingTimeLeft(address _user) external view returns(uint256 _secsLeft){ uint256 left = 0; uint256 expiryDate = (users[_user][SYFP].period).add(LastStakedOn(_user)); if(now < expiryDate) left = expiryDate.sub(now); return left; } //#########################################################################################################################################################// //####################################################STAKING ONLY OWNER FUNCTION##########################################################################// //#########################################################################################################################################################// // ------------------------------------------------------------------------ // Change staking rate // @param _newStakingRate new rate applied for staking // @required only owner or governance contract // ------------------------------------------------------------------------ function ChangeStakingRate(uint256 _newStakingRate) public onlyOwner{ tokens[SYFP].rate = _newStakingRate; emit StakingRateChanged(_newStakingRate); } // ------------------------------------------------------------------------ // Change the staking period // @param _seconds number of seconds to stake (n days = n*24*60*60) // @required only callable by owner or governance contract // ------------------------------------------------------------------------ function SetStakingPeriod(uint256 _seconds) public onlyOwner{ stakingPeriod = _seconds; } // ------------------------------------------------------------------------ // Change the staking claim fee // @param _fee claim fee in weis // @required only callable by owner or governance contract // ------------------------------------------------------------------------ function SetClaimFee(uint256 _fee) public onlyOwner{ stakeClaimFee = _fee; } //#########################################################################################################################################################// //################################################################COMMON UTILITIES#########################################################################// //#########################################################################################################################################################// // ------------------------------------------------------------------------ // Internal function to add new deposit // ------------------------------------------------------------------------ function _newDeposit(address _tokenAddress, uint256 _amount) internal{ require(users[msg.sender][_tokenAddress].activeDeposit == 0, "Already running"); require(tokens[_tokenAddress].exists, "Token doesn't exist"); // add that token into the contract balance // check if we have any pending reward/yield, add it to pendingGains variable if(_tokenAddress == SYFP){ users[msg.sender][_tokenAddress].pendingGains = PendingReward(msg.sender); users[msg.sender][_tokenAddress].period = stakingPeriod; users[msg.sender][_tokenAddress].rate = tokens[_tokenAddress].rate; // rate for stakers will be fixed at time of staking } else users[msg.sender][_tokenAddress].pendingGains = PendingYield(_tokenAddress, msg.sender); users[msg.sender][_tokenAddress].activeDeposit = _amount; users[msg.sender][_tokenAddress].totalDeposits = users[msg.sender][_tokenAddress].totalDeposits.add(_amount); users[msg.sender][_tokenAddress].startTime = now; users[msg.sender][_tokenAddress].lastClaimedDate = now; tokens[_tokenAddress].stakedTokens = tokens[_tokenAddress].stakedTokens.add(_amount); } // ------------------------------------------------------------------------ // Internal function to add to existing deposit // ------------------------------------------------------------------------ function _addToExisting(address _tokenAddress, uint256 _amount) internal{ require(tokens[_tokenAddress].exists, "Token doesn't exist"); // require(users[msg.sender][_tokenAddress].running, "no running farming/stake"); require(users[msg.sender][_tokenAddress].activeDeposit > 0, "no running farming/stake"); // update farming stats // check if we have any pending reward/yield, add it to pendingGains variable if(_tokenAddress == SYFP){ users[msg.sender][_tokenAddress].pendingGains = PendingReward(msg.sender); users[msg.sender][_tokenAddress].period = stakingPeriod; users[msg.sender][_tokenAddress].rate = tokens[_tokenAddress].rate; // rate of only staking will be updated when more is added to stake } else users[msg.sender][_tokenAddress].pendingGains = PendingYield(_tokenAddress, msg.sender); // update current deposited amount users[msg.sender][_tokenAddress].activeDeposit = users[msg.sender][_tokenAddress].activeDeposit.add(_amount); // update total deposits till today users[msg.sender][_tokenAddress].totalDeposits = users[msg.sender][_tokenAddress].totalDeposits.add(_amount); // update new deposit start time -- new stake/farming will begin from this time onwards users[msg.sender][_tokenAddress].startTime = now; // reset last claimed figure as well -- new stake/farming will begin from this time onwards users[msg.sender][_tokenAddress].lastClaimedDate = now; tokens[_tokenAddress].stakedTokens = tokens[_tokenAddress].stakedTokens.add(_amount); } // ------------------------------------------------------------------------ // Internal function to add token // ------------------------------------------------------------------------ function _addToken(address _tokenAddress, uint256 _rate) internal{ require(!tokens[_tokenAddress].exists, "token already exists"); tokens[_tokenAddress] = Tokens({ exists: true, rate: _rate, stakedTokens: 0 }); TokensAddresses.push(_tokenAddress); emit TokenAdded(_tokenAddress, _rate); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"AddedToExistingFarm","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"AddedToExistingStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"newAPY","type":"uint256"}],"name":"FarmingRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"FarmingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":true,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newAPY","type":"uint256"}],"name":"StakingRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"APY","type":"uint256"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"APY","type":"uint256"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":true,"internalType":"uint256","name":"stakedTokens","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_yield","type":"uint256"}],"name":"YieldCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"yieldCollectionFee","type":"uint256"}],"name":"YieldCollectionFeeChanged","type":"event"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"ActiveFarmDeposit","outputs":[{"internalType":"uint256","name":"_activeDeposit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AddToFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AddToStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"AddToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_newFarmingRate","type":"uint256"}],"name":"ChangeFarmingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStakingRate","type":"uint256"}],"name":"ChangeStakingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ClaimReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ClaimStakedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ClaimUnStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Farm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"LastFarmedOn","outputs":[{"internalType":"uint256","name":"_unixLastFarmedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"LastStakedOn","outputs":[{"internalType":"uint256","name":"_unixLastStakedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LatestStakingRate","outputs":[{"internalType":"uint256","name":"APY","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"PendingReward","outputs":[{"internalType":"uint256","name":"_pendingReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"PendingYield","outputs":[{"internalType":"uint256","name":"_pendingRewardWeis","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"RemoveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SYFP","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"SetClaimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"SetStakingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"SetYieldCollectionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"StakingTimeLeft","outputs":[{"internalType":"uint256","name":"_secsLeft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"TotalFarmingRewards","outputs":[{"internalType":"uint256","name":"_totalEarned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"TotalStakeRewardsClaimedTillToday","outputs":[{"internalType":"uint256","name":"_totalEarned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawFarmedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"Yield","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"YourActiveStake","outputs":[{"internalType":"uint256","name":"_activeStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"YourStakingPeriod","outputs":[{"internalType":"uint256","name":"_stakingPeriod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"YourStakingRate","outputs":[{"internalType":"uint256","name":"_stakingRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"YourTotalFarmingTillToday","outputs":[{"internalType":"uint256","name":"_totalFarming","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"YourTotalStakesTillToday","outputs":[{"internalType":"uint256","name":"_totalStakes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeClaimFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokens","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"stakedTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldCollectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"yieldWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405266b1a2bc2ec5000060015562127500600255662386f26fc10000600355600680546001600160a01b03191673c11396e14990ebe98a09f8639a082c03eb9db55a1790553480156200005457600080fd5b50600080546001600160a01b031990811633171673f64df26fb32ce9142393c31f01bb1689ff7b29f5179055620000a373c11396e14990ebe98a09f8639a082c03eb9db55a623d09006200017a565b620000c573dac17f958d2ee523a2206206994597c13d831ec76137786200017a565b620000e773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486137786200017a565b6200010a73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2624f58806200017a565b6200012e730bc529c00c6401aef6d220be8c6ea1667f6ad93e6311b870206200017a565b620001517345f24baeef268bb6d63aee5129015d69702bcdfa620382706200017a565b620001747396d62cdcd1cc49cb6ee99c867cb8812bea86b9fa620493e06200017a565b620002a7565b6001600160a01b03821660009081526007602052604090205460ff1615620001e9576040805162461bcd60e51b815260206004820152601460248201527f746f6b656e20616c726561647920657869737473000000000000000000000000604482015290519081900360640190fd5b604080516060810182526001808252602080830185815260008486018181526001600160a01b03891680835260079094528682209551865460ff1916901515178655915185850155905160029094019390935560088054928301815583527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180546001600160a01b0319168217905591518392917ff4c563a3ea86ff1f4275e8c207df0375a51963f2b831b7bf4da8be938d92876c91a35050565b6125bf80620002b76000396000f3fe60806040526004361061023b5760003560e01c8063896931b01161012e578063c1672177116100ab578063e48603391161006f578063e48603391461082d578063f2fde38b14610880578063faea0532146108b3578063fe995a4e146108e6578063fea167e01461091f5761023b565b8063c167217714610732578063c74e9f771461075c578063cd926e1314610786578063dd4d2dd5146107c1578063e1bea1af146107f45761023b565b8063af16b538116100f2578063af16b53814610692578063b3872dc7146106a7578063bd7b2194146106cd578063c03d5b47146106e2578063c141a951146106f75761023b565b8063896931b0146105c95780638da5cb5b146105fc5780638f670e54146106115780639328ec361461064a578063abff57471461067d5761023b565b80631fade863116101bc5780634eb129c8116101805780634eb129c8146104f65780634ebf68cf1461052957806356e6a500146105645780635eb478d51461059757806379372f9a146105c15761023b565b80631fade86314610419578063227a473b1461044357806331ac805a1461046d5780633252a02e146104825780634453cb2f146104bb5761023b565b806313fa675f1161020357806313fa675f1461031557806319e158361461033f5780631b359373146103725780631b38b912146103ab5780631d662c06146103de5761023b565b8063014182051461024057806301584c3e1461026757806305dc5a19146102985780630e15561a146102cb5780630eb5c1f3146102e0575b600080fd5b34801561024c57600080fd5b50610255610934565b60408051918252519081900360200190f35b34801561027357600080fd5b5061027c61093a565b604080516001600160a01b039092168252519081900360200190f35b3480156102a457600080fd5b50610255600480360360208110156102bb57600080fd5b50356001600160a01b0316610949565b3480156102d757600080fd5b50610255610975565b3480156102ec57600080fd5b506103136004803603602081101561030357600080fd5b50356001600160a01b031661097b565b005b34801561032157600080fd5b506103136004803603602081101561033857600080fd5b50356109b6565b34801561034b57600080fd5b506102556004803603602081101561036257600080fd5b50356001600160a01b03166109d2565b34801561037e57600080fd5b506103136004803603604081101561039557600080fd5b506001600160a01b038135169060200135610a01565b3480156103b757600080fd5b50610255600480360360208110156103ce57600080fd5b50356001600160a01b0316610b28565b3480156103ea57600080fd5b506102556004803603604081101561040157600080fd5b506001600160a01b0381358116916020013516610b57565b34801561042557600080fd5b506103136004803603602081101561043c57600080fd5b5035610b87565b34801561044f57600080fd5b506103136004803603602081101561046657600080fd5b5035610be8565b34801561047957600080fd5b50610313610cbd565b34801561048e57600080fd5b50610313600480360360408110156104a557600080fd5b506001600160a01b038135169060200135610ccf565b3480156104c757600080fd5b50610255600480360360408110156104de57600080fd5b506001600160a01b0381358116916020013516610d93565b34801561050257600080fd5b506103136004803603602081101561051957600080fd5b50356001600160a01b0316610dc2565b34801561053557600080fd5b506102556004803603604081101561054c57600080fd5b506001600160a01b0381358116916020013516610e8c565b34801561057057600080fd5b506102556004803603602081101561058757600080fd5b50356001600160a01b0316610f95565b3480156105a357600080fd5b50610313600480360360208110156105ba57600080fd5b5035610ff5565b61031361103f565b3480156105d557600080fd5b50610255600480360360208110156105ec57600080fd5b50356001600160a01b031661125f565b34801561060857600080fd5b5061027c61128e565b34801561061d57600080fd5b506103136004803603604081101561063457600080fd5b506001600160a01b03813516906020013561129d565b34801561065657600080fd5b506102556004803603602081101561066d57600080fd5b50356001600160a01b03166113c4565b34801561068957600080fd5b5061025561159e565b34801561069e57600080fd5b506102556115bf565b610313600480360360208110156106bd57600080fd5b50356001600160a01b03166115c5565b3480156106d957600080fd5b50610313611888565b3480156106ee57600080fd5b50610255611ad7565b34801561070357600080fd5b506102556004803603604081101561071a57600080fd5b506001600160a01b0381358116916020013516611add565b34801561073e57600080fd5b506103136004803603602081101561075557600080fd5b5035611b09565b34801561076857600080fd5b506103136004803603602081101561077f57600080fd5b5035611c62565b34801561079257600080fd5b50610255600480360360408110156107a957600080fd5b506001600160a01b0381358116916020013516611c7e565b3480156107cd57600080fd5b50610255600480360360208110156107e457600080fd5b50356001600160a01b0316611cad565b34801561080057600080fd5b506103136004803603604081101561081757600080fd5b506001600160a01b038135169060200135611cdc565b34801561083957600080fd5b506108606004803603602081101561085057600080fd5b50356001600160a01b0316611d01565b604080519315158452602084019290925282820152519081900360600190f35b34801561088c57600080fd5b50610313600480360360208110156108a357600080fd5b50356001600160a01b0316611d26565b3480156108bf57600080fd5b50610255600480360360208110156108d657600080fd5b50356001600160a01b0316611d88565b3480156108f257600080fd5b506103136004803603604081101561090957600080fd5b506001600160a01b038135169060200135611db7565b34801561092b57600080fd5b50610255611ff5565b60045481565b6006546001600160a01b031681565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052205490565b60055481565b610984816115c5565b3360009081526009602090815260408083206001600160a01b03851684529091529020546109b3908290611db7565b50565b6000546001600160a01b031633146109cd57600080fd5b600355565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206002015490565b6006546001600160a01b0383811691161415610a5a576040805162461bcd60e51b8152602060048201526013602482015272155cd9481cdd185ada5b99c81a5b9cdd195859606a1b604482015290519081900360640190fd5b610a648282611ffb565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b158015610ab957600080fd5b505af1158015610acd573d6000803e3d6000fd5b505050506040513d6020811015610ae357600080fd5b5051610aee57600080fd5b60405181906001600160a01b038416907f7de25affb428d2916c612e371f3ece047da76e52c3b848bc8aa98f8f832d10fe90600090a35050565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206007015490565b6001600160a01b038082166000908152600960209081526040808320938616835292905220600201545b92915050565b6000546001600160a01b03163314610b9e57600080fd5b6006546001600160a01b03166000908152600760205260408082206001018390555182917fb0ee74db6dce7f227ef9bf096b4b0baaa897706d47aa9e753125ceac39751c3591a250565b600654610bfe906001600160a01b031682611ffb565b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610c5857600080fd5b505af1158015610c6c573d6000803e3d6000fd5b505050506040513d6020811015610c8257600080fd5b5051610c8d57600080fd5b604051819033907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90600090a350565b610cc561103f565b610ccd611888565b565b6000546001600160a01b03163314610ce657600080fd5b6001600160a01b03821660009081526007602052604090205460ff16610d49576040805162461bcd60e51b81526020600482015260136024820152721d1bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220600101849055518392917f7f1955a793d9c38c520b2e8394264d17e1ebbcfbeefed578552fea2149bc7a2391a35050565b6001600160a01b0380821660009081526009602090815260408083209386168352929052206005015492915050565b6000546001600160a01b03163314610dd957600080fd5b6001600160a01b03811660009081526007602052604090205460ff16610e3c576040805162461bcd60e51b81526020600482015260136024820152721d1bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805460ff191681556001015490519092917fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e91a350565b6001600160a01b0380821660009081526009602090815260408083209386168352929052908120600401548190610ec4904290612209565b6001600160a01b03851660009081526007602052604081206001015491925090610f07906301e1338090610f0190683635c9adc5dea0000061221b565b90612246565b90506000610f546b033b2e3c9fd0803ce8000000610f01610f28868661221b565b6001600160a01b03808a166000908152600960209081526040808320938e16835292905220549061221b565b6001600160a01b038087166000908152600960209081526040808320938b1683529290522060030154909150610f8b90829061225b565b9695505050505050565b60008080610fd7610fa5856109d2565b6001600160a01b038087166000908152600960209081526040808320600654909416835292905220600701549061225b565b905080421015610fee57610feb8142612209565b91505b5092915050565b6000546001600160a01b0316331461100c57600080fd5b600181905560405181907f514c42e17f7b6a99f4565772ac1cb1283fb5538cc7c0a15937542d0ae004044f90600090a250565b600354341015611096576040805162461bcd60e51b815260206004820152601a60248201527f73686f756c642070617920657861637420636c61696d20666565000000000000604482015290519081900360640190fd5b60006110a1336113c4565b116110f3576040805162461bcd60e51b815260206004820152601860248201527f6e6f7468696e672070656e64696e6720746f20636c61696d0000000000000000604482015290519081900360640190fd5b60006110fe336113c4565b60055490915061110e908261225b565b60059081553360009081526009602090815260408083206006546001600160a01b0316845290915290200154611144908261225b565b336000908152600960209081526040808320600680546001600160a01b039081168652919093528184206005019490945581548416835280832042600490910155905483168252808220600301829055815490519216913480156108fc0292909190818181858888f193505050501580156111c3573d6000803e3d6000fd5b50600654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b50506040518392503391507f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724190600090a350565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206005015490565b6000546001600160a01b031681565b6006546001600160a01b03838116911614156112f6576040805162461bcd60e51b81526020600482015260136024820152721d5cd9481cdd185ada5b99c81a5b9cdd195859606a1b604482015290519081900360640190fd5b611300828261226a565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b15801561135557600080fd5b505af1158015611369573d6000803e3d6000fd5b505050506040513d602081101561137f57600080fd5b505161138a57600080fd5b60405181906001600160a01b038416907f0f53de7833b10029a9cc77140305b2a85bce72a6064e4aa0d584412a0fe473d790600090a35050565b6001600160a01b03818116600090815260096020908152604080832060065490941683529290529081206002810154600790910154829182916114069161225b565b90508042101561144e576001600160a01b03808516600090815260096020908152604080832060065490941683529290522060040154611447904290612209565b91506114c3565b6001600160a01b03808516600090815260096020908152604080832060065490941683529290522060040154811161148957600091506114c3565b6001600160a01b038085166000908152600960209081526040808320600654909416835292905220600401546114c0908290612209565b91505b6001600160a01b03808516600090815260096020908152604080832060068054909516845290915281209091015461150490683635c9adc5dea0000061221b565b905060006115546b033b2e3c9fd0803ce8000000610f01611525878661221b565b6001600160a01b03808b166000908152600960209081526040808320600654909416835292905220549061221b565b9050611564816301e13380612246565b6001600160a01b03808816600090815260096020908152604080832060065490941683529290522060030154909150610f8b90829061225b565b6006546001600160a01b031660009081526007602052604090206001015490565b60015481565b60015434101561161c576040805162461bcd60e51b815260206004820152601a60248201527f73686f756c642070617920657861637420636c61696d20666565000000000000604482015290519081900360640190fd5b60006116288233610e8c565b1161166d576040805162461bcd60e51b815260206004820152601060248201526f139bc81c195b991a5b99c81e5a595b1960821b604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166116d0576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6006546001600160a01b0382811691161415611729576040805162461bcd60e51b81526020600482015260136024820152721d5cd9481cdd185ada5b99c81a5b9cdd195859606a1b604482015290519081900360640190fd5b60006117358233610e8c565b600454909150611745908261225b565b6004553360009081526009602090815260408083206001600160a01b0386168452909152902060050154611779908261225b565b3360009081526009602090815260408083206001600160a01b038781168552925280832060058101949094554260048501556003909301829055815492519216913480156108fc0292909190818181858888f193505050501580156117e2573d6000803e3d6000fd5b50600654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b50506040518392506001600160a01b03851691507fe542fd70a6e48b1017b003a83582b8b431ba620b546e8febe1d6c063d04d0ad690600090a35050565b3360009081526009602090815260408083206006546001600160a01b031684529091529020546118f2576040805162461bcd60e51b815260206004820152601060248201526f6e6f2072756e6e696e67207374616b6560801b604482015290519081900360640190fd5b3360009081526009602090815260408083206006546001600160a01b0316845290915290206007810154600290910154429161192e919061225b565b1061196a5760405162461bcd60e51b81526004018080602001828103825260238152602001806125676023913960400191505060405180910390fd5b3360008181526009602090815260408083206006546001600160a01b031684529091529020549061199a906113c4565b336000908152600960209081526040808320600680546001600160a01b0390811686529184528285206003019590955593549093168252828220546007909152919020600201546119ea91612209565b600680546001600160a01b03908116600090815260076020908152604080832060020195909555338083526009825285832085548516845282528583208390559354855163a9059cbb60e01b81526004810195909552602485018790529451949092169363a9059cbb9360448082019493918390030190829087803b158015611a7257600080fd5b505af1158015611a86573d6000803e3d6000fd5b505050506040513d6020811015611a9c57600080fd5b5051611aa757600080fd5b604051819033907f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e43090600090a350565b60025481565b6001600160a01b0380821660009081526009602090815260408083209386168352929052205492915050565b3360009081526009602090815260408083206006546001600160a01b0316845290915290206007810154600290910154420310611b8d576040805162461bcd60e51b815260206004820152601760248201527f63757272656e74207374616b696e672065787069726564000000000000000000604482015290519081900360640190fd5b600654611ba3906001600160a01b03168261226a565b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611bfd57600080fd5b505af1158015611c11573d6000803e3d6000fd5b505050506040513d6020811015611c2757600080fd5b5051611c3257600080fd5b604051819033907f87cc10241523077a91c98e7f42c67bc94408b811dcfb4202150e2935e471b08690600090a350565b6000546001600160a01b03163314611c7957600080fd5b600255565b6001600160a01b0380821660009081526009602090815260408083209386168352929052206001015492915050565b6001600160a01b0390811660009081526009602090815260408083206006805490951684529091529020015490565b6000546001600160a01b03163314611cf357600080fd5b611cfd8282612443565b5050565b60076020526000908152604090208054600182015460029092015460ff909116919083565b6000546001600160a01b03163314611d3d57600080fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206001015490565b3360009081526009602090815260408083206001600160a01b0386168452909152902054811115611e2f576040805162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e7420616d6f756e7420696e206661726d696e670000604482015290519081900360640190fd5b6006546001600160a01b0383811691161415611e92576040805162461bcd60e51b815260206004820152601f60248201527f757365207769746864726177206f66207374616b696e6720696e737465616400604482015290519081900360640190fd5b611e9c8233610e8c565b3360009081526009602090815260408083206001600160a01b0387168452825280832060030193909355600790522060020154611ed99082612209565b6001600160a01b03831660008181526007602090815260408083206002019490945533825260098152838220928252919091522054611f189082612209565b3360008181526009602090815260408083206001600160a01b0388168085529083528184209586554260028701819055600496870155815163a9059cbb60e01b8152958601949094526024850186905251929363a9059cbb9360448083019491928390030190829087803b158015611f8f57600080fd5b505af1158015611fa3573d6000803e3d6000fd5b505050506040513d6020811015611fb957600080fd5b5051611fc457600080fd5b604051819033907f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e43090600090a35050565b60035481565b3360009081526009602090815260408083206001600160a01b038616845290915290205415612063576040805162461bcd60e51b815260206004820152600f60248201526e416c72656164792072756e6e696e6760881b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff166120c6576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6006546001600160a01b0383811691161415612133576120e5336113c4565b3360009081526009602090815260408083206001600160a01b038716845280835281842060038101959095556002546007808701919091558352922060010154919052600690910155612165565b61213d8233610e8c565b3360009081526009602090815260408083206001600160a01b03871684529091529020600301555b3360009081526009602090815260408083206001600160a01b0386168452909152902081815560010154612199908261225b565b3360009081526009602090815260408083206001600160a01b0387168452825280832060018101949094554260028086018290556004909501556007909152902001546121e6908261225b565b6001600160a01b0390921660009081526007602052604090206002019190915550565b60008282111561221557fe5b50900390565b60008261222a57506000610b81565b8282028284828161223757fe5b041461223f57fe5b9392505050565b60008082848161225257fe5b04949350505050565b60008282018381101561223f57fe5b6001600160a01b03821660009081526007602052604090205460ff166122cd576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b3360009081526009602090815260408083206001600160a01b0386168452909152902054612342576040805162461bcd60e51b815260206004820152601860248201527f6e6f2072756e6e696e67206661726d696e672f7374616b650000000000000000604482015290519081900360640190fd5b6006546001600160a01b03838116911614156123af57612361336113c4565b3360009081526009602090815260408083206001600160a01b0387168452808352818420600381019590955560025460078087019190915583529220600101549190526006909101556123e1565b6123b98233610e8c565b3360009081526009602090815260408083206001600160a01b03871684529091529020600301555b3360009081526009602090815260408083206001600160a01b038616845290915290205461240f908261225b565b3360009081526009602090815260408083206001600160a01b0387168452909152902090815560010154612199908261225b565b6001600160a01b03821660009081526007602052604090205460ff16156124a8576040805162461bcd60e51b8152602060048201526014602482015273746f6b656e20616c72656164792065786973747360601b604482015290519081900360640190fd5b604080516060810182526001808252602080830185815260008486018181526001600160a01b03891680835260079094528682209551865460ff1916901515178655915185850155905160029094019390935560088054928301815583527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180546001600160a01b0319168217905591518392917ff4c563a3ea86ff1f4275e8c207df0375a51963f2b831b7bf4da8be938d92876c91a3505056fe6e6f7420636c61696d61626c65206265666f7265207374616b696e6720706572696f64a26469706673582212204ad45095d35554327d2e694b519670ea6823b1494dc0bf77537498de943843d164736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c8063896931b01161012e578063c1672177116100ab578063e48603391161006f578063e48603391461082d578063f2fde38b14610880578063faea0532146108b3578063fe995a4e146108e6578063fea167e01461091f5761023b565b8063c167217714610732578063c74e9f771461075c578063cd926e1314610786578063dd4d2dd5146107c1578063e1bea1af146107f45761023b565b8063af16b538116100f2578063af16b53814610692578063b3872dc7146106a7578063bd7b2194146106cd578063c03d5b47146106e2578063c141a951146106f75761023b565b8063896931b0146105c95780638da5cb5b146105fc5780638f670e54146106115780639328ec361461064a578063abff57471461067d5761023b565b80631fade863116101bc5780634eb129c8116101805780634eb129c8146104f65780634ebf68cf1461052957806356e6a500146105645780635eb478d51461059757806379372f9a146105c15761023b565b80631fade86314610419578063227a473b1461044357806331ac805a1461046d5780633252a02e146104825780634453cb2f146104bb5761023b565b806313fa675f1161020357806313fa675f1461031557806319e158361461033f5780631b359373146103725780631b38b912146103ab5780631d662c06146103de5761023b565b8063014182051461024057806301584c3e1461026757806305dc5a19146102985780630e15561a146102cb5780630eb5c1f3146102e0575b600080fd5b34801561024c57600080fd5b50610255610934565b60408051918252519081900360200190f35b34801561027357600080fd5b5061027c61093a565b604080516001600160a01b039092168252519081900360200190f35b3480156102a457600080fd5b50610255600480360360208110156102bb57600080fd5b50356001600160a01b0316610949565b3480156102d757600080fd5b50610255610975565b3480156102ec57600080fd5b506103136004803603602081101561030357600080fd5b50356001600160a01b031661097b565b005b34801561032157600080fd5b506103136004803603602081101561033857600080fd5b50356109b6565b34801561034b57600080fd5b506102556004803603602081101561036257600080fd5b50356001600160a01b03166109d2565b34801561037e57600080fd5b506103136004803603604081101561039557600080fd5b506001600160a01b038135169060200135610a01565b3480156103b757600080fd5b50610255600480360360208110156103ce57600080fd5b50356001600160a01b0316610b28565b3480156103ea57600080fd5b506102556004803603604081101561040157600080fd5b506001600160a01b0381358116916020013516610b57565b34801561042557600080fd5b506103136004803603602081101561043c57600080fd5b5035610b87565b34801561044f57600080fd5b506103136004803603602081101561046657600080fd5b5035610be8565b34801561047957600080fd5b50610313610cbd565b34801561048e57600080fd5b50610313600480360360408110156104a557600080fd5b506001600160a01b038135169060200135610ccf565b3480156104c757600080fd5b50610255600480360360408110156104de57600080fd5b506001600160a01b0381358116916020013516610d93565b34801561050257600080fd5b506103136004803603602081101561051957600080fd5b50356001600160a01b0316610dc2565b34801561053557600080fd5b506102556004803603604081101561054c57600080fd5b506001600160a01b0381358116916020013516610e8c565b34801561057057600080fd5b506102556004803603602081101561058757600080fd5b50356001600160a01b0316610f95565b3480156105a357600080fd5b50610313600480360360208110156105ba57600080fd5b5035610ff5565b61031361103f565b3480156105d557600080fd5b50610255600480360360208110156105ec57600080fd5b50356001600160a01b031661125f565b34801561060857600080fd5b5061027c61128e565b34801561061d57600080fd5b506103136004803603604081101561063457600080fd5b506001600160a01b03813516906020013561129d565b34801561065657600080fd5b506102556004803603602081101561066d57600080fd5b50356001600160a01b03166113c4565b34801561068957600080fd5b5061025561159e565b34801561069e57600080fd5b506102556115bf565b610313600480360360208110156106bd57600080fd5b50356001600160a01b03166115c5565b3480156106d957600080fd5b50610313611888565b3480156106ee57600080fd5b50610255611ad7565b34801561070357600080fd5b506102556004803603604081101561071a57600080fd5b506001600160a01b0381358116916020013516611add565b34801561073e57600080fd5b506103136004803603602081101561075557600080fd5b5035611b09565b34801561076857600080fd5b506103136004803603602081101561077f57600080fd5b5035611c62565b34801561079257600080fd5b50610255600480360360408110156107a957600080fd5b506001600160a01b0381358116916020013516611c7e565b3480156107cd57600080fd5b50610255600480360360208110156107e457600080fd5b50356001600160a01b0316611cad565b34801561080057600080fd5b506103136004803603604081101561081757600080fd5b506001600160a01b038135169060200135611cdc565b34801561083957600080fd5b506108606004803603602081101561085057600080fd5b50356001600160a01b0316611d01565b604080519315158452602084019290925282820152519081900360600190f35b34801561088c57600080fd5b50610313600480360360208110156108a357600080fd5b50356001600160a01b0316611d26565b3480156108bf57600080fd5b50610255600480360360208110156108d657600080fd5b50356001600160a01b0316611d88565b3480156108f257600080fd5b506103136004803603604081101561090957600080fd5b506001600160a01b038135169060200135611db7565b34801561092b57600080fd5b50610255611ff5565b60045481565b6006546001600160a01b031681565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052205490565b60055481565b610984816115c5565b3360009081526009602090815260408083206001600160a01b03851684529091529020546109b3908290611db7565b50565b6000546001600160a01b031633146109cd57600080fd5b600355565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206002015490565b6006546001600160a01b0383811691161415610a5a576040805162461bcd60e51b8152602060048201526013602482015272155cd9481cdd185ada5b99c81a5b9cdd195859606a1b604482015290519081900360640190fd5b610a648282611ffb565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b158015610ab957600080fd5b505af1158015610acd573d6000803e3d6000fd5b505050506040513d6020811015610ae357600080fd5b5051610aee57600080fd5b60405181906001600160a01b038416907f7de25affb428d2916c612e371f3ece047da76e52c3b848bc8aa98f8f832d10fe90600090a35050565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206007015490565b6001600160a01b038082166000908152600960209081526040808320938616835292905220600201545b92915050565b6000546001600160a01b03163314610b9e57600080fd5b6006546001600160a01b03166000908152600760205260408082206001018390555182917fb0ee74db6dce7f227ef9bf096b4b0baaa897706d47aa9e753125ceac39751c3591a250565b600654610bfe906001600160a01b031682611ffb565b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610c5857600080fd5b505af1158015610c6c573d6000803e3d6000fd5b505050506040513d6020811015610c8257600080fd5b5051610c8d57600080fd5b604051819033907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d90600090a350565b610cc561103f565b610ccd611888565b565b6000546001600160a01b03163314610ce657600080fd5b6001600160a01b03821660009081526007602052604090205460ff16610d49576040805162461bcd60e51b81526020600482015260136024820152721d1bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220600101849055518392917f7f1955a793d9c38c520b2e8394264d17e1ebbcfbeefed578552fea2149bc7a2391a35050565b6001600160a01b0380821660009081526009602090815260408083209386168352929052206005015492915050565b6000546001600160a01b03163314610dd957600080fd5b6001600160a01b03811660009081526007602052604090205460ff16610e3c576040805162461bcd60e51b81526020600482015260136024820152721d1bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805460ff191681556001015490519092917fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e91a350565b6001600160a01b0380821660009081526009602090815260408083209386168352929052908120600401548190610ec4904290612209565b6001600160a01b03851660009081526007602052604081206001015491925090610f07906301e1338090610f0190683635c9adc5dea0000061221b565b90612246565b90506000610f546b033b2e3c9fd0803ce8000000610f01610f28868661221b565b6001600160a01b03808a166000908152600960209081526040808320938e16835292905220549061221b565b6001600160a01b038087166000908152600960209081526040808320938b1683529290522060030154909150610f8b90829061225b565b9695505050505050565b60008080610fd7610fa5856109d2565b6001600160a01b038087166000908152600960209081526040808320600654909416835292905220600701549061225b565b905080421015610fee57610feb8142612209565b91505b5092915050565b6000546001600160a01b0316331461100c57600080fd5b600181905560405181907f514c42e17f7b6a99f4565772ac1cb1283fb5538cc7c0a15937542d0ae004044f90600090a250565b600354341015611096576040805162461bcd60e51b815260206004820152601a60248201527f73686f756c642070617920657861637420636c61696d20666565000000000000604482015290519081900360640190fd5b60006110a1336113c4565b116110f3576040805162461bcd60e51b815260206004820152601860248201527f6e6f7468696e672070656e64696e6720746f20636c61696d0000000000000000604482015290519081900360640190fd5b60006110fe336113c4565b60055490915061110e908261225b565b60059081553360009081526009602090815260408083206006546001600160a01b0316845290915290200154611144908261225b565b336000908152600960209081526040808320600680546001600160a01b039081168652919093528184206005019490945581548416835280832042600490910155905483168252808220600301829055815490519216913480156108fc0292909190818181858888f193505050501580156111c3573d6000803e3d6000fd5b50600654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b50506040518392503391507f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724190600090a350565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206005015490565b6000546001600160a01b031681565b6006546001600160a01b03838116911614156112f6576040805162461bcd60e51b81526020600482015260136024820152721d5cd9481cdd185ada5b99c81a5b9cdd195859606a1b604482015290519081900360640190fd5b611300828261226a565b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b15801561135557600080fd5b505af1158015611369573d6000803e3d6000fd5b505050506040513d602081101561137f57600080fd5b505161138a57600080fd5b60405181906001600160a01b038416907f0f53de7833b10029a9cc77140305b2a85bce72a6064e4aa0d584412a0fe473d790600090a35050565b6001600160a01b03818116600090815260096020908152604080832060065490941683529290529081206002810154600790910154829182916114069161225b565b90508042101561144e576001600160a01b03808516600090815260096020908152604080832060065490941683529290522060040154611447904290612209565b91506114c3565b6001600160a01b03808516600090815260096020908152604080832060065490941683529290522060040154811161148957600091506114c3565b6001600160a01b038085166000908152600960209081526040808320600654909416835292905220600401546114c0908290612209565b91505b6001600160a01b03808516600090815260096020908152604080832060068054909516845290915281209091015461150490683635c9adc5dea0000061221b565b905060006115546b033b2e3c9fd0803ce8000000610f01611525878661221b565b6001600160a01b03808b166000908152600960209081526040808320600654909416835292905220549061221b565b9050611564816301e13380612246565b6001600160a01b03808816600090815260096020908152604080832060065490941683529290522060030154909150610f8b90829061225b565b6006546001600160a01b031660009081526007602052604090206001015490565b60015481565b60015434101561161c576040805162461bcd60e51b815260206004820152601a60248201527f73686f756c642070617920657861637420636c61696d20666565000000000000604482015290519081900360640190fd5b60006116288233610e8c565b1161166d576040805162461bcd60e51b815260206004820152601060248201526f139bc81c195b991a5b99c81e5a595b1960821b604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff166116d0576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6006546001600160a01b0382811691161415611729576040805162461bcd60e51b81526020600482015260136024820152721d5cd9481cdd185ada5b99c81a5b9cdd195859606a1b604482015290519081900360640190fd5b60006117358233610e8c565b600454909150611745908261225b565b6004553360009081526009602090815260408083206001600160a01b0386168452909152902060050154611779908261225b565b3360009081526009602090815260408083206001600160a01b038781168552925280832060058101949094554260048501556003909301829055815492519216913480156108fc0292909190818181858888f193505050501580156117e2573d6000803e3d6000fd5b50600654604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561183657600080fd5b505af115801561184a573d6000803e3d6000fd5b50506040518392506001600160a01b03851691507fe542fd70a6e48b1017b003a83582b8b431ba620b546e8febe1d6c063d04d0ad690600090a35050565b3360009081526009602090815260408083206006546001600160a01b031684529091529020546118f2576040805162461bcd60e51b815260206004820152601060248201526f6e6f2072756e6e696e67207374616b6560801b604482015290519081900360640190fd5b3360009081526009602090815260408083206006546001600160a01b0316845290915290206007810154600290910154429161192e919061225b565b1061196a5760405162461bcd60e51b81526004018080602001828103825260238152602001806125676023913960400191505060405180910390fd5b3360008181526009602090815260408083206006546001600160a01b031684529091529020549061199a906113c4565b336000908152600960209081526040808320600680546001600160a01b0390811686529184528285206003019590955593549093168252828220546007909152919020600201546119ea91612209565b600680546001600160a01b03908116600090815260076020908152604080832060020195909555338083526009825285832085548516845282528583208390559354855163a9059cbb60e01b81526004810195909552602485018790529451949092169363a9059cbb9360448082019493918390030190829087803b158015611a7257600080fd5b505af1158015611a86573d6000803e3d6000fd5b505050506040513d6020811015611a9c57600080fd5b5051611aa757600080fd5b604051819033907f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e43090600090a350565b60025481565b6001600160a01b0380821660009081526009602090815260408083209386168352929052205492915050565b3360009081526009602090815260408083206006546001600160a01b0316845290915290206007810154600290910154420310611b8d576040805162461bcd60e51b815260206004820152601760248201527f63757272656e74207374616b696e672065787069726564000000000000000000604482015290519081900360640190fd5b600654611ba3906001600160a01b03168261226a565b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611bfd57600080fd5b505af1158015611c11573d6000803e3d6000fd5b505050506040513d6020811015611c2757600080fd5b5051611c3257600080fd5b604051819033907f87cc10241523077a91c98e7f42c67bc94408b811dcfb4202150e2935e471b08690600090a350565b6000546001600160a01b03163314611c7957600080fd5b600255565b6001600160a01b0380821660009081526009602090815260408083209386168352929052206001015492915050565b6001600160a01b0390811660009081526009602090815260408083206006805490951684529091529020015490565b6000546001600160a01b03163314611cf357600080fd5b611cfd8282612443565b5050565b60076020526000908152604090208054600182015460029092015460ff909116919083565b6000546001600160a01b03163314611d3d57600080fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6001600160a01b0390811660009081526009602090815260408083206006549094168352929052206001015490565b3360009081526009602090815260408083206001600160a01b0386168452909152902054811115611e2f576040805162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e7420616d6f756e7420696e206661726d696e670000604482015290519081900360640190fd5b6006546001600160a01b0383811691161415611e92576040805162461bcd60e51b815260206004820152601f60248201527f757365207769746864726177206f66207374616b696e6720696e737465616400604482015290519081900360640190fd5b611e9c8233610e8c565b3360009081526009602090815260408083206001600160a01b0387168452825280832060030193909355600790522060020154611ed99082612209565b6001600160a01b03831660008181526007602090815260408083206002019490945533825260098152838220928252919091522054611f189082612209565b3360008181526009602090815260408083206001600160a01b0388168085529083528184209586554260028701819055600496870155815163a9059cbb60e01b8152958601949094526024850186905251929363a9059cbb9360448083019491928390030190829087803b158015611f8f57600080fd5b505af1158015611fa3573d6000803e3d6000fd5b505050506040513d6020811015611fb957600080fd5b5051611fc457600080fd5b604051819033907f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e43090600090a35050565b60035481565b3360009081526009602090815260408083206001600160a01b038616845290915290205415612063576040805162461bcd60e51b815260206004820152600f60248201526e416c72656164792072756e6e696e6760881b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff166120c6576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b6006546001600160a01b0383811691161415612133576120e5336113c4565b3360009081526009602090815260408083206001600160a01b038716845280835281842060038101959095556002546007808701919091558352922060010154919052600690910155612165565b61213d8233610e8c565b3360009081526009602090815260408083206001600160a01b03871684529091529020600301555b3360009081526009602090815260408083206001600160a01b0386168452909152902081815560010154612199908261225b565b3360009081526009602090815260408083206001600160a01b0387168452825280832060018101949094554260028086018290556004909501556007909152902001546121e6908261225b565b6001600160a01b0390921660009081526007602052604090206002019190915550565b60008282111561221557fe5b50900390565b60008261222a57506000610b81565b8282028284828161223757fe5b041461223f57fe5b9392505050565b60008082848161225257fe5b04949350505050565b60008282018381101561223f57fe5b6001600160a01b03821660009081526007602052604090205460ff166122cd576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b3360009081526009602090815260408083206001600160a01b0386168452909152902054612342576040805162461bcd60e51b815260206004820152601860248201527f6e6f2072756e6e696e67206661726d696e672f7374616b650000000000000000604482015290519081900360640190fd5b6006546001600160a01b03838116911614156123af57612361336113c4565b3360009081526009602090815260408083206001600160a01b0387168452808352818420600381019590955560025460078087019190915583529220600101549190526006909101556123e1565b6123b98233610e8c565b3360009081526009602090815260408083206001600160a01b03871684529091529020600301555b3360009081526009602090815260408083206001600160a01b038616845290915290205461240f908261225b565b3360009081526009602090815260408083206001600160a01b0387168452909152902090815560010154612199908261225b565b6001600160a01b03821660009081526007602052604090205460ff16156124a8576040805162461bcd60e51b8152602060048201526014602482015273746f6b656e20616c72656164792065786973747360601b604482015290519081900360640190fd5b604080516060810182526001808252602080830185815260008486018181526001600160a01b03891680835260079094528682209551865460ff1916901515178655915185850155905160029094019390935560088054928301815583527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180546001600160a01b0319168217905591518392917ff4c563a3ea86ff1f4275e8c207df0375a51963f2b831b7bf4da8be938d92876c91a3505056fe6e6f7420636c61696d61626c65206265666f7265207374616b696e6720706572696f64a26469706673582212204ad45095d35554327d2e694b519670ea6823b1494dc0bf77537498de943843d164736f6c634300060c0033
Deployed Bytecode Sourcemap
2979:29587:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3210:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3282:64;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3282:64:0;;;;;;;;;;;;;;23268:141;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23268:141:0;-1:-1:-1;;;;;23268:141:0;;:::i;3242:27::-;;;;;;;;;;;;;:::i;10636:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10636:198:0;-1:-1:-1;;;;;10636:198:0;;:::i;:::-;;27872:89;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27872:89:0;;:::i;24009:139::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24009:139:0;-1:-1:-1;;;;;24009:139:0;;:::i;6337:440::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6337:440:0;;;;;;;;:::i;25436:138::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25436:138:0;-1:-1:-1;;;;;25436:138:0;;:::i;17797:173::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17797:173:0;;;;;;;;;;:::i;26919:193::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26919:193:0;;:::i;11636:317::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11636:317:0;;:::i;13916:95::-;;;;;;;;;;;;;:::i;20461:321::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20461:321:0;;;;;;;;:::i;18254:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18254:175:0;;;;;;;;;;:::i;19761:288::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19761:288:0;-1:-1:-1;;;;;19761:288:0;;:::i;16057:615::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16057:615:0;;;;;;;;;;:::i;25791:317::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25791:317:0;-1:-1:-1;;;;;25791:317:0;;:::i;21088:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21088:152:0;;:::i;14300:993::-;;;:::i;24375:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24375:157:0;-1:-1:-1;;;;;24375:157:0;;:::i;270:28::-;;;;;;;;;;;;;:::i;7108:423::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7108:423:0;;;;;;;;:::i;21949:1095::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21949:1095:0;-1:-1:-1;;;;;21949:1095:0;;:::i;24744:106::-;;;;;;;;;;;;;:::i;3064:46::-;;;;;;;;;;;;;:::i;7839:1118::-;;;;;;;;;;;;;;;;-1:-1:-1;7839:1118:0;-1:-1:-1;;;;;7839:1118:0;;:::i;13002:902::-;;;;;;;;;;;;;:::i;3117:38::-;;;;;;;;;;;;;:::i;16939:177::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16939:177:0;;;;;;;;;;:::i;12284:429::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12284:429:0;;:::i;27457:102::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27457:102:0;;:::i;17385:184::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17385:184:0;;;;;;;;;;:::i;25076:132::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25076:132:0;-1:-1:-1;;;;;25076:132:0;;:::i;19309:123::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19309:123:0;;;;;;;;:::i;3468:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3468:40:0;-1:-1:-1;;;;;3468:40:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;538:166;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;538:166:0;-1:-1:-1;;;;;538:166:0;;:::i;23633:150::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23633:150:0;-1:-1:-1;;;;;23633:150:0;;:::i;9315:1309::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9315:1309:0;;;;;;;;:::i;3162:41::-;;;;;;;;;;;;;:::i;3210:25::-;;;;:::o;3282:64::-;;;-1:-1:-1;;;;;3282:64:0;;:::o;23268:141::-;-1:-1:-1;;;;;23369:12:0;;;23330:20;23369:12;;;:5;:12;;;;;;;;23382:4;;;;;23369:18;;;;;;:32;;23268:141::o;3242:27::-;;;;:::o;10636:198::-;10702:20;10708:13;10702:5;:20::i;:::-;10775:10;10769:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;10769:32:0;;;;;;;;;:46;10733:83;;10754:13;;10733:20;:83::i;:::-;10636:198;:::o;27872:89::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;27933:13:::1;:20:::0;27872:89::o;24009:139::-;-1:-1:-1;;;;;24112:12:0;;;24066:27;24112:12;;;:5;:12;;;;;;;;24125:4;;;;;24112:18;;;;;;:28;;;;24009:139::o;6337:440::-;6435:4;;-1:-1:-1;;;;;6418:21:0;;;6435:4;;6418:21;;6410:53;;;;;-1:-1:-1;;;6410:53:0;;;;;;;;;;;;-1:-1:-1;;;6410:53:0;;;;;;;;;;;;;;;6509:35;6521:13;6536:7;6509:11;:35::i;:::-;6635:69;;;-1:-1:-1;;;6635:69:0;;6669:10;6635:69;;;;6689:4;6635:69;;;;;;;;;;;;-1:-1:-1;;;;;6635:33:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;6635:33:0;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6635:69:0;6627:78;;;;;;6731:38;;6761:7;;-1:-1:-1;;;;;6731:38:0;;;;;;;;6337:440;;:::o;25436:138::-;-1:-1:-1;;;;;25541:12:0;;;25500:22;25541:12;;;:5;:12;;;;;;;;25554:4;;;;;25541:18;;;;;;:25;;;;25436:138::o;17797:173::-;-1:-1:-1;;;;;17925:12:0;;;17879:27;17925:12;;;:5;:12;;;;;;;;:27;;;;;;;;;:37;;;17797:173;;;;;:::o;26919:193::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;27015:4:::1;::::0;-1:-1:-1;;;;;27015:4:0::1;27008:12;::::0;;;:6:::1;:12;::::0;;;;;27015:4;27008:17:::1;:35:::0;;;27069;27028:15;;27069:35:::1;::::0;::::1;26919:193:::0;:::o;11636:317::-;11726:4;;11714:26;;-1:-1:-1;;;;;11726:4:0;11732:7;11714:11;:26::i;:::-;11837:4;;11831:60;;;-1:-1:-1;;;11831:60:0;;11856:10;11831:60;;;;11876:4;11831:60;;;;;;;;;;;;-1:-1:-1;;;;;11837:4:0;;;;11831:24;;:60;;;;;;;;;;;;;;;11837:4;;11831:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11831:60:0;11823:69;;;;;;11918:27;;11937:7;;11925:10;;11918:27;;;;;11636:317;:::o;13916:95::-;13960:13;:11;:13::i;:::-;13984:19;:17;:19::i;:::-;13916:95::o;20461:321::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;-1:-1:-1;;;;;20581:21:0;::::1;;::::0;;;:6:::1;:21;::::0;;;;:28;::::1;;20573:60;;;::::0;;-1:-1:-1;;;20573:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;20573:60:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;20654:21:0;::::1;;::::0;;;:6:::1;:21;::::0;;;;;:26:::1;;:44:::0;;;20724:50;20683:15;;20654:21;20724:50:::1;::::0;::::1;20461:321:::0;;:::o;18254:175::-;-1:-1:-1;;;;;18382:12:0;;;18343:20;18382:12;;;:5;:12;;;;;;;;:27;;;;;;;;;:39;;;18254:175;;;;:::o;19761:288::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;-1:-1:-1;;;;;19851:21:0;::::1;;::::0;;;:6:::1;:21;::::0;;;;:28;::::1;;19843:60;;;::::0;;-1:-1:-1;;;19843:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19843:60:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;19924:21:0;::::1;19955:5;19924:21:::0;;;:6:::1;:21;::::0;;;;;:36;;-1:-1:-1;;19924:36:0::1;::::0;;;20014:26:::1;::::0;19986:55;;20014:26;;19924:21;19986:55:::1;::::0;::::1;19761:288:::0;:::o;16057:615::-;-1:-1:-1;;;;;16213:14:0;;;16139:26;16213:14;;;:5;:14;;;;;;;;:29;;;;;;;;;;;:45;;;16139:26;;16205:54;;:3;;:7;:54::i;:::-;-1:-1:-1;;;;;16313:21:0;;16280:28;16313:21;;;:6;:21;;;;;:26;;;16177:82;;-1:-1:-1;16280:28:0;16311:58;;16360:8;;16312:42;;16345:8;16312:32;:42::i;:::-;16311:48;;:58::i;:::-;16280:89;-1:-1:-1;16411:13:0;16427:110;16528:8;16428:94;16478:43;:17;16280:89;16478:21;:43::i;:::-;-1:-1:-1;;;;;16429:14:0;;;;;;;:5;:14;;;;;;;;:29;;;;;;;;;:43;;16428:49;:94::i;16427:110::-;-1:-1:-1;;;;;16621:14:0;;;;;;;:5;:14;;;;;;;;:29;;;;;;;;;:42;;;16411:126;;-1:-1:-1;16611:53:0;;16411:126;;16611:9;:53::i;:::-;16604:60;16057:615;-1:-1:-1;;;;;;16057:615:0:o;25791:317::-;25853:17;;;25931:52;25963:19;25976:5;25963:12;:19::i;:::-;-1:-1:-1;;;;;25932:12:0;;;;;;;:5;:12;;;;;;;;25945:4;;;;;25932:18;;;;;;:25;;;;25931:31;:52::i;:::-;25910:73;;26013:10;26007:3;:16;26004:60;;;26045:19;:10;26060:3;26045:14;:19::i;:::-;26038:26;;26004:60;-1:-1:-1;26096:4:0;25791:317;-1:-1:-1;;25791:317:0:o;21088:152::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;21160:18:::1;:25:::0;;;21201:31:::1;::::0;21181:4;;21201:31:::1;::::0;;;::::1;21088:152:::0;:::o;14300:993::-;14370:13;;14357:9;:26;;14349:65;;;;;-1:-1:-1;;;14349:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14461:1;14433:25;14447:10;14433:13;:25::i;:::-;:29;14425:66;;;;;-1:-1:-1;;;14425:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14508:22;14533:25;14547:10;14533:13;:25::i;:::-;14641:12;;14508:50;;-1:-1:-1;14641:32:0;;14508:50;14641:16;:32::i;:::-;14626:12;:47;;;14780:10;14774:17;;;;:5;:17;;;;;;;;14792:4;;-1:-1:-1;;;;;14792:4:0;14774:23;;;;;;;:35;;:55;;14814:14;14774:39;:55::i;:::-;14742:10;14736:17;;;;:5;:17;;;;;;;;14754:4;;;-1:-1:-1;;;;;14754:4:0;;;14736:23;;;;;;;;;:35;;:93;;;;14894:4;;;;14876:23;;;;;14918:3;14876:39;;;;:45;14985:4;;;;14967:23;;;;;:36;;:40;;;15076:5;;:25;;:5;;;15091:9;15076:25;;;;;15091:9;;15076:25;;14736:17;15076:25;15091:9;15076:5;:25;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15179:4:0;;15173:44;;;-1:-1:-1;;;15173:44:0;;15190:10;15173:44;;;;;;;;;;;;-1:-1:-1;;;;;15179:4:0;;;;15173:16;;:44;;;;;15179:4;;15173:44;;;;;;;;15179:4;;15173:44;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15244:41:0;;15270:14;;-1:-1:-1;15258:10:0;;-1:-1:-1;15244:41:0;;;;;14300:993;:::o;24375:157::-;-1:-1:-1;;;;;24494:12:0;;;24455:20;24494:12;;;:5;:12;;;;;;;;24507:4;;;;;24494:18;;;;;;:30;;;;24375:157::o;270:28::-;;;-1:-1:-1;;;;;270:28:0;;:::o;7108:423::-;7211:4;;-1:-1:-1;;;;;7194:21:0;;;7211:4;;7194:21;;7186:53;;;;;-1:-1:-1;;;7186:53:0;;;;;;;;;;;;-1:-1:-1;;;7186:53:0;;;;;;;;;;;;;;;7250:38;7265:13;7280:7;7250:14;:38::i;:::-;7385:68;;;-1:-1:-1;;;7385:68:0;;7419:10;7385:68;;;;7438:4;7385:68;;;;;;;;;;;;-1:-1:-1;;;;;7385:33:0;;;;;:68;;;;;;;;;;;;;;-1:-1:-1;7385:33:0;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7385:68:0;7377:77;;;;;;7480:43;;7515:7;;-1:-1:-1;;;;;7480:43:0;;;;;;;;7108:423;;:::o;21949:1095::-;-1:-1:-1;;;;;22137:14:0;;;22009:22;22137:14;;;:5;:14;;;;;;;;22152:4;;;;;22137:20;;;;;;;;:30;;;;22104:27;;;;;22009:22;;;;22103:65;;:33;:65::i;:::-;22082:86;;22198:10;22192:3;:16;22189:379;;;-1:-1:-1;;;;;22250:14:0;;;;;;;:5;:14;;;;;;;;22265:4;;;;;22250:20;;;;;;:36;;;22242:45;;:3;;:7;:45::i;:::-;22223:64;;22189:379;;;-1:-1:-1;;;;;22320:14:0;;;;;;;:5;:14;;;;;;;;22335:4;;;;;22320:20;;;;;;:36;;;:50;-1:-1:-1;22317:239:0;;22447:1;22428:20;;22317:239;;;-1:-1:-1;;;;;22519:14:0;;;;;;;:5;:14;;;;;;;;22534:4;;;;;22519:20;;;;;;:36;;;22504:52;;:10;;:14;:52::i;:::-;22485:71;;22317:239;-1:-1:-1;;;;;22625:14:0;;;22592:28;22625:14;;;:5;:14;;;;;;;;22640:4;;;;;;22625:20;;;;;;;:25;;;;22624:41;;22656:8;22624:31;:41::i;:::-;22592:74;-1:-1:-1;22698:14:0;22716:100;22807:8;22717:84;22758:42;:16;22592:74;22758:20;:42::i;:::-;-1:-1:-1;;;;;22718:14:0;;;;;;;:5;:14;;;;;;;;22733:4;;;;;22718:20;;;;;;:34;;22717:40;:84::i;22716:100::-;22698:118;-1:-1:-1;22951:20:0;22698:118;22962:8;22951:10;:20::i;:::-;-1:-1:-1;;;;;23001:14:0;;;;;;;:5;:14;;;;;;;;23016:4;;;;;23001:20;;;;;;:33;;;22942:29;;-1:-1:-1;22990:45:0;;22942:29;;22990:10;:45::i;24744:106::-;24832:4;;-1:-1:-1;;;;;24832:4:0;24795:11;24825:12;;;:6;:12;;;;;24832:4;24825:17;;24744:106;:::o;3064:46::-;;;;:::o;7839:1118::-;7924:18;;7911:9;:31;;7903:70;;;;;-1:-1:-1;;;7903:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8034:1;7992:39;8005:13;8020:10;7992:12;:39::i;:::-;:43;7984:72;;;;;-1:-1:-1;;;7984:72:0;;;;;;;;;;;;-1:-1:-1;;;7984:72:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;8075:21:0;;;;;;:6;:21;;;;;:28;;;8067:60;;;;;-1:-1:-1;;;8067:60:0;;;;;;;;;;;;-1:-1:-1;;;8067:60:0;;;;;;;;;;;;;;;8163:4;;-1:-1:-1;;;;;8146:21:0;;;8163:4;;8146:21;;8138:53;;;;;-1:-1:-1;;;8138:53:0;;;;;;;;;;;;-1:-1:-1;;;8138:53:0;;;;;;;;;;;;;;;8208:21;8232:39;8245:13;8260:10;8232:12;:39::i;:::-;8337:10;;8208:63;;-1:-1:-1;8337:29:0;;8208:63;8337:14;:29::i;:::-;8324:10;:42;8470:10;8464:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;8464:32:0;;;;;;;;;:44;;;:63;;8513:13;8464:48;:63::i;:::-;8423:10;8417:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;8417:32:0;;;;;;;;;;:44;;;:110;;;;8589:3;8538:48;;;:54;8603:45;;;;:49;;;8711:5;;:25;;:5;;;8726:9;8711:25;;;;;8726:9;;8711:25;;8417:17;8711:25;8726:9;8711:5;:25;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8842:4:0;;8836:43;;;-1:-1:-1;;;8836:43:0;;8853:10;8836:43;;;;;;;;;;;;-1:-1:-1;;;;;8842:4:0;;;;8836:16;;:43;;;;;8842:4;;8836:43;;;;;;;;8842:4;;8836:43;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8905:44:0;;8935:13;;-1:-1:-1;;;;;;8905:44:0;;;-1:-1:-1;8905:44:0;;;;;7839:1118;;:::o;13002:902::-;13063:10;13097:1;13057:17;;;:5;:17;;;;;;;;13075:4;;-1:-1:-1;;;;;13075:4:0;13057:23;;;;;;;:37;13049:70;;;;;-1:-1:-1;;;13049:70:0;;;;;;;;;;;;-1:-1:-1;;;13049:70:0;;;;;;;;;;;;;;;13182:10;13176:17;;;;:5;:17;;;;;;;;13194:4;;-1:-1:-1;;;;;13194:4:0;13176:23;;;;;;;:30;;;;13138:33;;;;;13210:3;;13138:69;;:33;:37;:69::i;:::-;:75;13130:123;;;;-1:-1:-1;;;13130:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13306:10;13274:23;13300:17;;;:5;:17;;;;;;;;13318:4;;-1:-1:-1;;;;;13318:4:0;13300:23;;;;;;;:37;;13473:25;;:13;:25::i;:::-;13440:10;13434:17;;;;:5;:17;;;;;;;;13452:4;;;-1:-1:-1;;;;;13452:4:0;;;13434:23;;;;;;;;:36;;:64;;;;13595:4;;;;;13577:23;;;;;:37;13547:6;:12;;;;;;:25;;;:68;;:29;:68::i;:::-;13526:4;;;-1:-1:-1;;;;;13526:4:0;;;13519:12;;;;:6;:12;;;;;;;;:25;;:96;;;;13669:10;13663:17;;;:5;:17;;;;;13681:4;;;;13663:23;;;;;;;:41;;;13774:4;;13768:49;;-1:-1:-1;;;13768:49:0;;;;;;;;;;;;;;;;;13774:4;;;;;13768:20;;:49;;;;;13519:12;13768:49;;;;;;;;13774:4;13768:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13768:49:0;13760:58;;;;;;13834:42;;13860:15;;13848:10;;13834:42;;;;;13002:902;:::o;3117:38::-;;;;:::o;16939:177::-;-1:-1:-1;;;;;17067:12:0;;;17026:22;17067:12;;;:5;:12;;;;;;;;:27;;;;;;;;;:41;16939:177;;;;:::o;12284:429::-;12397:10;12391:17;;;;:5;:17;;;;;;;;12409:4;;-1:-1:-1;;;;;12409:4:0;12391:23;;;;;;;:30;;;;12355:33;;;;;12349:3;:39;:72;12341:108;;;;;-1:-1:-1;;;12341:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12475:4;;12460:29;;-1:-1:-1;;;;;12475:4:0;12481:7;12460:14;:29::i;:::-;12584:4;;12578:59;;;-1:-1:-1;;;12578:59:0;;12603:10;12578:59;;;;12622:4;12578:59;;;;;;;;;;;;-1:-1:-1;;;;;12584:4:0;;;;12578:24;;:59;;;;;;;;;;;;;;;12584:4;;12578:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12578:59:0;12570:68;;;;;;12664:41;;12697:7;;12685:10;;12664:41;;;;;12284:429;:::o;27457:102::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;27527:13:::1;:24:::0;27457:102::o;17385:184::-;-1:-1:-1;;;;;17520:12:0;;;17480:21;17520:12;;;:5;:12;;;;;;;;:27;;;;;;;;;:41;;;17385:184;;;;:::o;25076:132::-;-1:-1:-1;;;;;25177:12:0;;;25138:20;25177:12;;;:5;:12;;;;;;;;25190:4;;;;;;25177:18;;;;;;;:23;;;25076:132::o;19309:123::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;19393:31:::1;19403:13;19418:5;19393:9;:31::i;:::-;19309:123:::0;;:::o;3468:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;538:166::-;504:5;;-1:-1:-1;;;;;504:5:0;490:10;:19;482:28;;;;;;620:5:::1;:17:::0;;-1:-1:-1;;;;;;620:17:0::1;-1:-1:-1::0;;;;;620:17:0;::::1;::::0;;::::1;::::0;;653:43:::1;::::0;620:17;;674:10:::1;::::0;653:43:::1;::::0;620:5;653:43:::1;538:166:::0;:::o;23633:150::-;-1:-1:-1;;;;;23743:12:0;;;23704:20;23743:12;;;:5;:12;;;;;;;;23756:4;;;;;23743:18;;;;;;23756:4;23743:32;;;23633:150::o;9315:1309::-;9417:10;9411:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;9411:32:0;;;;;;;;;:46;:57;-1:-1:-1;9411:57:0;9403:100;;;;;-1:-1:-1;;;9403:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:4;;-1:-1:-1;;;;;9522:21:0;;;9539:4;;9522:21;;9514:65;;;;;-1:-1:-1;;;9514:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9765:39;9778:13;9793:10;9765:12;:39::i;:::-;9723:10;9717:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;9717:32:0;;;;;;;;;:45;;:87;;;;9870:6;:21;;;:34;;;:47;;9909:7;9870:38;:47::i;:::-;-1:-1:-1;;;;;9833:21:0;;;;;;:6;:21;;;;;;;;:34;;:84;;;;10032:10;10026:17;;:5;:17;;;;;:32;;;;;;;;:46;:59;;10077:7;10026:50;:59::i;:::-;9983:10;9977:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;9977:32:0;;;;;;;;;;;:108;;;10236:3;10191:42;;;:48;;;10353;;;;:54;10505:50;;-1:-1:-1;;;10505:50:0;;;;;;;;;;;;;;;;9977:32;;10505:29;;:50;;;;;;;;;;;;;;9977:32;10505:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10505:50:0;10497:59;;;;;;10582:34;;10608:7;;10596:10;;10582:34;;;;;9315:1309;;:::o;3162:41::-;;;;:::o;28687:1263::-;28781:10;28775:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;28775:32:0;;;;;;;;;:46;:52;28767:80;;;;;-1:-1:-1;;;28767:80:0;;;;;;;;;;;;-1:-1:-1;;;28767:80:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28866:21:0;;;;;;:6;:21;;;;;:28;;;28858:60;;;;;-1:-1:-1;;;28858:60:0;;;;;;;;;;;;-1:-1:-1;;;28858:60:0;;;;;;;;;;;;;;;29099:4;;-1:-1:-1;;;;;29082:21:0;;;29099:4;;29082:21;29079:444;;;29167:25;29181:10;29167:13;:25::i;:::-;29125:10;29119:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;29119:32:0;;;;;;;;;;:45;;;:73;;;;29249:13;;29207:39;;;;:55;;;;29317:21;;;;:26;;;29277:32;;;:37;;;;:66;29079:444;;;29484:39;29497:13;29512:10;29484:12;:39::i;:::-;29442:10;29436:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;29436:32:0;;;;;;;;;:45;;:87;29079:444;29554:10;29548:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;29548:32:0;;;;;;;;;:56;;;29664:46;;;:59;;29548:56;29664:50;:59::i;:::-;29621:10;29615:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;29615:32:0;;;;;;;;;:46;;;:108;;;;29779:3;29734:42;;;;:48;;;29793;;;;:54;29895:6;:21;;;;;:34;;:47;;29934:7;29895:38;:47::i;:::-;-1:-1:-1;;;;;29858:21:0;;;;;;;:6;:21;;;;;:34;;:84;;;;-1:-1:-1;28687:1263:0:o;2342:113::-;2400:7;2428:1;2423;:6;;2416:14;;;;-1:-1:-1;2444:5:0;;;2342:113::o;1880:180::-;1938:7;1958:6;1954:37;;-1:-1:-1;1982:1:0;1975:8;;1954:37;2009:5;;;2013:1;2009;:5;:1;2028:5;;;;;:10;2021:18;;;;2053:1;1880:180;-1:-1:-1;;;1880:180:0:o;2066:270::-;2124:7;2215:9;2231:1;2227;:5;;;;;;;2066:270;-1:-1:-1;;;;2066:270:0:o;2461:133::-;2519:7;2547:5;;;2566:6;;;;2559:14;;;30181:1771;-1:-1:-1;;;;;30272:21:0;;;;;;:6;:21;;;;;:28;;;30264:60;;;;;-1:-1:-1;;;30264:60:0;;;;;;;;;;;;-1:-1:-1;;;30264:60:0;;;;;;;;;;;;;;;30440:10;30483:1;30434:17;;;:5;:17;;;;;;;;-1:-1:-1;;;;;30434:32:0;;;;;;;;;:46;30426:87;;;;;-1:-1:-1;;;30426:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30672:4;;-1:-1:-1;;;;;30655:21:0;;;30672:4;;30655:21;30652:483;;;30744:25;30758:10;30744:13;:25::i;:::-;30702:10;30696:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;30696:32:0;;;;;;;;;;:45;;;:73;;;;30830:13;;30788:39;;;;:55;;;;30902:21;;;;:26;;;30862:32;;;:37;;;;:66;30652:483;;;31096:39;31109:13;31124:10;31096:12;:39::i;:::-;31054:10;31048:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;31048:32:0;;;;;;;;;:45;;:87;30652:483;31254:10;31248:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;31248:32:0;;;;;;;;;:46;:59;;31299:7;31248:50;:59::i;:::-;31205:10;31199:17;;;;:5;:17;;;;;;;;-1:-1:-1;;;;;31199:32:0;;;;;;;;;:108;;;31420:46;;;:59;;31471:7;31420:50;:59::i;32166:397::-;-1:-1:-1;;;;;32251:21:0;;;;;;:6;:21;;;;;:28;;;32250:29;32242:62;;;;;-1:-1:-1;;;32242:62:0;;;;;;;;;;;;-1:-1:-1;;;32242:62:0;;;;;;;;;;;;;;;32349:102;;;;;;;;32379:4;32349:102;;;;;;;;;;-1:-1:-1;32349:102:0;;;;;;-1:-1:-1;;;;;32325:21:0;;;;;:6;:21;;;;;;:126;;;;-1:-1:-1;;32325:126:0;;;;;;;;;;;;;;;;;;;;;;;32472:15;:35;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32472:35:0;;;;;32523:32;;32349:102;;32325:21;32523:32;;;32166:397;;:::o
Swarm Source
ipfs://4ad45095d35554327d2e694b519670ea6823b1494dc0bf77537498de943843d1
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.