Source Code
Latest 19 from a total of 19 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Reset | 21730890 | 220 days ago | IN | 0 FRAX | 0.00015337 | ||||
| Reset | 21730840 | 220 days ago | IN | 0 FRAX | 0.00015436 | ||||
| Claim Bribes | 13779353 | 404 days ago | IN | 0 FRAX | 0.00000552 | ||||
| Create Gauge | 9518767 | 502 days ago | IN | 0 FRAX | 0.00000555 | ||||
| Reset | 8118261 | 535 days ago | IN | 0 FRAX | 0.00000173 | ||||
| Reset | 6561253 | 571 days ago | IN | 0 FRAX | 0.00000086 | ||||
| Distribute | 3624005 | 639 days ago | IN | 0 FRAX | 0.00000332 | ||||
| Distro | 3623992 | 639 days ago | IN | 0 FRAX | 0.00000285 | ||||
| Vote | 3406401 | 644 days ago | IN | 0 FRAX | 0.00000179 | ||||
| Vote | 3406378 | 644 days ago | IN | 0 FRAX | 0.00000186 | ||||
| Vote | 2839479 | 657 days ago | IN | 0 FRAX | 0.00000249 | ||||
| Vote | 2839439 | 657 days ago | IN | 0 FRAX | 0.00000254 | ||||
| Vote | 2614134 | 662 days ago | IN | 0 FRAX | 0.00000425 | ||||
| Create Gauge | 2408076 | 667 days ago | IN | 0 FRAX | 0.00000955 | ||||
| Vote | 2341028 | 668 days ago | IN | 0 FRAX | 0.00000707 | ||||
| Create Gauge | 1999674 | 676 days ago | IN | 0 FRAX | 0.00000889 | ||||
| Set Whitelisting... | 1923605 | 678 days ago | IN | 0 FRAX | 0.00000309 | ||||
| Whitelist Batch | 1822751 | 680 days ago | IN | 0 FRAX | 0.00000847 | ||||
| Initialize | 1821092 | 681 days ago | IN | 0 FRAX | 0.00000763 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
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 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 = 625000e18;
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 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
Contract ABI
API[{"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"}],"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":"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
61010060405260016018553480156200001757600080fd5b50604051620044ef380380620044ef8339810160408190526200003a9162000262565b6001600160a01b038416158015906200005b57506001600160a01b03831615155b80156200007057506001600160a01b03821615155b80156200008557506001600160a01b03811615155b620000ea5760405162461bcd60e51b815260206004820152602b60248201527f566f7465723a207a65726f20616464726573732070726f766964656420696e2060448201526a31b7b739ba393ab1ba37b960a91b606482015260840160405180910390fd5b6001600160a01b03808516608081905290841660a05260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa1580156200013c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001629190620002bf565b6001600160a01b0390811660c052600080549382166001600160a01b0319948516178155911660e0526001805483163390811782556002805490941681179093556005805460ff199081169091556984595161401484a0000060045592825260116020526040822080548416821790557f295a4ffdc519333d9c723410dafa910a4ea56bcd3ab227348108e92a4605a7c4805484168217905573726461fa6e788bd8a79986d36f1992368a3e56ea9091527ff3da598d0469dad60e2c05ecde0b47799d0331540e69dbeb5f95c5fce5e72c14805490921617905550620002e49050565b80516001600160a01b03811681146200025d57600080fd5b919050565b600080600080608085870312156200027957600080fd5b620002848562000245565b9350620002946020860162000245565b9250620002a46040860162000245565b9150620002b46060860162000245565b905092959194509250565b600060208284031215620002d257600080fd5b620002dd8262000245565b9392505050565b60805160a05160c05160e051614137620003b8600039600081816108cb01526123ba015260008181610ed601528181610f4f015281816112be0152818161139301528181611ec80152818161255a0152612692015260008181610807015261220801526000818161069901528181610bbf01528181610c7301528181610d0f01528181610ff50152818161147c01528181611662015281816118e501528181611aad01528181611b670152818161248001528181612f3d01528181613225015281816132bf015261360801526141376000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c80638dd598fb116101f4578063b9a09fd51161011a578063eaa53523116100ad578063f0cf6c961161007c578063f0cf6c9614610923578063f80d612414610930578063f851a44014610938578063fbdfe6b71461094b57600080fd5b8063eaa53523146108b3578063eb4a78e0146108c6578063eded3e02146108ed578063ef897f071461090057600080fd5b8063d560b0d7116100e9578063d560b0d714610867578063d80a4d4d1461087a578063dae6c8311461088d578063ea94ee44146108a057600080fd5b8063b9a09fd5146107d9578063c45a015514610802578063c527ee1f14610829578063d23254b41461083c57600080fd5b8063a0947d6f11610192578063a7cac84611610161578063a7cac8461461075a578063a8c5d95a1461077a578063aa79979b146107a3578063b6fe96bc146107c657600080fd5b8063a0947d6f14610719578063a5f4301e14610721578063a61c713a14610734578063a6dd93641461074757600080fd5b8063992a7933116101ce578063992a7933146106cd5780639b19251a146106e05780639b6a9d72146106f35780639f06247b1461070657600080fd5b80638dd598fb1461069457806396c82e57146106bb5780639769a38a146106c457600080fd5b8063411b1f77116102e4578063698473e3116102775780637715ee75116102465780637715ee751461063b57806379e938241461064e5780637ac09bf71461066e5780638a126be11461068157600080fd5b8063698473e3146105ef5780636b2cc75c146106025780636ecbe38a14610615578063704b6c021461062857600080fd5b806350c116b8116102b357806350c116b81461059e57806353d78693146105c157806363453ae1146105c9578063666256aa146105dc57600080fd5b8063411b1f771461055d578063462d0b2e1461057057806347b3c6ba14610583578063485fdb4a1461058b57600080fd5b8063264deaf81161035c5780633af32abf1161032b5780633af32abf146104d95780633c6b16ab146104fc5780633e504f7d1461050f578063402914f51461053d57600080fd5b8063264deaf81461049857806326782247146104a0578063310bd74b146104b357806332145f90146104c657600080fd5b80630e18b681116103985780630e18b6811461042b5780631937e58f146104355780631f7b6d321461047357806320b1cb6f1461048557600080fd5b806306d6a1b2146103bf57806307546172146104055780630d52333c14610418575b600080fd5b6103e86103cd36600461398c565b6009602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546103e8906001600160a01b031681565b6000546103e8906001600160a01b031681565b61043361095e565b005b6104636104433660046139b0565b601360209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016103fc565b6007545b6040519081526020016103fc565b610433610493366004613b83565b6109b1565b610433610acd565b6003546103e8906001600160a01b031681565b6104336104c1366004613be7565b610b8a565b6104336104d4366004613be7565b610cda565b6104636104e736600461398c565b60126020526000908152604090205460ff1681565b61043361050a366004613be7565b610ed1565b61046361051d3660046139b0565b601460209081526000928352604080842090915290825290205460ff1681565b61047761054b36600461398c565b60156020526000908152604090205481565b61043361056b366004613c00565b610fa4565b61043361057e366004613c25565b611097565b610433611120565b610433610599366004613c7a565b611131565b6104636105ac36600461398c565b60106020526000908152604090205460ff1681565b6104336111c5565b6104336105d736600461398c565b6111d4565b6104336105ea366004613cc5565b611447565b6104336105fd366004613c00565b611611565b61043361061036600461398c565b611704565b61043361062336600461398c565b611810565b61043361063636600461398c565b61181c565b610433610649366004613cc5565b6118b0565b61047761065c366004613be7565b600e6020526000908152604090205481565b61043361067c366004613d7e565b611a78565b61043361068f366004613c7a565b611ca9565b6103e87f000000000000000000000000000000000000000000000000000000000000000081565b61047760065481565b61047760045481565b6104336106db36600461398c565b611d3d565b6104336106ee36600461398c565b611e5e565b610433610701366004613df8565b611efb565b61043361071436600461398c565b611f3d565b61043361204c565b6103e861072f36600461398c565b612166565b610433610742366004613e1a565b6127a1565b610433610755366004613be7565b612809565b61047761076836600461398c565b600b6020526000908152604090205481565b6103e861078836600461398c565b600a602052600090815260409020546001600160a01b031681565b6104636107b136600461398c565b600f6020526000908152604090205460ff1681565b6104336107d4366004613e52565b6128bd565b6103e86107e736600461398c565b6008602052600090815260409020546001600160a01b031681565b6103e87f000000000000000000000000000000000000000000000000000000000000000081565b610433610837366004613e80565b612942565b61047761084a366004613c00565b600c60209081526000928352604080842090915290825290205481565b610433610875366004613e80565b612a47565b610433610888366004613df8565b612a7d565b6103e861089b366004613df8565b612bd1565b6104336108ae366004613e1a565b612c09565b6104336108c1366004613e80565b612c68565b6103e87f000000000000000000000000000000000000000000000000000000000000000081565b6104336108fb366004613e80565b612ceb565b61046361090e36600461398c565b60116020526000908152604090205460ff1681565b6005546104639060ff1681565b610433612e28565b6002546103e8906001600160a01b031681565b6103e8610959366004613be7565b612ee4565b6003546001600160a01b0316331461097557600080fd5b600354600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60005b8251811015610ac8578281815181106109cf576109cf613ebd565b60200260200101516001600160a01b03166331279d3d338484815181106109f8576109f8613ebd565b60200260200101516040518363ffffffff1660e01b8152600401610a1d929190613f31565b600060405180830381600087803b158015610a3757600080fd5b505af1925050508015610a48575060015b610ac057828181518110610a5e57610a5e613ebd565b60200260200101516001600160a01b03167f64b5ca626ed4122d05be46c898b7520ff5a9a24880a4ebe983ae30b0e0aa82bf838381518110610aa257610aa2613ebd565b6020026020010151604051610ab79190613f53565b60405180910390a25b6001016109b4565b505050565b6002546001600160a01b03163314610b2c5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e00000000000000000000000000000060448201526064015b60405180910390fd5b60055460ff16610b7e5760405162461bcd60e51b815260206004820152601860248201527f5065726d697373696f6e204d6f64652044697361626c656400000000000000006044820152606401610b23565b6005805460ff19169055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015610c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c329190613f66565b610c3b57600080fd5b610c4481612f0e565b6040517fc1f0fb9f000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b5050505050565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d829190613f66565b610d8b57600080fd5b6000818152600d6020908152604080832080548251818502810185019093528083529192909190830182828015610deb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610dcd575b5050505050905060008151905060008167ffffffffffffffff811115610e1357610e136139e9565b604051908082528060200260200182016040528015610e3c578160200160208202803683370190505b50905060005b82811015610ebf57600c60008681526020019081526020016000206000858381518110610e7157610e71613ebd565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610eac57610eac613ebd565b6020908102919091010152600101610e42565b50610ecb8484836131ed565b50505050565b610efd7f000000000000000000000000000000000000000000000000000000000000000033308461369f565b600654600090610f1583670de0b6b3a7640000613fb2565b610f1f9190613fcf565b90508015610f3f578060166000828254610f39919061400a565b90915550505b6040518281526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b336000908152600f602052604090205460ff16610fc057600080fd5b811561105a576040517f986b7d8a000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290602001610f98565b6001546001600160a01b031633146110ae57600080fd5b60005b82518110156110e4576110dc8382815181106110cf576110cf613ebd565b60200260200101516137bd565b6001016110b1565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b60075461112f90600090612a7d565b565b6002546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03928316600090815260136020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60075461112f90600090611efb565b6018546001146111e357600080fd5b6002601855600154604080517fed29fc1100000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561124d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611271919061401d565b5061127b81613830565b6001600160a01b03818116600081815260156020526040908190205490517f99bcc0520000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009093166004840152916399bcc05290602401602060405180830381865afa15801561130c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611330919061401d565b8111801561134a5750600061134862093a8083613fcf565b115b1561143e576001600160a01b0382811660008181526015602052604080822091909155517fb66503cf0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156113e557600080fd5b505af11580156113f9573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601855565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa1580156114cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ef9190613f66565b6114f857600080fd5b60005b8351811015610ecb5783818151811061151657611516613ebd565b60200260200101516001600160a01b031663a7852afa8385848151811061153f5761153f613ebd565b60200260200101516040518363ffffffff1660e01b8152600401611564929190614036565b600060405180830381600087803b15801561157e57600080fd5b505af192505050801561158f575060015b611609578381815181106115a5576115a5613ebd565b60200260200101516001600160a01b03167f3d29a870fa2d124f14984f98a1df8bcd683e624184195c2a63697d6200266f3e838584815181106115ea576115ea613ebd565b6020026020010151604051611600929190614036565b60405180910390a25b6001016114fb565b336000908152600f602052604090205460ff1661162d57600080fd5b81156116c7576040517ffbd3a29d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fbd3a29d90602401600060405180830381600087803b1580156116ae57600080fd5b505af11580156116c2573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90602001610f98565b6002546001600160a01b0316331461175e5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03811660009081526012602052604090205460ff166117c65760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b23565b6001600160a01b038116600081815260126020526040808220805460ff191690555133917f60a9f9ee3d1d62847472dc6b066eb0548a70c14f0ba4715be1c5bcdbd9b4462591a350565b61181981613830565b50565b6002546001600160a01b031633146118765760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119589190613f66565b61196157600080fd5b60005b8351811015610ecb5783818151811061197f5761197f613ebd565b60200260200101516001600160a01b031663a7852afa838584815181106119a8576119a8613ebd565b60200260200101516040518363ffffffff1660e01b81526004016119cd929190614036565b600060405180830381600087803b1580156119e757600080fd5b505af19250505080156119f8575060015b611a7057838181518110611a0e57611a0e613ebd565b60200260200101516001600160a01b03167f707c40b300e86ea06afe070057bebf0a23f03e55ca3aa0dffb91d96d2fc89fac848381518110611a5257611a52613ebd565b6020026020010151604051611a679190613f53565b60405180910390a25b600101611964565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b209190613f66565b611b2957600080fd5b828114611b3557600080fd5b6040517ff8a05763000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f8a0576390602401602060405180830381865afa158015611bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bda919061401d565b905080611be561391b565b1115611c335760405162461bcd60e51b815260206004820152601160248201527f6c6f636b206578706972657320736f6f6e0000000000000000000000000000006044820152606401610b23565b611ca18686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506131ed92505050565b505050505050565b6002546001600160a01b03163314611d035760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03928316600090815260146020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6002546001600160a01b03163314611d975760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03811660009081526010602052604090205460ff16611dff5760405162461bcd60e51b815260206004820152601160248201527f6761756765206973206e6f74206c6976650000000000000000000000000000006044820152606401610b23565b611e08816111d4565b6001600160a01b0381166000818152601060209081526040808320805460ff191690556015909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b60055460ff1615611ec3576002546001600160a01b03163314611ec35760405162461bcd60e51b815260206004820152601960248201527f5065726d697373696f6e204d6f646520497320416374697665000000000000006044820152606401610b23565b611ef27f000000000000000000000000000000000000000000000000000000000000000033600060045461369f565b611819816137bd565b815b81811015610ac857611f3560078281548110611f1b57611f1b613ebd565b6000918252602090912001546001600160a01b0316613830565b600101611efd565b6002546001600160a01b03163314611f975760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03811660009081526010602052604090205460ff16156120005760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b23565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b60005b600754811015611819576007818154811061206c5761206c613ebd565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1925050508015612102575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120ff9181019061404f565b60015b61215b576007818154811061211957612119613ebd565b60009182526020822001546040516001600160a01b03909116917f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb91a261215e565b50505b60010161204f565b6001600160a01b03818116600090815260086020526040812054909116156121d05760405162461bcd60e51b815260206004820152600660248201527f65786973747300000000000000000000000000000000000000000000000000006044820152606401610b23565b6040517fe5e31b130000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063e5e31b1390602401602060405180830381865afa15801561224f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122739190613f66565b6122bf5760405162461bcd60e51b815260206004820152600560248201527f21706169720000000000000000000000000000000000000000000000000000006044820152606401610b23565b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af1158015612301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123259190614073565b6001600160a01b038216600090815260126020526040902054919350915060ff16801561236a57506001600160a01b03811660009081526012602052604090205460ff165b6123b65760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b23565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d27b9a786040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243c91906140a2565b600080546040517f1c48e0fa0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015280851660248301527f00000000000000000000000000000000000000000000000000000000000000008116604483015293945091921690631c48e0fa906064016020604051808303816000875af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f991906140a2565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156125a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c99190613f66565b506001600160a01b038181166000818152600a6020908152604080832080548887167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092558c8716808652600885528386208054831688179055958552600984528285208054909116909517909455600f8252808320805460ff199081166001908117909255601084528285208054821683179055601384528285208b881680875290855283862080548316841790558a881680875284872080548416851790557f00000000000000000000000000000000000000000000000000000000000000009098168652838620805483168417905595855260148452828520958552949092528083208054851683179055938252929020805490911690911790556126f681613830565b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560405133815288831692851691907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a495945050505050565b336000908152600f602052604090205460ff166127bd57600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b3360009081526011602052604090205460ff166128685760405162461bcd60e51b815260206004820152601760248201527f566f7465723a206f6e6c7920666565206d616e616765720000000000000000006044820152606401610b23565b600081116128b85760405162461bcd60e51b815260206004820152601d60248201527f466565206d7573742062652067726561746572207468616e207a65726f0000006044820152606401610b23565b600455565b6002546001600160a01b031633146129175760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60005b8151811015612a435781818151811061296057612960613ebd565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af19250505080156129e0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526129dd9181019061404f565b60015b612a38578181815181106129f6576129f6613ebd565b60200260200101516001600160a01b03167f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb60405160405180910390a2612a3b565b50505b600101612945565b5050565b60005b8151811015612a4357612a75828281518110612a6857612a68613ebd565b6020026020010151613830565b600101612a4a565b815b81811015610ac857306001600160a01b03166363453ae160078381548110612aa957612aa9613ebd565b60009182526020909120015460405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039091166004820152602401600060405180830381600087803b158015612b0e57600080fd5b505af1925050508015612b1f575060015b612b785760078181548110612b3657612b36613ebd565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612bc9565b60078181548110612b8b57612b8b613ebd565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612a7f565b600d6020528160005260406000208181548110612bed57600080fd5b6000918252602090912001546001600160a01b03169150829050565b336000908152600f602052604090205460ff16612c2557600080fd5b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56791016127fc565b6002546001600160a01b03163314612cc25760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b60005b8151811015612a4357612ce38282815181106110cf576110cf613ebd565b600101612cc5565b60005b8151811015612a4357306001600160a01b03166363453ae1838381518110612d1857612d18613ebd565b60200260200101516040518263ffffffff1660e01b8152600401612d4b91906001600160a01b0391909116815260200190565b600060405180830381600087803b158015612d6557600080fd5b505af1925050508015612d76575060015b612dcf5760078181548110612d8d57612d8d613ebd565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612e20565b60078181548110612de257612de2613ebd565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612cee565b6002546001600160a01b03163314612e825760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b60055460ff1615612ed55760405162461bcd60e51b815260206004820152601760248201527f5065726d697373696f6e204d6f646520456e61626c65640000000000000000006044820152606401610b23565b6005805460ff19166001179055565b60078181548110612ef457600080fd5b6000918252602090912001546001600160a01b0316905081565b6040517fc26defcd000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c26defcd90602401602060405180830381865afa158015612f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb09190613f66565b612ffc5760405162461bcd60e51b815260206004820152600c60248201527f566f7465204c6f636b65642100000000000000000000000000000000000000006044820152606401610b23565b6000818152600d6020526040812080549091805b828110156131b157600084828154811061302c5761302c613ebd565b6000918252602080832090910154888352600c825260408084206001600160a01b039092168085529190925291205490915080156131a75761306d82613830565b6001600160a01b0382166000908152600b6020526040812080548392906130959084906140bf565b90915550506000878152600c602090815260408083206001600160a01b0386168452909152812080548392906130cc9084906140bf565b90915550506001600160a01b038281166000908152600a6020526040908190205490517f9e2bf22c00000000000000000000000000000000000000000000000000000000815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561314657600080fd5b505af115801561315a573d6000803e3d6000fd5b50505050808461316a919061400a565b60408051898152602081018490529195507fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b5050600101613010565b5080600660008282546131c491906140bf565b90915550506000848152600e60209081526040808320839055600d9091528120610ecb91613945565b6131f683612f0e565b6040517f67279054000000000000000000000000000000000000000000000000000000008152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636727905490602401600060405180830381600087803b15801561327157600080fd5b505af1158015613285573d6000803e3d6000fd5b505083516040517fe7e242d400000000000000000000000000000000000000000000000000000000815260048101879052909250600091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e7e242d490602401602060405180830381865afa15801561330e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613332919061401d565b90506000806000805b858110156133725786818151811061335557613355613ebd565b602002602001015184613368919061400a565b935060010161333b565b5060005b858110156135d257600088828151811061339257613392613ebd565b6020908102919091018101516001600160a01b0381166000908152600f90925260409091205490915060ff16156135c957600085878a85815181106133d9576133d9613ebd565b60200260200101516133eb9190613fb2565b6133f59190613fcf565b60008c8152600c602090815260408083206001600160a01b03871684529091529020549091501561342557600080fd5b8060000361343257600080fd5b61343b82613830565b60008b8152600d6020908152604080832080546001810182559084528284200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387169081179091558352600b909152812080548392906134a890849061400a565b909155505060008b8152600c602090815260408083206001600160a01b0386168452909152812080548392906134df90849061400a565b90915550506001600160a01b038281166000908152600a6020526040908190205490517ff320772300000000000000000000000000000000000000000000000000000000815260048101849052602481018e905291169063f320772390604401600060405180830381600087803b15801561355957600080fd5b505af115801561356d573d6000803e3d6000fd5b50505050808461357d919061400a565b9350613589818661400a565b604080518d81526020810184905291965033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b50600101613376565b50801561366d576040517ffd4a77f1000000000000000000000000000000000000000000000000000000008152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fd4a77f190602401600060405180830381600087803b15801561365457600080fd5b505af1158015613668573d6000803e3d6000fd5b505050505b816006600082825461367f919061400a565b90915550506000978852600e602052604090972096909655505050505050565b6000846001600160a01b03163b116136b657600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161374891906140d2565b6000604051808303816000865af19150503d8060008114613785576040519150601f19603f3d011682016040523d82523d6000602084013e61378a565b606091505b50915091508180156137b45750805115806137b45750808060200190518101906137b49190613f66565b611ca157600080fd5b6001600160a01b03811660009081526012602052604090205460ff16156137e357600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b0381166000908152600b602052604090205480156138fb576001600160a01b03821660009081526017602052604081208054601654918290559161387b83836140bf565b90508015610cd3576000670de0b6b3a76400006138988387613fb2565b6138a29190613fcf565b6001600160a01b03871660009081526010602052604090205490915060ff1615611ca1576001600160a01b038616600090815260156020526040812080548392906138ee90849061400a565b9091555050505050505050565b6016546001600160a01b0383166000908152601760205260409020555050565b600062093a808061392c814261400a565b6139369190613fcf565b6139409190613fb2565b905090565b508054600082559060005260206000209081019061181991905b80821115613973576000815560010161395f565b5090565b6001600160a01b038116811461181957600080fd5b60006020828403121561399e57600080fd5b81356139a981613977565b9392505050565b600080604083850312156139c357600080fd5b82356139ce81613977565b915060208301356139de81613977565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5f57613a5f6139e9565b604052919050565b600067ffffffffffffffff821115613a8157613a816139e9565b5060051b60200190565b600082601f830112613a9c57600080fd5b81356020613ab1613aac83613a67565b613a18565b8083825260208201915060208460051b870101935086841115613ad357600080fd5b602086015b84811015613af8578035613aeb81613977565b8352918301918301613ad8565b509695505050505050565b600082601f830112613b1457600080fd5b81356020613b24613aac83613a67565b82815260059290921b84018101918181019086841115613b4357600080fd5b8286015b84811015613af857803567ffffffffffffffff811115613b675760008081fd5b613b758986838b0101613a8b565b845250918301918301613b47565b60008060408385031215613b9657600080fd5b823567ffffffffffffffff80821115613bae57600080fd5b613bba86838701613a8b565b93506020850135915080821115613bd057600080fd5b50613bdd85828601613b03565b9150509250929050565b600060208284031215613bf957600080fd5b5035919050565b60008060408385031215613c1357600080fd5b8235915060208301356139de81613977565b60008060408385031215613c3857600080fd5b823567ffffffffffffffff811115613c4f57600080fd5b613c5b85828601613a8b565b92505060208301356139de81613977565b801515811461181957600080fd5b600080600060608486031215613c8f57600080fd5b8335613c9a81613977565b92506020840135613caa81613977565b91506040840135613cba81613c6c565b809150509250925092565b600080600060608486031215613cda57600080fd5b833567ffffffffffffffff80821115613cf257600080fd5b613cfe87838801613a8b565b94506020860135915080821115613d1457600080fd5b50613d2186828701613b03565b925050604084013590509250925092565b60008083601f840112613d4457600080fd5b50813567ffffffffffffffff811115613d5c57600080fd5b6020830191508360208260051b8501011115613d7757600080fd5b9250929050565b600080600080600060608688031215613d9657600080fd5b85359450602086013567ffffffffffffffff80821115613db557600080fd5b613dc189838a01613d32565b90965094506040880135915080821115613dda57600080fd5b50613de788828901613d32565b969995985093965092949392505050565b60008060408385031215613e0b57600080fd5b50508035926020909101359150565b600080600060608486031215613e2f57600080fd5b833592506020840135613e4181613977565b929592945050506040919091013590565b60008060408385031215613e6557600080fd5b8235613e7081613977565b915060208301356139de81613c6c565b600060208284031215613e9257600080fd5b813567ffffffffffffffff811115613ea957600080fd5b613eb584828501613a8b565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151808452602080850194506020840160005b83811015613f265781516001600160a01b031687529582019590820190600101613f01565b509495945050505050565b6001600160a01b0383168152604060208201526000613eb56040830184613eec565b6020815260006139a96020830184613eec565b600060208284031215613f7857600080fd5b81516139a981613c6c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417613fc957613fc9613f83565b92915050565b600082614005577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115613fc957613fc9613f83565b60006020828403121561402f57600080fd5b5051919050565b828152604060208201526000613eb56040830184613eec565b6000806040838503121561406257600080fd5b505080516020909101519092909150565b6000806040838503121561408657600080fd5b825161409181613977565b60208401519092506139de81613977565b6000602082840312156140b457600080fd5b81516139a981613977565b81810381811115613fc957613fc9613f83565b6000825160005b818110156140f357602081860181015185830152016140d9565b50600092019182525091905056fea264697066735822122034131d742feb0f540a65e1dfaab7b14e5ce4938871fad426b4be50ee58e6556a64736f6c634300081600330000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334200000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824000000000000000000000000b33f66f27d8d8282ac1f55f98cd83503e90128e9000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c80638dd598fb116101f4578063b9a09fd51161011a578063eaa53523116100ad578063f0cf6c961161007c578063f0cf6c9614610923578063f80d612414610930578063f851a44014610938578063fbdfe6b71461094b57600080fd5b8063eaa53523146108b3578063eb4a78e0146108c6578063eded3e02146108ed578063ef897f071461090057600080fd5b8063d560b0d7116100e9578063d560b0d714610867578063d80a4d4d1461087a578063dae6c8311461088d578063ea94ee44146108a057600080fd5b8063b9a09fd5146107d9578063c45a015514610802578063c527ee1f14610829578063d23254b41461083c57600080fd5b8063a0947d6f11610192578063a7cac84611610161578063a7cac8461461075a578063a8c5d95a1461077a578063aa79979b146107a3578063b6fe96bc146107c657600080fd5b8063a0947d6f14610719578063a5f4301e14610721578063a61c713a14610734578063a6dd93641461074757600080fd5b8063992a7933116101ce578063992a7933146106cd5780639b19251a146106e05780639b6a9d72146106f35780639f06247b1461070657600080fd5b80638dd598fb1461069457806396c82e57146106bb5780639769a38a146106c457600080fd5b8063411b1f77116102e4578063698473e3116102775780637715ee75116102465780637715ee751461063b57806379e938241461064e5780637ac09bf71461066e5780638a126be11461068157600080fd5b8063698473e3146105ef5780636b2cc75c146106025780636ecbe38a14610615578063704b6c021461062857600080fd5b806350c116b8116102b357806350c116b81461059e57806353d78693146105c157806363453ae1146105c9578063666256aa146105dc57600080fd5b8063411b1f771461055d578063462d0b2e1461057057806347b3c6ba14610583578063485fdb4a1461058b57600080fd5b8063264deaf81161035c5780633af32abf1161032b5780633af32abf146104d95780633c6b16ab146104fc5780633e504f7d1461050f578063402914f51461053d57600080fd5b8063264deaf81461049857806326782247146104a0578063310bd74b146104b357806332145f90146104c657600080fd5b80630e18b681116103985780630e18b6811461042b5780631937e58f146104355780631f7b6d321461047357806320b1cb6f1461048557600080fd5b806306d6a1b2146103bf57806307546172146104055780630d52333c14610418575b600080fd5b6103e86103cd36600461398c565b6009602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546103e8906001600160a01b031681565b6000546103e8906001600160a01b031681565b61043361095e565b005b6104636104433660046139b0565b601360209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016103fc565b6007545b6040519081526020016103fc565b610433610493366004613b83565b6109b1565b610433610acd565b6003546103e8906001600160a01b031681565b6104336104c1366004613be7565b610b8a565b6104336104d4366004613be7565b610cda565b6104636104e736600461398c565b60126020526000908152604090205460ff1681565b61043361050a366004613be7565b610ed1565b61046361051d3660046139b0565b601460209081526000928352604080842090915290825290205460ff1681565b61047761054b36600461398c565b60156020526000908152604090205481565b61043361056b366004613c00565b610fa4565b61043361057e366004613c25565b611097565b610433611120565b610433610599366004613c7a565b611131565b6104636105ac36600461398c565b60106020526000908152604090205460ff1681565b6104336111c5565b6104336105d736600461398c565b6111d4565b6104336105ea366004613cc5565b611447565b6104336105fd366004613c00565b611611565b61043361061036600461398c565b611704565b61043361062336600461398c565b611810565b61043361063636600461398c565b61181c565b610433610649366004613cc5565b6118b0565b61047761065c366004613be7565b600e6020526000908152604090205481565b61043361067c366004613d7e565b611a78565b61043361068f366004613c7a565b611ca9565b6103e87f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334281565b61047760065481565b61047760045481565b6104336106db36600461398c565b611d3d565b6104336106ee36600461398c565b611e5e565b610433610701366004613df8565b611efb565b61043361071436600461398c565b611f3d565b61043361204c565b6103e861072f36600461398c565b612166565b610433610742366004613e1a565b6127a1565b610433610755366004613be7565b612809565b61047761076836600461398c565b600b6020526000908152604090205481565b6103e861078836600461398c565b600a602052600090815260409020546001600160a01b031681565b6104636107b136600461398c565b600f6020526000908152604090205460ff1681565b6104336107d4366004613e52565b6128bd565b6103e86107e736600461398c565b6008602052600090815260409020546001600160a01b031681565b6103e87f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf782481565b610433610837366004613e80565b612942565b61047761084a366004613c00565b600c60209081526000928352604080842090915290825290205481565b610433610875366004613e80565b612a47565b610433610888366004613df8565b612a7d565b6103e861089b366004613df8565b612bd1565b6104336108ae366004613e1a565b612c09565b6104336108c1366004613e80565b612c68565b6103e87f000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e81565b6104336108fb366004613e80565b612ceb565b61046361090e36600461398c565b60116020526000908152604090205460ff1681565b6005546104639060ff1681565b610433612e28565b6002546103e8906001600160a01b031681565b6103e8610959366004613be7565b612ee4565b6003546001600160a01b0316331461097557600080fd5b600354600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60005b8251811015610ac8578281815181106109cf576109cf613ebd565b60200260200101516001600160a01b03166331279d3d338484815181106109f8576109f8613ebd565b60200260200101516040518363ffffffff1660e01b8152600401610a1d929190613f31565b600060405180830381600087803b158015610a3757600080fd5b505af1925050508015610a48575060015b610ac057828181518110610a5e57610a5e613ebd565b60200260200101516001600160a01b03167f64b5ca626ed4122d05be46c898b7520ff5a9a24880a4ebe983ae30b0e0aa82bf838381518110610aa257610aa2613ebd565b6020026020010151604051610ab79190613f53565b60405180910390a25b6001016109b4565b505050565b6002546001600160a01b03163314610b2c5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e00000000000000000000000000000060448201526064015b60405180910390fd5b60055460ff16610b7e5760405162461bcd60e51b815260206004820152601860248201527f5065726d697373696f6e204d6f64652044697361626c656400000000000000006044820152606401610b23565b6005805460ff19169055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015610c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c329190613f66565b610c3b57600080fd5b610c4481612f0e565b6040517fc1f0fb9f000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b5050505050565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015610d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d829190613f66565b610d8b57600080fd5b6000818152600d6020908152604080832080548251818502810185019093528083529192909190830182828015610deb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610dcd575b5050505050905060008151905060008167ffffffffffffffff811115610e1357610e136139e9565b604051908082528060200260200182016040528015610e3c578160200160208202803683370190505b50905060005b82811015610ebf57600c60008681526020019081526020016000206000858381518110610e7157610e71613ebd565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610eac57610eac613ebd565b6020908102919091010152600101610e42565b50610ecb8484836131ed565b50505050565b610efd7f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c133308461369f565b600654600090610f1583670de0b6b3a7640000613fb2565b610f1f9190613fcf565b90508015610f3f578060166000828254610f39919061400a565b90915550505b6040518281526001600160a01b037f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b336000908152600f602052604090205460ff16610fc057600080fd5b811561105a576040517f986b7d8a000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290602001610f98565b6001546001600160a01b031633146110ae57600080fd5b60005b82518110156110e4576110dc8382815181106110cf576110cf613ebd565b60200260200101516137bd565b6001016110b1565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b60075461112f90600090612a7d565b565b6002546001600160a01b0316331461118b5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03928316600090815260136020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60075461112f90600090611efb565b6018546001146111e357600080fd5b6002601855600154604080517fed29fc1100000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561124d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611271919061401d565b5061127b81613830565b6001600160a01b03818116600081815260156020526040908190205490517f99bcc0520000000000000000000000000000000000000000000000000000000081527f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19093166004840152916399bcc05290602401602060405180830381865afa15801561130c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611330919061401d565b8111801561134a5750600061134862093a8083613fcf565b115b1561143e576001600160a01b0382811660008181526015602052604080822091909155517fb66503cf0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156113e557600080fd5b505af11580156113f9573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601855565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa1580156114cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ef9190613f66565b6114f857600080fd5b60005b8351811015610ecb5783818151811061151657611516613ebd565b60200260200101516001600160a01b031663a7852afa8385848151811061153f5761153f613ebd565b60200260200101516040518363ffffffff1660e01b8152600401611564929190614036565b600060405180830381600087803b15801561157e57600080fd5b505af192505050801561158f575060015b611609578381815181106115a5576115a5613ebd565b60200260200101516001600160a01b03167f3d29a870fa2d124f14984f98a1df8bcd683e624184195c2a63697d6200266f3e838584815181106115ea576115ea613ebd565b6020026020010151604051611600929190614036565b60405180910390a25b6001016114fb565b336000908152600f602052604090205460ff1661162d57600080fd5b81156116c7576040517ffbd3a29d000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063fbd3a29d90602401600060405180830381600087803b1580156116ae57600080fd5b505af11580156116c2573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90602001610f98565b6002546001600160a01b0316331461175e5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03811660009081526012602052604090205460ff166117c65760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b23565b6001600160a01b038116600081815260126020526040808220805460ff191690555133917f60a9f9ee3d1d62847472dc6b066eb0548a70c14f0ba4715be1c5bcdbd9b4462591a350565b61181981613830565b50565b6002546001600160a01b031633146118765760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119589190613f66565b61196157600080fd5b60005b8351811015610ecb5783818151811061197f5761197f613ebd565b60200260200101516001600160a01b031663a7852afa838584815181106119a8576119a8613ebd565b60200260200101516040518363ffffffff1660e01b81526004016119cd929190614036565b600060405180830381600087803b1580156119e757600080fd5b505af19250505080156119f8575060015b611a7057838181518110611a0e57611a0e613ebd565b60200260200101516001600160a01b03167f707c40b300e86ea06afe070057bebf0a23f03e55ca3aa0dffb91d96d2fc89fac848381518110611a5257611a52613ebd565b6020026020010151604051611a679190613f53565b60405180910390a25b600101611964565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015611afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b209190613f66565b611b2957600080fd5b828114611b3557600080fd5b6040517ff8a05763000000000000000000000000000000000000000000000000000000008152600481018690526000907f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063f8a0576390602401602060405180830381865afa158015611bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bda919061401d565b905080611be561391b565b1115611c335760405162461bcd60e51b815260206004820152601160248201527f6c6f636b206578706972657320736f6f6e0000000000000000000000000000006044820152606401610b23565b611ca18686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506131ed92505050565b505050505050565b6002546001600160a01b03163314611d035760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03928316600090815260146020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6002546001600160a01b03163314611d975760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03811660009081526010602052604090205460ff16611dff5760405162461bcd60e51b815260206004820152601160248201527f6761756765206973206e6f74206c6976650000000000000000000000000000006044820152606401610b23565b611e08816111d4565b6001600160a01b0381166000818152601060209081526040808320805460ff191690556015909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b60055460ff1615611ec3576002546001600160a01b03163314611ec35760405162461bcd60e51b815260206004820152601960248201527f5065726d697373696f6e204d6f646520497320416374697665000000000000006044820152606401610b23565b611ef27f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c133600060045461369f565b611819816137bd565b815b81811015610ac857611f3560078281548110611f1b57611f1b613ebd565b6000918252602090912001546001600160a01b0316613830565b600101611efd565b6002546001600160a01b03163314611f975760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03811660009081526010602052604090205460ff16156120005760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b23565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b60005b600754811015611819576007818154811061206c5761206c613ebd565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1925050508015612102575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526120ff9181019061404f565b60015b61215b576007818154811061211957612119613ebd565b60009182526020822001546040516001600160a01b03909116917f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb91a261215e565b50505b60010161204f565b6001600160a01b03818116600090815260086020526040812054909116156121d05760405162461bcd60e51b815260206004820152600660248201527f65786973747300000000000000000000000000000000000000000000000000006044820152606401610b23565b6040517fe5e31b130000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824169063e5e31b1390602401602060405180830381865afa15801561224f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122739190613f66565b6122bf5760405162461bcd60e51b815260206004820152600560248201527f21706169720000000000000000000000000000000000000000000000000000006044820152606401610b23565b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af1158015612301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123259190614073565b6001600160a01b038216600090815260126020526040902054919350915060ff16801561236a57506001600160a01b03811660009081526012602052604090205460ff165b6123b65760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b23565b60007f000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e6001600160a01b031663d27b9a786040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243c91906140a2565b600080546040517f1c48e0fa0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015280851660248301527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33428116604483015293945091921690631c48e0fa906064016020604051808303816000875af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f991906140a2565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301529192507f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19091169063095ea7b3906044016020604051808303816000875af11580156125a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c99190613f66565b506001600160a01b038181166000818152600a6020908152604080832080548887167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092558c8716808652600885528386208054831688179055958552600984528285208054909116909517909455600f8252808320805460ff199081166001908117909255601084528285208054821683179055601384528285208b881680875290855283862080548316841790558a881680875284872080548416851790557f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19098168652838620805483168417905595855260148452828520958552949092528083208054851683179055938252929020805490911690911790556126f681613830565b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560405133815288831692851691907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a495945050505050565b336000908152600f602052604090205460ff166127bd57600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b3360009081526011602052604090205460ff166128685760405162461bcd60e51b815260206004820152601760248201527f566f7465723a206f6e6c7920666565206d616e616765720000000000000000006044820152606401610b23565b600081116128b85760405162461bcd60e51b815260206004820152601d60248201527f466565206d7573742062652067726561746572207468616e207a65726f0000006044820152606401610b23565b600455565b6002546001600160a01b031633146129175760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60005b8151811015612a435781818151811061296057612960613ebd565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af19250505080156129e0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526129dd9181019061404f565b60015b612a38578181815181106129f6576129f6613ebd565b60200260200101516001600160a01b03167f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb60405160405180910390a2612a3b565b50505b600101612945565b5050565b60005b8151811015612a4357612a75828281518110612a6857612a68613ebd565b6020026020010151613830565b600101612a4a565b815b81811015610ac857306001600160a01b03166363453ae160078381548110612aa957612aa9613ebd565b60009182526020909120015460405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039091166004820152602401600060405180830381600087803b158015612b0e57600080fd5b505af1925050508015612b1f575060015b612b785760078181548110612b3657612b36613ebd565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612bc9565b60078181548110612b8b57612b8b613ebd565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612a7f565b600d6020528160005260406000208181548110612bed57600080fd5b6000918252602090912001546001600160a01b03169150829050565b336000908152600f602052604090205460ff16612c2557600080fd5b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56791016127fc565b6002546001600160a01b03163314612cc25760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b60005b8151811015612a4357612ce38282815181106110cf576110cf613ebd565b600101612cc5565b60005b8151811015612a4357306001600160a01b03166363453ae1838381518110612d1857612d18613ebd565b60200260200101516040518263ffffffff1660e01b8152600401612d4b91906001600160a01b0391909116815260200190565b600060405180830381600087803b158015612d6557600080fd5b505af1925050508015612d76575060015b612dcf5760078181548110612d8d57612d8d613ebd565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612e20565b60078181548110612de257612de2613ebd565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612cee565b6002546001600160a01b03163314612e825760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b23565b60055460ff1615612ed55760405162461bcd60e51b815260206004820152601760248201527f5065726d697373696f6e204d6f646520456e61626c65640000000000000000006044820152606401610b23565b6005805460ff19166001179055565b60078181548110612ef457600080fd5b6000918252602090912001546001600160a01b0316905081565b6040517fc26defcd000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063c26defcd90602401602060405180830381865afa158015612f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb09190613f66565b612ffc5760405162461bcd60e51b815260206004820152600c60248201527f566f7465204c6f636b65642100000000000000000000000000000000000000006044820152606401610b23565b6000818152600d6020526040812080549091805b828110156131b157600084828154811061302c5761302c613ebd565b6000918252602080832090910154888352600c825260408084206001600160a01b039092168085529190925291205490915080156131a75761306d82613830565b6001600160a01b0382166000908152600b6020526040812080548392906130959084906140bf565b90915550506000878152600c602090815260408083206001600160a01b0386168452909152812080548392906130cc9084906140bf565b90915550506001600160a01b038281166000908152600a6020526040908190205490517f9e2bf22c00000000000000000000000000000000000000000000000000000000815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561314657600080fd5b505af115801561315a573d6000803e3d6000fd5b50505050808461316a919061400a565b60408051898152602081018490529195507fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b5050600101613010565b5080600660008282546131c491906140bf565b90915550506000848152600e60209081526040808320839055600d9091528120610ecb91613945565b6131f683612f0e565b6040517f67279054000000000000000000000000000000000000000000000000000000008152600481018490527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b031690636727905490602401600060405180830381600087803b15801561327157600080fd5b505af1158015613285573d6000803e3d6000fd5b505083516040517fe7e242d400000000000000000000000000000000000000000000000000000000815260048101879052909250600091507f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063e7e242d490602401602060405180830381865afa15801561330e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613332919061401d565b90506000806000805b858110156133725786818151811061335557613355613ebd565b602002602001015184613368919061400a565b935060010161333b565b5060005b858110156135d257600088828151811061339257613392613ebd565b6020908102919091018101516001600160a01b0381166000908152600f90925260409091205490915060ff16156135c957600085878a85815181106133d9576133d9613ebd565b60200260200101516133eb9190613fb2565b6133f59190613fcf565b60008c8152600c602090815260408083206001600160a01b03871684529091529020549091501561342557600080fd5b8060000361343257600080fd5b61343b82613830565b60008b8152600d6020908152604080832080546001810182559084528284200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387169081179091558352600b909152812080548392906134a890849061400a565b909155505060008b8152600c602090815260408083206001600160a01b0386168452909152812080548392906134df90849061400a565b90915550506001600160a01b038281166000908152600a6020526040908190205490517ff320772300000000000000000000000000000000000000000000000000000000815260048101849052602481018e905291169063f320772390604401600060405180830381600087803b15801561355957600080fd5b505af115801561356d573d6000803e3d6000fd5b50505050808461357d919061400a565b9350613589818661400a565b604080518d81526020810184905291965033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b50600101613376565b50801561366d576040517ffd4a77f1000000000000000000000000000000000000000000000000000000008152600481018990527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063fd4a77f190602401600060405180830381600087803b15801561365457600080fd5b505af1158015613668573d6000803e3d6000fd5b505050505b816006600082825461367f919061400a565b90915550506000978852600e602052604090972096909655505050505050565b6000846001600160a01b03163b116136b657600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161374891906140d2565b6000604051808303816000865af19150503d8060008114613785576040519150601f19603f3d011682016040523d82523d6000602084013e61378a565b606091505b50915091508180156137b45750805115806137b45750808060200190518101906137b49190613f66565b611ca157600080fd5b6001600160a01b03811660009081526012602052604090205460ff16156137e357600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b0381166000908152600b602052604090205480156138fb576001600160a01b03821660009081526017602052604081208054601654918290559161387b83836140bf565b90508015610cd3576000670de0b6b3a76400006138988387613fb2565b6138a29190613fcf565b6001600160a01b03871660009081526010602052604090205490915060ff1615611ca1576001600160a01b038616600090815260156020526040812080548392906138ee90849061400a565b9091555050505050505050565b6016546001600160a01b0383166000908152601760205260409020555050565b600062093a808061392c814261400a565b6139369190613fcf565b6139409190613fb2565b905090565b508054600082559060005260206000209081019061181991905b80821115613973576000815560010161395f565b5090565b6001600160a01b038116811461181957600080fd5b60006020828403121561399e57600080fd5b81356139a981613977565b9392505050565b600080604083850312156139c357600080fd5b82356139ce81613977565b915060208301356139de81613977565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5f57613a5f6139e9565b604052919050565b600067ffffffffffffffff821115613a8157613a816139e9565b5060051b60200190565b600082601f830112613a9c57600080fd5b81356020613ab1613aac83613a67565b613a18565b8083825260208201915060208460051b870101935086841115613ad357600080fd5b602086015b84811015613af8578035613aeb81613977565b8352918301918301613ad8565b509695505050505050565b600082601f830112613b1457600080fd5b81356020613b24613aac83613a67565b82815260059290921b84018101918181019086841115613b4357600080fd5b8286015b84811015613af857803567ffffffffffffffff811115613b675760008081fd5b613b758986838b0101613a8b565b845250918301918301613b47565b60008060408385031215613b9657600080fd5b823567ffffffffffffffff80821115613bae57600080fd5b613bba86838701613a8b565b93506020850135915080821115613bd057600080fd5b50613bdd85828601613b03565b9150509250929050565b600060208284031215613bf957600080fd5b5035919050565b60008060408385031215613c1357600080fd5b8235915060208301356139de81613977565b60008060408385031215613c3857600080fd5b823567ffffffffffffffff811115613c4f57600080fd5b613c5b85828601613a8b565b92505060208301356139de81613977565b801515811461181957600080fd5b600080600060608486031215613c8f57600080fd5b8335613c9a81613977565b92506020840135613caa81613977565b91506040840135613cba81613c6c565b809150509250925092565b600080600060608486031215613cda57600080fd5b833567ffffffffffffffff80821115613cf257600080fd5b613cfe87838801613a8b565b94506020860135915080821115613d1457600080fd5b50613d2186828701613b03565b925050604084013590509250925092565b60008083601f840112613d4457600080fd5b50813567ffffffffffffffff811115613d5c57600080fd5b6020830191508360208260051b8501011115613d7757600080fd5b9250929050565b600080600080600060608688031215613d9657600080fd5b85359450602086013567ffffffffffffffff80821115613db557600080fd5b613dc189838a01613d32565b90965094506040880135915080821115613dda57600080fd5b50613de788828901613d32565b969995985093965092949392505050565b60008060408385031215613e0b57600080fd5b50508035926020909101359150565b600080600060608486031215613e2f57600080fd5b833592506020840135613e4181613977565b929592945050506040919091013590565b60008060408385031215613e6557600080fd5b8235613e7081613977565b915060208301356139de81613c6c565b600060208284031215613e9257600080fd5b813567ffffffffffffffff811115613ea957600080fd5b613eb584828501613a8b565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151808452602080850194506020840160005b83811015613f265781516001600160a01b031687529582019590820190600101613f01565b509495945050505050565b6001600160a01b0383168152604060208201526000613eb56040830184613eec565b6020815260006139a96020830184613eec565b600060208284031215613f7857600080fd5b81516139a981613c6c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417613fc957613fc9613f83565b92915050565b600082614005577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115613fc957613fc9613f83565b60006020828403121561402f57600080fd5b5051919050565b828152604060208201526000613eb56040830184613eec565b6000806040838503121561406257600080fd5b505080516020909101519092909150565b6000806040838503121561408657600080fd5b825161409181613977565b60208401519092506139de81613977565b6000602082840312156140b457600080fd5b81516139a981613977565b81810381811115613fc957613fc9613f83565b6000825160005b818110156140f357602081860181015185830152016140d9565b50600092019182525091905056fea264697066735822122034131d742feb0f540a65e1dfaab7b14e5ce4938871fad426b4be50ee58e6556a64736f6c63430008160033
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
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.