Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
Voter
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import {IVotingEscrow} from "./interfaces/IVotingEscrow.sol"; import {IPairFactory} from "./interfaces/IPairFactory.sol"; import {IPair} from "./interfaces/IPair.sol"; import {IGaugeFactory} from "./interfaces/IGaugeFactory.sol"; import {IBribeFactory} from "./interfaces/IBribeFactory.sol"; import {IGauge} from "./interfaces/IGauge.sol"; import {IBribe} from "./interfaces/IBribe.sol"; import {IMinter} from "./interfaces/IMinter.sol"; contract Voter { address public immutable _ve; // the ve token that governs these contracts address public immutable factory; // the BaseV1Factory address internal immutable base; address public gaugeFactory; address public immutable bribeFactory; uint internal constant DURATION = 7 days; // rewards are released over 7 days address public minter; address public admin; address public pendingAdmin; uint256 public whitelistingFee; bool public permissionMode; uint public totalWeight; // total voting weight address[] public allGauges; // all gauges viable for incentives mapping(address => address) public gauges; // pair => maturity => gauge mapping(address => address) public poolForGauge; // gauge => pool mapping(address => address) public bribes; // gauge => bribe mapping(address => uint256) public weights; // gauge => weight mapping(uint => mapping(address => uint256)) public votes; // nft => gauge => votes mapping(uint => address[]) public gaugeVote; // nft => gauge mapping(uint => uint) public usedWeights; // nft => total voting weight of user mapping(address => bool) public isGauge; mapping(address => bool) public isLive; // gauge => status (live or not) mapping(address => bool) public feeManagers; mapping(address => bool) public isWhitelisted; mapping(address => mapping(address => bool)) public isReward; mapping(address => mapping(address => bool)) public isBribe; mapping(address => uint) public claimable; uint internal index; mapping(address => uint) internal supplyIndex; event GaugeCreated(address indexed gauge, address creator, address indexed bribe, address indexed pair); event Voted(address indexed voter, uint tokenId, uint256 weight); event Abstained(uint tokenId, uint256 weight); event Deposit(address indexed lp, address indexed gauge, uint tokenId, uint amount); event Withdraw(address indexed lp, address indexed gauge, uint tokenId, uint amount); event NotifyReward(address indexed sender, address indexed reward, uint amount); event DistributeReward(address indexed sender, address indexed gauge, uint amount); event Attach(address indexed owner, address indexed gauge, uint tokenId); event Detach(address indexed owner, address indexed gauge, uint tokenId); event Whitelisted(address indexed whitelister, address indexed token); event Delisted(address indexed delister, address indexed token); event GaugeKilled(address indexed gauge); event GaugeRemoved(address indexed gauge, address indexed bribe, address indexed pair); event GaugeRevived(address indexed gauge); event GaugeNotProcessed(address indexed gauge); event GaugeProcessed(address indexed gauge); event ErrorClaimingGaugeRewards(address indexed gauge, address[] tokens); event ErrorClaimingBribeRewards(address indexed bribe, address[] tokens); event ErrorClaimingGaugeFees(address indexed gauge); event ErrorClaimingBribeFees(address indexed bribe, uint tokenId, address[] tokens); modifier onlyAdmin() { require(msg.sender == admin, "Voter: only admin"); _; } /// @dev Only calls from the enabled fee managers are accepted. modifier onlyFeeManagers() { require(feeManagers[msg.sender], 'Voter: only fee manager'); _; } modifier checkPermissionMode() { if(permissionMode) { require(msg.sender == admin, "Permission Mode Is Active"); } _; } constructor(address __ve, address _factory, address _gauges, address _bribes) { require( __ve != address(0) && _factory != address(0) && _gauges != address(0) && _bribes != address(0), "Voter: zero address provided in constructor" ); _ve = __ve; factory = _factory; base = IVotingEscrow(__ve).token(); gaugeFactory = _gauges; bribeFactory = _bribes; minter = msg.sender; admin = msg.sender; permissionMode = false; whitelistingFee = 160000e18; feeManagers[msg.sender] = true; feeManagers[0x0c5D52630c982aE81b78AB2954Ddc9EC2797bB9c] = true; feeManagers[0x726461FA6e788bd8a79986D36F1992368A3e56eA] = true; } // simple re-entrancy check uint internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function initialize(address[] memory _tokens, address _minter) external { require(msg.sender == minter); for (uint i = 0; i < _tokens.length; i++) { _whitelist(_tokens[i]); } minter = _minter; } function setAdmin(address _admin) external onlyAdmin { pendingAdmin = _admin; } function acceptAdmin() external { require(msg.sender == pendingAdmin); admin = pendingAdmin; } function enablePermissionMode() external onlyAdmin { require(!permissionMode, "Permission Mode Enabled"); permissionMode = true; } function disablePermissionMode() external onlyAdmin { require(permissionMode, "Permission Mode Disabled"); permissionMode = false; } function manageFeeManager(address feeManager, bool _value) external onlyAdmin { feeManagers[feeManager] = _value; } function setReward(address _gauge, address _token, bool _status) external onlyAdmin { isReward[_gauge][_token] = _status; } function setBribe(address _bribe, address _token, bool _status) external onlyAdmin { isBribe[_bribe][_token] = _status; } function setWhitelistingFee(uint256 _fee) external onlyFeeManagers { require(_fee > 0, 'Fee must be greater than zero'); whitelistingFee = _fee; } function killGauge(address _gauge) external onlyAdmin { require(isLive[_gauge], "gauge is not live"); distribute(_gauge); isLive[_gauge] = false; claimable[_gauge] = 0; emit GaugeKilled(_gauge); } function reviveGauge(address _gauge) external onlyAdmin { require(!isLive[_gauge], "gauge is live"); isLive[_gauge] = true; emit GaugeRevived(_gauge); } function removeGauge(address _gauge) external onlyAdmin { require(!isLive[_gauge], "gauge is live"); address pair = poolForGauge[_gauge]; require(IPairFactory(factory).isPair(pair), "pair does not exist"); (address tokenA, address tokenB) = IPair(pair).tokens(); require(gauges[pair] != address(0x0), "gauge does not exist"); address bribe = bribes[_gauge]; gauges[pair] = address(0x0); poolForGauge[_gauge] = address(0x0); bribes[_gauge] = address(0x0); isReward[_gauge][tokenA] = false; isReward[_gauge][tokenB] = false; isReward[_gauge][base] = false; isBribe[bribe][tokenA] = false; isBribe[bribe][tokenB] = false; isGauge[_gauge] = false; emit GaugeRemoved(_gauge, bribe, pair); } function reset(uint _tokenId) external { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId)); _reset(_tokenId); IVotingEscrow(_ve).abstain(_tokenId); } function _reset(uint _tokenId) internal { require(IVotingEscrow(_ve).isVoteExpired(_tokenId),"Vote Locked!"); address[] storage _gaugeVote = gaugeVote[_tokenId]; uint _gaugeVoteCnt = _gaugeVote.length; uint256 _totalWeight = 0; for (uint i = 0; i < _gaugeVoteCnt; i++) { address _gauge = _gaugeVote[i]; uint256 _votes = votes[_tokenId][_gauge]; if (_votes != 0) { _updateFor(_gauge); weights[_gauge] -= _votes; votes[_tokenId][_gauge] -= _votes; IBribe(bribes[_gauge])._withdraw(uint256(_votes), _tokenId); _totalWeight += _votes; emit Abstained(_tokenId, _votes); } } totalWeight -= uint256(_totalWeight); usedWeights[_tokenId] = 0; delete gaugeVote[_tokenId]; } function poke(uint _tokenId) external { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId)); address[] memory _gaugeVote = gaugeVote[_tokenId]; uint _gaugeCnt = _gaugeVote.length; uint256[] memory _weights = new uint256[](_gaugeCnt); for (uint i = 0; i < _gaugeCnt; i++) { _weights[i] = votes[_tokenId][_gaugeVote[i]]; } _vote(_tokenId, _gaugeVote, _weights); } function _vote(uint _tokenId, address[] memory _gaugeVote, uint256[] memory _weights) internal { _reset(_tokenId); // Lock vote for 1 WEEK IVotingEscrow(_ve).lockVote(_tokenId); uint _gaugeCnt = _gaugeVote.length; uint256 _weight = IVotingEscrow(_ve).balanceOfNFT(_tokenId); uint256 _totalVoteWeight = 0; uint256 _totalWeight = 0; uint256 _usedWeight = 0; for (uint i = 0; i < _gaugeCnt; i++) { _totalVoteWeight += _weights[i]; } for (uint i = 0; i < _gaugeCnt; i++) { address _gauge = _gaugeVote[i]; if (isGauge[_gauge]) { uint256 _gaugeWeight = _weights[i] * _weight / _totalVoteWeight; require(votes[_tokenId][_gauge] == 0); require(_gaugeWeight != 0); _updateFor(_gauge); gaugeVote[_tokenId].push(_gauge); weights[_gauge] += _gaugeWeight; votes[_tokenId][_gauge] += _gaugeWeight; IBribe(bribes[_gauge])._deposit(_gaugeWeight, _tokenId); _usedWeight += _gaugeWeight; _totalWeight += _gaugeWeight; emit Voted(msg.sender, _tokenId, _gaugeWeight); } } if (_usedWeight > 0) IVotingEscrow(_ve).voting(_tokenId); totalWeight += _totalWeight; usedWeights[_tokenId] = _usedWeight; } // @param _tokenId The id of the veNFT to vote with // @param _gaugeVote The list of gauges to vote for // @param _weights The list of weights to vote for each gauge // @notice the sum of weights is the total weight of the veNFT at max function vote(uint tokenId, address[] calldata _gaugeVote, uint256[] calldata _weights) external { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); require(_gaugeVote.length == _weights.length); uint _lockEnd = IVotingEscrow(_ve).locked__end(tokenId); require(_nextPeriod() <= _lockEnd, "lock expires soon"); _vote(tokenId, _gaugeVote, _weights); } function whitelist(address _token) public checkPermissionMode { _safeTransferFrom(base, msg.sender, address(0), whitelistingFee); _whitelist(_token); } function whitelistBatch(address[] memory _tokens) external onlyAdmin { for (uint i = 0; i < _tokens.length; i++) { _whitelist(_tokens[i]); } } function _whitelist(address _token) internal { require(!isWhitelisted[_token]); isWhitelisted[_token] = true; emit Whitelisted(msg.sender, _token); } function delist(address _token) public onlyAdmin { require(isWhitelisted[_token], "!whitelisted"); isWhitelisted[_token] = false; emit Delisted(msg.sender, _token); } function createGauge(address _pair) external returns (address) { require(gauges[_pair] == address(0x0), "exists"); require(IPairFactory(factory).isPair(_pair), "!pair"); (address _tokenA, address _tokenB) = IPair(_pair).tokens(); require(isWhitelisted[_tokenA] && isWhitelisted[_tokenB], "!whitelisted"); address _bribe = IBribeFactory(bribeFactory).createBribe(); address _gauge = IGaugeFactory(gaugeFactory).createGauge(_pair, _bribe, _ve); IERC20(base).approve(_gauge, type(uint).max); bribes[_gauge] = _bribe; gauges[_pair] = _gauge; poolForGauge[_gauge] = _pair; isGauge[_gauge] = true; isLive[_gauge] = true; isReward[_gauge][_tokenA] = true; isReward[_gauge][_tokenB] = true; isReward[_gauge][base] = true; isBribe[_bribe][_tokenA] = true; isBribe[_bribe][_tokenB] = true; _updateFor(_gauge); allGauges.push(_gauge); emit GaugeCreated(_gauge, msg.sender, _bribe, _pair); return _gauge; } function attachTokenToGauge(uint tokenId, address account) external { require(isGauge[msg.sender]); if (tokenId > 0) IVotingEscrow(_ve).attach(tokenId); emit Attach(account, msg.sender, tokenId); } function emitDeposit(uint tokenId, address account, uint amount) external { require(isGauge[msg.sender]); emit Deposit(account, msg.sender, tokenId, amount); } function detachTokenFromGauge(uint tokenId, address account) external { require(isGauge[msg.sender]); if (tokenId > 0) IVotingEscrow(_ve).detach(tokenId); emit Detach(account, msg.sender, tokenId); } function emitWithdraw(uint tokenId, address account, uint amount) external { require(isGauge[msg.sender]); emit Withdraw(account, msg.sender, tokenId, amount); } function length() external view returns (uint) { return allGauges.length; } // @notice called by Minter contract to distribute weekly rewards // @param _amount the amount of tokens distributed function notifyRewardAmount(uint amount) external { _safeTransferFrom(base, msg.sender, address(this), amount); // transfer the distro in uint256 _ratio = amount * 1e18 / totalWeight; // 1e18 adjustment is removed during claim if (_ratio > 0) { index += _ratio; } emit NotifyReward(msg.sender, base, amount); } function updateFor(address[] memory _gauges) external { for (uint i = 0; i < _gauges.length; i++) { _updateFor(_gauges[i]); } } function updateForRange(uint start, uint end) public { for (uint i = start; i < end; i++) { _updateFor(allGauges[i]); } } function updateAll() external { updateForRange(0, allGauges.length); } // @notice update a gauge eligibility for rewards to the current index // @param _gauge the gauge to update function updateGauge(address _gauge) external { _updateFor(_gauge); } function _updateFor(address _gauge) internal { uint256 _supplied = weights[_gauge]; if (_supplied > 0) { uint _supplyIndex = supplyIndex[_gauge]; uint _index = index; // get global index0 for accumulated distro supplyIndex[_gauge] = _index; // update _gauge current position to global position uint _delta = _index - _supplyIndex; // see if there is any difference that need to be accrued if (_delta > 0) { uint _share = uint(_supplied) * _delta / 1e18; // add accrued difference for each supplied token if (isLive[_gauge]) { claimable[_gauge] += _share; } } } else { supplyIndex[_gauge] = index; // new users are set to the default global state } } // @notice allow a gauge depositor to claim earned rewards if any // @param _gauges list of gauges contracts to claim rewards on // @param _tokens list of tokens to claim function claimRewards(address[] memory _gauges, address[][] memory _tokens) external { for (uint i = 0; i < _gauges.length; i++) { try IGauge(_gauges[i]).getReward(msg.sender, _tokens[i]) { } catch { emit ErrorClaimingGaugeRewards(_gauges[i], _tokens[i]); } } } // @notice allow a voter to claim earned bribes if any // @param _bribes list of bribes contracts to claims bribes on // @param _tokens list of the tokens to claim // @param _tokenId the ID of veNFT to claim bribes for function claimBribes(address[] memory _bribes, address[][] memory _tokens, uint _tokenId) external { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId)); for (uint i = 0; i < _bribes.length; i++) { try IBribe(_bribes[i]).getRewardForOwner(_tokenId, _tokens[i]) { } catch { emit ErrorClaimingBribeRewards(_bribes[i], _tokens[i]); } } } // @notice allow voter to claim earned fees // @param _fees list of bribes contracts to claim fees on // @param _tokens list of the tokens to claim // @param _tokenId the ID of veNFT to claim fees for function claimFees(address[] memory _fees, address[][] memory _tokens, uint _tokenId) external { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId)); for (uint i = 0; i < _fees.length; i++) { try IBribe(_fees[i]).getRewardForOwner(_tokenId, _tokens[i]) { } catch { emit ErrorClaimingBribeFees(_fees[i], _tokenId, _tokens[i]); } } } // @notice distribute earned fees to the bribe contract for a given gauge // @param _gauges the gauges to distribute fees for function distributeFees(address[] memory _gauges) external { for (uint i = 0; i < _gauges.length; i++) { try IGauge(_gauges[i]).claimFees() { } catch { emit ErrorClaimingGaugeFees(_gauges[i]); } } } // @notice distribute earned fees to the bribe contract for all gauges function distroFees() external { for (uint i = 0; i < allGauges.length; i++) { try IGauge(allGauges[i]).claimFees() { } catch { emit ErrorClaimingGaugeFees(allGauges[i]); } } } // @notice distribute fair share of rewards to a gauge // @param _gauge the gauge to distribute rewards to function distribute(address _gauge) public lock { IMinter(minter).update_period(); _updateFor(_gauge); uint _claimable = claimable[_gauge]; if (_claimable > IGauge(_gauge).left(base) && _claimable / DURATION > 0) { claimable[_gauge] = 0; IGauge(_gauge).notifyRewardAmount(base, _claimable); emit DistributeReward(msg.sender, _gauge, _claimable); } } function distro() external { distributeRange(0, allGauges.length); } function distributeRange(uint start, uint finish) public { for (uint x = start; x < finish; x++) { try this.distribute(allGauges[x]) { emit GaugeProcessed(allGauges[x]); } catch { emit GaugeNotProcessed(allGauges[x]); } } } function distributeGauges(address[] memory _gauges) external { for (uint x = 0; x < _gauges.length; x++) { try this.distribute(_gauges[x]) { emit GaugeProcessed(allGauges[x]); } catch { emit GaugeNotProcessed(allGauges[x]); } } } // @notice current active vote period // @return the UNIX timestamp of the beginning of the current vote period function _activePeriod() internal view returns (uint activePeriod) { activePeriod = block.timestamp / DURATION * DURATION; } // @notice next vote period // @return the UNIX timestamp of the beginning of the next vote period function _nextPeriod() internal view returns(uint nextPeriod) { nextPeriod = (block.timestamp + DURATION) / DURATION * DURATION; } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IBribe { function _deposit(uint amount, uint tokenId) external; function _withdraw(uint amount, uint tokenId) external; function getRewardForOwner(uint tokenId, address[] memory tokens) external; function notifyRewardAmount(address token, uint amount) external; function left(address token) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IBribeFactory { function createBribe() external returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IGauge { function notifyRewardAmount(address token, uint amount) external; function getReward(address account, address[] memory tokens) external; function claimFees() external returns (uint claimed0, uint claimed1); function left(address token) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IGaugeFactory { function createGauge(address, address, address) external returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IMinter { function update_period() external returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IPair { function burn(address to) external returns (uint amount0, uint amount1); function claimFees() external returns (uint, uint); function getAmountOut(uint amountIn, address tokenIn) external view returns (uint); function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast); function mint(address to) external returns (uint liquidity); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function stable() external view returns (bool); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function tokens() external returns (address, address); function transferFrom(address src, address dst, uint amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IPairFactory { function admin() external view returns (address); function feeManagers(address feeManager) external view returns (bool); function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); function getInitializable() external view returns (address, address, bool); function setPause(bool _state) external; function isPaused() external view returns (bool); function getFee(bool _stable) external view returns(uint256); function getRealFee(address _pair) external view returns(uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.22; interface IVotingEscrow { struct Point { int128 bias; int128 slope; // # -dweight / dt uint256 ts; uint256 blk; // block } function user_point_epoch(uint tokenId) external view returns (uint); function epoch() external view returns (uint); function user_point_history(uint tokenId, uint loc) external view returns (Point memory); function point_history(uint loc) external view returns (Point memory); function checkpoint() external; function deposit_for(uint tokenId, uint value) external; function token() external view returns (address); function user_point_history__ts(uint tokenId, uint idx) external view returns (uint); function locked__end(uint _tokenId) external view returns (uint); function locked__amount(uint _tokenId) external view returns (uint); function approve(address spender, uint tokenId) external; function balanceOfNFT(uint) external view returns (uint); function isApprovedOrOwner(address, uint) external view returns (bool); function ownerOf(uint) external view returns (address); function transferFrom(address, address, uint) external; function totalSupply() external view returns (uint); function supply() external view returns (uint); function create_lock_for(uint, uint, address) external returns (uint); function lockVote(uint tokenId) external; function isVoteExpired(uint tokenId) external view returns (bool); function voteExpiry(uint _tokenId) external view returns (uint); function attach(uint tokenId) external; function detach(uint tokenId) external; function voting(uint tokenId) external; function abstain(uint tokenId) external; function voted(uint tokenId) external view returns (bool); function withdraw(uint tokenId) external; function create_lock(uint value, uint duration) external returns (uint); function setVoter(address voter) external; function balanceOf(address owner) external view returns (uint); function safeTransferFrom(address from, address to, uint tokenId) external; function burn(uint _tokenId) external; function setAdmin(address _admin) external; function setArtProxy(address _proxy) external; }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_gauges","type":"address"},{"internalType":"address","name":"_bribes","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Abstained","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Attach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"Delisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Detach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributeReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ErrorClaimingBribeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ErrorClaimingBribeRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"ErrorClaimingGaugeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ErrorClaimingGaugeRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"GaugeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeKilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeNotProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"GaugeRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeRevived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allGauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"attachTokenToGauge","outputs":[],"stateMutability":"nonpayable","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":"_tokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_fees","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"createGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"delist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"detachTokenFromGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePermissionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distributeGauges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"finish","type":"uint256"}],"name":"distributeRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distroFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePermissionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeManagers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"gaugeVote","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_tokens","type":"address[]"},{"internalType":"address","name":"_minter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isBribe","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"killGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feeManager","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"manageFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permissionMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"poke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolForGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"removeGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"reviveGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bribe","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWhitelistingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"updateFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"updateForRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"updateGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"_gaugeVote","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"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"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"whitelistBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61010060405260016018553480156200001757600080fd5b50604051620048ea380380620048ea8339810160408190526200003a9162000262565b6001600160a01b038416158015906200005b57506001600160a01b03831615155b80156200007057506001600160a01b03821615155b80156200008557506001600160a01b03811615155b620000ea5760405162461bcd60e51b815260206004820152602b60248201527f566f7465723a207a65726f20616464726573732070726f766964656420696e2060448201526a31b7b739ba393ab1ba37b960a91b606482015260840160405180910390fd5b6001600160a01b03808516608081905290841660a05260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa1580156200013c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001629190620002bf565b6001600160a01b0390811660c052600080549382166001600160a01b0319948516178155911660e0526001805483163390811782556002805490941681179093556005805460ff199081169091556921e19e0c9bab2400000060045592825260116020526040822080548416821790557f295a4ffdc519333d9c723410dafa910a4ea56bcd3ab227348108e92a4605a7c4805484168217905573726461fa6e788bd8a79986d36f1992368a3e56ea9091527ff3da598d0469dad60e2c05ecde0b47799d0331540e69dbeb5f95c5fce5e72c14805490921617905550620002e49050565b80516001600160a01b03811681146200025d57600080fd5b919050565b600080600080608085870312156200027957600080fd5b620002848562000245565b9350620002946020860162000245565b9250620002a46040860162000245565b9150620002b46060860162000245565b905092959194509250565b600060208284031215620002d257600080fd5b620002dd8262000245565b9392505050565b60805160a05160c05160e051614524620003c6600039600081816108e901526127a7015260008181611223015281816112c30152818161133c015281816116ab01528181611780015281816122b5015281816129470152612a7f0152600081816108250152818161100001526125f50152600081816106b701528181610bdd01528181610c9101528181610d2d015281816113e20152818161186901528181611a4f01528181611cd201528181611e9a01528181611f540152818161286d0152818161332a01528181613612015281816136ac01526139f501526145246000f3fe608060405234801561001057600080fd5b50600436106103c55760003560e01c80638a126be1116101ff578063b9a09fd51161011a578063eaa53523116100ad578063f0cf6c961161007c578063f0cf6c9614610941578063f80d61241461094e578063f851a44014610956578063fbdfe6b71461096957600080fd5b8063eaa53523146108d1578063eb4a78e0146108e4578063eded3e021461090b578063ef897f071461091e57600080fd5b8063d560b0d7116100e9578063d560b0d714610885578063d80a4d4d14610898578063dae6c831146108ab578063ea94ee44146108be57600080fd5b8063b9a09fd5146107f7578063c45a015514610820578063c527ee1f14610847578063d23254b41461085a57600080fd5b8063a0947d6f11610192578063a7cac84611610161578063a7cac84614610778578063a8c5d95a14610798578063aa79979b146107c1578063b6fe96bc146107e457600080fd5b8063a0947d6f14610737578063a5f4301e1461073f578063a61c713a14610752578063a6dd93641461076557600080fd5b8063992a7933116101ce578063992a7933146106eb5780639b19251a146106fe5780639b6a9d72146107115780639f06247b1461072457600080fd5b80638a126be11461069f5780638dd598fb146106b257806396c82e57146106d95780639769a38a146106e257600080fd5b8063402914f5116102ef578063666256aa11610282578063704b6c0211610251578063704b6c02146106465780637715ee751461065957806379e938241461066c5780637ac09bf71461068c57600080fd5b8063666256aa146105fa578063698473e31461060d5780636b2cc75c146106205780636ecbe38a1461063357600080fd5b8063485fdb4a116102be578063485fdb4a146105a957806350c116b8146105bc57806353d78693146105df57806363453ae1146105e757600080fd5b8063402914f51461055b578063411b1f771461057b578063462d0b2e1461058e57806347b3c6ba146105a157600080fd5b8063264deaf8116103675780633a045145116103365780633a045145146104e45780633af32abf146104f75780633c6b16ab1461051a5780633e504f7d1461052d57600080fd5b8063264deaf8146104a357806326782247146104ab578063310bd74b146104be57806332145f90146104d157600080fd5b80630e18b681116103a35780630e18b681146104365780631937e58f146104405780631f7b6d321461047e57806320b1cb6f1461049057600080fd5b806306d6a1b2146103ca57806307546172146104105780630d52333c14610423575b600080fd5b6103f36103d8366004613d79565b6009602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546103f3906001600160a01b031681565b6000546103f3906001600160a01b031681565b61043e61097c565b005b61046e61044e366004613d9d565b601360209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610407565b6007545b604051908152602001610407565b61043e61049e366004613f70565b6109cf565b61043e610aeb565b6003546103f3906001600160a01b031681565b61043e6104cc366004613fd4565b610ba8565b61043e6104df366004613fd4565b610cf8565b61043e6104f2366004613d79565b610eef565b61046e610505366004613d79565b60126020526000908152604090205460ff1681565b61043e610528366004613fd4565b6112be565b61046e61053b366004613d9d565b601460209081526000928352604080842090915290825290205460ff1681565b610482610569366004613d79565b60156020526000908152604090205481565b61043e610589366004613fed565b611391565b61043e61059c366004614012565b611484565b61043e61150d565b61043e6105b7366004614067565b61151e565b61046e6105ca366004613d79565b60106020526000908152604090205460ff1681565b61043e6115b2565b61043e6105f5366004613d79565b6115c1565b61043e6106083660046140b2565b611834565b61043e61061b366004613fed565b6119fe565b61043e61062e366004613d79565b611af1565b61043e610641366004613d79565b611bfd565b61043e610654366004613d79565b611c09565b61043e6106673660046140b2565b611c9d565b61048261067a366004613fd4565b600e6020526000908152604090205481565b61043e61069a36600461416b565b611e65565b61043e6106ad366004614067565b612096565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61048260065481565b61048260045481565b61043e6106f9366004613d79565b61212a565b61043e61070c366004613d79565b61224b565b61043e61071f3660046141e5565b6122e8565b61043e610732366004613d79565b61232a565b61043e612439565b6103f361074d366004613d79565b612553565b61043e610760366004614207565b612b8e565b61043e610773366004613fd4565b612bf6565b610482610786366004613d79565b600b6020526000908152604090205481565b6103f36107a6366004613d79565b600a602052600090815260409020546001600160a01b031681565b61046e6107cf366004613d79565b600f6020526000908152604090205460ff1681565b61043e6107f236600461423f565b612caa565b6103f3610805366004613d79565b6008602052600090815260409020546001600160a01b031681565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61043e61085536600461426d565b612d2f565b610482610868366004613fed565b600c60209081526000928352604080842090915290825290205481565b61043e61089336600461426d565b612e34565b61043e6108a63660046141e5565b612e6a565b6103f36108b93660046141e5565b612fbe565b61043e6108cc366004614207565b612ff6565b61043e6108df36600461426d565b613055565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61043e61091936600461426d565b6130d8565b61046e61092c366004613d79565b60116020526000908152604090205460ff1681565b60055461046e9060ff1681565b61043e613215565b6002546103f3906001600160a01b031681565b6103f3610977366004613fd4565b6132d1565b6003546001600160a01b0316331461099357600080fd5b600354600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60005b8251811015610ae6578281815181106109ed576109ed6142aa565b60200260200101516001600160a01b03166331279d3d33848481518110610a1657610a166142aa565b60200260200101516040518363ffffffff1660e01b8152600401610a3b92919061431e565b600060405180830381600087803b158015610a5557600080fd5b505af1925050508015610a66575060015b610ade57828181518110610a7c57610a7c6142aa565b60200260200101516001600160a01b03167f64b5ca626ed4122d05be46c898b7520ff5a9a24880a4ebe983ae30b0e0aa82bf838381518110610ac057610ac06142aa565b6020026020010151604051610ad59190614340565b60405180910390a25b6001016109d2565b505050565b6002546001600160a01b03163314610b4a5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e00000000000000000000000000000060448201526064015b60405180910390fd5b60055460ff16610b9c5760405162461bcd60e51b815260206004820152601860248201527f5065726d697373696f6e204d6f64652044697361626c656400000000000000006044820152606401610b41565b6005805460ff19169055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c509190614353565b610c5957600080fd5b610c62816132fb565b6040517fc1f0fb9f000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610cdd57600080fd5b505af1158015610cf1573d6000803e3d6000fd5b5050505050565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190614353565b610da957600080fd5b6000818152600d6020908152604080832080548251818502810185019093528083529192909190830182828015610e0957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610deb575b5050505050905060008151905060008167ffffffffffffffff811115610e3157610e31613dd6565b604051908082528060200260200182016040528015610e5a578160200160208202803683370190505b50905060005b82811015610edd57600c60008681526020019081526020016000206000858381518110610e8f57610e8f6142aa565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610eca57610eca6142aa565b6020908102919091010152600101610e60565b50610ee98484836135da565b50505050565b6002546001600160a01b03163314610f495760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff1615610fb25760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b03818116600090815260096020526040908190205490517fe5e31b1300000000000000000000000000000000000000000000000000000000815290821660048201819052917f0000000000000000000000000000000000000000000000000000000000000000169063e5e31b1390602401602060405180830381865afa158015611047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106b9190614353565b6110b75760405162461bcd60e51b815260206004820152601360248201527f7061697220646f6573206e6f74206578697374000000000000000000000000006044820152606401610b41565b600080826001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190614370565b6001600160a01b038581166000908152600860205260409020549294509092501661118a5760405162461bcd60e51b815260206004820152601460248201527f676175676520646f6573206e6f742065786973740000000000000000000000006044820152606401610b41565b6001600160a01b038481166000818152600a6020908152604080832080548987168086526008855283862080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091558787526009865284872080548216905583541690925560138452828520898816808752908552838620805460ff199081169091558989168088528588208054831690557f00000000000000000000000000000000000000000000000000000000000000008a1688528588208054831690559290981680875260148652848720918752908552838620805489169055908552828520805488169055858552600f909352818420805490961690955551909392849290917f13379c5ce739840b099b7f3973cd7c9ecaa3aff6f381da0cfb8008ce4f18ace59190a45050505050565b6112ea7f0000000000000000000000000000000000000000000000000000000000000000333084613a8c565b60065460009061130283670de0b6b3a76400006143ce565b61130c91906143eb565b9050801561132c5780601660008282546113269190614426565b90915550505b6040518281526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b336000908152600f602052604090205460ff166113ad57600080fd5b8115611447576040517f986b7d8a000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290602001611385565b6001546001600160a01b0316331461149b57600080fd5b60005b82518110156114d1576114c98382815181106114bc576114bc6142aa565b6020026020010151613baa565b60010161149e565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b60075461151c90600090612e6a565b565b6002546001600160a01b031633146115785760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260136020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60075461151c906000906122e8565b6018546001146115d057600080fd5b6002601855600154604080517fed29fc1100000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561163a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165e9190614439565b5061166881613c1d565b6001600160a01b03818116600081815260156020526040908190205490517f99bcc0520000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009093166004840152916399bcc05290602401602060405180830381865afa1580156116f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171d9190614439565b811180156117375750600061173562093a80836143eb565b115b1561182b576001600160a01b0382811660008181526015602052604080822091909155517fb66503cf0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156117d257600080fd5b505af11580156117e6573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601855565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc9190614353565b6118e557600080fd5b60005b8351811015610ee957838181518110611903576119036142aa565b60200260200101516001600160a01b031663a7852afa8385848151811061192c5761192c6142aa565b60200260200101516040518363ffffffff1660e01b8152600401611951929190614452565b600060405180830381600087803b15801561196b57600080fd5b505af192505050801561197c575060015b6119f657838181518110611992576119926142aa565b60200260200101516001600160a01b03167f3d29a870fa2d124f14984f98a1df8bcd683e624184195c2a63697d6200266f3e838584815181106119d7576119d76142aa565b60200260200101516040516119ed929190614452565b60405180910390a25b6001016118e8565b336000908152600f602052604090205460ff16611a1a57600080fd5b8115611ab4576040517ffbd3a29d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611a9b57600080fd5b505af1158015611aaf573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90602001611385565b6002546001600160a01b03163314611b4b5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526012602052604090205460ff16611bb35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260126020526040808220805460ff191690555133917f60a9f9ee3d1d62847472dc6b066eb0548a70c14f0ba4715be1c5bcdbd9b4462591a350565b611c0681613c1d565b50565b6002546001600160a01b03163314611c635760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190614353565b611d4e57600080fd5b60005b8351811015610ee957838181518110611d6c57611d6c6142aa565b60200260200101516001600160a01b031663a7852afa83858481518110611d9557611d956142aa565b60200260200101516040518363ffffffff1660e01b8152600401611dba929190614452565b600060405180830381600087803b158015611dd457600080fd5b505af1925050508015611de5575060015b611e5d57838181518110611dfb57611dfb6142aa565b60200260200101516001600160a01b03167f707c40b300e86ea06afe070057bebf0a23f03e55ca3aa0dffb91d96d2fc89fac848381518110611e3f57611e3f6142aa565b6020026020010151604051611e549190614340565b60405180910390a25b600101611d51565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d9190614353565b611f1657600080fd5b828114611f2257600080fd5b6040517ff8a05763000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f8a0576390602401602060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614439565b905080611fd2613d08565b11156120205760405162461bcd60e51b815260206004820152601160248201527f6c6f636b206578706972657320736f6f6e0000000000000000000000000000006044820152606401610b41565b61208e8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506135da92505050565b505050505050565b6002546001600160a01b031633146120f05760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260146020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6002546001600160a01b031633146121845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff166121ec5760405162461bcd60e51b815260206004820152601160248201527f6761756765206973206e6f74206c6976650000000000000000000000000000006044820152606401610b41565b6121f5816115c1565b6001600160a01b0381166000818152601060209081526040808320805460ff191690556015909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b60055460ff16156122b0576002546001600160a01b031633146122b05760405162461bcd60e51b815260206004820152601960248201527f5065726d697373696f6e204d6f646520497320416374697665000000000000006044820152606401610b41565b6122df7f0000000000000000000000000000000000000000000000000000000000000000336000600454613a8c565b611c0681613baa565b815b81811015610ae65761232260078281548110612308576123086142aa565b6000918252602090912001546001600160a01b0316613c1d565b6001016122ea565b6002546001600160a01b031633146123845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff16156123ed5760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b60005b600754811015611c065760078181548110612459576124596142aa565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af19250505080156124ef575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124ec9181019061446b565b60015b6125485760078181548110612506576125066142aa565b60009182526020822001546040516001600160a01b03909116917f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb91a261254b565b50505b60010161243c565b6001600160a01b03818116600090815260086020526040812054909116156125bd5760405162461bcd60e51b815260206004820152600660248201527f65786973747300000000000000000000000000000000000000000000000000006044820152606401610b41565b6040517fe5e31b130000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063e5e31b1390602401602060405180830381865afa15801561263c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126609190614353565b6126ac5760405162461bcd60e51b815260206004820152600560248201527f21706169720000000000000000000000000000000000000000000000000000006044820152606401610b41565b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156126ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127129190614370565b6001600160a01b038216600090815260126020526040902054919350915060ff16801561275757506001600160a01b03811660009081526012602052604090205460ff165b6127a35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d27b9a786040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612829919061448f565b600080546040517f1c48e0fa0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015280851660248301527f00000000000000000000000000000000000000000000000000000000000000008116604483015293945091921690631c48e0fa906064016020604051808303816000875af11580156128c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e6919061448f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b69190614353565b506001600160a01b038181166000818152600a6020908152604080832080548887167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092558c8716808652600885528386208054831688179055958552600984528285208054909116909517909455600f8252808320805460ff199081166001908117909255601084528285208054821683179055601384528285208b881680875290855283862080548316841790558a881680875284872080548416851790557f0000000000000000000000000000000000000000000000000000000000000000909816865283862080548316841790559585526014845282852095855294909252808320805485168317905593825292902080549091169091179055612ae381613c1d565b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560405133815288831692851691907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a495945050505050565b336000908152600f602052604090205460ff16612baa57600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b3360009081526011602052604090205460ff16612c555760405162461bcd60e51b815260206004820152601760248201527f566f7465723a206f6e6c7920666565206d616e616765720000000000000000006044820152606401610b41565b60008111612ca55760405162461bcd60e51b815260206004820152601d60248201527f466565206d7573742062652067726561746572207468616e207a65726f0000006044820152606401610b41565b600455565b6002546001600160a01b03163314612d045760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60005b8151811015612e3057818181518110612d4d57612d4d6142aa565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1925050508015612dcd575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612dca9181019061446b565b60015b612e2557818181518110612de357612de36142aa565b60200260200101516001600160a01b03167f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb60405160405180910390a2612e28565b50505b600101612d32565b5050565b60005b8151811015612e3057612e62828281518110612e5557612e556142aa565b6020026020010151613c1d565b600101612e37565b815b81811015610ae657306001600160a01b03166363453ae160078381548110612e9657612e966142aa565b60009182526020909120015460405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039091166004820152602401600060405180830381600087803b158015612efb57600080fd5b505af1925050508015612f0c575060015b612f655760078181548110612f2357612f236142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612fb6565b60078181548110612f7857612f786142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612e6c565b600d6020528160005260406000208181548110612fda57600080fd5b6000918252602090912001546001600160a01b03169150829050565b336000908152600f602052604090205460ff1661301257600080fd5b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679101612be9565b6002546001600160a01b031633146130af5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60005b8151811015612e30576130d08282815181106114bc576114bc6142aa565b6001016130b2565b60005b8151811015612e3057306001600160a01b03166363453ae1838381518110613105576131056142aa565b60200260200101516040518263ffffffff1660e01b815260040161313891906001600160a01b0391909116815260200190565b600060405180830381600087803b15801561315257600080fd5b505af1925050508015613163575060015b6131bc576007818154811061317a5761317a6142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a261320d565b600781815481106131cf576131cf6142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b6001016130db565b6002546001600160a01b0316331461326f5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60055460ff16156132c25760405162461bcd60e51b815260206004820152601760248201527f5065726d697373696f6e204d6f646520456e61626c65640000000000000000006044820152606401610b41565b6005805460ff19166001179055565b600781815481106132e157600080fd5b6000918252602090912001546001600160a01b0316905081565b6040517fc26defcd000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c26defcd90602401602060405180830381865afa158015613379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339d9190614353565b6133e95760405162461bcd60e51b815260206004820152600c60248201527f566f7465204c6f636b65642100000000000000000000000000000000000000006044820152606401610b41565b6000818152600d6020526040812080549091805b8281101561359e576000848281548110613419576134196142aa565b6000918252602080832090910154888352600c825260408084206001600160a01b039092168085529190925291205490915080156135945761345a82613c1d565b6001600160a01b0382166000908152600b6020526040812080548392906134829084906144ac565b90915550506000878152600c602090815260408083206001600160a01b0386168452909152812080548392906134b99084906144ac565b90915550506001600160a01b038281166000908152600a6020526040908190205490517f9e2bf22c00000000000000000000000000000000000000000000000000000000815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561353357600080fd5b505af1158015613547573d6000803e3d6000fd5b5050505080846135579190614426565b60408051898152602081018490529195507fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b50506001016133fd565b5080600660008282546135b191906144ac565b90915550506000848152600e60209081526040808320839055600d9091528120610ee991613d32565b6135e3836132fb565b6040517f67279054000000000000000000000000000000000000000000000000000000008152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636727905490602401600060405180830381600087803b15801561365e57600080fd5b505af1158015613672573d6000803e3d6000fd5b505083516040517fe7e242d400000000000000000000000000000000000000000000000000000000815260048101879052909250600091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e7e242d490602401602060405180830381865afa1580156136fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371f9190614439565b90506000806000805b8581101561375f57868181518110613742576137426142aa565b6020026020010151846137559190614426565b9350600101613728565b5060005b858110156139bf57600088828151811061377f5761377f6142aa565b6020908102919091018101516001600160a01b0381166000908152600f90925260409091205490915060ff16156139b657600085878a85815181106137c6576137c66142aa565b60200260200101516137d891906143ce565b6137e291906143eb565b60008c8152600c602090815260408083206001600160a01b03871684529091529020549091501561381257600080fd5b8060000361381f57600080fd5b61382882613c1d565b60008b8152600d6020908152604080832080546001810182559084528284200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387169081179091558352600b90915281208054839290613895908490614426565b909155505060008b8152600c602090815260408083206001600160a01b0386168452909152812080548392906138cc908490614426565b90915550506001600160a01b038281166000908152600a6020526040908190205490517ff320772300000000000000000000000000000000000000000000000000000000815260048101849052602481018e905291169063f320772390604401600060405180830381600087803b15801561394657600080fd5b505af115801561395a573d6000803e3d6000fd5b50505050808461396a9190614426565b93506139768186614426565b604080518d81526020810184905291965033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b50600101613763565b508015613a5a576040517ffd4a77f1000000000000000000000000000000000000000000000000000000008152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fd4a77f190602401600060405180830381600087803b158015613a4157600080fd5b505af1158015613a55573d6000803e3d6000fd5b505050505b8160066000828254613a6c9190614426565b90915550506000978852600e602052604090972096909655505050505050565b6000846001600160a01b03163b11613aa357600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613b3591906144bf565b6000604051808303816000865af19150503d8060008114613b72576040519150601f19603f3d011682016040523d82523d6000602084013e613b77565b606091505b5091509150818015613ba1575080511580613ba1575080806020019051810190613ba19190614353565b61208e57600080fd5b6001600160a01b03811660009081526012602052604090205460ff1615613bd057600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b0381166000908152600b60205260409020548015613ce8576001600160a01b038216600090815260176020526040812080546016549182905591613c6883836144ac565b90508015610cf1576000670de0b6b3a7640000613c8583876143ce565b613c8f91906143eb565b6001600160a01b03871660009081526010602052604090205490915060ff161561208e576001600160a01b03861660009081526015602052604081208054839290613cdb908490614426565b9091555050505050505050565b6016546001600160a01b0383166000908152601760205260409020555050565b600062093a8080613d198142614426565b613d2391906143eb565b613d2d91906143ce565b905090565b5080546000825590600052602060002090810190611c0691905b80821115613d605760008155600101613d4c565b5090565b6001600160a01b0381168114611c0657600080fd5b600060208284031215613d8b57600080fd5b8135613d9681613d64565b9392505050565b60008060408385031215613db057600080fd5b8235613dbb81613d64565b91506020830135613dcb81613d64565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e4c57613e4c613dd6565b604052919050565b600067ffffffffffffffff821115613e6e57613e6e613dd6565b5060051b60200190565b600082601f830112613e8957600080fd5b81356020613e9e613e9983613e54565b613e05565b8083825260208201915060208460051b870101935086841115613ec057600080fd5b602086015b84811015613ee5578035613ed881613d64565b8352918301918301613ec5565b509695505050505050565b600082601f830112613f0157600080fd5b81356020613f11613e9983613e54565b82815260059290921b84018101918181019086841115613f3057600080fd5b8286015b84811015613ee557803567ffffffffffffffff811115613f545760008081fd5b613f628986838b0101613e78565b845250918301918301613f34565b60008060408385031215613f8357600080fd5b823567ffffffffffffffff80821115613f9b57600080fd5b613fa786838701613e78565b93506020850135915080821115613fbd57600080fd5b50613fca85828601613ef0565b9150509250929050565b600060208284031215613fe657600080fd5b5035919050565b6000806040838503121561400057600080fd5b823591506020830135613dcb81613d64565b6000806040838503121561402557600080fd5b823567ffffffffffffffff81111561403c57600080fd5b61404885828601613e78565b9250506020830135613dcb81613d64565b8015158114611c0657600080fd5b60008060006060848603121561407c57600080fd5b833561408781613d64565b9250602084013561409781613d64565b915060408401356140a781614059565b809150509250925092565b6000806000606084860312156140c757600080fd5b833567ffffffffffffffff808211156140df57600080fd5b6140eb87838801613e78565b9450602086013591508082111561410157600080fd5b5061410e86828701613ef0565b925050604084013590509250925092565b60008083601f84011261413157600080fd5b50813567ffffffffffffffff81111561414957600080fd5b6020830191508360208260051b850101111561416457600080fd5b9250929050565b60008060008060006060868803121561418357600080fd5b85359450602086013567ffffffffffffffff808211156141a257600080fd5b6141ae89838a0161411f565b909650945060408801359150808211156141c757600080fd5b506141d48882890161411f565b969995985093965092949392505050565b600080604083850312156141f857600080fd5b50508035926020909101359150565b60008060006060848603121561421c57600080fd5b83359250602084013561422e81613d64565b929592945050506040919091013590565b6000806040838503121561425257600080fd5b823561425d81613d64565b91506020830135613dcb81614059565b60006020828403121561427f57600080fd5b813567ffffffffffffffff81111561429657600080fd5b6142a284828501613e78565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151808452602080850194506020840160005b838110156143135781516001600160a01b0316875295820195908201906001016142ee565b509495945050505050565b6001600160a01b03831681526040602082015260006142a260408301846142d9565b602081526000613d9660208301846142d9565b60006020828403121561436557600080fd5b8151613d9681614059565b6000806040838503121561438357600080fd5b825161438e81613d64565b6020840151909250613dcb81613d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176143e5576143e561439f565b92915050565b600082614421577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156143e5576143e561439f565b60006020828403121561444b57600080fd5b5051919050565b8281526040602082015260006142a260408301846142d9565b6000806040838503121561447e57600080fd5b505080516020909101519092909150565b6000602082840312156144a157600080fd5b8151613d9681613d64565b818103818111156143e5576143e561439f565b6000825160005b818110156144e057602081860181015185830152016144c6565b50600092019182525091905056fea2646970667358221220d3e452a1dc749ed306ee956c36c0692628aece3661ff637ed44222c050dfc73264736f6c634300081600330000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334200000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824000000000000000000000000b33f66f27d8d8282ac1f55f98cd83503e90128e9000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103c55760003560e01c80638a126be1116101ff578063b9a09fd51161011a578063eaa53523116100ad578063f0cf6c961161007c578063f0cf6c9614610941578063f80d61241461094e578063f851a44014610956578063fbdfe6b71461096957600080fd5b8063eaa53523146108d1578063eb4a78e0146108e4578063eded3e021461090b578063ef897f071461091e57600080fd5b8063d560b0d7116100e9578063d560b0d714610885578063d80a4d4d14610898578063dae6c831146108ab578063ea94ee44146108be57600080fd5b8063b9a09fd5146107f7578063c45a015514610820578063c527ee1f14610847578063d23254b41461085a57600080fd5b8063a0947d6f11610192578063a7cac84611610161578063a7cac84614610778578063a8c5d95a14610798578063aa79979b146107c1578063b6fe96bc146107e457600080fd5b8063a0947d6f14610737578063a5f4301e1461073f578063a61c713a14610752578063a6dd93641461076557600080fd5b8063992a7933116101ce578063992a7933146106eb5780639b19251a146106fe5780639b6a9d72146107115780639f06247b1461072457600080fd5b80638a126be11461069f5780638dd598fb146106b257806396c82e57146106d95780639769a38a146106e257600080fd5b8063402914f5116102ef578063666256aa11610282578063704b6c0211610251578063704b6c02146106465780637715ee751461065957806379e938241461066c5780637ac09bf71461068c57600080fd5b8063666256aa146105fa578063698473e31461060d5780636b2cc75c146106205780636ecbe38a1461063357600080fd5b8063485fdb4a116102be578063485fdb4a146105a957806350c116b8146105bc57806353d78693146105df57806363453ae1146105e757600080fd5b8063402914f51461055b578063411b1f771461057b578063462d0b2e1461058e57806347b3c6ba146105a157600080fd5b8063264deaf8116103675780633a045145116103365780633a045145146104e45780633af32abf146104f75780633c6b16ab1461051a5780633e504f7d1461052d57600080fd5b8063264deaf8146104a357806326782247146104ab578063310bd74b146104be57806332145f90146104d157600080fd5b80630e18b681116103a35780630e18b681146104365780631937e58f146104405780631f7b6d321461047e57806320b1cb6f1461049057600080fd5b806306d6a1b2146103ca57806307546172146104105780630d52333c14610423575b600080fd5b6103f36103d8366004613d79565b6009602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546103f3906001600160a01b031681565b6000546103f3906001600160a01b031681565b61043e61097c565b005b61046e61044e366004613d9d565b601360209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610407565b6007545b604051908152602001610407565b61043e61049e366004613f70565b6109cf565b61043e610aeb565b6003546103f3906001600160a01b031681565b61043e6104cc366004613fd4565b610ba8565b61043e6104df366004613fd4565b610cf8565b61043e6104f2366004613d79565b610eef565b61046e610505366004613d79565b60126020526000908152604090205460ff1681565b61043e610528366004613fd4565b6112be565b61046e61053b366004613d9d565b601460209081526000928352604080842090915290825290205460ff1681565b610482610569366004613d79565b60156020526000908152604090205481565b61043e610589366004613fed565b611391565b61043e61059c366004614012565b611484565b61043e61150d565b61043e6105b7366004614067565b61151e565b61046e6105ca366004613d79565b60106020526000908152604090205460ff1681565b61043e6115b2565b61043e6105f5366004613d79565b6115c1565b61043e6106083660046140b2565b611834565b61043e61061b366004613fed565b6119fe565b61043e61062e366004613d79565b611af1565b61043e610641366004613d79565b611bfd565b61043e610654366004613d79565b611c09565b61043e6106673660046140b2565b611c9d565b61048261067a366004613fd4565b600e6020526000908152604090205481565b61043e61069a36600461416b565b611e65565b61043e6106ad366004614067565b612096565b6103f37f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334281565b61048260065481565b61048260045481565b61043e6106f9366004613d79565b61212a565b61043e61070c366004613d79565b61224b565b61043e61071f3660046141e5565b6122e8565b61043e610732366004613d79565b61232a565b61043e612439565b6103f361074d366004613d79565b612553565b61043e610760366004614207565b612b8e565b61043e610773366004613fd4565b612bf6565b610482610786366004613d79565b600b6020526000908152604090205481565b6103f36107a6366004613d79565b600a602052600090815260409020546001600160a01b031681565b61046e6107cf366004613d79565b600f6020526000908152604090205460ff1681565b61043e6107f236600461423f565b612caa565b6103f3610805366004613d79565b6008602052600090815260409020546001600160a01b031681565b6103f37f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf782481565b61043e61085536600461426d565b612d2f565b610482610868366004613fed565b600c60209081526000928352604080842090915290825290205481565b61043e61089336600461426d565b612e34565b61043e6108a63660046141e5565b612e6a565b6103f36108b93660046141e5565b612fbe565b61043e6108cc366004614207565b612ff6565b61043e6108df36600461426d565b613055565b6103f37f000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e81565b61043e61091936600461426d565b6130d8565b61046e61092c366004613d79565b60116020526000908152604090205460ff1681565b60055461046e9060ff1681565b61043e613215565b6002546103f3906001600160a01b031681565b6103f3610977366004613fd4565b6132d1565b6003546001600160a01b0316331461099357600080fd5b600354600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60005b8251811015610ae6578281815181106109ed576109ed6142aa565b60200260200101516001600160a01b03166331279d3d33848481518110610a1657610a166142aa565b60200260200101516040518363ffffffff1660e01b8152600401610a3b92919061431e565b600060405180830381600087803b158015610a5557600080fd5b505af1925050508015610a66575060015b610ade57828181518110610a7c57610a7c6142aa565b60200260200101516001600160a01b03167f64b5ca626ed4122d05be46c898b7520ff5a9a24880a4ebe983ae30b0e0aa82bf838381518110610ac057610ac06142aa565b6020026020010151604051610ad59190614340565b60405180910390a25b6001016109d2565b505050565b6002546001600160a01b03163314610b4a5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e00000000000000000000000000000060448201526064015b60405180910390fd5b60055460ff16610b9c5760405162461bcd60e51b815260206004820152601860248201527f5065726d697373696f6e204d6f64652044697361626c656400000000000000006044820152606401610b41565b6005805460ff19169055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c509190614353565b610c5957600080fd5b610c62816132fb565b6040517fc1f0fb9f000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610cdd57600080fd5b505af1158015610cf1573d6000803e3d6000fd5b5050505050565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190614353565b610da957600080fd5b6000818152600d6020908152604080832080548251818502810185019093528083529192909190830182828015610e0957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610deb575b5050505050905060008151905060008167ffffffffffffffff811115610e3157610e31613dd6565b604051908082528060200260200182016040528015610e5a578160200160208202803683370190505b50905060005b82811015610edd57600c60008681526020019081526020016000206000858381518110610e8f57610e8f6142aa565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610eca57610eca6142aa565b6020908102919091010152600101610e60565b50610ee98484836135da565b50505050565b6002546001600160a01b03163314610f495760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff1615610fb25760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b03818116600090815260096020526040908190205490517fe5e31b1300000000000000000000000000000000000000000000000000000000815290821660048201819052917f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824169063e5e31b1390602401602060405180830381865afa158015611047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106b9190614353565b6110b75760405162461bcd60e51b815260206004820152601360248201527f7061697220646f6573206e6f74206578697374000000000000000000000000006044820152606401610b41565b600080826001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190614370565b6001600160a01b038581166000908152600860205260409020549294509092501661118a5760405162461bcd60e51b815260206004820152601460248201527f676175676520646f6573206e6f742065786973740000000000000000000000006044820152606401610b41565b6001600160a01b038481166000818152600a6020908152604080832080548987168086526008855283862080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091558787526009865284872080548216905583541690925560138452828520898816808752908552838620805460ff199081169091558989168088528588208054831690557f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c18a1688528588208054831690559290981680875260148652848720918752908552838620805489169055908552828520805488169055858552600f909352818420805490961690955551909392849290917f13379c5ce739840b099b7f3973cd7c9ecaa3aff6f381da0cfb8008ce4f18ace59190a45050505050565b6112ea7f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1333084613a8c565b60065460009061130283670de0b6b3a76400006143ce565b61130c91906143eb565b9050801561132c5780601660008282546113269190614426565b90915550505b6040518281526001600160a01b037f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b336000908152600f602052604090205460ff166113ad57600080fd5b8115611447576040517f986b7d8a000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290602001611385565b6001546001600160a01b0316331461149b57600080fd5b60005b82518110156114d1576114c98382815181106114bc576114bc6142aa565b6020026020010151613baa565b60010161149e565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b60075461151c90600090612e6a565b565b6002546001600160a01b031633146115785760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260136020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60075461151c906000906122e8565b6018546001146115d057600080fd5b6002601855600154604080517fed29fc1100000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561163a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165e9190614439565b5061166881613c1d565b6001600160a01b03818116600081815260156020526040908190205490517f99bcc0520000000000000000000000000000000000000000000000000000000081527f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19093166004840152916399bcc05290602401602060405180830381865afa1580156116f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171d9190614439565b811180156117375750600061173562093a80836143eb565b115b1561182b576001600160a01b0382811660008181526015602052604080822091909155517fb66503cf0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156117d257600080fd5b505af11580156117e6573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601855565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc9190614353565b6118e557600080fd5b60005b8351811015610ee957838181518110611903576119036142aa565b60200260200101516001600160a01b031663a7852afa8385848151811061192c5761192c6142aa565b60200260200101516040518363ffffffff1660e01b8152600401611951929190614452565b600060405180830381600087803b15801561196b57600080fd5b505af192505050801561197c575060015b6119f657838181518110611992576119926142aa565b60200260200101516001600160a01b03167f3d29a870fa2d124f14984f98a1df8bcd683e624184195c2a63697d6200266f3e838584815181106119d7576119d76142aa565b60200260200101516040516119ed929190614452565b60405180910390a25b6001016118e8565b336000908152600f602052604090205460ff16611a1a57600080fd5b8115611ab4576040517ffbd3a29d000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611a9b57600080fd5b505af1158015611aaf573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90602001611385565b6002546001600160a01b03163314611b4b5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526012602052604090205460ff16611bb35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260126020526040808220805460ff191690555133917f60a9f9ee3d1d62847472dc6b066eb0548a70c14f0ba4715be1c5bcdbd9b4462591a350565b611c0681613c1d565b50565b6002546001600160a01b03163314611c635760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190614353565b611d4e57600080fd5b60005b8351811015610ee957838181518110611d6c57611d6c6142aa565b60200260200101516001600160a01b031663a7852afa83858481518110611d9557611d956142aa565b60200260200101516040518363ffffffff1660e01b8152600401611dba929190614452565b600060405180830381600087803b158015611dd457600080fd5b505af1925050508015611de5575060015b611e5d57838181518110611dfb57611dfb6142aa565b60200260200101516001600160a01b03167f707c40b300e86ea06afe070057bebf0a23f03e55ca3aa0dffb91d96d2fc89fac848381518110611e3f57611e3f6142aa565b6020026020010151604051611e549190614340565b60405180910390a25b600101611d51565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d9190614353565b611f1657600080fd5b828114611f2257600080fd5b6040517ff8a05763000000000000000000000000000000000000000000000000000000008152600481018690526000907f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063f8a0576390602401602060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614439565b905080611fd2613d08565b11156120205760405162461bcd60e51b815260206004820152601160248201527f6c6f636b206578706972657320736f6f6e0000000000000000000000000000006044820152606401610b41565b61208e8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506135da92505050565b505050505050565b6002546001600160a01b031633146120f05760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260146020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6002546001600160a01b031633146121845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff166121ec5760405162461bcd60e51b815260206004820152601160248201527f6761756765206973206e6f74206c6976650000000000000000000000000000006044820152606401610b41565b6121f5816115c1565b6001600160a01b0381166000818152601060209081526040808320805460ff191690556015909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b60055460ff16156122b0576002546001600160a01b031633146122b05760405162461bcd60e51b815260206004820152601960248201527f5065726d697373696f6e204d6f646520497320416374697665000000000000006044820152606401610b41565b6122df7f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1336000600454613a8c565b611c0681613baa565b815b81811015610ae65761232260078281548110612308576123086142aa565b6000918252602090912001546001600160a01b0316613c1d565b6001016122ea565b6002546001600160a01b031633146123845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff16156123ed5760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b60005b600754811015611c065760078181548110612459576124596142aa565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af19250505080156124ef575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124ec9181019061446b565b60015b6125485760078181548110612506576125066142aa565b60009182526020822001546040516001600160a01b03909116917f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb91a261254b565b50505b60010161243c565b6001600160a01b03818116600090815260086020526040812054909116156125bd5760405162461bcd60e51b815260206004820152600660248201527f65786973747300000000000000000000000000000000000000000000000000006044820152606401610b41565b6040517fe5e31b130000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824169063e5e31b1390602401602060405180830381865afa15801561263c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126609190614353565b6126ac5760405162461bcd60e51b815260206004820152600560248201527f21706169720000000000000000000000000000000000000000000000000000006044820152606401610b41565b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156126ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127129190614370565b6001600160a01b038216600090815260126020526040902054919350915060ff16801561275757506001600160a01b03811660009081526012602052604090205460ff165b6127a35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b60007f000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e6001600160a01b031663d27b9a786040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612829919061448f565b600080546040517f1c48e0fa0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015280851660248301527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33428116604483015293945091921690631c48e0fa906064016020604051808303816000875af11580156128c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e6919061448f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301529192507f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19091169063095ea7b3906044016020604051808303816000875af1158015612992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b69190614353565b506001600160a01b038181166000818152600a6020908152604080832080548887167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092558c8716808652600885528386208054831688179055958552600984528285208054909116909517909455600f8252808320805460ff199081166001908117909255601084528285208054821683179055601384528285208b881680875290855283862080548316841790558a881680875284872080548416851790557f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1909816865283862080548316841790559585526014845282852095855294909252808320805485168317905593825292902080549091169091179055612ae381613c1d565b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560405133815288831692851691907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a495945050505050565b336000908152600f602052604090205460ff16612baa57600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b3360009081526011602052604090205460ff16612c555760405162461bcd60e51b815260206004820152601760248201527f566f7465723a206f6e6c7920666565206d616e616765720000000000000000006044820152606401610b41565b60008111612ca55760405162461bcd60e51b815260206004820152601d60248201527f466565206d7573742062652067726561746572207468616e207a65726f0000006044820152606401610b41565b600455565b6002546001600160a01b03163314612d045760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60005b8151811015612e3057818181518110612d4d57612d4d6142aa565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1925050508015612dcd575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612dca9181019061446b565b60015b612e2557818181518110612de357612de36142aa565b60200260200101516001600160a01b03167f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb60405160405180910390a2612e28565b50505b600101612d32565b5050565b60005b8151811015612e3057612e62828281518110612e5557612e556142aa565b6020026020010151613c1d565b600101612e37565b815b81811015610ae657306001600160a01b03166363453ae160078381548110612e9657612e966142aa565b60009182526020909120015460405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039091166004820152602401600060405180830381600087803b158015612efb57600080fd5b505af1925050508015612f0c575060015b612f655760078181548110612f2357612f236142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612fb6565b60078181548110612f7857612f786142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612e6c565b600d6020528160005260406000208181548110612fda57600080fd5b6000918252602090912001546001600160a01b03169150829050565b336000908152600f602052604090205460ff1661301257600080fd5b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679101612be9565b6002546001600160a01b031633146130af5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60005b8151811015612e30576130d08282815181106114bc576114bc6142aa565b6001016130b2565b60005b8151811015612e3057306001600160a01b03166363453ae1838381518110613105576131056142aa565b60200260200101516040518263ffffffff1660e01b815260040161313891906001600160a01b0391909116815260200190565b600060405180830381600087803b15801561315257600080fd5b505af1925050508015613163575060015b6131bc576007818154811061317a5761317a6142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a261320d565b600781815481106131cf576131cf6142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b6001016130db565b6002546001600160a01b0316331461326f5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60055460ff16156132c25760405162461bcd60e51b815260206004820152601760248201527f5065726d697373696f6e204d6f646520456e61626c65640000000000000000006044820152606401610b41565b6005805460ff19166001179055565b600781815481106132e157600080fd5b6000918252602090912001546001600160a01b0316905081565b6040517fc26defcd000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063c26defcd90602401602060405180830381865afa158015613379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339d9190614353565b6133e95760405162461bcd60e51b815260206004820152600c60248201527f566f7465204c6f636b65642100000000000000000000000000000000000000006044820152606401610b41565b6000818152600d6020526040812080549091805b8281101561359e576000848281548110613419576134196142aa565b6000918252602080832090910154888352600c825260408084206001600160a01b039092168085529190925291205490915080156135945761345a82613c1d565b6001600160a01b0382166000908152600b6020526040812080548392906134829084906144ac565b90915550506000878152600c602090815260408083206001600160a01b0386168452909152812080548392906134b99084906144ac565b90915550506001600160a01b038281166000908152600a6020526040908190205490517f9e2bf22c00000000000000000000000000000000000000000000000000000000815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561353357600080fd5b505af1158015613547573d6000803e3d6000fd5b5050505080846135579190614426565b60408051898152602081018490529195507fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b50506001016133fd565b5080600660008282546135b191906144ac565b90915550506000848152600e60209081526040808320839055600d9091528120610ee991613d32565b6135e3836132fb565b6040517f67279054000000000000000000000000000000000000000000000000000000008152600481018490527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b031690636727905490602401600060405180830381600087803b15801561365e57600080fd5b505af1158015613672573d6000803e3d6000fd5b505083516040517fe7e242d400000000000000000000000000000000000000000000000000000000815260048101879052909250600091507f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063e7e242d490602401602060405180830381865afa1580156136fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371f9190614439565b90506000806000805b8581101561375f57868181518110613742576137426142aa565b6020026020010151846137559190614426565b9350600101613728565b5060005b858110156139bf57600088828151811061377f5761377f6142aa565b6020908102919091018101516001600160a01b0381166000908152600f90925260409091205490915060ff16156139b657600085878a85815181106137c6576137c66142aa565b60200260200101516137d891906143ce565b6137e291906143eb565b60008c8152600c602090815260408083206001600160a01b03871684529091529020549091501561381257600080fd5b8060000361381f57600080fd5b61382882613c1d565b60008b8152600d6020908152604080832080546001810182559084528284200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387169081179091558352600b90915281208054839290613895908490614426565b909155505060008b8152600c602090815260408083206001600160a01b0386168452909152812080548392906138cc908490614426565b90915550506001600160a01b038281166000908152600a6020526040908190205490517ff320772300000000000000000000000000000000000000000000000000000000815260048101849052602481018e905291169063f320772390604401600060405180830381600087803b15801561394657600080fd5b505af115801561395a573d6000803e3d6000fd5b50505050808461396a9190614426565b93506139768186614426565b604080518d81526020810184905291965033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b50600101613763565b508015613a5a576040517ffd4a77f1000000000000000000000000000000000000000000000000000000008152600481018990527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063fd4a77f190602401600060405180830381600087803b158015613a4157600080fd5b505af1158015613a55573d6000803e3d6000fd5b505050505b8160066000828254613a6c9190614426565b90915550506000978852600e602052604090972096909655505050505050565b6000846001600160a01b03163b11613aa357600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613b3591906144bf565b6000604051808303816000865af19150503d8060008114613b72576040519150601f19603f3d011682016040523d82523d6000602084013e613b77565b606091505b5091509150818015613ba1575080511580613ba1575080806020019051810190613ba19190614353565b61208e57600080fd5b6001600160a01b03811660009081526012602052604090205460ff1615613bd057600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b0381166000908152600b60205260409020548015613ce8576001600160a01b038216600090815260176020526040812080546016549182905591613c6883836144ac565b90508015610cf1576000670de0b6b3a7640000613c8583876143ce565b613c8f91906143eb565b6001600160a01b03871660009081526010602052604090205490915060ff161561208e576001600160a01b03861660009081526015602052604081208054839290613cdb908490614426565b9091555050505050505050565b6016546001600160a01b0383166000908152601760205260409020555050565b600062093a8080613d198142614426565b613d2391906143eb565b613d2d91906143ce565b905090565b5080546000825590600052602060002090810190611c0691905b80821115613d605760008155600101613d4c565b5090565b6001600160a01b0381168114611c0657600080fd5b600060208284031215613d8b57600080fd5b8135613d9681613d64565b9392505050565b60008060408385031215613db057600080fd5b8235613dbb81613d64565b91506020830135613dcb81613d64565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e4c57613e4c613dd6565b604052919050565b600067ffffffffffffffff821115613e6e57613e6e613dd6565b5060051b60200190565b600082601f830112613e8957600080fd5b81356020613e9e613e9983613e54565b613e05565b8083825260208201915060208460051b870101935086841115613ec057600080fd5b602086015b84811015613ee5578035613ed881613d64565b8352918301918301613ec5565b509695505050505050565b600082601f830112613f0157600080fd5b81356020613f11613e9983613e54565b82815260059290921b84018101918181019086841115613f3057600080fd5b8286015b84811015613ee557803567ffffffffffffffff811115613f545760008081fd5b613f628986838b0101613e78565b845250918301918301613f34565b60008060408385031215613f8357600080fd5b823567ffffffffffffffff80821115613f9b57600080fd5b613fa786838701613e78565b93506020850135915080821115613fbd57600080fd5b50613fca85828601613ef0565b9150509250929050565b600060208284031215613fe657600080fd5b5035919050565b6000806040838503121561400057600080fd5b823591506020830135613dcb81613d64565b6000806040838503121561402557600080fd5b823567ffffffffffffffff81111561403c57600080fd5b61404885828601613e78565b9250506020830135613dcb81613d64565b8015158114611c0657600080fd5b60008060006060848603121561407c57600080fd5b833561408781613d64565b9250602084013561409781613d64565b915060408401356140a781614059565b809150509250925092565b6000806000606084860312156140c757600080fd5b833567ffffffffffffffff808211156140df57600080fd5b6140eb87838801613e78565b9450602086013591508082111561410157600080fd5b5061410e86828701613ef0565b925050604084013590509250925092565b60008083601f84011261413157600080fd5b50813567ffffffffffffffff81111561414957600080fd5b6020830191508360208260051b850101111561416457600080fd5b9250929050565b60008060008060006060868803121561418357600080fd5b85359450602086013567ffffffffffffffff808211156141a257600080fd5b6141ae89838a0161411f565b909650945060408801359150808211156141c757600080fd5b506141d48882890161411f565b969995985093965092949392505050565b600080604083850312156141f857600080fd5b50508035926020909101359150565b60008060006060848603121561421c57600080fd5b83359250602084013561422e81613d64565b929592945050506040919091013590565b6000806040838503121561425257600080fd5b823561425d81613d64565b91506020830135613dcb81614059565b60006020828403121561427f57600080fd5b813567ffffffffffffffff81111561429657600080fd5b6142a284828501613e78565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151808452602080850194506020840160005b838110156143135781516001600160a01b0316875295820195908201906001016142ee565b509495945050505050565b6001600160a01b03831681526040602082015260006142a260408301846142d9565b602081526000613d9660208301846142d9565b60006020828403121561436557600080fd5b8151613d9681614059565b6000806040838503121561438357600080fd5b825161438e81613d64565b6020840151909250613dcb81613d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176143e5576143e561439f565b92915050565b600082614421577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156143e5576143e561439f565b60006020828403121561444b57600080fd5b5051919050565b8281526040602082015260006142a260408301846142d9565b6000806040838503121561447e57600080fd5b505080516020909101519092909150565b6000602082840312156144a157600080fd5b8151613d9681613d64565b818103818111156143e5576143e561439f565b6000825160005b818110156144e057602081860181015185830152016144c6565b50600092019182525091905056fea2646970667358221220d3e452a1dc749ed306ee956c36c0692628aece3661ff637ed44222c050dfc73264736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334200000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824000000000000000000000000b33f66f27d8d8282ac1f55f98cd83503e90128e9000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e
-----Decoded View---------------
Arg [0] : __ve (address): 0x6ACa098fa93DAD7A872F6dcb989F8b4A3aFC3342
Arg [1] : _factory (address): 0x12508dd9108Abab2c5fD8fC6E4984E46a3CF7824
Arg [2] : _gauges (address): 0xb33F66f27d8D8282AC1f55F98cd83503e90128e9
Arg [3] : _bribes (address): 0xc8c5172879f0b7E88cc03ca20835dbE9e283386e
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc3342
Arg [1] : 00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824
Arg [2] : 000000000000000000000000b33f66f27d8d8282ac1f55f98cd83503e90128e9
Arg [3] : 000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.