More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 8,453 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Bribes | 103902648 | 10 days ago | IN | 0 FTM | 0.00047855 | ||||
Claim Bribes | 103862691 | 11 days ago | IN | 0 FTM | 0.00013824 | ||||
Vote | 103227283 | 21 days ago | IN | 0 FTM | 0.00136821 | ||||
Claim Bribes | 103053847 | 23 days ago | IN | 0 FTM | 0.0005962 | ||||
Claim Bribes | 102890621 | 26 days ago | IN | 0 FTM | 0.00045955 | ||||
Claim Bribes | 102875524 | 26 days ago | IN | 0 FTM | 0.00182716 | ||||
Claim Bribes | 102807972 | 27 days ago | IN | 0 FTM | 0.00052165 | ||||
Claim Bribes | 102806376 | 27 days ago | IN | 0 FTM | 0.00036236 | ||||
Claim Bribes | 102676156 | 29 days ago | IN | 0 FTM | 0.00144811 | ||||
Claim Bribes | 102665111 | 29 days ago | IN | 0 FTM | 0.00055173 | ||||
Claim Bribes | 102636234 | 29 days ago | IN | 0 FTM | 0.00035906 | ||||
Claim Bribes | 102617305 | 30 days ago | IN | 0 FTM | 0.00041987 | ||||
Vote | 102500508 | 31 days ago | IN | 0 FTM | 0.00081909 | ||||
Claim Bribes | 102453259 | 32 days ago | IN | 0 FTM | 0.00050902 | ||||
Claim Bribes | 102441576 | 32 days ago | IN | 0 FTM | 0.00044746 | ||||
Claim Bribes | 102390924 | 33 days ago | IN | 0 FTM | 0.0007967 | ||||
Vote | 102257627 | 34 days ago | IN | 0 FTM | 0.00033406 | ||||
Claim Bribes | 102192090 | 35 days ago | IN | 0 FTM | 0.00059753 | ||||
Claim Bribes | 101974907 | 38 days ago | IN | 0 FTM | 0.00198351 | ||||
Claim Bribes | 101703586 | 41 days ago | IN | 0 FTM | 0.00032926 | ||||
Claim Bribes | 101460539 | 44 days ago | IN | 0 FTM | 0.00041772 | ||||
Claim Bribes | 101433940 | 44 days ago | IN | 0 FTM | 0.0002555 | ||||
Claim Bribes | 101406685 | 45 days ago | IN | 0 FTM | 0.00058983 | ||||
Claim Bribes | 101354546 | 45 days ago | IN | 0 FTM | 0.00030728 | ||||
Claim Bribes | 101348032 | 45 days ago | IN | 0 FTM | 0.00035855 |
Latest 22 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
77733507 | 329 days ago | Contract Creation | 0 FTM | |||
50532346 | 829 days ago | Contract Creation | 0 FTM | |||
45560513 | 903 days ago | Contract Creation | 0 FTM | |||
45526256 | 903 days ago | Contract Creation | 0 FTM | |||
45380981 | 906 days ago | Contract Creation | 0 FTM | |||
45380502 | 906 days ago | Contract Creation | 0 FTM | |||
44590742 | 917 days ago | Contract Creation | 0 FTM | |||
44590540 | 917 days ago | Contract Creation | 0 FTM | |||
44433375 | 919 days ago | Contract Creation | 0 FTM | |||
44433342 | 919 days ago | Contract Creation | 0 FTM | |||
44433253 | 919 days ago | Contract Creation | 0 FTM | |||
44157319 | 923 days ago | Contract Creation | 0 FTM | |||
42022855 | 953 days ago | Contract Creation | 0 FTM | |||
42022756 | 953 days ago | Contract Creation | 0 FTM | |||
42022520 | 953 days ago | Contract Creation | 0 FTM | |||
42022398 | 953 days ago | Contract Creation | 0 FTM | |||
42022300 | 953 days ago | Contract Creation | 0 FTM | |||
42022119 | 953 days ago | Contract Creation | 0 FTM | |||
42022056 | 953 days ago | Contract Creation | 0 FTM | |||
42021984 | 953 days ago | Contract Creation | 0 FTM | |||
42019140 | 953 days ago | Contract Creation | 0 FTM | |||
42019140 | 953 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
VariableGaugeProxy
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion, Audited
Contract Source Code (Solidity Standard Json-Input format)Audit Report
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } function toPayable(address account) internal pure returns (address payable) { return payable(address(uint160(account))); } function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) - value; callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function callOptionalReturn(IERC20 token, bytes memory data) private { require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IBaseV1Pair { function claimFees() external returns (uint, uint); function tokens() external returns (address, address); function stable() external returns (bool); } interface IBaseV1Factory { function isPair(address _tokenLP) external returns (bool); } interface IBribe { function _deposit(uint256 _amount, address _user) external; function _withdraw(uint256 _amount, address _user) external; function left(address rewardToken) external view returns (uint256); function addReward(address _rewardsToken) external; function getRewardForOwner(address _user) external; function notifyRewardAmount(address _rewardsToken, uint256 reward) external; } interface IGaugeProxy { function bribes(address gauge) external returns (address); } contract Gauge is ReentrancyGuard { using SafeERC20 for IERC20; IERC20 public SPIRIT; IERC20 public inSPIRIT; IERC20 public immutable TOKEN; address public immutable DISTRIBUTION; uint256 public constant DURATION = 7 days; uint256 public periodFinish = 0; uint256 public rewardRate = 0; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; uint256 public fees0; uint256 public fees1; address public gaugeProxy; modifier onlyDistribution() { require( msg.sender == DISTRIBUTION, "Caller is not RewardsDistribution contract" ); _; } mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; uint256 private _totalSupply; uint256 public derivedSupply; mapping(address => uint256) private _balances; mapping(address => uint256) public derivedBalances; mapping(address => uint256) private _base; constructor( address _spirit, address _inSpirit, address _token, address _gaugeProxy ) public { SPIRIT = IERC20(_spirit); inSPIRIT = IERC20(_inSpirit); TOKEN = IERC20(_token); gaugeProxy = _gaugeProxy; DISTRIBUTION = msg.sender; } function claimVotingFees() external nonReentrant returns (uint claimed0, uint claimed1) { // require address(TOKEN) is BaseV1Pair return _claimVotingFees(); } function _claimVotingFees() internal returns (uint claimed0, uint claimed1) { (claimed0, claimed1) = IBaseV1Pair(address(TOKEN)).claimFees(); address bribe = IGaugeProxy(gaugeProxy).bribes(address(this)); if (claimed0 > 0 || claimed1 > 0) { uint _fees0 = fees0 + claimed0; uint _fees1 = fees1 + claimed1; (address _token0, address _token1) = IBaseV1Pair(address(TOKEN)).tokens(); if (_fees0 > IBribe(bribe).left(_token0) && _fees0 / DURATION > 0) { fees0 = 0; IERC20(_token0).safeApprove(bribe, _fees0); IBribe(bribe).notifyRewardAmount(_token0, _fees0); } else { fees0 = _fees0; } if (_fees1 > IBribe(bribe).left(_token1) && _fees1 / DURATION > 0) { fees1 = 0; IERC20(_token1).safeApprove(bribe, _fees1); IBribe(bribe).notifyRewardAmount(_token1, _fees1); } else { fees1 = _fees1; } emit ClaimVotingFees(msg.sender, claimed0, claimed1); } } function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } function lastTimeRewardApplicable() public view returns (uint256) { return Math.min(block.timestamp, periodFinish); } function rewardPerToken() public view returns (uint256) { if (derivedSupply == 0) { return 0; } if (_totalSupply == 0) { return rewardPerTokenStored; } return rewardPerTokenStored + ((lastTimeRewardApplicable() - lastUpdateTime) * rewardRate * 1e18 / derivedSupply); } function derivedBalance(address account) public view returns (uint256) { if (inSPIRIT.totalSupply() == 0) return 0; uint256 _balance = _balances[account]; uint256 _derived = _balance * 40 / 100; uint256 _adjusted = (_totalSupply * inSPIRIT.balanceOf(account) / inSPIRIT.totalSupply()) * 60 / 100; return Math.min(_derived + _adjusted, _balance); } function kick(address account) public { uint256 _derivedBalance = derivedBalances[account]; derivedSupply = derivedSupply - _derivedBalance; _derivedBalance = derivedBalance(account); derivedBalances[account] = _derivedBalance; derivedSupply = derivedSupply + _derivedBalance; } function earned(address account) public view returns (uint256) { return (derivedBalances[account] * (rewardPerToken() - userRewardPerTokenPaid[account]) / 1e18) + rewards[account]; } function getRewardForDuration() external view returns (uint256) { return rewardRate * DURATION; } function depositAll() external { _deposit(TOKEN.balanceOf(msg.sender), msg.sender); } function deposit(uint256 amount) external { _deposit(amount, msg.sender); } function depositFor(uint256 amount, address account) external { _deposit(amount, account); } function _deposit(uint256 amount, address account) internal nonReentrant updateReward(account) { require(amount > 0, "deposit(Gauge): cannot stake 0"); uint256 userAmount = amount; _balances[account] = _balances[account] + userAmount; _totalSupply = _totalSupply + userAmount; TOKEN.safeTransferFrom(account, address(this), amount); emit Staked(account, userAmount); } function withdrawAll() external { _withdraw(_balances[msg.sender]); } function withdraw(uint256 amount) external { _withdraw(amount); } function _withdraw(uint256 amount) internal nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); _totalSupply = _totalSupply - amount; _balances[msg.sender] = _balances[msg.sender] - amount; TOKEN.safeTransfer(msg.sender, amount); emit Withdrawn(msg.sender, amount); } function getReward() public nonReentrant updateReward(msg.sender) { uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; SPIRIT.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); } } function notifyRewardAmount(uint256 reward) external onlyDistribution updateReward(address(0)) { SPIRIT.safeTransferFrom(DISTRIBUTION, address(this), reward); if (block.timestamp >= periodFinish) { rewardRate = reward / DURATION; } else { uint256 remaining = periodFinish - block.timestamp; uint256 leftover = remaining * rewardRate; rewardRate = (reward + leftover) / DURATION; } // Ensure the provided reward amount is not more than the balance in the contract. // This keeps the reward rate in the right range, preventing overflows due to // very high values of rewardRate in the earned and rewardsPerToken functions; // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow. uint256 balance = SPIRIT.balanceOf(address(this)); require( rewardRate <= balance / DURATION, "Provided reward too high" ); lastUpdateTime = block.timestamp; periodFinish = block.timestamp + DURATION; emit RewardAdded(reward); } modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; if (account != address(0)) { kick(account); } } event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); event ClaimVotingFees(address indexed from, uint256 claimed0, uint256 claimed1); } interface MasterChef { function deposit(uint256, uint256) external; function withdraw(uint256, uint256) external; function userInfo(uint256, address) external view returns (uint256, uint256); } interface IBaseV1BribeFactory { function createBribe( address owner, address _token0, address _token1 ) external returns (address); } contract ProtocolGovernance { /// @notice governance address for the governance contract address public governance; address public pendingGovernance; /** * @notice Allows governance to change governance (for future upgradability) * @param _governance new governance address to set */ function setGovernance(address _governance) external { require(msg.sender == governance, "setGovernance: !gov"); pendingGovernance = _governance; } /** * @notice Allows pendingGovernance to accept their role as governance (protection pattern) */ function acceptGovernance() external { require( msg.sender == pendingGovernance, "acceptGovernance: !pendingGov" ); governance = pendingGovernance; } } contract MasterDill { /// @notice EIP-20 token name for this token string public constant name = "Master inSPIRIT"; /// @notice EIP-20 token symbol for this token string public constant symbol = "minSPIRIT"; /// @notice EIP-20 token decimals for this token uint8 public constant decimals = 18; /// @notice Total number of tokens in circulation uint256 public totalSupply = 1e18; mapping(address => mapping(address => uint256)) internal allowances; mapping(address => uint256) internal balances; /// @notice The standard EIP-20 transfer event event Transfer(address indexed from, address indexed to, uint256 amount); /// @notice The standard EIP-20 approval event event Approval( address indexed owner, address indexed spender, uint256 amount ); constructor() public { balances[msg.sender] = 1e18; emit Transfer(address(0x0), msg.sender, 1e18); } /** * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` * @param account The address of the account holding the funds * @param spender The address of the account spending the funds * @return The number of tokens approved */ function allowance(address account, address spender) external view returns (uint256) { return allowances[account][spender]; } /** * @notice Approve `spender` to transfer up to `amount` from `src` * @dev This will overwrite the approval amount for `spender` * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) * @param spender The address of the account which may transfer tokens * @param amount The number of tokens that are approved (2^256-1 means infinite) * @return Whether or not the approval succeeded */ function approve(address spender, uint256 amount) external returns (bool) { allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } /** * @notice Get the number of tokens held by the `account` * @param account The address of the account to get the balance of * @return The number of tokens held */ function balanceOf(address account) external view returns (uint256) { return balances[account]; } /** * @notice Transfer `amount` tokens from `msg.sender` to `dst` * @param dst The address of the destination account * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transfer(address dst, uint256 amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } /** * @notice Transfer `amount` tokens from `src` to `dst` * @param src The address of the source account * @param dst The address of the destination account * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transferFrom( address src, address dst, uint256 amount ) external returns (bool) { address spender = msg.sender; uint256 spenderAllowance = allowances[src][spender]; if (spender != src && spenderAllowance != type(uint256).max) { uint256 newAllowance = spenderAllowance - amount; allowances[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens( address src, address dst, uint256 amount ) internal { require(src != address(0), "_transferTokens: zero address"); require(dst != address(0), "_transferTokens: zero address"); balances[src] = balances[src] - amount; balances[dst] = balances[dst] + amount; emit Transfer(src, dst, amount); } } contract VariableGaugeProxy is ProtocolGovernance, ReentrancyGuard { using SafeERC20 for IERC20; MasterChef public MASTER; IERC20 public inSPIRIT; IERC20 public SPIRIT; IERC20 public immutable TOKEN; // mInSpirit address public admin; //Admin address to manage gauges like add/deprecate/resurrect uint256 public minFee = 100 ether; // Address for bribeFactory address public bribeFactory; uint256 public immutable MIN_INSPIRIT_FOR_VERIFY = 1e23; // 100k inSPIRIT uint256 public pid = type(uint256).max; // -1 means 0xFFF....F and hasn't been set yet uint256 public totalWeight; // Time delays uint256 public voteDelay = 604800; uint256 public distributeDelay = 604800; uint256 public lastDistribute; mapping(address => uint256) public lastVote; // msg.sender => time of users last vote // V2 added variables for pre-distribute uint256 public lockedTotalWeight; uint256 public lockedBalance; uint256 public locktime; mapping(address => uint256) public lockedWeights; // token => weight mapping(address => bool) public hasDistributed; // LPtoken => bool // Variables verified tokens mapping(address => bool) public verifiedTokens; // verified tokens mapping(address => bool) public baseTokens; // Base tokens address public pairFactory; // VE bool bool public ve = false; address[] internal _tokens; address public feeDistAddr; // fee distributor address mapping(address => address) public gauges; // token => gauge mapping(address => bool) public gaugeStatus; // token => bool : false = deprecated // Add Guage to Bribe Mapping mapping(address => address) public bribes; // gauge => bribes mapping(address => uint256) public weights; // token => weight mapping(address => mapping(address => uint256)) public votes; // msg.sender => votes mapping(address => address[]) public tokenVote; // msg.sender => token mapping(address => uint256) public usedWeights; // msg.sender => total voting weight of user // Modifiers modifier hasVoted(address voter) { uint256 time = block.timestamp - lastVote[voter]; require(time > voteDelay, "You voted in the last 7 days"); _; } modifier hasDistribute() { uint256 time = block.timestamp - lastDistribute; require( time > distributeDelay, "this has been distributed in the last 7 days" ); _; } constructor( address _masterChef, address _spirit, address _inSpirit, address _feeDist, address _bribeFactory, address _pairFactory ) public { MASTER = MasterChef(_masterChef); SPIRIT = IERC20(_spirit); inSPIRIT = IERC20(_inSpirit); TOKEN = IERC20(address(new MasterDill())); governance = msg.sender; admin = msg.sender; feeDistAddr = _feeDist; bribeFactory = _bribeFactory; pairFactory = _pairFactory; } function tokens() external view returns (address[] memory) { return _tokens; } function getGauge(address _token) external view returns (address) { return gauges[_token]; } function getBribes(address _gauge) external view returns (address) { return bribes[_gauge]; } function setBaseToken(address _tokenLP, bool _flag) external { require( (msg.sender == governance || msg.sender == admin), "!gov or !admin" ); baseTokens[_tokenLP] = _flag; } function setVerifiedToken(address _tokenLP, bool _flag) external { require( (msg.sender == governance || msg.sender == admin), "!gov or !admin" ); verifiedTokens[_tokenLP] = _flag; } // Reset votes to 0 function reset() external { _reset(msg.sender); } // Reset votes to 0 function _reset(address _owner) internal { address[] storage _tokenVote = tokenVote[_owner]; uint256 _tokenVoteCnt = _tokenVote.length; for (uint256 i = 0; i < _tokenVoteCnt; i++) { address _token = _tokenVote[i]; uint256 _votes = votes[_owner][_token]; if (_votes > 0) { totalWeight = totalWeight - _votes; weights[_token] = weights[_token] - _votes; // Bribe vote withdrawal IBribe(bribes[gauges[_token]])._withdraw( uint256(_votes), _owner ); votes[_owner][_token] = 0; } } delete tokenVote[_owner]; } // Adjusts _owner's votes according to latest _owner's inSPIRIT balance function poke(address _owner) public { address[] memory _tokenVote = tokenVote[_owner]; uint256 _tokenCnt = _tokenVote.length; uint256[] memory _weights = new uint256[](_tokenCnt); uint256 _prevUsedWeight = usedWeights[_owner]; uint256 _weight = inSPIRIT.balanceOf(_owner); for (uint256 i = 0; i < _tokenCnt; i++) { // Need to make this reflect the value deposited into bribes, anyone should be able to call this on // other addresses to stop them from gaming the system with outdated votes that dont lose voting power uint256 _prevWeight = votes[_owner][_tokenVote[i]]; _weights[i] = _prevWeight * _weight / _prevUsedWeight; } _vote(_owner, _tokenVote, _weights); } function _vote( address _owner, address[] memory _tokenVote, uint256[] memory _weights ) internal { // _weights[i] = percentage * 100 _reset(_owner); uint256 _tokenCnt = _tokenVote.length; uint256 _weight = inSPIRIT.balanceOf(_owner); uint256 _totalVoteWeight = 0; uint256 _usedWeight = 0; for (uint256 i = 0; i < _tokenCnt; i++) { _totalVoteWeight = _totalVoteWeight + _weights[i]; } for (uint256 i = 0; i < _tokenCnt; i++) { address _token = _tokenVote[i]; address _gauge = gauges[_token]; uint256 _tokenWeight = _weights[i] * _weight / _totalVoteWeight; if (_gauge != address(0x0) && gaugeStatus[_token]) { _usedWeight = _usedWeight + _tokenWeight; totalWeight = totalWeight + _tokenWeight; weights[_token] = weights[_token] + _tokenWeight; tokenVote[_owner].push(_token); votes[_owner][_token] = _tokenWeight; // Bribe vote deposit IBribe(bribes[_gauge])._deposit(uint256(_tokenWeight), _owner); } } usedWeights[_owner] = _usedWeight; } // Vote with inSPIRIT on a gauge function vote(address[] calldata _tokenVote, uint256[] calldata _weights) external hasVoted(msg.sender) { require(_tokenVote.length == _weights.length); lastVote[msg.sender] = block.timestamp; _vote(msg.sender, _tokenVote, _weights); } function setAdmin(address _admin) external { require(msg.sender == governance, "!gov"); admin = _admin; } // Add new token gauge function addGaugeForOwner(address _tokenLP, address _token0, address _token1) external returns (address) { require( (msg.sender == governance || msg.sender == admin), "!gov or !admin" ); require(gauges[_tokenLP] == address(0x0), "exists"); // Deploy Gauge gauges[_tokenLP] = address( new Gauge(address(SPIRIT), address(inSPIRIT), _tokenLP, address(this)) ); _tokens.push(_tokenLP); gaugeStatus[_tokenLP] = true; // Deploy Bribe address _bribe = IBaseV1BribeFactory(bribeFactory).createBribe( governance, _token0, _token1 ); bribes[gauges[_tokenLP]] = _bribe; emit GaugeAddedByOwner(_tokenLP, _token0, _token1); return gauges[_tokenLP]; } // Add new token gauge function addGauge(address _tokenLP) external returns (address) { require(gauges[_tokenLP] == address(0x0), "exists"); require(IBaseV1Factory(pairFactory).isPair(_tokenLP), "!_tokenLP"); require(!IBaseV1Pair(_tokenLP).stable()); (address _token0, address _token1) = IBaseV1Pair(_tokenLP).tokens(); require(baseTokens[_token0] && verifiedTokens[_token1] || baseTokens[_token1] && verifiedTokens[_token0], "!verified"); require(inSPIRIT.balanceOf(msg.sender) > inSPIRIT.totalSupply() / 100 || msg.sender == governance || msg.sender == admin, "!supply"); // Deploy Gauge gauges[_tokenLP] = address( new Gauge(address(SPIRIT), address(inSPIRIT), _tokenLP, address(this)) ); _tokens.push(_tokenLP); gaugeStatus[_tokenLP] = true; // Deploy Bribe address _bribe = IBaseV1BribeFactory(bribeFactory).createBribe( governance, _token0, _token1 ); bribes[gauges[_tokenLP]] = _bribe; emit GaugeAdded(_tokenLP); return gauges[_tokenLP]; } // Deprecate existing gauge function deprecateGauge(address _token) external { require( (msg.sender == governance || msg.sender == admin), "!gov or !admin" ); require(gauges[_token] != address(0x0), "does not exist"); require(gaugeStatus[_token], "gauge is not active"); gaugeStatus[_token] = false; emit GaugeDeprecated(_token); } // Bring Deprecated gauge back into use function resurrectGauge(address _token) external { require( (msg.sender == governance || msg.sender == admin), "!gov or !admin" ); require(gauges[_token] != address(0x0), "does not exist"); require(!gaugeStatus[_token], "gauge is active"); gaugeStatus[_token] = true; emit GaugeResurrected(_token); } // Sets MasterChef PID function setPID(uint256 _pid) external { require(msg.sender == governance, "!gov"); pid = _pid; } // Deposits minSPIRIT into MasterChef function deposit() public { require(pid != type(uint256).max, "pid not initialized"); IERC20 _token = TOKEN; uint256 _balance = _token.balanceOf(address(this)); _token.safeApprove(address(MASTER), 0); _token.safeApprove(address(MASTER), _balance); MASTER.deposit(pid, _balance); } // Fetches Spirit // Change from public to internal, ONLY preDistribute should be able to call function collect() internal { (uint256 _locked, ) = MASTER.userInfo(pid, address(this)); MASTER.withdraw(pid, _locked); deposit(); } function length() external view returns (uint256) { return _tokens.length; } function preDistribute() external nonReentrant hasDistribute { lockedTotalWeight = totalWeight; for (uint256 i = 0; i < _tokens.length; i++) { lockedWeights[_tokens[i]] = weights[_tokens[i]]; hasDistributed[_tokens[i]] = false; } collect(); lastDistribute = block.timestamp; uint256 _balance = SPIRIT.balanceOf(address(this)); lockedBalance = _balance; uint256 _inSpiritRewards = 0; if (ve) { uint256 _lockedSpirit = SPIRIT.balanceOf(address(inSPIRIT)); uint256 _spiritSupply = SPIRIT.totalSupply(); _inSpiritRewards = _balance * _lockedSpirit / _spiritSupply; if (_inSpiritRewards > 0) { SPIRIT.safeTransfer(feeDistAddr, _inSpiritRewards); lockedBalance = SPIRIT.balanceOf(address(this)); } } locktime = block.timestamp; emit PreDistributed(_inSpiritRewards); } function distribute(uint256 _start, uint256 _end) external nonReentrant { require(_start < _end, "bad _start"); require(_end <= _tokens.length, "bad _end"); if (lockedBalance > 0 && lockedTotalWeight > 0) { for (uint256 i = _start; i < _end; i++) { address _token = _tokens[i]; if (!hasDistributed[_token] && gaugeStatus[_token]) { address _gauge = gauges[_token]; uint256 _reward = lockedBalance * lockedWeights[_token] / lockedTotalWeight; if (_reward > 0) { SPIRIT.safeApprove(_gauge, 0); SPIRIT.safeApprove(_gauge, _reward); Gauge(_gauge).notifyRewardAmount(_reward); } hasDistributed[_token] = true; } } } } // Add claim function for bribes function claimBribes(address[] memory _bribes, address _user) external { for (uint256 i = 0; i < _bribes.length; i++) { IBribe(_bribes[i]).getRewardForOwner(_user); } } // Update fee distributor address function updateFeeDistributor(address _feeDistAddr) external { require( (msg.sender == governance || msg.sender == admin), "updateFeeDestributor: permission is denied!" ); feeDistAddr = _feeDistAddr; } function toggleVE() external { require( (msg.sender == governance || msg.sender == admin), "turnVeOn: permission is denied!" ); ve = !ve; } event GaugeAdded(address tokenLP); event GaugeAddedByOwner(address tokenLP, address token0, address token1); event GaugeDeprecated(address tokenLP); event GaugeResurrected(address tokenLP); event PreDistributed(uint256 spiritRewards); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- PeckShield - August 8th, 2022 - Security Audit Report
[{"inputs":[{"internalType":"address","name":"_masterChef","type":"address"},{"internalType":"address","name":"_spirit","type":"address"},{"internalType":"address","name":"_inSpirit","type":"address"},{"internalType":"address","name":"_feeDist","type":"address"},{"internalType":"address","name":"_bribeFactory","type":"address"},{"internalType":"address","name":"_pairFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenLP","type":"address"}],"name":"GaugeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenLP","type":"address"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"address","name":"token1","type":"address"}],"name":"GaugeAddedByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenLP","type":"address"}],"name":"GaugeDeprecated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenLP","type":"address"}],"name":"GaugeResurrected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"spiritRewards","type":"uint256"}],"name":"PreDistributed","type":"event"},{"inputs":[],"name":"MASTER","outputs":[{"internalType":"contract MasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_INSPIRIT_FOR_VERIFY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPIRIT","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenLP","type":"address"}],"name":"addGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenLP","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"addGaugeForOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"baseTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribeFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bribes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bribes","type":"address[]"},{"internalType":"address","name":"_user","type":"address"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"deprecateGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDistAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gaugeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"getBribes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasDistributed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSPIRIT","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDistribute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedTotalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locktime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"poke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"resurrectGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenLP","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setBaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setPID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenLP","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setVerifiedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleVE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeDistAddr","type":"address"}],"name":"updateFeeDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usedWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"verifiedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokenVote","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405268056bc75e2d6310000060075569152d02c7e14af680000060a05260001960095562093a80600b819055600c556016805460ff60a01b191690553480156200004b57600080fd5b5060405162005808380380620058088339810160408190526200006e916200016d565b6001600255600380546001600160a01b038089166001600160a01b031992831617909255600580548884169083161790556004805492871692909116919091179055604051620000be9062000142565b604051809103906000f080158015620000db573d6000803e3d6000fd5b506001600160a01b0390811660805260008054336001600160a01b03199182168117909255600680548216909217909155601880548216958316959095179094556008805485169382169390931790925560168054909316911617905550620001ee915050565b6106b1806200515783390190565b80516001600160a01b03811681146200016857600080fd5b919050565b60008060008060008060c087890312156200018757600080fd5b620001928762000150565b9550620001a26020880162000150565b9450620001b26040880162000150565b9350620001c26060880162000150565b9250620001d26080880162000150565b9150620001e260a0880162000150565b90509295509295509295565b60805160a051614f3c6200021b6000396000610438015260008181610636015261227f0152614f3c6000f3fe60806040523480156200001157600080fd5b5060043610620003c05760003560e01c806396c82e5711620001f9578063cad1b9061162000119578063f106845411620000af578063f6d12b161162000086578063f6d12b1614620008ed578063f851a44014620008f7578063f9b2fe27146200090b578063ff2af408146200091557600080fd5b8063f106845414620008b8578063f2a1a8ed14620008c2578063f39c38a014620008d957600080fd5b8063e14f870d11620000f0578063e14f870d1462000856578063e96a6bda146200086a578063eb4a78e01462000890578063f05cc5b614620008a457600080fd5b8063cad1b9061462000814578063d0e30db01462000842578063d826f88f146200084c57600080fd5b8063b1a997ac116200018f578063b70aed711162000166578063b70aed7114620007a3578063b9173ec414620007ba578063b9a09fd514620007d1578063c84afda014620007fd57600080fd5b8063b1a997ac1462000746578063b1c6f0e9146200075d578063b23e3014146200078c57600080fd5b8063a7cac84611620001d0578063a7cac84614620006cc578063a7fa806b14620006ef578063a8c5d95a1462000703578063ab033ea9146200072f57600080fd5b806396c82e5714620006925780639d63848a146200069c5780639da882ac14620006b557600080fd5b80634c904f2c11620002e5578063704b6c02116200027b57806382836391116200025257806382836391146200062657806382bfefc814620006305780638d0605191462000658578063924d9f77146200066f57600080fd5b8063704b6c0214620005ee5780637625391a14620006055780637b80889b146200061c57600080fd5b806361c533b411620002bc57806361c533b414620005935780636848c2bd146200059d5780636accc8cf14620005b45780636f816a2014620005d757600080fd5b80634c904f2c14620005545780635aa6e675146200056857806360c73bf2146200057c57600080fd5b806324ec7590116200035b5780632951005c11620003325780632951005c14620004c85780634668e61914620004ee578063471aedc2146200053657806347d67339146200054a57600080fd5b806324ec759014620004aa57806328b02a1d14620004b4578063292fc97914620004be57600080fd5b80631baaaffe116200039c5780631baaaffe146200045a5780631f7b6d3214620004805780631f8507161462000489578063238efcbc146200049e57600080fd5b80622f8de414620003c557806302eba09414620003fb57806313976fc81462000432575b600080fd5b620003e8620003d636600462002e6b565b601f6020526000908152604090205481565b6040519081526020015b60405180910390f35b620004216200040c36600462002e6b565b60156020526000908152604090205460ff1681565b6040519015158152602001620003f2565b620003e87f000000000000000000000000000000000000000000000000000000000000000081565b620004216200046b36600462002e6b565b60146020526000908152604090205460ff1681565b601754620003e8565b6016546200042190600160a01b900460ff1681565b620004a86200092c565b005b620003e860075481565b620003e8600f5481565b620003e8600b5481565b62000421620004d936600462002e6b565b601a6020526000908152604090205460ff1681565b6200051d620004ff36600462002e6b565b6001600160a01b039081166000908152601b60205260409020541690565b6040516001600160a01b039091168152602001620003f2565b6003546200051d906001600160a01b031681565b620003e8600d5481565b6018546200051d906001600160a01b031681565b6000546200051d906001600160a01b031681565b620004a86200058d36600462002e6b565b620009b0565b620003e860115481565b620004a8620005ae36600462002e6b565b62000a58565b620003e8620005c536600462002e6b565b600e6020526000908152604090205481565b620004a8620005e836600462002ee1565b62000bad565b620004a8620005ff36600462002e6b565b62000cb5565b620004a86200061636600462002f54565b62000d1c565b620003e860105481565b620004a862000fae565b6200051d7f000000000000000000000000000000000000000000000000000000000000000081565b620004a86200066936600462002f77565b62001423565b620003e86200068036600462002e6b565b60126020526000908152604090205481565b620003e8600a5481565b620006a66200146d565b604051620003f2919062002f91565b6200051d620006c636600462002e6b565b620014d1565b620003e8620006dd36600462002e6b565b601c6020526000908152604090205481565b6005546200051d906001600160a01b031681565b6200051d6200071436600462002e6b565b601b602052600090815260409020546001600160a01b031681565b620004a86200074036600462002e6b565b62001acd565b620004a86200075736600462002e6b565b62001b41565b6200051d6200076e36600462002e6b565b6001600160a01b039081166000908152601960205260409020541690565b620004a86200079d36600462002fef565b62001d52565b620004a8620007b436600462002fef565b62001dc0565b620004a8620007cb36600462002e6b565b62001e2e565b6200051d620007e236600462002e6b565b6019602052600090815260409020546001600160a01b031681565b6200051d6200080e3660046200302d565b62001f7d565b620003e8620008253660046200307f565b601d60209081526000928352604080842090915290825290205481565b620004a86200221e565b620004a8620023a3565b6016546200051d906001600160a01b031681565b620004216200087b36600462002e6b565b60136020526000908152604090205460ff1681565b6008546200051d906001600160a01b031681565b6004546200051d906001600160a01b031681565b620003e860095481565b6200051d620008d3366004620030b2565b620023b0565b6001546200051d906001600160a01b031681565b620003e8600c5481565b6006546200051d906001600160a01b031681565b620004a8620023e9565b620004a862000926366004620030f7565b6200247c565b6001546001600160a01b031633146200098c5760405162461bcd60e51b815260206004820152601d60248201527f616363657074476f7665726e616e63653a202170656e64696e67476f7600000060448201526064015b60405180910390fd5b600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b0316331480620009d457506006546001600160a01b031633145b62000a365760405162461bcd60e51b815260206004820152602b60248201527f7570646174654665654465737472696275746f723a207065726d697373696f6e60448201526a2069732064656e6965642160a81b606482015260840162000983565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148062000a7c57506006546001600160a01b031633145b62000a9b5760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b038181166000908152601960205260409020541662000af55760405162461bcd60e51b815260206004820152600e60248201526d191bd95cc81b9bdd08195e1a5cdd60921b604482015260640162000983565b6001600160a01b0381166000908152601a602052604090205460ff1662000b555760405162461bcd60e51b81526020600482015260136024820152726761756765206973206e6f742061637469766560681b604482015260640162000983565b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916905590519182527fd780203fe297949db725d8b7408a8d9f009bafaf49909a5eb5130c37bba5efb191015b60405180910390a150565b336000818152600e602052604081205462000bc990426200321c565b9050600b54811162000c1e5760405162461bcd60e51b815260206004820152601c60248201527f596f7520766f74656420696e20746865206c6173742037206461797300000000604482015260640162000983565b84831462000c2b57600080fd5b336000818152600e60209081526040918290204290558151888202818101830190935288815262000cad939290918a918a9182919085019084908082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920191909152506200252292505050565b505050505050565b6000546001600160a01b0316331462000cfa5760405162461bcd60e51b8152600401620009839060208082526004908201526310b3b7bb60e11b604082015260600190565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60028054141562000d705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000983565b6002805580821062000db25760405162461bcd60e51b815260206004820152600a6024820152691898590817dcdd185c9d60b21b604482015260640162000983565b60175481111562000df15760405162461bcd60e51b81526020600482015260086024820152671898590817d95b9960c21b604482015260640162000983565b600060105411801562000e0657506000600f54115b1562000fa557815b8181101562000fa35760006017828154811062000e2f5762000e2f62003236565b60009182526020808320909101546001600160a01b0316808352601390915260409091205490915060ff1615801562000e8057506001600160a01b0381166000908152601a602052604090205460ff165b1562000f8d576001600160a01b03808216600090815260196020908152604080832054600f54601290935290832054601054919094169362000ec2916200324c565b62000ece91906200326e565b9050801562000f675760055462000ef1906001600160a01b03168360006200280c565b60055462000f0a906001600160a01b031683836200280c565b604051633c6b16ab60e01b8152600481018290526001600160a01b03831690633c6b16ab90602401600060405180830381600087803b15801562000f4d57600080fd5b505af115801562000f62573d6000803e3d6000fd5b505050505b50506001600160a01b0381166000908152601360205260409020805460ff191660011790555b508062000f9a8162003291565b91505062000e0e565b505b50506001600255565b600280541415620010025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000983565b60028055600d546000906200101890426200321c565b9050600c548111620010825760405162461bcd60e51b815260206004820152602c60248201527f7468697320686173206265656e20646973747269627574656420696e2074686560448201526b206c6173742037206461797360a01b606482015260840162000983565b600a54600f5560005b6017548110156200119657601c600060178381548110620010b057620010b062003236565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601260006017848154811062001109576200110962003236565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601780546013918391859081106200114d576200114d62003236565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055806200118d8162003291565b9150506200108b565b50620011a16200295c565b42600d556005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015620011ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012159190620032af565b6010819055601654909150600090600160a01b900460ff1615620013e257600554600480546040516370a0823160e01b81526001600160a01b039182169281019290925260009216906370a0823190602401602060405180830381865afa15801562001285573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012ab9190620032af565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013299190620032af565b9050806200133883866200324c565b6200134491906200326e565b92508215620013df576018546005546200136c916001600160a01b0391821691168562002a50565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015620013b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013db9190620032af565b6010555b50505b426011556040518181527fce10d9c5a37f75faa552238874842dbf93dc8424647cb8c3286cfdcb73f6212a9060200160405180910390a15050600160025550565b6000546001600160a01b03163314620014685760405162461bcd60e51b8152600401620009839060208082526004908201526310b3b7bb60e11b604082015260600190565b600955565b60606017805480602002602001604051908101604052809291908181526020018280548015620014c757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620014a8575b5050505050905090565b6001600160a01b0381811660009081526019602052604081205490911615620015265760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b604482015260640162000983565b60165460405163e5e31b1360e01b81526001600160a01b0384811660048301529091169063e5e31b13906024016020604051808303816000875af115801562001573573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015999190620032c9565b620015d35760405162461bcd60e51b81526020600482015260096024820152680215f746f6b656e4c560bc1b604482015260640162000983565b816001600160a01b03166322be3de16040518163ffffffff1660e01b81526004016020604051808303816000875af115801562001614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200163a9190620032c9565b156200164557600080fd5b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af115801562001688573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016ae9190620032e9565b6001600160a01b038216600090815260156020526040902054919350915060ff168015620016f457506001600160a01b03811660009081526014602052604090205460ff165b806200173c57506001600160a01b03811660009081526015602052604090205460ff1680156200173c57506001600160a01b03821660009081526014602052604090205460ff165b620017765760405162461bcd60e51b8152602060048201526009602482015268085d995c9a599a595960ba1b604482015260640162000983565b6064600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620017cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017f29190620032af565b620017fe91906200326e565b600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa15801562001848573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200186e9190620032af565b11806200188557506000546001600160a01b031633145b806200189b57506006546001600160a01b031633145b620018d35760405162461bcd60e51b815260206004820152600760248201526621737570706c7960c81b604482015260640162000983565b6005546004546040516001600160a01b03928316929091169086903090620018fb9062002e00565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f08015801562001940573d6000803e3d6000fd5b506001600160a01b03858116600081815260196020908152604080832080549686166001600160a01b03199788161790556017805460018181019092557fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15018054909716909417909555601a9052838120805460ff191690921790915560085481549351631c1e57c960e11b8152938316600485015285831660248501528483166044850152909291169063383caf92906064016020604051808303816000875af115801562001a14573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a3a91906200331d565b6001600160a01b0386811660008181526019602090815260408083205485168352601b82529182902080546001600160a01b03191694861694909417909355519081529192507f9808313031a8f4caa534c417adad16800af7317516eff29a2d37cec0ffb244db910160405180910390a1505050506001600160a01b039081166000908152601960205260409020541690565b6000546001600160a01b0316331462001b1f5760405162461bcd60e51b815260206004820152601360248201527239b2ba23b7bb32b93730b731b29d1010b3b7bb60691b604482015260640162000983565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152601e602090815260408083208054825181850281018501909352808352919290919083018282801562001bad57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162001b8e575b5050505050905060008151905060008167ffffffffffffffff81111562001bd85762001bd8620030e1565b60405190808252806020026020018201604052801562001c02578160200160208202803683370190505b506001600160a01b038581166000818152601f6020526040808220546004805492516370a0823160e01b815290810194909452949550909216906370a0823190602401602060405180830381865afa15801562001c63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c899190620032af565b905060005b8481101562001d44576001600160a01b0387166000908152601d602052604081208751829089908590811062001cc85762001cc862003236565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054905083838262001d0291906200324c565b62001d0e91906200326e565b85838151811062001d235762001d2362003236565b6020908102919091010152508062001d3b8162003291565b91505062001c8e565b5062000cad86868562002522565b6000546001600160a01b031633148062001d7657506006546001600160a01b031633145b62001d955760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6000546001600160a01b031633148062001de457506006546001600160a01b031633145b62001e035760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b6000546001600160a01b031633148062001e5257506006546001600160a01b031633145b62001e715760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b038181166000908152601960205260409020541662001ecb5760405162461bcd60e51b815260206004820152600e60248201526d191bd95cc81b9bdd08195e1a5cdd60921b604482015260640162000983565b6001600160a01b0381166000908152601a602052604090205460ff161562001f285760405162461bcd60e51b815260206004820152600f60248201526e67617567652069732061637469766560881b604482015260640162000983565b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916600117905590519182527f9249e27c005fd3aeb1554e7b8cb687f7e017f0651813d386f7d74ebd7245c8a2910162000ba2565b600080546001600160a01b031633148062001fa257506006546001600160a01b031633145b62001fc15760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b038481166000908152601960205260409020541615620020145760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b604482015260640162000983565b6005546004546040516001600160a01b039283169290911690869030906200203c9062002e00565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f08015801562002081573d6000803e3d6000fd5b506001600160a01b03858116600081815260196020908152604080832080549686166001600160a01b03199788161790556017805460018181019092557fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15018054909716909417909555601a9052838120805460ff191690921790915560085481549351631c1e57c960e11b8152938316600485015286831660248501528583166044850152909291169063383caf92906064016020604051808303816000875af115801562002155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200217b91906200331d565b6001600160a01b0386811660008181526019602090815260408083205485168352601b82529182902080546001600160a01b031916868616179055815192835288841690830152918616918101919091529091507fdecab58d8a6a044c9ac75d257407891e2515835f38d07a2b7333682b8d4b63089060600160405180910390a1505050506001600160a01b039081166000908152601960205260409020541690565b60001960095414156200226a5760405162461bcd60e51b81526020600482015260136024820152721c1a59081b9bdd081a5b9a5d1a585b1a5e9959606a1b604482015260640162000983565b6040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015620022d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022fa9190620032af565b6003549091506200231a906001600160a01b03848116911660006200280c565b60035462002336906001600160a01b038481169116836200280c565b600354600954604051631c57762b60e31b81526001600160a01b039092169163e2bbb1589162002373918590600401918252602082015260400190565b600060405180830381600087803b1580156200238e57600080fd5b505af115801562000cad573d6000803e3d6000fd5b620023ae3362002a82565b565b601e6020528160005260406000208181548110620023cd57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b03163314806200240d57506006546001600160a01b031633145b6200245b5760405162461bcd60e51b815260206004820152601f60248201527f7475726e56654f6e3a207065726d697373696f6e2069732064656e6965642100604482015260640162000983565b6016805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60005b82518110156200251d578281815181106200249e576200249e62003236565b602090810291909101015160405163ef0d090f60e01b81526001600160a01b0384811660048301529091169063ef0d090f90602401600060405180830381600087803b158015620024ee57600080fd5b505af115801562002503573d6000803e3d6000fd5b505050508080620025149062003291565b9150506200247f565b505050565b6200252d8362002a82565b8151600480546040516370a0823160e01b81526001600160a01b0387811693820193909352600092909116906370a0823190602401602060405180830381865afa15801562002580573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025a69190620032af565b905060008060005b84811015620025f857858181518110620025cc57620025cc62003236565b602002602001015183620025e191906200333d565b925080620025ef8162003291565b915050620025ae565b5060005b84811015620027e75760008782815181106200261c576200261c62003236565b6020908102919091018101516001600160a01b038082166000908152601990935260408320548a51929450169190869088908b908790811062002663576200266362003236565b60200260200101516200267791906200324c565b6200268391906200326e565b90506001600160a01b03821615801590620026b657506001600160a01b0383166000908152601a602052604090205460ff165b15620027ce57620026c881866200333d565b945080600a54620026da91906200333d565b600a556001600160a01b0383166000908152601c6020526040902054620027039082906200333d565b6001600160a01b038481166000818152601c60209081526040808320959095558f8416808352601e825285832080546001810182559084528284200180546001600160a01b03191685179055808352601d82528583209383529281528482208690558684168252601b9052839020549251630463cd9760e41b815260048101859052602481019190915291169063463cd97090604401600060405180830381600087803b158015620027b457600080fd5b505af1158015620027c9573d6000803e3d6000fd5b505050505b5050508080620027de9062003291565b915050620025fc565b506001600160a01b039096166000908152601f60205260409020959095555050505050565b8015806200288a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562002862573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620028889190620032af565b155b620028f75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840162000983565b6040516001600160a01b0383166024820152604481018290526200251d90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002c27565b6003546009546040516393f1a40b60e01b815260048101919091523060248201526000916001600160a01b0316906393f1a40b906044016040805180830381865afa158015620029b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620029d6919062003358565b50600354600954604051630441a3e760e41b81526004810191909152602481018390529192506001600160a01b03169063441a3e7090604401600060405180830381600087803b15801562002a2a57600080fd5b505af115801562002a3f573d6000803e3d6000fd5b5050505062002a4d6200221e565b50565b6040516001600160a01b0383166024820152604481018290526200251d90849063a9059cbb60e01b9060640162002924565b6001600160a01b0381166000908152601e60205260408120805490915b8181101562002c0357600083828154811062002abf5762002abf62003236565b60009182526020808320909101546001600160a01b038881168452601d8352604080852091909216808552925290912054909150801562002beb5780600a5462002b0a91906200321c565b600a556001600160a01b0382166000908152601c602052604090205462002b339082906200321c565b6001600160a01b038381166000908152601c6020908152604080832094909455601981528382205483168252601b905282902054915163293311ab60e01b815260048101849052888216602482015291169063293311ab90604401600060405180830381600087803b15801562002ba957600080fd5b505af115801562002bbe573d6000803e3d6000fd5b5050506001600160a01b038088166000908152601d60209081526040808320938716835292905290812055505b5050808062002bfa9062003291565b91505062002a9f565b506001600160a01b0383166000908152601e602052604081206200251d9162002e0e565b62002c3b826001600160a01b031662002dc3565b62002c895760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640162000983565b600080836001600160a01b03168360405162002ca691906200337d565b6000604051808303816000865af19150503d806000811462002ce5576040519150601f19603f3d011682016040523d82523d6000602084013e62002cea565b606091505b50915091508162002d3e5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640162000983565b80511562002dbd578080602001905181019062002d5c9190620032c9565b62002dbd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000983565b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159062002df85750808214155b949350505050565b611b4b80620033bc83390190565b508054600082559060005260206000209081019062002a4d91905b8082111562002e3f576000815560010162002e29565b5090565b6001600160a01b038116811462002a4d57600080fd5b803562002e668162002e43565b919050565b60006020828403121562002e7e57600080fd5b813562002e8b8162002e43565b9392505050565b60008083601f84011262002ea557600080fd5b50813567ffffffffffffffff81111562002ebe57600080fd5b6020830191508360208260051b850101111562002eda57600080fd5b9250929050565b6000806000806040858703121562002ef857600080fd5b843567ffffffffffffffff8082111562002f1157600080fd5b62002f1f8883890162002e92565b9096509450602087013591508082111562002f3957600080fd5b5062002f488782880162002e92565b95989497509550505050565b6000806040838503121562002f6857600080fd5b50508035926020909101359150565b60006020828403121562002f8a57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101562002fd45783516001600160a01b03168352928401929184019160010162002fad565b50909695505050505050565b801515811462002a4d57600080fd5b600080604083850312156200300357600080fd5b8235620030108162002e43565b91506020830135620030228162002fe0565b809150509250929050565b6000806000606084860312156200304357600080fd5b8335620030508162002e43565b92506020840135620030628162002e43565b91506040840135620030748162002e43565b809150509250925092565b600080604083850312156200309357600080fd5b8235620030a08162002e43565b91506020830135620030228162002e43565b60008060408385031215620030c657600080fd5b8235620030d38162002e43565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200310b57600080fd5b823567ffffffffffffffff808211156200312457600080fd5b818501915085601f8301126200313957600080fd5b8135602082821115620031505762003150620030e1565b8160051b604051601f19603f83011681018181108682111715620031785762003178620030e1565b6040529283528183019350848101820192898411156200319757600080fd5b948201945b83861015620031c057620031b08662002e59565b855294820194938201936200319c565b9650620031d1905087820162002e59565b9450505050509250929050565b6020808252600e908201526d10b3b7bb1037b91010b0b236b4b760911b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101562003231576200323162003206565b500390565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161562003269576200326962003206565b500290565b6000826200328c57634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415620032a857620032a862003206565b5060010190565b600060208284031215620032c257600080fd5b5051919050565b600060208284031215620032dc57600080fd5b815162002e8b8162002fe0565b60008060408385031215620032fd57600080fd5b82516200330a8162002e43565b6020840151909250620030228162002e43565b6000602082840312156200333057600080fd5b815162002e8b8162002e43565b6000821982111562003353576200335362003206565b500190565b600080604083850312156200336c57600080fd5b505080516020909101519092909150565b6000825160005b81811015620033a0576020818601810151858301520162003384565b81811115620033b0576000828501525b50919091019291505056fe60c0604052600060035560006004553480156200001b57600080fd5b5060405162001b4b38038062001b4b8339810160408190526200003e91620000ad565b6001600081905580546001600160a01b039586166001600160a01b0319918216179091556002805494861694821694909417909355908316608052600980549190931691161790553360a0526200010a565b80516001600160a01b0381168114620000a857600080fd5b919050565b60008060008060808587031215620000c457600080fd5b620000cf8562000090565b9350620000df6020860162000090565b9250620000ef6040860162000090565b9150620000ff6060860162000090565b905092959194509250565b60805160a0516119ea62000161600039600081816102f70152818161050e015261060101526000818161033e01528181610c1101528181610d9601528181610f4b0152818161109c01526111d301526119ea6000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063853828b61161010f578063ca1c9b75116100a2578063de5f626811610071578063de5f626814610427578063df136d651461042f578063ebe2b12b14610438578063f05cc5b61461044157600080fd5b8063ca1c9b75146103f0578063cd3daf9d14610403578063d35e25441461040b578063d7da4bb01461041e57600080fd5b806396c55175116100de57806396c55175146103ae578063a7fa806b146103c1578063b6b55f25146103d4578063c8f33c91146103e757600080fd5b8063853828b6146103605780638b0e888e146103685780638b8763471461038557806393f1c442146103a557600080fd5b80633d18b912116101875780637b0a47ee116101565780637b0a47ee146102e95780637c91e4eb146102f257806380faa57d1461033157806382bfefc81461033957600080fd5b80633d18b9121461028f5780634c02a21c1461029757806363fb415b146102a057806370a08231146102c057600080fd5b80631c1f78eb116101c35780631c1f78eb1461024c5780632e1a7d4d1461025457806336efd16f146102695780633c6b16ab1461027c57600080fd5b80628cc262146101f45780630700037d1461021a57806318160ddd1461023a5780631be0528914610242575b600080fd5b6102076102023660046117ab565b610454565b6040519081526020015b60405180910390f35b6102076102283660046117ab565b600b6020526000908152604090205481565b600c54610207565b61020762093a8081565b6102076104d1565b6102676102623660046117c8565b6104e9565b005b6102676102773660046117e1565b6104f5565b61026761028a3660046117c8565b610503565b6102676107b7565b61020760085481565b6102076102ae3660046117ab565b600f6020526000908152604090205481565b6102076102ce3660046117ab565b6001600160a01b03166000908152600e602052604090205490565b61020760045481565b6103197f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610211565b6102076108d0565b6103197f000000000000000000000000000000000000000000000000000000000000000081565b6102676108de565b6103706108f9565b60408051928352602083019190915201610211565b6102076103933660046117ab565b600a6020526000908152604090205481565b61020760075481565b6102676103bc3660046117ab565b610939565b600154610319906001600160a01b031681565b6102676103e23660046117c8565b61099f565b61020760055481565b600954610319906001600160a01b031681565b6102076109a9565b6102076104193660046117ab565b610a18565b610207600d5481565b610267610bf8565b61020760065481565b61020760035481565b600254610319906001600160a01b031681565b6001600160a01b0381166000908152600b6020908152604080832054600a909252822054670de0b6b3a76400009061048a6109a9565b6104949190611827565b6001600160a01b0385166000908152600f60205260409020546104b7919061183e565b6104c1919061185d565b6104cb919061187f565b92915050565b600062093a806004546104e4919061183e565b905090565b6104f281610c8a565b50565b6104ff8282610e1b565b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105935760405162461bcd60e51b815260206004820152602a60248201527f43616c6c6572206973206e6f742052657761726473446973747269627574696f6044820152691b8818dbdb9d1c9858dd60b21b60648201526084015b60405180910390fd5b600061059d6109a9565b6006556105a86108d0565b6005556001600160a01b038116156105ef576105c381610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b600154610627906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000003085610fd9565b60035442106106455761063d62093a808361185d565b600455610687565b6000426003546106559190611827565b9050600060045482610667919061183e565b905062093a80610677828661187f565b610681919061185d565b60045550505b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190611897565b905061070362093a808261185d565b60045411156107545760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015260640161058a565b4260058190556107689062093a809061187f565b6003556040518381527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a1506001600160a01b038116156104ff576104ff81610939565b600260005414156107da5760405162461bcd60e51b815260040161058a906118b0565b6002600055336107e86109a9565b6006556107f36108d0565b6005556001600160a01b0381161561083a5761080e81610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b336000908152600b602052604090205480156108af57336000818152600b6020526040812055600154610879916001600160a01b03909116908361104a565b60405181815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b506001600160a01b038116156108c8576108c881610939565b506001600055565b60006104e44260035461107f565b336000908152600e60205260409020546108f790610c8a565b565b6000806002600054141561091f5760405162461bcd60e51b815260040161058a906118b0565b600260005561092c611097565b9150915060016000559091565b6001600160a01b0381166000908152600f6020526040902054600d54610960908290611827565b600d5561096c82610a18565b6001600160a01b0383166000908152600f60205260409020819055600d5490915061099890829061187f565b600d555050565b6104f28133610e1b565b6000600d54600014156109bc5750600090565b600c546109ca575060065490565b600d546004546005546109db6108d0565b6109e59190611827565b6109ef919061183e565b610a0190670de0b6b3a764000061183e565b610a0b919061185d565b6006546104e4919061187f565b600254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190611897565b610a9257506000919050565b6001600160a01b0382166000908152600e6020526040812054906064610ab983602861183e565b610ac3919061185d565b905060006064600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190611897565b6002546040516370a0823160e01b81526001600160a01b038981166004830152909116906370a0823190602401602060405180830381865afa158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190611897565b600c54610bbb919061183e565b610bc5919061185d565b610bd090603c61183e565b610bda919061185d565b9050610bef610be9828461187f565b8461107f565b95945050505050565b6040516370a0823160e01b81523360048201526108f7907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c849190611897565b33610e1b565b60026000541415610cad5760405162461bcd60e51b815260040161058a906118b0565b600260005533610cbb6109a9565b600655610cc66108d0565b6005556001600160a01b03811615610d0d57610ce181610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b60008211610d515760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015260640161058a565b81600c54610d5f9190611827565b600c55336000908152600e6020526040902054610d7d908390611827565b336000818152600e6020526040902091909155610dc5907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316908461104a565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a26001600160a01b03811615610e1257610e1281610939565b50506001600055565b60026000541415610e3e5760405162461bcd60e51b815260040161058a906118b0565b600260005580610e4c6109a9565b600655610e576108d0565b6005556001600160a01b03811615610e9e57610e7281610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b60008311610eee5760405162461bcd60e51b815260206004820152601e60248201527f6465706f736974284761756765293a2063616e6e6f74207374616b6520300000604482015260640161058a565b6001600160a01b0382166000908152600e60205260409020548390610f1490829061187f565b6001600160a01b0384166000908152600e6020526040902055600c54610f3b90829061187f565b600c55610f736001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016843087610fd9565b826001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051610fae91815260200190565b60405180910390a2506001600160a01b03811615610fcf57610fcf81610939565b5050600160005550565b6040516001600160a01b03808516602483015283166044820152606481018290526110449085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114be565b50505050565b6040516001600160a01b03831660248201526044810182905261107a90849063a9059cbb60e01b9060640161100d565b505050565b600081831061108e5781611090565b825b9392505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af11580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d91906118e7565b600954604051635462ecad60e11b81523060048201529294509092506000916001600160a01b039091169063a8c5d95a906024016020604051808303816000875af1158015611170573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611194919061190b565b905060008311806111a55750600082115b156114b9576000836007546111ba919061187f565b90506000836008546111cc919061187f565b90506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af1158015611230573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112549190611928565b604051634cde602960e11b81526001600160a01b038084166004830152929450909250908616906399bcc05290602401602060405180830381865afa1580156112a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c59190611897565b841180156112df575060006112dd62093a808661185d565b115b156113645760006007556112fd6001600160a01b0383168686611645565b60405163b66503cf60e01b81526001600160a01b0383811660048301526024820186905286169063b66503cf90604401600060405180830381600087803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b5050505061136a565b60078490555b604051634cde602960e11b81526001600160a01b0382811660048301528616906399bcc05290602401602060405180830381865afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d49190611897565b831180156113ee575060006113ec62093a808561185d565b115b1561147357600060085561140c6001600160a01b0382168685611645565b60405163b66503cf60e01b81526001600160a01b0382811660048301526024820185905286169063b66503cf90604401600060405180830381600087803b15801561145657600080fd5b505af115801561146a573d6000803e3d6000fd5b50505050611479565b60088390555b604080518881526020810188905233917fd9b982883d6f1d237dbf653d6baf27ba3264fa2a489737131b3cb7aef4fe40de910160405180910390a2505050505b509091565b6114d0826001600160a01b031661175a565b61151c5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640161058a565b600080836001600160a01b0316836040516115379190611957565b6000604051808303816000865af19150503d8060008114611574576040519150601f19603f3d011682016040523d82523d6000602084013e611579565b606091505b5091509150816115cb5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640161058a565b80511561104457808060200190518101906115e69190611992565b6110445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161058a565b8015806116bf5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd9190611897565b155b61172a5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161058a565b6040516001600160a01b03831660248201526044810182905261107a90849063095ea7b360e01b9060640161100d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061178e5750808214155b949350505050565b6001600160a01b03811681146104f257600080fd5b6000602082840312156117bd57600080fd5b813561109081611796565b6000602082840312156117da57600080fd5b5035919050565b600080604083850312156117f457600080fd5b82359150602083013561180681611796565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008282101561183957611839611811565b500390565b600081600019048311821515161561185857611858611811565b500290565b60008261187a57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561189257611892611811565b500190565b6000602082840312156118a957600080fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600080604083850312156118fa57600080fd5b505080516020909101519092909150565b60006020828403121561191d57600080fd5b815161109081611796565b6000806040838503121561193b57600080fd5b825161194681611796565b602084015190925061180681611796565b6000825160005b81811015611978576020818601810151858301520161195e565b81811115611987576000828501525b509190910192915050565b6000602082840312156119a457600080fd5b8151801515811461109057600080fdfea264697066735822122066f72515bb4daa008959d4753b0595f4ad9982ef4282ca713cfb73fd619c573064736f6c634300080b0033a2646970667358221220302c85b8d04fd1185f18abfd3bb640a32373156aae6711c094c2783a4a7f127b64736f6c634300080b00336080604052670de0b6b3a764000060005534801561001c57600080fd5b50336000818152600260209081526040808320670de0b6b3a76400009081905590519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106368061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461012957806370a082311461014357806395d89b411461016c578063a9059cbb14610194578063dd62ed3e146101a757600080fd5b806306fdde0314610098578063095ea7b3146100dc57806318160ddd146100ff57806323b872dd14610116575b600080fd5b6100c66040518060400160405280600f81526020016e13585cdd195c881a5b94d412549255608a1b81525081565b6040516100d3919061048f565b60405180910390f35b6100ef6100ea366004610500565b6101e0565b60405190151581526020016100d3565b61010860005481565b6040519081526020016100d3565b6100ef61012436600461052a565b61024c565b610131601281565b60405160ff90911681526020016100d3565b610108610151366004610566565b6001600160a01b031660009081526002602052604090205490565b6100c6604051806040016040528060098152602001681b5a5b94d41254925560ba1b81525081565b6100ef6101a2366004610500565b610313565b6101086101b5366004610588565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061023b9086815260200190565b60405180910390a350600192915050565b6001600160a01b03831660008181526001602090815260408083203380855292528220549192909190821480159061028657506000198114155b156102fc57600061029785836105d1565b6001600160a01b038881166000818152600160209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b610307868686610329565b50600195945050505050565b6000610320338484610329565b50600192915050565b6001600160a01b0383166103845760405162461bcd60e51b815260206004820152601d60248201527f5f7472616e73666572546f6b656e733a207a65726f206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0382166103da5760405162461bcd60e51b815260206004820152601d60248201527f5f7472616e73666572546f6b656e733a207a65726f2061646472657373000000604482015260640161037b565b6001600160a01b0383166000908152600260205260409020546103fe9082906105d1565b6001600160a01b03808516600090815260026020526040808220939093559084168152205461042e9082906105e8565b6001600160a01b0380841660008181526002602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104829085815260200190565b60405180910390a3505050565b600060208083528351808285015260005b818110156104bc578581018301518582016040015282016104a0565b818111156104ce576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146104fb57600080fd5b919050565b6000806040838503121561051357600080fd5b61051c836104e4565b946020939093013593505050565b60008060006060848603121561053f57600080fd5b610548846104e4565b9250610556602085016104e4565b9150604084013590509250925092565b60006020828403121561057857600080fd5b610581826104e4565b9392505050565b6000806040838503121561059b57600080fd5b6105a4836104e4565b91506105b2602084016104e4565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b6000828210156105e3576105e36105bb565b500390565b600082198211156105fb576105fb6105bb565b50019056fea2646970667358221220894e80bc4d565b405d2910008cf85fdcebdf9dcfd2a3a34c27a212e996c4c2b864736f6c634300080b00330000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f0930000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b0000000000000000000000002fbff41a9efaeae77538bd63f1ea489494acdc0800000000000000000000000019f236eaada7b47c1bccd5cc6671fc247bffcc210000000000000000000000002d0ffb56f0945ce719eac4a79e1cd2b8b64d03d00000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620003c05760003560e01c806396c82e5711620001f9578063cad1b9061162000119578063f106845411620000af578063f6d12b161162000086578063f6d12b1614620008ed578063f851a44014620008f7578063f9b2fe27146200090b578063ff2af408146200091557600080fd5b8063f106845414620008b8578063f2a1a8ed14620008c2578063f39c38a014620008d957600080fd5b8063e14f870d11620000f0578063e14f870d1462000856578063e96a6bda146200086a578063eb4a78e01462000890578063f05cc5b614620008a457600080fd5b8063cad1b9061462000814578063d0e30db01462000842578063d826f88f146200084c57600080fd5b8063b1a997ac116200018f578063b70aed711162000166578063b70aed7114620007a3578063b9173ec414620007ba578063b9a09fd514620007d1578063c84afda014620007fd57600080fd5b8063b1a997ac1462000746578063b1c6f0e9146200075d578063b23e3014146200078c57600080fd5b8063a7cac84611620001d0578063a7cac84614620006cc578063a7fa806b14620006ef578063a8c5d95a1462000703578063ab033ea9146200072f57600080fd5b806396c82e5714620006925780639d63848a146200069c5780639da882ac14620006b557600080fd5b80634c904f2c11620002e5578063704b6c02116200027b57806382836391116200025257806382836391146200062657806382bfefc814620006305780638d0605191462000658578063924d9f77146200066f57600080fd5b8063704b6c0214620005ee5780637625391a14620006055780637b80889b146200061c57600080fd5b806361c533b411620002bc57806361c533b414620005935780636848c2bd146200059d5780636accc8cf14620005b45780636f816a2014620005d757600080fd5b80634c904f2c14620005545780635aa6e675146200056857806360c73bf2146200057c57600080fd5b806324ec7590116200035b5780632951005c11620003325780632951005c14620004c85780634668e61914620004ee578063471aedc2146200053657806347d67339146200054a57600080fd5b806324ec759014620004aa57806328b02a1d14620004b4578063292fc97914620004be57600080fd5b80631baaaffe116200039c5780631baaaffe146200045a5780631f7b6d3214620004805780631f8507161462000489578063238efcbc146200049e57600080fd5b80622f8de414620003c557806302eba09414620003fb57806313976fc81462000432575b600080fd5b620003e8620003d636600462002e6b565b601f6020526000908152604090205481565b6040519081526020015b60405180910390f35b620004216200040c36600462002e6b565b60156020526000908152604090205460ff1681565b6040519015158152602001620003f2565b620003e87f00000000000000000000000000000000000000000000152d02c7e14af680000081565b620004216200046b36600462002e6b565b60146020526000908152604090205460ff1681565b601754620003e8565b6016546200042190600160a01b900460ff1681565b620004a86200092c565b005b620003e860075481565b620003e8600f5481565b620003e8600b5481565b62000421620004d936600462002e6b565b601a6020526000908152604090205460ff1681565b6200051d620004ff36600462002e6b565b6001600160a01b039081166000908152601b60205260409020541690565b6040516001600160a01b039091168152602001620003f2565b6003546200051d906001600160a01b031681565b620003e8600d5481565b6018546200051d906001600160a01b031681565b6000546200051d906001600160a01b031681565b620004a86200058d36600462002e6b565b620009b0565b620003e860115481565b620004a8620005ae36600462002e6b565b62000a58565b620003e8620005c536600462002e6b565b600e6020526000908152604090205481565b620004a8620005e836600462002ee1565b62000bad565b620004a8620005ff36600462002e6b565b62000cb5565b620004a86200061636600462002f54565b62000d1c565b620003e860105481565b620004a862000fae565b6200051d7f000000000000000000000000c368f073afa6cd616c7918b14cd1a8b6c12a0a5981565b620004a86200066936600462002f77565b62001423565b620003e86200068036600462002e6b565b60126020526000908152604090205481565b620003e8600a5481565b620006a66200146d565b604051620003f2919062002f91565b6200051d620006c636600462002e6b565b620014d1565b620003e8620006dd36600462002e6b565b601c6020526000908152604090205481565b6005546200051d906001600160a01b031681565b6200051d6200071436600462002e6b565b601b602052600090815260409020546001600160a01b031681565b620004a86200074036600462002e6b565b62001acd565b620004a86200075736600462002e6b565b62001b41565b6200051d6200076e36600462002e6b565b6001600160a01b039081166000908152601960205260409020541690565b620004a86200079d36600462002fef565b62001d52565b620004a8620007b436600462002fef565b62001dc0565b620004a8620007cb36600462002e6b565b62001e2e565b6200051d620007e236600462002e6b565b6019602052600090815260409020546001600160a01b031681565b6200051d6200080e3660046200302d565b62001f7d565b620003e8620008253660046200307f565b601d60209081526000928352604080842090915290825290205481565b620004a86200221e565b620004a8620023a3565b6016546200051d906001600160a01b031681565b620004216200087b36600462002e6b565b60136020526000908152604090205460ff1681565b6008546200051d906001600160a01b031681565b6004546200051d906001600160a01b031681565b620003e860095481565b6200051d620008d3366004620030b2565b620023b0565b6001546200051d906001600160a01b031681565b620003e8600c5481565b6006546200051d906001600160a01b031681565b620004a8620023e9565b620004a862000926366004620030f7565b6200247c565b6001546001600160a01b031633146200098c5760405162461bcd60e51b815260206004820152601d60248201527f616363657074476f7665726e616e63653a202170656e64696e67476f7600000060448201526064015b60405180910390fd5b600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b0316331480620009d457506006546001600160a01b031633145b62000a365760405162461bcd60e51b815260206004820152602b60248201527f7570646174654665654465737472696275746f723a207065726d697373696f6e60448201526a2069732064656e6965642160a81b606482015260840162000983565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148062000a7c57506006546001600160a01b031633145b62000a9b5760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b038181166000908152601960205260409020541662000af55760405162461bcd60e51b815260206004820152600e60248201526d191bd95cc81b9bdd08195e1a5cdd60921b604482015260640162000983565b6001600160a01b0381166000908152601a602052604090205460ff1662000b555760405162461bcd60e51b81526020600482015260136024820152726761756765206973206e6f742061637469766560681b604482015260640162000983565b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916905590519182527fd780203fe297949db725d8b7408a8d9f009bafaf49909a5eb5130c37bba5efb191015b60405180910390a150565b336000818152600e602052604081205462000bc990426200321c565b9050600b54811162000c1e5760405162461bcd60e51b815260206004820152601c60248201527f596f7520766f74656420696e20746865206c6173742037206461797300000000604482015260640162000983565b84831462000c2b57600080fd5b336000818152600e60209081526040918290204290558151888202818101830190935288815262000cad939290918a918a9182919085019084908082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920191909152506200252292505050565b505050505050565b6000546001600160a01b0316331462000cfa5760405162461bcd60e51b8152600401620009839060208082526004908201526310b3b7bb60e11b604082015260600190565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60028054141562000d705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000983565b6002805580821062000db25760405162461bcd60e51b815260206004820152600a6024820152691898590817dcdd185c9d60b21b604482015260640162000983565b60175481111562000df15760405162461bcd60e51b81526020600482015260086024820152671898590817d95b9960c21b604482015260640162000983565b600060105411801562000e0657506000600f54115b1562000fa557815b8181101562000fa35760006017828154811062000e2f5762000e2f62003236565b60009182526020808320909101546001600160a01b0316808352601390915260409091205490915060ff1615801562000e8057506001600160a01b0381166000908152601a602052604090205460ff165b1562000f8d576001600160a01b03808216600090815260196020908152604080832054600f54601290935290832054601054919094169362000ec2916200324c565b62000ece91906200326e565b9050801562000f675760055462000ef1906001600160a01b03168360006200280c565b60055462000f0a906001600160a01b031683836200280c565b604051633c6b16ab60e01b8152600481018290526001600160a01b03831690633c6b16ab90602401600060405180830381600087803b15801562000f4d57600080fd5b505af115801562000f62573d6000803e3d6000fd5b505050505b50506001600160a01b0381166000908152601360205260409020805460ff191660011790555b508062000f9a8162003291565b91505062000e0e565b505b50506001600255565b600280541415620010025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000983565b60028055600d546000906200101890426200321c565b9050600c548111620010825760405162461bcd60e51b815260206004820152602c60248201527f7468697320686173206265656e20646973747269627574656420696e2074686560448201526b206c6173742037206461797360a01b606482015260840162000983565b600a54600f5560005b6017548110156200119657601c600060178381548110620010b057620010b062003236565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054601260006017848154811062001109576200110962003236565b60009182526020808320909101546001600160a01b03168352820192909252604001812091909155601780546013918391859081106200114d576200114d62003236565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055806200118d8162003291565b9150506200108b565b50620011a16200295c565b42600d556005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015620011ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012159190620032af565b6010819055601654909150600090600160a01b900460ff1615620013e257600554600480546040516370a0823160e01b81526001600160a01b039182169281019290925260009216906370a0823190602401602060405180830381865afa15801562001285573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012ab9190620032af565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013299190620032af565b9050806200133883866200324c565b6200134491906200326e565b92508215620013df576018546005546200136c916001600160a01b0391821691168562002a50565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015620013b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013db9190620032af565b6010555b50505b426011556040518181527fce10d9c5a37f75faa552238874842dbf93dc8424647cb8c3286cfdcb73f6212a9060200160405180910390a15050600160025550565b6000546001600160a01b03163314620014685760405162461bcd60e51b8152600401620009839060208082526004908201526310b3b7bb60e11b604082015260600190565b600955565b60606017805480602002602001604051908101604052809291908181526020018280548015620014c757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620014a8575b5050505050905090565b6001600160a01b0381811660009081526019602052604081205490911615620015265760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b604482015260640162000983565b60165460405163e5e31b1360e01b81526001600160a01b0384811660048301529091169063e5e31b13906024016020604051808303816000875af115801562001573573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015999190620032c9565b620015d35760405162461bcd60e51b81526020600482015260096024820152680215f746f6b656e4c560bc1b604482015260640162000983565b816001600160a01b03166322be3de16040518163ffffffff1660e01b81526004016020604051808303816000875af115801562001614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200163a9190620032c9565b156200164557600080fd5b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af115801562001688573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016ae9190620032e9565b6001600160a01b038216600090815260156020526040902054919350915060ff168015620016f457506001600160a01b03811660009081526014602052604090205460ff165b806200173c57506001600160a01b03811660009081526015602052604090205460ff1680156200173c57506001600160a01b03821660009081526014602052604090205460ff165b620017765760405162461bcd60e51b8152602060048201526009602482015268085d995c9a599a595960ba1b604482015260640162000983565b6064600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620017cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017f29190620032af565b620017fe91906200326e565b600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa15801562001848573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200186e9190620032af565b11806200188557506000546001600160a01b031633145b806200189b57506006546001600160a01b031633145b620018d35760405162461bcd60e51b815260206004820152600760248201526621737570706c7960c81b604482015260640162000983565b6005546004546040516001600160a01b03928316929091169086903090620018fb9062002e00565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f08015801562001940573d6000803e3d6000fd5b506001600160a01b03858116600081815260196020908152604080832080549686166001600160a01b03199788161790556017805460018181019092557fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15018054909716909417909555601a9052838120805460ff191690921790915560085481549351631c1e57c960e11b8152938316600485015285831660248501528483166044850152909291169063383caf92906064016020604051808303816000875af115801562001a14573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a3a91906200331d565b6001600160a01b0386811660008181526019602090815260408083205485168352601b82529182902080546001600160a01b03191694861694909417909355519081529192507f9808313031a8f4caa534c417adad16800af7317516eff29a2d37cec0ffb244db910160405180910390a1505050506001600160a01b039081166000908152601960205260409020541690565b6000546001600160a01b0316331462001b1f5760405162461bcd60e51b815260206004820152601360248201527239b2ba23b7bb32b93730b731b29d1010b3b7bb60691b604482015260640162000983565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152601e602090815260408083208054825181850281018501909352808352919290919083018282801562001bad57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162001b8e575b5050505050905060008151905060008167ffffffffffffffff81111562001bd85762001bd8620030e1565b60405190808252806020026020018201604052801562001c02578160200160208202803683370190505b506001600160a01b038581166000818152601f6020526040808220546004805492516370a0823160e01b815290810194909452949550909216906370a0823190602401602060405180830381865afa15801562001c63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c899190620032af565b905060005b8481101562001d44576001600160a01b0387166000908152601d602052604081208751829089908590811062001cc85762001cc862003236565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054905083838262001d0291906200324c565b62001d0e91906200326e565b85838151811062001d235762001d2362003236565b6020908102919091010152508062001d3b8162003291565b91505062001c8e565b5062000cad86868562002522565b6000546001600160a01b031633148062001d7657506006546001600160a01b031633145b62001d955760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6000546001600160a01b031633148062001de457506006546001600160a01b031633145b62001e035760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b6000546001600160a01b031633148062001e5257506006546001600160a01b031633145b62001e715760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b038181166000908152601960205260409020541662001ecb5760405162461bcd60e51b815260206004820152600e60248201526d191bd95cc81b9bdd08195e1a5cdd60921b604482015260640162000983565b6001600160a01b0381166000908152601a602052604090205460ff161562001f285760405162461bcd60e51b815260206004820152600f60248201526e67617567652069732061637469766560881b604482015260640162000983565b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916600117905590519182527f9249e27c005fd3aeb1554e7b8cb687f7e017f0651813d386f7d74ebd7245c8a2910162000ba2565b600080546001600160a01b031633148062001fa257506006546001600160a01b031633145b62001fc15760405162461bcd60e51b81526004016200098390620031de565b6001600160a01b038481166000908152601960205260409020541615620020145760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b604482015260640162000983565b6005546004546040516001600160a01b039283169290911690869030906200203c9062002e00565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103906000f08015801562002081573d6000803e3d6000fd5b506001600160a01b03858116600081815260196020908152604080832080549686166001600160a01b03199788161790556017805460018181019092557fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15018054909716909417909555601a9052838120805460ff191690921790915560085481549351631c1e57c960e11b8152938316600485015286831660248501528583166044850152909291169063383caf92906064016020604051808303816000875af115801562002155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200217b91906200331d565b6001600160a01b0386811660008181526019602090815260408083205485168352601b82529182902080546001600160a01b031916868616179055815192835288841690830152918616918101919091529091507fdecab58d8a6a044c9ac75d257407891e2515835f38d07a2b7333682b8d4b63089060600160405180910390a1505050506001600160a01b039081166000908152601960205260409020541690565b60001960095414156200226a5760405162461bcd60e51b81526020600482015260136024820152721c1a59081b9bdd081a5b9a5d1a585b1a5e9959606a1b604482015260640162000983565b6040516370a0823160e01b81523060048201527f000000000000000000000000c368f073afa6cd616c7918b14cd1a8b6c12a0a59906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015620022d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022fa9190620032af565b6003549091506200231a906001600160a01b03848116911660006200280c565b60035462002336906001600160a01b038481169116836200280c565b600354600954604051631c57762b60e31b81526001600160a01b039092169163e2bbb1589162002373918590600401918252602082015260400190565b600060405180830381600087803b1580156200238e57600080fd5b505af115801562000cad573d6000803e3d6000fd5b620023ae3362002a82565b565b601e6020528160005260406000208181548110620023cd57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000546001600160a01b03163314806200240d57506006546001600160a01b031633145b6200245b5760405162461bcd60e51b815260206004820152601f60248201527f7475726e56654f6e3a207065726d697373696f6e2069732064656e6965642100604482015260640162000983565b6016805460ff60a01b198116600160a01b9182900460ff1615909102179055565b60005b82518110156200251d578281815181106200249e576200249e62003236565b602090810291909101015160405163ef0d090f60e01b81526001600160a01b0384811660048301529091169063ef0d090f90602401600060405180830381600087803b158015620024ee57600080fd5b505af115801562002503573d6000803e3d6000fd5b505050508080620025149062003291565b9150506200247f565b505050565b6200252d8362002a82565b8151600480546040516370a0823160e01b81526001600160a01b0387811693820193909352600092909116906370a0823190602401602060405180830381865afa15801562002580573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025a69190620032af565b905060008060005b84811015620025f857858181518110620025cc57620025cc62003236565b602002602001015183620025e191906200333d565b925080620025ef8162003291565b915050620025ae565b5060005b84811015620027e75760008782815181106200261c576200261c62003236565b6020908102919091018101516001600160a01b038082166000908152601990935260408320548a51929450169190869088908b908790811062002663576200266362003236565b60200260200101516200267791906200324c565b6200268391906200326e565b90506001600160a01b03821615801590620026b657506001600160a01b0383166000908152601a602052604090205460ff165b15620027ce57620026c881866200333d565b945080600a54620026da91906200333d565b600a556001600160a01b0383166000908152601c6020526040902054620027039082906200333d565b6001600160a01b038481166000818152601c60209081526040808320959095558f8416808352601e825285832080546001810182559084528284200180546001600160a01b03191685179055808352601d82528583209383529281528482208690558684168252601b9052839020549251630463cd9760e41b815260048101859052602481019190915291169063463cd97090604401600060405180830381600087803b158015620027b457600080fd5b505af1158015620027c9573d6000803e3d6000fd5b505050505b5050508080620027de9062003291565b915050620025fc565b506001600160a01b039096166000908152601f60205260409020959095555050505050565b8015806200288a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562002862573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620028889190620032af565b155b620028f75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840162000983565b6040516001600160a01b0383166024820152604481018290526200251d90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002c27565b6003546009546040516393f1a40b60e01b815260048101919091523060248201526000916001600160a01b0316906393f1a40b906044016040805180830381865afa158015620029b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620029d6919062003358565b50600354600954604051630441a3e760e41b81526004810191909152602481018390529192506001600160a01b03169063441a3e7090604401600060405180830381600087803b15801562002a2a57600080fd5b505af115801562002a3f573d6000803e3d6000fd5b5050505062002a4d6200221e565b50565b6040516001600160a01b0383166024820152604481018290526200251d90849063a9059cbb60e01b9060640162002924565b6001600160a01b0381166000908152601e60205260408120805490915b8181101562002c0357600083828154811062002abf5762002abf62003236565b60009182526020808320909101546001600160a01b038881168452601d8352604080852091909216808552925290912054909150801562002beb5780600a5462002b0a91906200321c565b600a556001600160a01b0382166000908152601c602052604090205462002b339082906200321c565b6001600160a01b038381166000908152601c6020908152604080832094909455601981528382205483168252601b905282902054915163293311ab60e01b815260048101849052888216602482015291169063293311ab90604401600060405180830381600087803b15801562002ba957600080fd5b505af115801562002bbe573d6000803e3d6000fd5b5050506001600160a01b038088166000908152601d60209081526040808320938716835292905290812055505b5050808062002bfa9062003291565b91505062002a9f565b506001600160a01b0383166000908152601e602052604081206200251d9162002e0e565b62002c3b826001600160a01b031662002dc3565b62002c895760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640162000983565b600080836001600160a01b03168360405162002ca691906200337d565b6000604051808303816000865af19150503d806000811462002ce5576040519150601f19603f3d011682016040523d82523d6000602084013e62002cea565b606091505b50915091508162002d3e5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640162000983565b80511562002dbd578080602001905181019062002d5c9190620032c9565b62002dbd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000983565b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159062002df85750808214155b949350505050565b611b4b80620033bc83390190565b508054600082559060005260206000209081019062002a4d91905b8082111562002e3f576000815560010162002e29565b5090565b6001600160a01b038116811462002a4d57600080fd5b803562002e668162002e43565b919050565b60006020828403121562002e7e57600080fd5b813562002e8b8162002e43565b9392505050565b60008083601f84011262002ea557600080fd5b50813567ffffffffffffffff81111562002ebe57600080fd5b6020830191508360208260051b850101111562002eda57600080fd5b9250929050565b6000806000806040858703121562002ef857600080fd5b843567ffffffffffffffff8082111562002f1157600080fd5b62002f1f8883890162002e92565b9096509450602087013591508082111562002f3957600080fd5b5062002f488782880162002e92565b95989497509550505050565b6000806040838503121562002f6857600080fd5b50508035926020909101359150565b60006020828403121562002f8a57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101562002fd45783516001600160a01b03168352928401929184019160010162002fad565b50909695505050505050565b801515811462002a4d57600080fd5b600080604083850312156200300357600080fd5b8235620030108162002e43565b91506020830135620030228162002fe0565b809150509250929050565b6000806000606084860312156200304357600080fd5b8335620030508162002e43565b92506020840135620030628162002e43565b91506040840135620030748162002e43565b809150509250925092565b600080604083850312156200309357600080fd5b8235620030a08162002e43565b91506020830135620030228162002e43565b60008060408385031215620030c657600080fd5b8235620030d38162002e43565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200310b57600080fd5b823567ffffffffffffffff808211156200312457600080fd5b818501915085601f8301126200313957600080fd5b8135602082821115620031505762003150620030e1565b8160051b604051601f19603f83011681018181108682111715620031785762003178620030e1565b6040529283528183019350848101820192898411156200319757600080fd5b948201945b83861015620031c057620031b08662002e59565b855294820194938201936200319c565b9650620031d1905087820162002e59565b9450505050509250929050565b6020808252600e908201526d10b3b7bb1037b91010b0b236b4b760911b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101562003231576200323162003206565b500390565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161562003269576200326962003206565b500290565b6000826200328c57634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415620032a857620032a862003206565b5060010190565b600060208284031215620032c257600080fd5b5051919050565b600060208284031215620032dc57600080fd5b815162002e8b8162002fe0565b60008060408385031215620032fd57600080fd5b82516200330a8162002e43565b6020840151909250620030228162002e43565b6000602082840312156200333057600080fd5b815162002e8b8162002e43565b6000821982111562003353576200335362003206565b500190565b600080604083850312156200336c57600080fd5b505080516020909101519092909150565b6000825160005b81811015620033a0576020818601810151858301520162003384565b81811115620033b0576000828501525b50919091019291505056fe60c0604052600060035560006004553480156200001b57600080fd5b5060405162001b4b38038062001b4b8339810160408190526200003e91620000ad565b6001600081905580546001600160a01b039586166001600160a01b0319918216179091556002805494861694821694909417909355908316608052600980549190931691161790553360a0526200010a565b80516001600160a01b0381168114620000a857600080fd5b919050565b60008060008060808587031215620000c457600080fd5b620000cf8562000090565b9350620000df6020860162000090565b9250620000ef6040860162000090565b9150620000ff6060860162000090565b905092959194509250565b60805160a0516119ea62000161600039600081816102f70152818161050e015261060101526000818161033e01528181610c1101528181610d9601528181610f4b0152818161109c01526111d301526119ea6000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c8063853828b61161010f578063ca1c9b75116100a2578063de5f626811610071578063de5f626814610427578063df136d651461042f578063ebe2b12b14610438578063f05cc5b61461044157600080fd5b8063ca1c9b75146103f0578063cd3daf9d14610403578063d35e25441461040b578063d7da4bb01461041e57600080fd5b806396c55175116100de57806396c55175146103ae578063a7fa806b146103c1578063b6b55f25146103d4578063c8f33c91146103e757600080fd5b8063853828b6146103605780638b0e888e146103685780638b8763471461038557806393f1c442146103a557600080fd5b80633d18b912116101875780637b0a47ee116101565780637b0a47ee146102e95780637c91e4eb146102f257806380faa57d1461033157806382bfefc81461033957600080fd5b80633d18b9121461028f5780634c02a21c1461029757806363fb415b146102a057806370a08231146102c057600080fd5b80631c1f78eb116101c35780631c1f78eb1461024c5780632e1a7d4d1461025457806336efd16f146102695780633c6b16ab1461027c57600080fd5b80628cc262146101f45780630700037d1461021a57806318160ddd1461023a5780631be0528914610242575b600080fd5b6102076102023660046117ab565b610454565b6040519081526020015b60405180910390f35b6102076102283660046117ab565b600b6020526000908152604090205481565b600c54610207565b61020762093a8081565b6102076104d1565b6102676102623660046117c8565b6104e9565b005b6102676102773660046117e1565b6104f5565b61026761028a3660046117c8565b610503565b6102676107b7565b61020760085481565b6102076102ae3660046117ab565b600f6020526000908152604090205481565b6102076102ce3660046117ab565b6001600160a01b03166000908152600e602052604090205490565b61020760045481565b6103197f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610211565b6102076108d0565b6103197f000000000000000000000000000000000000000000000000000000000000000081565b6102676108de565b6103706108f9565b60408051928352602083019190915201610211565b6102076103933660046117ab565b600a6020526000908152604090205481565b61020760075481565b6102676103bc3660046117ab565b610939565b600154610319906001600160a01b031681565b6102676103e23660046117c8565b61099f565b61020760055481565b600954610319906001600160a01b031681565b6102076109a9565b6102076104193660046117ab565b610a18565b610207600d5481565b610267610bf8565b61020760065481565b61020760035481565b600254610319906001600160a01b031681565b6001600160a01b0381166000908152600b6020908152604080832054600a909252822054670de0b6b3a76400009061048a6109a9565b6104949190611827565b6001600160a01b0385166000908152600f60205260409020546104b7919061183e565b6104c1919061185d565b6104cb919061187f565b92915050565b600062093a806004546104e4919061183e565b905090565b6104f281610c8a565b50565b6104ff8282610e1b565b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105935760405162461bcd60e51b815260206004820152602a60248201527f43616c6c6572206973206e6f742052657761726473446973747269627574696f6044820152691b8818dbdb9d1c9858dd60b21b60648201526084015b60405180910390fd5b600061059d6109a9565b6006556105a86108d0565b6005556001600160a01b038116156105ef576105c381610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b600154610627906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000003085610fd9565b60035442106106455761063d62093a808361185d565b600455610687565b6000426003546106559190611827565b9050600060045482610667919061183e565b905062093a80610677828661187f565b610681919061185d565b60045550505b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190611897565b905061070362093a808261185d565b60045411156107545760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015260640161058a565b4260058190556107689062093a809061187f565b6003556040518381527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a1506001600160a01b038116156104ff576104ff81610939565b600260005414156107da5760405162461bcd60e51b815260040161058a906118b0565b6002600055336107e86109a9565b6006556107f36108d0565b6005556001600160a01b0381161561083a5761080e81610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b336000908152600b602052604090205480156108af57336000818152600b6020526040812055600154610879916001600160a01b03909116908361104a565b60405181815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b506001600160a01b038116156108c8576108c881610939565b506001600055565b60006104e44260035461107f565b336000908152600e60205260409020546108f790610c8a565b565b6000806002600054141561091f5760405162461bcd60e51b815260040161058a906118b0565b600260005561092c611097565b9150915060016000559091565b6001600160a01b0381166000908152600f6020526040902054600d54610960908290611827565b600d5561096c82610a18565b6001600160a01b0383166000908152600f60205260409020819055600d5490915061099890829061187f565b600d555050565b6104f28133610e1b565b6000600d54600014156109bc5750600090565b600c546109ca575060065490565b600d546004546005546109db6108d0565b6109e59190611827565b6109ef919061183e565b610a0190670de0b6b3a764000061183e565b610a0b919061185d565b6006546104e4919061187f565b600254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015610a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a869190611897565b610a9257506000919050565b6001600160a01b0382166000908152600e6020526040812054906064610ab983602861183e565b610ac3919061185d565b905060006064600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190611897565b6002546040516370a0823160e01b81526001600160a01b038981166004830152909116906370a0823190602401602060405180830381865afa158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190611897565b600c54610bbb919061183e565b610bc5919061185d565b610bd090603c61183e565b610bda919061185d565b9050610bef610be9828461187f565b8461107f565b95945050505050565b6040516370a0823160e01b81523360048201526108f7907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c849190611897565b33610e1b565b60026000541415610cad5760405162461bcd60e51b815260040161058a906118b0565b600260005533610cbb6109a9565b600655610cc66108d0565b6005556001600160a01b03811615610d0d57610ce181610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b60008211610d515760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015260640161058a565b81600c54610d5f9190611827565b600c55336000908152600e6020526040902054610d7d908390611827565b336000818152600e6020526040902091909155610dc5907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316908461104a565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a26001600160a01b03811615610e1257610e1281610939565b50506001600055565b60026000541415610e3e5760405162461bcd60e51b815260040161058a906118b0565b600260005580610e4c6109a9565b600655610e576108d0565b6005556001600160a01b03811615610e9e57610e7281610454565b6001600160a01b0382166000908152600b6020908152604080832093909355600654600a909152919020555b60008311610eee5760405162461bcd60e51b815260206004820152601e60248201527f6465706f736974284761756765293a2063616e6e6f74207374616b6520300000604482015260640161058a565b6001600160a01b0382166000908152600e60205260409020548390610f1490829061187f565b6001600160a01b0384166000908152600e6020526040902055600c54610f3b90829061187f565b600c55610f736001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016843087610fd9565b826001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051610fae91815260200190565b60405180910390a2506001600160a01b03811615610fcf57610fcf81610939565b5050600160005550565b6040516001600160a01b03808516602483015283166044820152606481018290526110449085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114be565b50505050565b6040516001600160a01b03831660248201526044810182905261107a90849063a9059cbb60e01b9060640161100d565b505050565b600081831061108e5781611090565b825b9392505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af11580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d91906118e7565b600954604051635462ecad60e11b81523060048201529294509092506000916001600160a01b039091169063a8c5d95a906024016020604051808303816000875af1158015611170573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611194919061190b565b905060008311806111a55750600082115b156114b9576000836007546111ba919061187f565b90506000836008546111cc919061187f565b90506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af1158015611230573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112549190611928565b604051634cde602960e11b81526001600160a01b038084166004830152929450909250908616906399bcc05290602401602060405180830381865afa1580156112a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c59190611897565b841180156112df575060006112dd62093a808661185d565b115b156113645760006007556112fd6001600160a01b0383168686611645565b60405163b66503cf60e01b81526001600160a01b0383811660048301526024820186905286169063b66503cf90604401600060405180830381600087803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b5050505061136a565b60078490555b604051634cde602960e11b81526001600160a01b0382811660048301528616906399bcc05290602401602060405180830381865afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d49190611897565b831180156113ee575060006113ec62093a808561185d565b115b1561147357600060085561140c6001600160a01b0382168685611645565b60405163b66503cf60e01b81526001600160a01b0382811660048301526024820185905286169063b66503cf90604401600060405180830381600087803b15801561145657600080fd5b505af115801561146a573d6000803e3d6000fd5b50505050611479565b60088390555b604080518881526020810188905233917fd9b982883d6f1d237dbf653d6baf27ba3264fa2a489737131b3cb7aef4fe40de910160405180910390a2505050505b509091565b6114d0826001600160a01b031661175a565b61151c5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015260640161058a565b600080836001600160a01b0316836040516115379190611957565b6000604051808303816000865af19150503d8060008114611574576040519150601f19603f3d011682016040523d82523d6000602084013e611579565b606091505b5091509150816115cb5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640161058a565b80511561104457808060200190518101906115e69190611992565b6110445760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161058a565b8015806116bf5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd9190611897565b155b61172a5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161058a565b6040516001600160a01b03831660248201526044810182905261107a90849063095ea7b360e01b9060640161100d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061178e5750808214155b949350505050565b6001600160a01b03811681146104f257600080fd5b6000602082840312156117bd57600080fd5b813561109081611796565b6000602082840312156117da57600080fd5b5035919050565b600080604083850312156117f457600080fd5b82359150602083013561180681611796565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008282101561183957611839611811565b500390565b600081600019048311821515161561185857611858611811565b500290565b60008261187a57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561189257611892611811565b500190565b6000602082840312156118a957600080fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600080604083850312156118fa57600080fd5b505080516020909101519092909150565b60006020828403121561191d57600080fd5b815161109081611796565b6000806040838503121561193b57600080fd5b825161194681611796565b602084015190925061180681611796565b6000825160005b81811015611978576020818601810151858301520161195e565b81811115611987576000828501525b509190910192915050565b6000602082840312156119a457600080fd5b8151801515811461109057600080fdfea264697066735822122066f72515bb4daa008959d4753b0595f4ad9982ef4282ca713cfb73fd619c573064736f6c634300080b0033a2646970667358221220302c85b8d04fd1185f18abfd3bb640a32373156aae6711c094c2783a4a7f127b64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f0930000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b0000000000000000000000002fbff41a9efaeae77538bd63f1ea489494acdc0800000000000000000000000019f236eaada7b47c1bccd5cc6671fc247bffcc210000000000000000000000002d0ffb56f0945ce719eac4a79e1cd2b8b64d03d00000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c
-----Decoded View---------------
Arg [0] : _masterChef (address): 0x9083EA3756BDE6Ee6f27a6e996806FBD37F6F093
Arg [1] : _spirit (address): 0x5Cc61A78F164885776AA610fb0FE1257df78E59B
Arg [2] : _inSpirit (address): 0x2FBFf41a9efAEAE77538bd63f1ea489494acdc08
Arg [3] : _feeDist (address): 0x19F236eaADa7b47C1bCCD5CC6671fC247bffcC21
Arg [4] : _bribeFactory (address): 0x2d0Ffb56F0945ce719eac4A79e1CD2b8B64d03D0
Arg [5] : _pairFactory (address): 0x9d3591719038752db0c8bEEe2040FfcC3B2c6B9c
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000009083ea3756bde6ee6f27a6e996806fbd37f6f093
Arg [1] : 0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b
Arg [2] : 0000000000000000000000002fbff41a9efaeae77538bd63f1ea489494acdc08
Arg [3] : 00000000000000000000000019f236eaada7b47c1bccd5cc6671fc247bffcc21
Arg [4] : 0000000000000000000000002d0ffb56f0945ce719eac4a79e1cd2b8b64d03d0
Arg [5] : 0000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.