ETH Price: $3,605.38 (-3.17%)

Contract

0x307B0F06EA422A5918613e07e59476da28cb82d8
 
Transaction Hash
Method
Block
From
To
Withdraw Farmed ...112923052020-11-20 2:37:121473 days ago1605839832IN
0x307B0F06...a28cb82d8
0 ETH0.0026958954
Yield112923052020-11-20 2:37:121473 days ago1605839832IN
0x307B0F06...a28cb82d8
0.05 ETH0.005869254
Withdraw Farmed ...112878532020-11-19 10:25:201474 days ago1605781520IN
0x307B0F06...a28cb82d8
0 ETH0.0027875638
Add To Stake112853982020-11-19 1:25:531474 days ago1605749153IN
0x307B0F06...a28cb82d8
0 ETH0.0051276744
Add To Stake112853872020-11-19 1:23:331474 days ago1605749013IN
0x307B0F06...a28cb82d8
0 ETH0.0045031648
Add To Farm112853632020-11-19 1:16:151474 days ago1605748575IN
0x307B0F06...a28cb82d8
0 ETH0.0035963941.00000123
Add To Farm112853492020-11-19 1:12:391474 days ago1605748359IN
0x307B0F06...a28cb82d8
0 ETH0.0035963941.00000123
Add To Farm112788542020-11-18 1:06:401475 days ago1605661600IN
0x307B0F06...a28cb82d8
0 ETH0.0074559485
Add To Farm112788422020-11-18 1:02:451475 days ago1605661365IN
0x307B0F06...a28cb82d8
0 ETH0.0065787775
Add To Farm112788312020-11-18 0:59:541475 days ago1605661194IN
0x307B0F06...a28cb82d8
0 ETH0.0065787775
Add To Farm112788242020-11-18 0:58:441475 days ago1605661124IN
0x307B0F06...a28cb82d8
0 ETH0.0061899475.9
Stake112595852020-11-15 2:04:231478 days ago1605405863IN
0x307B0F06...a28cb82d8
0 ETH0.0026872514
Yield112595672020-11-15 2:00:591478 days ago1605405659IN
0x307B0F06...a28cb82d8
0.05 ETH0.0015216414
Withdraw Farmed ...112458562020-11-12 23:41:231480 days ago1605224483IN
0x307B0F06...a28cb82d8
0 ETH0.0007790812.00000134
Yield112458562020-11-12 23:41:231480 days ago1605224483IN
0x307B0F06...a28cb82d8
0.05 ETH0.0009442612.00000134
Claim Reward112455132020-11-12 22:24:091481 days ago1605219849IN
0x307B0F06...a28cb82d8
0.01 ETH0.005896847
Claim Staked Tok...112454992020-11-12 22:21:301481 days ago1605219690IN
0x307B0F06...a28cb82d8
0 ETH0.004984550
Claim Staked Tok...112454992020-11-12 22:21:301481 days ago1605219690IN
0x307B0F06...a28cb82d8
0 ETH0.004984550
Withdraw Farmed ...112364162020-11-11 12:54:221482 days ago1605099262IN
0x307B0F06...a28cb82d8
0 ETH0.0024429633.297
Claim Staked Tok...112303192020-11-10 14:26:211483 days ago1605018381IN
0x307B0F06...a28cb82d8
0 ETH0.001205352.00000145
Claim Reward112303192020-11-10 14:26:211483 days ago1605018381IN
0x307B0F06...a28cb82d8
0.01 ETH0.001700652.00000145
Claim Staked Tok...112303192020-11-10 14:26:211483 days ago1605018381IN
0x307B0F06...a28cb82d8
0 ETH0.0030859452.00000145
Claim Reward112303192020-11-10 14:26:211483 days ago1605018381IN
0x307B0F06...a28cb82d8
0.01 ETH0.0017029452.00000145
Claim Reward112301872020-11-10 13:51:441483 days ago1605016304IN
0x307B0F06...a28cb82d8
0.01 ETH0.0011462135
Claim Reward112301832020-11-10 13:51:061483 days ago1605016266IN
0x307B0F06...a28cb82d8
0.01 ETH0.0033412435
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
112923052020-11-20 2:37:121473 days ago1605839832
0x307B0F06...a28cb82d8
0.05 ETH
112595672020-11-15 2:00:591478 days ago1605405659
0x307B0F06...a28cb82d8
0.05 ETH
112458562020-11-12 23:41:231480 days ago1605224483
0x307B0F06...a28cb82d8
0.05 ETH
112455132020-11-12 22:24:091481 days ago1605219849
0x307B0F06...a28cb82d8
0.01 ETH
112301832020-11-10 13:51:061483 days ago1605016266
0x307B0F06...a28cb82d8
0.01 ETH
112165682020-11-08 11:50:581485 days ago1604836258
0x307B0F06...a28cb82d8
0.01 ETH
112103512020-11-07 12:36:081486 days ago1604752568
0x307B0F06...a28cb82d8
0.05 ETH
111871492020-11-03 23:22:191489 days ago1604445739
0x307B0F06...a28cb82d8
0.05 ETH
111871332020-11-03 23:19:241489 days ago1604445564
0x307B0F06...a28cb82d8
0.05 ETH
111640772020-10-31 10:28:431493 days ago1604140123
0x307B0F06...a28cb82d8
0.01 ETH
111424642020-10-28 2:43:101496 days ago1603852990
0x307B0F06...a28cb82d8
0.01 ETH
111424542020-10-28 2:40:481496 days ago1603852848
0x307B0F06...a28cb82d8
0.01 ETH
111409382020-10-27 20:59:521497 days ago1603832392
0x307B0F06...a28cb82d8
0.05 ETH
111358092020-10-27 2:19:261497 days ago1603765166
0x307B0F06...a28cb82d8
0.01 ETH
111289392020-10-26 0:50:081498 days ago1603673408
0x307B0F06...a28cb82d8
0.05 ETH
111251312020-10-25 10:46:441499 days ago1603622804
0x307B0F06...a28cb82d8
0.05 ETH
111184342020-10-24 10:04:001500 days ago1603533840
0x307B0F06...a28cb82d8
0.01 ETH
111147192020-10-23 20:26:521501 days ago1603484812
0x307B0F06...a28cb82d8
0.01 ETH
111080532020-10-22 19:52:011502 days ago1603396321
0x307B0F06...a28cb82d8
0.05 ETH
111022062020-10-21 22:30:281503 days ago1603319428
0x307B0F06...a28cb82d8
0.05 ETH
111016122020-10-21 20:18:231503 days ago1603311503
0x307B0F06...a28cb82d8
0.01 ETH
110924482020-10-20 10:25:331504 days ago1603189533
0x307B0F06...a28cb82d8
0.05 ETH
110880292020-10-19 18:10:511505 days ago1603131051
0x307B0F06...a28cb82d8
0.01 ETH
110872202020-10-19 15:18:321505 days ago1603120712
0x307B0F06...a28cb82d8
0.01 ETH
110772552020-10-18 2:37:171506 days ago1602988637
0x307B0F06...a28cb82d8
0.01 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SYFP_STAKE_FARM

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.