S Price: $0.569307 (-4.10%)

Contract

0x0B1481fE6Fd74a6449064163604d712DFf9bc6DD

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Gauge51827682025-01-23 21:52:182 mins ago1737669138IN
0x0B1481fE...DFf9bc6DD
0 S0.2548009951
Create Gauge23361322025-01-03 8:26:3320 days ago1735892793IN
0x0B1481fE...DFf9bc6DD
0 S0.005553561.1
Whitelist Batch22072682025-01-01 23:43:2821 days ago1735775008IN
0x0B1481fE...DFf9bc6DD
0 S0.000107731.1
Initialize22069072025-01-01 23:38:3021 days ago1735774710IN
0x0B1481fE...DFf9bc6DD
0 S0.000084641.1

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Voter

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 10000 runs

Other Settings:
paris EvmVersion
File 1 of 11 : Voter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {IVotingEscrow} from "./interfaces/IVotingEscrow.sol";
import {IPairFactory} from "./interfaces/IPairFactory.sol";
import {IPair} from "./interfaces/IPair.sol";
import {IGaugeFactory} from "./interfaces/IGaugeFactory.sol";
import {IBribeFactory} from "./interfaces/IBribeFactory.sol";
import {IGauge} from "./interfaces/IGauge.sol";
import {IBribe} from "./interfaces/IBribe.sol";
import {IMinter} from "./interfaces/IMinter.sol";

contract Voter {

    address public immutable _ve; // the ve token that governs these contracts
    address public immutable factory; // the BaseV1Factory
    address internal immutable base;
    address public gaugeFactory;
    address public immutable bribeFactory;
    uint internal constant DURATION = 7 days; // rewards are released over 7 days
    address public minter;
    address public admin;
    address public pendingAdmin;
    uint256 public whitelistingFee;
    bool public permissionMode;

    uint public totalWeight; // total voting weight

    address[] public allGauges; // all gauges viable for incentives
    mapping(address => address) public gauges; // pair => maturity => gauge
    mapping(address => address) public poolForGauge; // gauge => pool
    mapping(address => address) public bribes; // gauge => bribe
    mapping(address => uint256) public weights; // gauge => weight
    mapping(uint => mapping(address => uint256)) public votes; // nft => gauge => votes
    mapping(uint => address[]) public gaugeVote; // nft => gauge
    mapping(uint => uint) public usedWeights;  // nft => total voting weight of user
    mapping(address => bool) public isGauge;
    mapping(address => bool) public isLive; // gauge => status (live or not)
    mapping(address => bool) public feeManagers;

    mapping(address => bool) public isWhitelisted;
    mapping(address => mapping(address => bool)) public isReward;
    mapping(address => mapping(address => bool)) public isBribe;


    mapping(address => uint) public claimable;
    uint internal index;
    mapping(address => uint) internal supplyIndex;

    event GaugeCreated(address indexed gauge, address creator, address indexed bribe, address indexed pair);
    event Voted(address indexed voter, uint tokenId, uint256 weight);
    event Abstained(uint tokenId, uint256 weight);
    event Deposit(address indexed lp, address indexed gauge, uint tokenId, uint amount);
    event Withdraw(address indexed lp, address indexed gauge, uint tokenId, uint amount);
    event NotifyReward(address indexed sender, address indexed reward, uint amount);
    event DistributeReward(address indexed sender, address indexed gauge, uint amount);
    event Attach(address indexed owner, address indexed gauge, uint tokenId);
    event Detach(address indexed owner, address indexed gauge, uint tokenId);
    event Whitelisted(address indexed whitelister, address indexed token);
    event Delisted(address indexed delister, address indexed token);
    event GaugeKilled(address indexed gauge);
    event GaugeRemoved(address indexed gauge, address indexed bribe, address indexed pair);
    event GaugeRevived(address indexed gauge);
    event GaugeNotProcessed(address indexed gauge);
    event GaugeProcessed(address indexed gauge);
    event ErrorClaimingGaugeRewards(address indexed gauge, address[] tokens);
    event ErrorClaimingBribeRewards(address indexed bribe, address[] tokens);
    event ErrorClaimingGaugeFees(address indexed gauge);
    event ErrorClaimingBribeFees(address indexed bribe, uint tokenId, address[] tokens);

    modifier onlyAdmin() {
        require(msg.sender == admin, "Voter: only admin");
        _;
    }
    
    /// @dev Only calls from the enabled fee managers are accepted.
    modifier onlyFeeManagers() 
    {
        require(feeManagers[msg.sender], 'Voter: only fee manager');
        _;
    }
    
    modifier checkPermissionMode() {
        if(permissionMode) {
            require(msg.sender == admin, "Permission Mode Is Active");
        }
        _;
    }

    constructor(address __ve, address _factory, address  _gauges, address _bribes) {
        require(
            __ve != address(0) &&
            _factory != address(0) &&
            _gauges != address(0) &&
            _bribes != address(0),
            "Voter: zero address provided in constructor"
        );
        _ve = __ve;
        factory = _factory;
        base = IVotingEscrow(__ve).token();
        gaugeFactory = _gauges;
        bribeFactory = _bribes;
        minter = msg.sender;
        admin = msg.sender;
        permissionMode = false;
        whitelistingFee = 160000e18;
        
        feeManagers[msg.sender] = true;
        feeManagers[0x0c5D52630c982aE81b78AB2954Ddc9EC2797bB9c] = true;
        feeManagers[0x726461FA6e788bd8a79986D36F1992368A3e56eA] = true;
    }

    // simple re-entrancy check
    uint internal _unlocked = 1;
    modifier lock() {
        require(_unlocked == 1);
        _unlocked = 2;
        _;
        _unlocked = 1;
    }

    function initialize(address[] memory _tokens, address _minter) external {
        require(msg.sender == minter);
        for (uint i = 0; i < _tokens.length; i++) {
            _whitelist(_tokens[i]);
        }
        
        minter = _minter;
    }

    function setAdmin(address _admin) external onlyAdmin {
        pendingAdmin = _admin;
    }

    function acceptAdmin() external {
        require(msg.sender == pendingAdmin);
        admin = pendingAdmin;
    }
    
    function enablePermissionMode() external onlyAdmin {
        require(!permissionMode, "Permission Mode Enabled");
        permissionMode = true;
    }

    function disablePermissionMode() external onlyAdmin {
        require(permissionMode, "Permission Mode Disabled");
        permissionMode = false;
    }
    
    function manageFeeManager(address feeManager, bool _value) external onlyAdmin
    {
        feeManagers[feeManager] = _value;
    }

    function setReward(address _gauge, address _token, bool _status) external onlyAdmin {
        isReward[_gauge][_token] = _status;
    }

    function setBribe(address _bribe, address _token, bool _status) external onlyAdmin {
        isBribe[_bribe][_token] = _status;
    }
    
    function setWhitelistingFee(uint256 _fee) external onlyFeeManagers {
        require(_fee > 0, 'Fee must be greater than zero');
        whitelistingFee = _fee;
    }

    function killGauge(address _gauge) external onlyAdmin {
        require(isLive[_gauge], "gauge is not live");
        distribute(_gauge);
        isLive[_gauge] = false;
        claimable[_gauge] = 0;
        emit GaugeKilled(_gauge);
    }

    function reviveGauge(address _gauge) external onlyAdmin {
        require(!isLive[_gauge], "gauge is live");
        isLive[_gauge] = true;
        emit GaugeRevived(_gauge);
    }
    
    function removeGauge(address _gauge) external onlyAdmin {
        require(!isLive[_gauge], "gauge is live");
        address pair = poolForGauge[_gauge];
        require(IPairFactory(factory).isPair(pair), "pair does not exist");
        (address tokenA, address tokenB) = IPair(pair).tokens();
        require(gauges[pair] != address(0x0), "gauge does not exist");
        address bribe = bribes[_gauge];
        gauges[pair] = address(0x0);
        poolForGauge[_gauge] = address(0x0);
        bribes[_gauge] = address(0x0);
        isReward[_gauge][tokenA] = false;
        isReward[_gauge][tokenB] = false;
        isReward[_gauge][base] = false;
        isBribe[bribe][tokenA] = false;
        isBribe[bribe][tokenB] = false;
        isGauge[_gauge] = false;
        emit GaugeRemoved(_gauge, bribe, pair);
    }

    function reset(uint _tokenId) external {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId));
        _reset(_tokenId);
        IVotingEscrow(_ve).abstain(_tokenId);
    }

    function _reset(uint _tokenId) internal {
        require(IVotingEscrow(_ve).isVoteExpired(_tokenId),"Vote Locked!");
        address[] storage _gaugeVote = gaugeVote[_tokenId];
        uint _gaugeVoteCnt = _gaugeVote.length;
        uint256 _totalWeight = 0;

        for (uint i = 0; i < _gaugeVoteCnt; i++) {
            address _gauge = _gaugeVote[i];
            uint256 _votes = votes[_tokenId][_gauge];
            if (_votes != 0) {
                _updateFor(_gauge);
                weights[_gauge] -= _votes;
                votes[_tokenId][_gauge] -= _votes;
                IBribe(bribes[_gauge])._withdraw(uint256(_votes), _tokenId);
                _totalWeight += _votes;
                emit Abstained(_tokenId, _votes);
            }
        }
        totalWeight -= uint256(_totalWeight);
        usedWeights[_tokenId] = 0;
        delete gaugeVote[_tokenId];
    }

    function poke(uint _tokenId) external {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId));
        address[] memory _gaugeVote = gaugeVote[_tokenId];
        uint _gaugeCnt = _gaugeVote.length;
        uint256[] memory _weights = new uint256[](_gaugeCnt);

        for (uint i = 0; i < _gaugeCnt; i++) {
            _weights[i] = votes[_tokenId][_gaugeVote[i]];
        }

        _vote(_tokenId, _gaugeVote, _weights);
    }

    function _vote(uint _tokenId, address[] memory _gaugeVote, uint256[] memory _weights) internal {
        _reset(_tokenId);
        // Lock vote for 1 WEEK
        IVotingEscrow(_ve).lockVote(_tokenId);
        uint _gaugeCnt = _gaugeVote.length;
        uint256 _weight = IVotingEscrow(_ve).balanceOfNFT(_tokenId);
        uint256 _totalVoteWeight = 0;
        uint256 _totalWeight = 0;
        uint256 _usedWeight = 0;

        for (uint i = 0; i < _gaugeCnt; i++) {
            _totalVoteWeight += _weights[i];
        }

        for (uint i = 0; i < _gaugeCnt; i++) {
            address _gauge = _gaugeVote[i];
            if (isGauge[_gauge]) {
                uint256 _gaugeWeight = _weights[i] * _weight / _totalVoteWeight;
                require(votes[_tokenId][_gauge] == 0);
                require(_gaugeWeight != 0);
                _updateFor(_gauge);

                gaugeVote[_tokenId].push(_gauge);

                weights[_gauge] += _gaugeWeight;
                votes[_tokenId][_gauge] += _gaugeWeight;
                IBribe(bribes[_gauge])._deposit(_gaugeWeight, _tokenId);
                _usedWeight += _gaugeWeight;
                _totalWeight += _gaugeWeight;
                emit Voted(msg.sender, _tokenId, _gaugeWeight);
            }
        }
        if (_usedWeight > 0) IVotingEscrow(_ve).voting(_tokenId);
        totalWeight += _totalWeight;
        usedWeights[_tokenId] = _usedWeight;
    }

    // @param _tokenId The id of the veNFT to vote with
    // @param _gaugeVote The list of gauges to vote for
    // @param _weights The list of weights to vote for each gauge
    // @notice the sum of weights is the total weight of the veNFT at max
    function vote(uint tokenId, address[] calldata _gaugeVote, uint256[] calldata _weights) external {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId));
        require(_gaugeVote.length == _weights.length);
        uint _lockEnd = IVotingEscrow(_ve).locked__end(tokenId);
        require(_nextPeriod() <= _lockEnd, "lock expires soon");
        _vote(tokenId, _gaugeVote, _weights);
    }

    function whitelist(address _token) public checkPermissionMode {
        _safeTransferFrom(base, msg.sender, address(0), whitelistingFee);
        _whitelist(_token);
    }
    
    function whitelistBatch(address[] memory _tokens) external onlyAdmin {
        for (uint i = 0; i < _tokens.length; i++) {
            _whitelist(_tokens[i]);
        }
    }

    function _whitelist(address _token) internal {
        require(!isWhitelisted[_token]);
        isWhitelisted[_token] = true;
        emit Whitelisted(msg.sender, _token);
    }
    
    function delist(address _token) public onlyAdmin {
        require(isWhitelisted[_token], "!whitelisted");
        isWhitelisted[_token] = false;
        emit Delisted(msg.sender, _token);
    }

    function createGauge(address _pair) external returns (address) {
        require(gauges[_pair] == address(0x0), "exists");
        require(IPairFactory(factory).isPair(_pair), "!pair");
        (address _tokenA, address _tokenB) = IPair(_pair).tokens();
        require(isWhitelisted[_tokenA] && isWhitelisted[_tokenB], "!whitelisted");
        address _bribe = IBribeFactory(bribeFactory).createBribe();
        address _gauge = IGaugeFactory(gaugeFactory).createGauge(_pair, _bribe, _ve);
        IERC20(base).approve(_gauge, type(uint).max);
        bribes[_gauge] = _bribe;
        gauges[_pair] = _gauge;
        poolForGauge[_gauge] = _pair;
        isGauge[_gauge] = true;
        isLive[_gauge] = true;
        isReward[_gauge][_tokenA] = true;
        isReward[_gauge][_tokenB] = true;
        isReward[_gauge][base] = true;
        isBribe[_bribe][_tokenA] = true;
        isBribe[_bribe][_tokenB] = true;
        _updateFor(_gauge);
        allGauges.push(_gauge);
        emit GaugeCreated(_gauge, msg.sender, _bribe, _pair);
        return _gauge;
    }

    function attachTokenToGauge(uint tokenId, address account) external {
        require(isGauge[msg.sender]);
        if (tokenId > 0) IVotingEscrow(_ve).attach(tokenId);
        emit Attach(account, msg.sender, tokenId);
    }

    function emitDeposit(uint tokenId, address account, uint amount) external {
        require(isGauge[msg.sender]);
        emit Deposit(account, msg.sender, tokenId, amount);
    }

    function detachTokenFromGauge(uint tokenId, address account) external {
        require(isGauge[msg.sender]);
        if (tokenId > 0) IVotingEscrow(_ve).detach(tokenId);
        emit Detach(account, msg.sender, tokenId);
    }

    function emitWithdraw(uint tokenId, address account, uint amount) external {
        require(isGauge[msg.sender]);
        emit Withdraw(account, msg.sender, tokenId, amount);
    }

    function length() external view returns (uint) {
        return allGauges.length;
    }

    // @notice called by Minter contract to distribute weekly rewards
    // @param _amount the amount of tokens distributed
    function notifyRewardAmount(uint amount) external {
        _safeTransferFrom(base, msg.sender, address(this), amount); // transfer the distro in
        uint256 _ratio = amount * 1e18 / totalWeight; // 1e18 adjustment is removed during claim
        if (_ratio > 0) {
            index += _ratio;
        }
        emit NotifyReward(msg.sender, base, amount);
    }

    function updateFor(address[] memory _gauges) external {
        for (uint i = 0; i < _gauges.length; i++) {
            _updateFor(_gauges[i]);
        }
    }

    function updateForRange(uint start, uint end) public {
        for (uint i = start; i < end; i++) {
            _updateFor(allGauges[i]);
        }
    }

    function updateAll() external {
        updateForRange(0, allGauges.length);
    }

    // @notice update a gauge eligibility for rewards to the current index
    // @param _gauge the gauge to update
    function updateGauge(address _gauge) external {
        _updateFor(_gauge);
    }

    function _updateFor(address _gauge) internal {
        uint256 _supplied = weights[_gauge];
        if (_supplied > 0) {
            uint _supplyIndex = supplyIndex[_gauge];
            uint _index = index; // get global index0 for accumulated distro
            supplyIndex[_gauge] = _index; // update _gauge current position to global position
            uint _delta = _index - _supplyIndex; // see if there is any difference that need to be accrued
            if (_delta > 0) {
                uint _share = uint(_supplied) * _delta / 1e18; // add accrued difference for each supplied token
                if (isLive[_gauge]) {
                    claimable[_gauge] += _share;
                }
            }
        } else {
            supplyIndex[_gauge] = index; // new users are set to the default global state
        }
    }

    // @notice allow a gauge depositor to claim earned rewards if any
    // @param _gauges list of gauges contracts to claim rewards on
    // @param _tokens list of  tokens to claim
    function claimRewards(address[] memory _gauges, address[][] memory _tokens) external {
        for (uint i = 0; i < _gauges.length; i++) {
            try IGauge(_gauges[i]).getReward(msg.sender, _tokens[i]) {
                
            } catch {
                emit ErrorClaimingGaugeRewards(_gauges[i], _tokens[i]);
            }
        }
    }

    // @notice allow a voter to claim earned bribes if any
    // @param _bribes list of bribes contracts to claims bribes on
    // @param _tokens list of the tokens to claim
    // @param _tokenId the ID of veNFT to claim bribes for
    function claimBribes(address[] memory _bribes, address[][] memory _tokens, uint _tokenId) external {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId));
        for (uint i = 0; i < _bribes.length; i++) {
            try IBribe(_bribes[i]).getRewardForOwner(_tokenId, _tokens[i]) {
                
            } catch {
                emit ErrorClaimingBribeRewards(_bribes[i], _tokens[i]);
            }
        }
    }

    // @notice allow voter to claim earned fees
    // @param _fees list of bribes contracts to claim fees on
    // @param _tokens list of the tokens to claim
    // @param _tokenId the ID of veNFT to claim fees for
    function claimFees(address[] memory _fees, address[][] memory _tokens, uint _tokenId) external {
        require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, _tokenId));
        for (uint i = 0; i < _fees.length; i++) {
            try IBribe(_fees[i]).getRewardForOwner(_tokenId, _tokens[i]) {
                
            } catch {
                emit ErrorClaimingBribeFees(_fees[i], _tokenId, _tokens[i]);
            }
        }
    }

    // @notice distribute earned fees to the bribe contract for a given gauge
    // @param _gauges the gauges to distribute fees for
    function distributeFees(address[] memory _gauges) external {
        for (uint i = 0; i < _gauges.length; i++) {
            try IGauge(_gauges[i]).claimFees() {
                
            } catch {
                emit ErrorClaimingGaugeFees(_gauges[i]);
            }
        }
    }

    // @notice distribute earned fees to the bribe contract for all gauges
    function distroFees() external {
        for (uint i = 0; i < allGauges.length; i++) {
            try IGauge(allGauges[i]).claimFees() {
                
            } catch {
                emit ErrorClaimingGaugeFees(allGauges[i]);
            }
        }
    }

    // @notice distribute fair share of rewards to a gauge
    // @param _gauge the gauge to distribute rewards to
    function distribute(address _gauge) public lock {
        IMinter(minter).update_period();
        _updateFor(_gauge);
        uint _claimable = claimable[_gauge];
        if (_claimable > IGauge(_gauge).left(base) && _claimable / DURATION > 0) {
            claimable[_gauge] = 0;
            IGauge(_gauge).notifyRewardAmount(base, _claimable);
            emit DistributeReward(msg.sender, _gauge, _claimable);
        }
    }

    function distro() external {
        distributeRange(0, allGauges.length);
    }

    function distributeRange(uint start, uint finish) public {
        for (uint x = start; x < finish; x++) {
            try this.distribute(allGauges[x]) {
                emit GaugeProcessed(allGauges[x]);
            } catch {
                emit GaugeNotProcessed(allGauges[x]);
            }
        }
    }

    function distributeGauges(address[] memory _gauges) external {
        for (uint x = 0; x < _gauges.length; x++) {
            try this.distribute(_gauges[x]) {
                emit GaugeProcessed(allGauges[x]);
            } catch {
                emit GaugeNotProcessed(allGauges[x]);
            }
        }
    }

    // @notice current active vote period
    // @return the UNIX timestamp of the beginning of the current vote period
    function _activePeriod() internal view returns (uint activePeriod) {
        activePeriod = block.timestamp / DURATION * DURATION;
    }

    // @notice next vote period
    // @return the UNIX timestamp of the beginning of the next vote period
    function _nextPeriod() internal view returns(uint nextPeriod) {
        nextPeriod = (block.timestamp + DURATION) / DURATION * DURATION;
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

File 2 of 11 : IERC20.sol
// 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);
}

File 3 of 11 : Math.sol
// 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);
        }
    }
}

File 4 of 11 : IBribe.sol
// 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);
}

File 5 of 11 : IBribeFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;

interface IBribeFactory {
    function createBribe() external returns (address);
}

File 6 of 11 : IGauge.sol
// 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);
}

File 7 of 11 : IGaugeFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;

interface IGaugeFactory {
    function createGauge(address, address, address) external returns (address);
}

File 8 of 11 : IMinter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;

interface IMinter {
    function update_period() external returns (uint);
}

File 9 of 11 : IPair.sol
// 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);
}

File 10 of 11 : IPairFactory.sol
// 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);
}

File 11 of 11 : IVotingEscrow.sol
// 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;
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_gauges","type":"address"},{"internalType":"address","name":"_bribes","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Abstained","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Attach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"Delisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Detach","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributeReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ErrorClaimingBribeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ErrorClaimingBribeRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"ErrorClaimingGaugeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ErrorClaimingGaugeRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"GaugeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeKilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeNotProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"GaugeRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"}],"name":"GaugeRevived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelister","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"Whitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allGauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"attachTokenToGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bribeFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bribes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bribes","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_fees","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"address[][]","name":"_tokens","type":"address[][]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"createGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"delist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"detachTokenFromGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePermissionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"distributeGauges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"finish","type":"uint256"}],"name":"distributeRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distroFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emitWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePermissionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeManagers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"gaugeVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gauges","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"address","name":"_minter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isBribe","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"killGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feeManager","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"manageFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permissionMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"poke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolForGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"removeGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"reviveGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bribe","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWhitelistingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"}],"name":"updateFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"updateForRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"updateGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedWeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"_gaugeVote","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"whitelistBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

61010060405260016018553480156200001757600080fd5b50604051620048ea380380620048ea8339810160408190526200003a9162000262565b6001600160a01b038416158015906200005b57506001600160a01b03831615155b80156200007057506001600160a01b03821615155b80156200008557506001600160a01b03811615155b620000ea5760405162461bcd60e51b815260206004820152602b60248201527f566f7465723a207a65726f20616464726573732070726f766964656420696e2060448201526a31b7b739ba393ab1ba37b960a91b606482015260840160405180910390fd5b6001600160a01b03808516608081905290841660a05260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa1580156200013c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001629190620002bf565b6001600160a01b0390811660c052600080549382166001600160a01b0319948516178155911660e0526001805483163390811782556002805490941681179093556005805460ff199081169091556921e19e0c9bab2400000060045592825260116020526040822080548416821790557f295a4ffdc519333d9c723410dafa910a4ea56bcd3ab227348108e92a4605a7c4805484168217905573726461fa6e788bd8a79986d36f1992368a3e56ea9091527ff3da598d0469dad60e2c05ecde0b47799d0331540e69dbeb5f95c5fce5e72c14805490921617905550620002e49050565b80516001600160a01b03811681146200025d57600080fd5b919050565b600080600080608085870312156200027957600080fd5b620002848562000245565b9350620002946020860162000245565b9250620002a46040860162000245565b9150620002b46060860162000245565b905092959194509250565b600060208284031215620002d257600080fd5b620002dd8262000245565b9392505050565b60805160a05160c05160e051614524620003c6600039600081816108e901526127a7015260008181611223015281816112c30152818161133c015281816116ab01528181611780015281816122b5015281816129470152612a7f0152600081816108250152818161100001526125f50152600081816106b701528181610bdd01528181610c9101528181610d2d015281816113e20152818161186901528181611a4f01528181611cd201528181611e9a01528181611f540152818161286d0152818161332a01528181613612015281816136ac01526139f501526145246000f3fe608060405234801561001057600080fd5b50600436106103c55760003560e01c80638a126be1116101ff578063b9a09fd51161011a578063eaa53523116100ad578063f0cf6c961161007c578063f0cf6c9614610941578063f80d61241461094e578063f851a44014610956578063fbdfe6b71461096957600080fd5b8063eaa53523146108d1578063eb4a78e0146108e4578063eded3e021461090b578063ef897f071461091e57600080fd5b8063d560b0d7116100e9578063d560b0d714610885578063d80a4d4d14610898578063dae6c831146108ab578063ea94ee44146108be57600080fd5b8063b9a09fd5146107f7578063c45a015514610820578063c527ee1f14610847578063d23254b41461085a57600080fd5b8063a0947d6f11610192578063a7cac84611610161578063a7cac84614610778578063a8c5d95a14610798578063aa79979b146107c1578063b6fe96bc146107e457600080fd5b8063a0947d6f14610737578063a5f4301e1461073f578063a61c713a14610752578063a6dd93641461076557600080fd5b8063992a7933116101ce578063992a7933146106eb5780639b19251a146106fe5780639b6a9d72146107115780639f06247b1461072457600080fd5b80638a126be11461069f5780638dd598fb146106b257806396c82e57146106d95780639769a38a146106e257600080fd5b8063402914f5116102ef578063666256aa11610282578063704b6c0211610251578063704b6c02146106465780637715ee751461065957806379e938241461066c5780637ac09bf71461068c57600080fd5b8063666256aa146105fa578063698473e31461060d5780636b2cc75c146106205780636ecbe38a1461063357600080fd5b8063485fdb4a116102be578063485fdb4a146105a957806350c116b8146105bc57806353d78693146105df57806363453ae1146105e757600080fd5b8063402914f51461055b578063411b1f771461057b578063462d0b2e1461058e57806347b3c6ba146105a157600080fd5b8063264deaf8116103675780633a045145116103365780633a045145146104e45780633af32abf146104f75780633c6b16ab1461051a5780633e504f7d1461052d57600080fd5b8063264deaf8146104a357806326782247146104ab578063310bd74b146104be57806332145f90146104d157600080fd5b80630e18b681116103a35780630e18b681146104365780631937e58f146104405780631f7b6d321461047e57806320b1cb6f1461049057600080fd5b806306d6a1b2146103ca57806307546172146104105780630d52333c14610423575b600080fd5b6103f36103d8366004613d79565b6009602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546103f3906001600160a01b031681565b6000546103f3906001600160a01b031681565b61043e61097c565b005b61046e61044e366004613d9d565b601360209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610407565b6007545b604051908152602001610407565b61043e61049e366004613f70565b6109cf565b61043e610aeb565b6003546103f3906001600160a01b031681565b61043e6104cc366004613fd4565b610ba8565b61043e6104df366004613fd4565b610cf8565b61043e6104f2366004613d79565b610eef565b61046e610505366004613d79565b60126020526000908152604090205460ff1681565b61043e610528366004613fd4565b6112be565b61046e61053b366004613d9d565b601460209081526000928352604080842090915290825290205460ff1681565b610482610569366004613d79565b60156020526000908152604090205481565b61043e610589366004613fed565b611391565b61043e61059c366004614012565b611484565b61043e61150d565b61043e6105b7366004614067565b61151e565b61046e6105ca366004613d79565b60106020526000908152604090205460ff1681565b61043e6115b2565b61043e6105f5366004613d79565b6115c1565b61043e6106083660046140b2565b611834565b61043e61061b366004613fed565b6119fe565b61043e61062e366004613d79565b611af1565b61043e610641366004613d79565b611bfd565b61043e610654366004613d79565b611c09565b61043e6106673660046140b2565b611c9d565b61048261067a366004613fd4565b600e6020526000908152604090205481565b61043e61069a36600461416b565b611e65565b61043e6106ad366004614067565b612096565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61048260065481565b61048260045481565b61043e6106f9366004613d79565b61212a565b61043e61070c366004613d79565b61224b565b61043e61071f3660046141e5565b6122e8565b61043e610732366004613d79565b61232a565b61043e612439565b6103f361074d366004613d79565b612553565b61043e610760366004614207565b612b8e565b61043e610773366004613fd4565b612bf6565b610482610786366004613d79565b600b6020526000908152604090205481565b6103f36107a6366004613d79565b600a602052600090815260409020546001600160a01b031681565b61046e6107cf366004613d79565b600f6020526000908152604090205460ff1681565b61043e6107f236600461423f565b612caa565b6103f3610805366004613d79565b6008602052600090815260409020546001600160a01b031681565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61043e61085536600461426d565b612d2f565b610482610868366004613fed565b600c60209081526000928352604080842090915290825290205481565b61043e61089336600461426d565b612e34565b61043e6108a63660046141e5565b612e6a565b6103f36108b93660046141e5565b612fbe565b61043e6108cc366004614207565b612ff6565b61043e6108df36600461426d565b613055565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61043e61091936600461426d565b6130d8565b61046e61092c366004613d79565b60116020526000908152604090205460ff1681565b60055461046e9060ff1681565b61043e613215565b6002546103f3906001600160a01b031681565b6103f3610977366004613fd4565b6132d1565b6003546001600160a01b0316331461099357600080fd5b600354600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60005b8251811015610ae6578281815181106109ed576109ed6142aa565b60200260200101516001600160a01b03166331279d3d33848481518110610a1657610a166142aa565b60200260200101516040518363ffffffff1660e01b8152600401610a3b92919061431e565b600060405180830381600087803b158015610a5557600080fd5b505af1925050508015610a66575060015b610ade57828181518110610a7c57610a7c6142aa565b60200260200101516001600160a01b03167f64b5ca626ed4122d05be46c898b7520ff5a9a24880a4ebe983ae30b0e0aa82bf838381518110610ac057610ac06142aa565b6020026020010151604051610ad59190614340565b60405180910390a25b6001016109d2565b505050565b6002546001600160a01b03163314610b4a5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e00000000000000000000000000000060448201526064015b60405180910390fd5b60055460ff16610b9c5760405162461bcd60e51b815260206004820152601860248201527f5065726d697373696f6e204d6f64652044697361626c656400000000000000006044820152606401610b41565b6005805460ff19169055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c509190614353565b610c5957600080fd5b610c62816132fb565b6040517fc1f0fb9f000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610cdd57600080fd5b505af1158015610cf1573d6000803e3d6000fd5b5050505050565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190614353565b610da957600080fd5b6000818152600d6020908152604080832080548251818502810185019093528083529192909190830182828015610e0957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610deb575b5050505050905060008151905060008167ffffffffffffffff811115610e3157610e31613dd6565b604051908082528060200260200182016040528015610e5a578160200160208202803683370190505b50905060005b82811015610edd57600c60008681526020019081526020016000206000858381518110610e8f57610e8f6142aa565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610eca57610eca6142aa565b6020908102919091010152600101610e60565b50610ee98484836135da565b50505050565b6002546001600160a01b03163314610f495760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff1615610fb25760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b03818116600090815260096020526040908190205490517fe5e31b1300000000000000000000000000000000000000000000000000000000815290821660048201819052917f0000000000000000000000000000000000000000000000000000000000000000169063e5e31b1390602401602060405180830381865afa158015611047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106b9190614353565b6110b75760405162461bcd60e51b815260206004820152601360248201527f7061697220646f6573206e6f74206578697374000000000000000000000000006044820152606401610b41565b600080826001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190614370565b6001600160a01b038581166000908152600860205260409020549294509092501661118a5760405162461bcd60e51b815260206004820152601460248201527f676175676520646f6573206e6f742065786973740000000000000000000000006044820152606401610b41565b6001600160a01b038481166000818152600a6020908152604080832080548987168086526008855283862080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091558787526009865284872080548216905583541690925560138452828520898816808752908552838620805460ff199081169091558989168088528588208054831690557f00000000000000000000000000000000000000000000000000000000000000008a1688528588208054831690559290981680875260148652848720918752908552838620805489169055908552828520805488169055858552600f909352818420805490961690955551909392849290917f13379c5ce739840b099b7f3973cd7c9ecaa3aff6f381da0cfb8008ce4f18ace59190a45050505050565b6112ea7f0000000000000000000000000000000000000000000000000000000000000000333084613a8c565b60065460009061130283670de0b6b3a76400006143ce565b61130c91906143eb565b9050801561132c5780601660008282546113269190614426565b90915550505b6040518281526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b336000908152600f602052604090205460ff166113ad57600080fd5b8115611447576040517f986b7d8a000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290602001611385565b6001546001600160a01b0316331461149b57600080fd5b60005b82518110156114d1576114c98382815181106114bc576114bc6142aa565b6020026020010151613baa565b60010161149e565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b60075461151c90600090612e6a565b565b6002546001600160a01b031633146115785760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260136020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60075461151c906000906122e8565b6018546001146115d057600080fd5b6002601855600154604080517fed29fc1100000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561163a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165e9190614439565b5061166881613c1d565b6001600160a01b03818116600081815260156020526040908190205490517f99bcc0520000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009093166004840152916399bcc05290602401602060405180830381865afa1580156116f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171d9190614439565b811180156117375750600061173562093a80836143eb565b115b1561182b576001600160a01b0382811660008181526015602052604080822091909155517fb66503cf0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156117d257600080fd5b505af11580156117e6573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601855565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc9190614353565b6118e557600080fd5b60005b8351811015610ee957838181518110611903576119036142aa565b60200260200101516001600160a01b031663a7852afa8385848151811061192c5761192c6142aa565b60200260200101516040518363ffffffff1660e01b8152600401611951929190614452565b600060405180830381600087803b15801561196b57600080fd5b505af192505050801561197c575060015b6119f657838181518110611992576119926142aa565b60200260200101516001600160a01b03167f3d29a870fa2d124f14984f98a1df8bcd683e624184195c2a63697d6200266f3e838584815181106119d7576119d76142aa565b60200260200101516040516119ed929190614452565b60405180910390a25b6001016118e8565b336000908152600f602052604090205460ff16611a1a57600080fd5b8115611ab4576040517ffbd3a29d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611a9b57600080fd5b505af1158015611aaf573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90602001611385565b6002546001600160a01b03163314611b4b5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526012602052604090205460ff16611bb35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260126020526040808220805460ff191690555133917f60a9f9ee3d1d62847472dc6b066eb0548a70c14f0ba4715be1c5bcdbd9b4462591a350565b611c0681613c1d565b50565b6002546001600160a01b03163314611c635760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190614353565b611d4e57600080fd5b60005b8351811015610ee957838181518110611d6c57611d6c6142aa565b60200260200101516001600160a01b031663a7852afa83858481518110611d9557611d956142aa565b60200260200101516040518363ffffffff1660e01b8152600401611dba929190614452565b600060405180830381600087803b158015611dd457600080fd5b505af1925050508015611de5575060015b611e5d57838181518110611dfb57611dfb6142aa565b60200260200101516001600160a01b03167f707c40b300e86ea06afe070057bebf0a23f03e55ca3aa0dffb91d96d2fc89fac848381518110611e3f57611e3f6142aa565b6020026020010151604051611e549190614340565b60405180910390a25b600101611d51565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063430c208190604401602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d9190614353565b611f1657600080fd5b828114611f2257600080fd5b6040517ff8a05763000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f8a0576390602401602060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614439565b905080611fd2613d08565b11156120205760405162461bcd60e51b815260206004820152601160248201527f6c6f636b206578706972657320736f6f6e0000000000000000000000000000006044820152606401610b41565b61208e8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506135da92505050565b505050505050565b6002546001600160a01b031633146120f05760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260146020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6002546001600160a01b031633146121845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff166121ec5760405162461bcd60e51b815260206004820152601160248201527f6761756765206973206e6f74206c6976650000000000000000000000000000006044820152606401610b41565b6121f5816115c1565b6001600160a01b0381166000818152601060209081526040808320805460ff191690556015909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b60055460ff16156122b0576002546001600160a01b031633146122b05760405162461bcd60e51b815260206004820152601960248201527f5065726d697373696f6e204d6f646520497320416374697665000000000000006044820152606401610b41565b6122df7f0000000000000000000000000000000000000000000000000000000000000000336000600454613a8c565b611c0681613baa565b815b81811015610ae65761232260078281548110612308576123086142aa565b6000918252602090912001546001600160a01b0316613c1d565b6001016122ea565b6002546001600160a01b031633146123845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff16156123ed5760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b60005b600754811015611c065760078181548110612459576124596142aa565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af19250505080156124ef575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124ec9181019061446b565b60015b6125485760078181548110612506576125066142aa565b60009182526020822001546040516001600160a01b03909116917f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb91a261254b565b50505b60010161243c565b6001600160a01b03818116600090815260086020526040812054909116156125bd5760405162461bcd60e51b815260206004820152600660248201527f65786973747300000000000000000000000000000000000000000000000000006044820152606401610b41565b6040517fe5e31b130000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063e5e31b1390602401602060405180830381865afa15801561263c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126609190614353565b6126ac5760405162461bcd60e51b815260206004820152600560248201527f21706169720000000000000000000000000000000000000000000000000000006044820152606401610b41565b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156126ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127129190614370565b6001600160a01b038216600090815260126020526040902054919350915060ff16801561275757506001600160a01b03811660009081526012602052604090205460ff165b6127a35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d27b9a786040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612829919061448f565b600080546040517f1c48e0fa0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015280851660248301527f00000000000000000000000000000000000000000000000000000000000000008116604483015293945091921690631c48e0fa906064016020604051808303816000875af11580156128c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e6919061448f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af1158015612992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b69190614353565b506001600160a01b038181166000818152600a6020908152604080832080548887167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092558c8716808652600885528386208054831688179055958552600984528285208054909116909517909455600f8252808320805460ff199081166001908117909255601084528285208054821683179055601384528285208b881680875290855283862080548316841790558a881680875284872080548416851790557f0000000000000000000000000000000000000000000000000000000000000000909816865283862080548316841790559585526014845282852095855294909252808320805485168317905593825292902080549091169091179055612ae381613c1d565b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560405133815288831692851691907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a495945050505050565b336000908152600f602052604090205460ff16612baa57600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b3360009081526011602052604090205460ff16612c555760405162461bcd60e51b815260206004820152601760248201527f566f7465723a206f6e6c7920666565206d616e616765720000000000000000006044820152606401610b41565b60008111612ca55760405162461bcd60e51b815260206004820152601d60248201527f466565206d7573742062652067726561746572207468616e207a65726f0000006044820152606401610b41565b600455565b6002546001600160a01b03163314612d045760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60005b8151811015612e3057818181518110612d4d57612d4d6142aa565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1925050508015612dcd575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612dca9181019061446b565b60015b612e2557818181518110612de357612de36142aa565b60200260200101516001600160a01b03167f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb60405160405180910390a2612e28565b50505b600101612d32565b5050565b60005b8151811015612e3057612e62828281518110612e5557612e556142aa565b6020026020010151613c1d565b600101612e37565b815b81811015610ae657306001600160a01b03166363453ae160078381548110612e9657612e966142aa565b60009182526020909120015460405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039091166004820152602401600060405180830381600087803b158015612efb57600080fd5b505af1925050508015612f0c575060015b612f655760078181548110612f2357612f236142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612fb6565b60078181548110612f7857612f786142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612e6c565b600d6020528160005260406000208181548110612fda57600080fd5b6000918252602090912001546001600160a01b03169150829050565b336000908152600f602052604090205460ff1661301257600080fd5b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679101612be9565b6002546001600160a01b031633146130af5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60005b8151811015612e30576130d08282815181106114bc576114bc6142aa565b6001016130b2565b60005b8151811015612e3057306001600160a01b03166363453ae1838381518110613105576131056142aa565b60200260200101516040518263ffffffff1660e01b815260040161313891906001600160a01b0391909116815260200190565b600060405180830381600087803b15801561315257600080fd5b505af1925050508015613163575060015b6131bc576007818154811061317a5761317a6142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a261320d565b600781815481106131cf576131cf6142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b6001016130db565b6002546001600160a01b0316331461326f5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60055460ff16156132c25760405162461bcd60e51b815260206004820152601760248201527f5065726d697373696f6e204d6f646520456e61626c65640000000000000000006044820152606401610b41565b6005805460ff19166001179055565b600781815481106132e157600080fd5b6000918252602090912001546001600160a01b0316905081565b6040517fc26defcd000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c26defcd90602401602060405180830381865afa158015613379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339d9190614353565b6133e95760405162461bcd60e51b815260206004820152600c60248201527f566f7465204c6f636b65642100000000000000000000000000000000000000006044820152606401610b41565b6000818152600d6020526040812080549091805b8281101561359e576000848281548110613419576134196142aa565b6000918252602080832090910154888352600c825260408084206001600160a01b039092168085529190925291205490915080156135945761345a82613c1d565b6001600160a01b0382166000908152600b6020526040812080548392906134829084906144ac565b90915550506000878152600c602090815260408083206001600160a01b0386168452909152812080548392906134b99084906144ac565b90915550506001600160a01b038281166000908152600a6020526040908190205490517f9e2bf22c00000000000000000000000000000000000000000000000000000000815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561353357600080fd5b505af1158015613547573d6000803e3d6000fd5b5050505080846135579190614426565b60408051898152602081018490529195507fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b50506001016133fd565b5080600660008282546135b191906144ac565b90915550506000848152600e60209081526040808320839055600d9091528120610ee991613d32565b6135e3836132fb565b6040517f67279054000000000000000000000000000000000000000000000000000000008152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636727905490602401600060405180830381600087803b15801561365e57600080fd5b505af1158015613672573d6000803e3d6000fd5b505083516040517fe7e242d400000000000000000000000000000000000000000000000000000000815260048101879052909250600091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e7e242d490602401602060405180830381865afa1580156136fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371f9190614439565b90506000806000805b8581101561375f57868181518110613742576137426142aa565b6020026020010151846137559190614426565b9350600101613728565b5060005b858110156139bf57600088828151811061377f5761377f6142aa565b6020908102919091018101516001600160a01b0381166000908152600f90925260409091205490915060ff16156139b657600085878a85815181106137c6576137c66142aa565b60200260200101516137d891906143ce565b6137e291906143eb565b60008c8152600c602090815260408083206001600160a01b03871684529091529020549091501561381257600080fd5b8060000361381f57600080fd5b61382882613c1d565b60008b8152600d6020908152604080832080546001810182559084528284200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387169081179091558352600b90915281208054839290613895908490614426565b909155505060008b8152600c602090815260408083206001600160a01b0386168452909152812080548392906138cc908490614426565b90915550506001600160a01b038281166000908152600a6020526040908190205490517ff320772300000000000000000000000000000000000000000000000000000000815260048101849052602481018e905291169063f320772390604401600060405180830381600087803b15801561394657600080fd5b505af115801561395a573d6000803e3d6000fd5b50505050808461396a9190614426565b93506139768186614426565b604080518d81526020810184905291965033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b50600101613763565b508015613a5a576040517ffd4a77f1000000000000000000000000000000000000000000000000000000008152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fd4a77f190602401600060405180830381600087803b158015613a4157600080fd5b505af1158015613a55573d6000803e3d6000fd5b505050505b8160066000828254613a6c9190614426565b90915550506000978852600e602052604090972096909655505050505050565b6000846001600160a01b03163b11613aa357600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613b3591906144bf565b6000604051808303816000865af19150503d8060008114613b72576040519150601f19603f3d011682016040523d82523d6000602084013e613b77565b606091505b5091509150818015613ba1575080511580613ba1575080806020019051810190613ba19190614353565b61208e57600080fd5b6001600160a01b03811660009081526012602052604090205460ff1615613bd057600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b0381166000908152600b60205260409020548015613ce8576001600160a01b038216600090815260176020526040812080546016549182905591613c6883836144ac565b90508015610cf1576000670de0b6b3a7640000613c8583876143ce565b613c8f91906143eb565b6001600160a01b03871660009081526010602052604090205490915060ff161561208e576001600160a01b03861660009081526015602052604081208054839290613cdb908490614426565b9091555050505050505050565b6016546001600160a01b0383166000908152601760205260409020555050565b600062093a8080613d198142614426565b613d2391906143eb565b613d2d91906143ce565b905090565b5080546000825590600052602060002090810190611c0691905b80821115613d605760008155600101613d4c565b5090565b6001600160a01b0381168114611c0657600080fd5b600060208284031215613d8b57600080fd5b8135613d9681613d64565b9392505050565b60008060408385031215613db057600080fd5b8235613dbb81613d64565b91506020830135613dcb81613d64565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e4c57613e4c613dd6565b604052919050565b600067ffffffffffffffff821115613e6e57613e6e613dd6565b5060051b60200190565b600082601f830112613e8957600080fd5b81356020613e9e613e9983613e54565b613e05565b8083825260208201915060208460051b870101935086841115613ec057600080fd5b602086015b84811015613ee5578035613ed881613d64565b8352918301918301613ec5565b509695505050505050565b600082601f830112613f0157600080fd5b81356020613f11613e9983613e54565b82815260059290921b84018101918181019086841115613f3057600080fd5b8286015b84811015613ee557803567ffffffffffffffff811115613f545760008081fd5b613f628986838b0101613e78565b845250918301918301613f34565b60008060408385031215613f8357600080fd5b823567ffffffffffffffff80821115613f9b57600080fd5b613fa786838701613e78565b93506020850135915080821115613fbd57600080fd5b50613fca85828601613ef0565b9150509250929050565b600060208284031215613fe657600080fd5b5035919050565b6000806040838503121561400057600080fd5b823591506020830135613dcb81613d64565b6000806040838503121561402557600080fd5b823567ffffffffffffffff81111561403c57600080fd5b61404885828601613e78565b9250506020830135613dcb81613d64565b8015158114611c0657600080fd5b60008060006060848603121561407c57600080fd5b833561408781613d64565b9250602084013561409781613d64565b915060408401356140a781614059565b809150509250925092565b6000806000606084860312156140c757600080fd5b833567ffffffffffffffff808211156140df57600080fd5b6140eb87838801613e78565b9450602086013591508082111561410157600080fd5b5061410e86828701613ef0565b925050604084013590509250925092565b60008083601f84011261413157600080fd5b50813567ffffffffffffffff81111561414957600080fd5b6020830191508360208260051b850101111561416457600080fd5b9250929050565b60008060008060006060868803121561418357600080fd5b85359450602086013567ffffffffffffffff808211156141a257600080fd5b6141ae89838a0161411f565b909650945060408801359150808211156141c757600080fd5b506141d48882890161411f565b969995985093965092949392505050565b600080604083850312156141f857600080fd5b50508035926020909101359150565b60008060006060848603121561421c57600080fd5b83359250602084013561422e81613d64565b929592945050506040919091013590565b6000806040838503121561425257600080fd5b823561425d81613d64565b91506020830135613dcb81614059565b60006020828403121561427f57600080fd5b813567ffffffffffffffff81111561429657600080fd5b6142a284828501613e78565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151808452602080850194506020840160005b838110156143135781516001600160a01b0316875295820195908201906001016142ee565b509495945050505050565b6001600160a01b03831681526040602082015260006142a260408301846142d9565b602081526000613d9660208301846142d9565b60006020828403121561436557600080fd5b8151613d9681614059565b6000806040838503121561438357600080fd5b825161438e81613d64565b6020840151909250613dcb81613d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176143e5576143e561439f565b92915050565b600082614421577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156143e5576143e561439f565b60006020828403121561444b57600080fd5b5051919050565b8281526040602082015260006142a260408301846142d9565b6000806040838503121561447e57600080fd5b505080516020909101519092909150565b6000602082840312156144a157600080fd5b8151613d9681613d64565b818103818111156143e5576143e561439f565b6000825160005b818110156144e057602081860181015185830152016144c6565b50600092019182525091905056fea2646970667358221220d3e452a1dc749ed306ee956c36c0692628aece3661ff637ed44222c050dfc73264736f6c634300081600330000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334200000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824000000000000000000000000b33f66f27d8d8282ac1f55f98cd83503e90128e9000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103c55760003560e01c80638a126be1116101ff578063b9a09fd51161011a578063eaa53523116100ad578063f0cf6c961161007c578063f0cf6c9614610941578063f80d61241461094e578063f851a44014610956578063fbdfe6b71461096957600080fd5b8063eaa53523146108d1578063eb4a78e0146108e4578063eded3e021461090b578063ef897f071461091e57600080fd5b8063d560b0d7116100e9578063d560b0d714610885578063d80a4d4d14610898578063dae6c831146108ab578063ea94ee44146108be57600080fd5b8063b9a09fd5146107f7578063c45a015514610820578063c527ee1f14610847578063d23254b41461085a57600080fd5b8063a0947d6f11610192578063a7cac84611610161578063a7cac84614610778578063a8c5d95a14610798578063aa79979b146107c1578063b6fe96bc146107e457600080fd5b8063a0947d6f14610737578063a5f4301e1461073f578063a61c713a14610752578063a6dd93641461076557600080fd5b8063992a7933116101ce578063992a7933146106eb5780639b19251a146106fe5780639b6a9d72146107115780639f06247b1461072457600080fd5b80638a126be11461069f5780638dd598fb146106b257806396c82e57146106d95780639769a38a146106e257600080fd5b8063402914f5116102ef578063666256aa11610282578063704b6c0211610251578063704b6c02146106465780637715ee751461065957806379e938241461066c5780637ac09bf71461068c57600080fd5b8063666256aa146105fa578063698473e31461060d5780636b2cc75c146106205780636ecbe38a1461063357600080fd5b8063485fdb4a116102be578063485fdb4a146105a957806350c116b8146105bc57806353d78693146105df57806363453ae1146105e757600080fd5b8063402914f51461055b578063411b1f771461057b578063462d0b2e1461058e57806347b3c6ba146105a157600080fd5b8063264deaf8116103675780633a045145116103365780633a045145146104e45780633af32abf146104f75780633c6b16ab1461051a5780633e504f7d1461052d57600080fd5b8063264deaf8146104a357806326782247146104ab578063310bd74b146104be57806332145f90146104d157600080fd5b80630e18b681116103a35780630e18b681146104365780631937e58f146104405780631f7b6d321461047e57806320b1cb6f1461049057600080fd5b806306d6a1b2146103ca57806307546172146104105780630d52333c14610423575b600080fd5b6103f36103d8366004613d79565b6009602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546103f3906001600160a01b031681565b6000546103f3906001600160a01b031681565b61043e61097c565b005b61046e61044e366004613d9d565b601360209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610407565b6007545b604051908152602001610407565b61043e61049e366004613f70565b6109cf565b61043e610aeb565b6003546103f3906001600160a01b031681565b61043e6104cc366004613fd4565b610ba8565b61043e6104df366004613fd4565b610cf8565b61043e6104f2366004613d79565b610eef565b61046e610505366004613d79565b60126020526000908152604090205460ff1681565b61043e610528366004613fd4565b6112be565b61046e61053b366004613d9d565b601460209081526000928352604080842090915290825290205460ff1681565b610482610569366004613d79565b60156020526000908152604090205481565b61043e610589366004613fed565b611391565b61043e61059c366004614012565b611484565b61043e61150d565b61043e6105b7366004614067565b61151e565b61046e6105ca366004613d79565b60106020526000908152604090205460ff1681565b61043e6115b2565b61043e6105f5366004613d79565b6115c1565b61043e6106083660046140b2565b611834565b61043e61061b366004613fed565b6119fe565b61043e61062e366004613d79565b611af1565b61043e610641366004613d79565b611bfd565b61043e610654366004613d79565b611c09565b61043e6106673660046140b2565b611c9d565b61048261067a366004613fd4565b600e6020526000908152604090205481565b61043e61069a36600461416b565b611e65565b61043e6106ad366004614067565b612096565b6103f37f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334281565b61048260065481565b61048260045481565b61043e6106f9366004613d79565b61212a565b61043e61070c366004613d79565b61224b565b61043e61071f3660046141e5565b6122e8565b61043e610732366004613d79565b61232a565b61043e612439565b6103f361074d366004613d79565b612553565b61043e610760366004614207565b612b8e565b61043e610773366004613fd4565b612bf6565b610482610786366004613d79565b600b6020526000908152604090205481565b6103f36107a6366004613d79565b600a602052600090815260409020546001600160a01b031681565b61046e6107cf366004613d79565b600f6020526000908152604090205460ff1681565b61043e6107f236600461423f565b612caa565b6103f3610805366004613d79565b6008602052600090815260409020546001600160a01b031681565b6103f37f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf782481565b61043e61085536600461426d565b612d2f565b610482610868366004613fed565b600c60209081526000928352604080842090915290825290205481565b61043e61089336600461426d565b612e34565b61043e6108a63660046141e5565b612e6a565b6103f36108b93660046141e5565b612fbe565b61043e6108cc366004614207565b612ff6565b61043e6108df36600461426d565b613055565b6103f37f000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e81565b61043e61091936600461426d565b6130d8565b61046e61092c366004613d79565b60116020526000908152604090205460ff1681565b60055461046e9060ff1681565b61043e613215565b6002546103f3906001600160a01b031681565b6103f3610977366004613fd4565b6132d1565b6003546001600160a01b0316331461099357600080fd5b600354600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b60005b8251811015610ae6578281815181106109ed576109ed6142aa565b60200260200101516001600160a01b03166331279d3d33848481518110610a1657610a166142aa565b60200260200101516040518363ffffffff1660e01b8152600401610a3b92919061431e565b600060405180830381600087803b158015610a5557600080fd5b505af1925050508015610a66575060015b610ade57828181518110610a7c57610a7c6142aa565b60200260200101516001600160a01b03167f64b5ca626ed4122d05be46c898b7520ff5a9a24880a4ebe983ae30b0e0aa82bf838381518110610ac057610ac06142aa565b6020026020010151604051610ad59190614340565b60405180910390a25b6001016109d2565b505050565b6002546001600160a01b03163314610b4a5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e00000000000000000000000000000060448201526064015b60405180910390fd5b60055460ff16610b9c5760405162461bcd60e51b815260206004820152601860248201527f5065726d697373696f6e204d6f64652044697361626c656400000000000000006044820152606401610b41565b6005805460ff19169055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c509190614353565b610c5957600080fd5b610c62816132fb565b6040517fc1f0fb9f000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063c1f0fb9f90602401600060405180830381600087803b158015610cdd57600080fd5b505af1158015610cf1573d6000803e3d6000fd5b5050505050565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da09190614353565b610da957600080fd5b6000818152600d6020908152604080832080548251818502810185019093528083529192909190830182828015610e0957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610deb575b5050505050905060008151905060008167ffffffffffffffff811115610e3157610e31613dd6565b604051908082528060200260200182016040528015610e5a578160200160208202803683370190505b50905060005b82811015610edd57600c60008681526020019081526020016000206000858381518110610e8f57610e8f6142aa565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610eca57610eca6142aa565b6020908102919091010152600101610e60565b50610ee98484836135da565b50505050565b6002546001600160a01b03163314610f495760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff1615610fb25760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b03818116600090815260096020526040908190205490517fe5e31b1300000000000000000000000000000000000000000000000000000000815290821660048201819052917f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824169063e5e31b1390602401602060405180830381865afa158015611047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106b9190614353565b6110b75760405162461bcd60e51b815260206004820152601360248201527f7061697220646f6573206e6f74206578697374000000000000000000000000006044820152606401610b41565b600080826001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190614370565b6001600160a01b038581166000908152600860205260409020549294509092501661118a5760405162461bcd60e51b815260206004820152601460248201527f676175676520646f6573206e6f742065786973740000000000000000000000006044820152606401610b41565b6001600160a01b038481166000818152600a6020908152604080832080548987168086526008855283862080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091558787526009865284872080548216905583541690925560138452828520898816808752908552838620805460ff199081169091558989168088528588208054831690557f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c18a1688528588208054831690559290981680875260148652848720918752908552838620805489169055908552828520805488169055858552600f909352818420805490961690955551909392849290917f13379c5ce739840b099b7f3973cd7c9ecaa3aff6f381da0cfb8008ce4f18ace59190a45050505050565b6112ea7f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1333084613a8c565b60065460009061130283670de0b6b3a76400006143ce565b61130c91906143eb565b9050801561132c5780601660008282546113269190614426565b90915550505b6040518281526001600160a01b037f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf50826906020015b60405180910390a35050565b336000908152600f602052604090205460ff166113ad57600080fd5b8115611447576040517f986b7d8a000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063986b7d8a90602401600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907fae268d9aab12f3605f58efd74fd3801fa812b03fdb44317eb70f46dff0e19e2290602001611385565b6001546001600160a01b0316331461149b57600080fd5b60005b82518110156114d1576114c98382815181106114bc576114bc6142aa565b6020026020010151613baa565b60010161149e565b50600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b60075461151c90600090612e6a565b565b6002546001600160a01b031633146115785760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260136020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60075461151c906000906122e8565b6018546001146115d057600080fd5b6002601855600154604080517fed29fc1100000000000000000000000000000000000000000000000000000000815290516001600160a01b039092169163ed29fc119160048082019260209290919082900301816000875af115801561163a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165e9190614439565b5061166881613c1d565b6001600160a01b03818116600081815260156020526040908190205490517f99bcc0520000000000000000000000000000000000000000000000000000000081527f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19093166004840152916399bcc05290602401602060405180830381865afa1580156116f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171d9190614439565b811180156117375750600061173562093a80836143eb565b115b1561182b576001600160a01b0382811660008181526015602052604080822091909155517fb66503cf0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19092166004830152602482018390529063b66503cf90604401600060405180830381600087803b1580156117d257600080fd5b505af11580156117e6573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507f4fa9693cae526341d334e2862ca2413b2e503f1266255f9e0869fb36e6d89b179060200160405180910390a35b50506001601855565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc9190614353565b6118e557600080fd5b60005b8351811015610ee957838181518110611903576119036142aa565b60200260200101516001600160a01b031663a7852afa8385848151811061192c5761192c6142aa565b60200260200101516040518363ffffffff1660e01b8152600401611951929190614452565b600060405180830381600087803b15801561196b57600080fd5b505af192505050801561197c575060015b6119f657838181518110611992576119926142aa565b60200260200101516001600160a01b03167f3d29a870fa2d124f14984f98a1df8bcd683e624184195c2a63697d6200266f3e838584815181106119d7576119d76142aa565b60200260200101516040516119ed929190614452565b60405180910390a25b6001016118e8565b336000908152600f602052604090205460ff16611a1a57600080fd5b8115611ab4576040517ffbd3a29d000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063fbd3a29d90602401600060405180830381600087803b158015611a9b57600080fd5b505af1158015611aaf573d6000803e3d6000fd5b505050505b60405182815233906001600160a01b038316907f60940192810a6fb3bce3fd3e2e3a13fd6ccc7605e963fb87ee971aba829989bd90602001611385565b6002546001600160a01b03163314611b4b5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526012602052604090205460ff16611bb35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260126020526040808220805460ff191690555133917f60a9f9ee3d1d62847472dc6b066eb0548a70c14f0ba4715be1c5bcdbd9b4462591a350565b611c0681613c1d565b50565b6002546001600160a01b03163314611c635760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190614353565b611d4e57600080fd5b60005b8351811015610ee957838181518110611d6c57611d6c6142aa565b60200260200101516001600160a01b031663a7852afa83858481518110611d9557611d956142aa565b60200260200101516040518363ffffffff1660e01b8152600401611dba929190614452565b600060405180830381600087803b158015611dd457600080fd5b505af1925050508015611de5575060015b611e5d57838181518110611dfb57611dfb6142aa565b60200260200101516001600160a01b03167f707c40b300e86ea06afe070057bebf0a23f03e55ca3aa0dffb91d96d2fc89fac848381518110611e3f57611e3f6142aa565b6020026020010151604051611e549190614340565b60405180910390a25b600101611d51565b6040517f430c2081000000000000000000000000000000000000000000000000000000008152336004820152602481018690527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063430c208190604401602060405180830381865afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d9190614353565b611f1657600080fd5b828114611f2257600080fd5b6040517ff8a05763000000000000000000000000000000000000000000000000000000008152600481018690526000907f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063f8a0576390602401602060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614439565b905080611fd2613d08565b11156120205760405162461bcd60e51b815260206004820152601160248201527f6c6f636b206578706972657320736f6f6e0000000000000000000000000000006044820152606401610b41565b61208e8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a028281018201909352898252909350899250889182918501908490808284376000920191909152506135da92505050565b505050505050565b6002546001600160a01b031633146120f05760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03928316600090815260146020908152604080832094909516825292909252919020805460ff1916911515919091179055565b6002546001600160a01b031633146121845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff166121ec5760405162461bcd60e51b815260206004820152601160248201527f6761756765206973206e6f74206c6976650000000000000000000000000000006044820152606401610b41565b6121f5816115c1565b6001600160a01b0381166000818152601060209081526040808320805460ff191690556015909152808220829055517f04a5d3f5d80d22d9345acc80618f4a4e7e663cf9e1aed23b57d975acec002ba79190a250565b60055460ff16156122b0576002546001600160a01b031633146122b05760405162461bcd60e51b815260206004820152601960248201527f5065726d697373696f6e204d6f646520497320416374697665000000000000006044820152606401610b41565b6122df7f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1336000600454613a8c565b611c0681613baa565b815b81811015610ae65761232260078281548110612308576123086142aa565b6000918252602090912001546001600160a01b0316613c1d565b6001016122ea565b6002546001600160a01b031633146123845760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03811660009081526010602052604090205460ff16156123ed5760405162461bcd60e51b815260206004820152600d60248201527f6761756765206973206c697665000000000000000000000000000000000000006044820152606401610b41565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fed18e9faa3dccfd8aa45f69c4de40546b2ca9cccc4538a2323531656516db1aa9190a250565b60005b600754811015611c065760078181548110612459576124596142aa565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af19250505080156124ef575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124ec9181019061446b565b60015b6125485760078181548110612506576125066142aa565b60009182526020822001546040516001600160a01b03909116917f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb91a261254b565b50505b60010161243c565b6001600160a01b03818116600090815260086020526040812054909116156125bd5760405162461bcd60e51b815260206004820152600660248201527f65786973747300000000000000000000000000000000000000000000000000006044820152606401610b41565b6040517fe5e31b130000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824169063e5e31b1390602401602060405180830381865afa15801561263c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126609190614353565b6126ac5760405162461bcd60e51b815260206004820152600560248201527f21706169720000000000000000000000000000000000000000000000000000006044820152606401610b41565b600080836001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af11580156126ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127129190614370565b6001600160a01b038216600090815260126020526040902054919350915060ff16801561275757506001600160a01b03811660009081526012602052604090205460ff165b6127a35760405162461bcd60e51b815260206004820152600c60248201527f2177686974656c697374656400000000000000000000000000000000000000006044820152606401610b41565b60007f000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e6001600160a01b031663d27b9a786040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612829919061448f565b600080546040517f1c48e0fa0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015280851660248301527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33428116604483015293945091921690631c48e0fa906064016020604051808303816000875af11580156128c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e6919061448f565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248301529192507f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c19091169063095ea7b3906044016020604051808303816000875af1158015612992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b69190614353565b506001600160a01b038181166000818152600a6020908152604080832080548887167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092558c8716808652600885528386208054831688179055958552600984528285208054909116909517909455600f8252808320805460ff199081166001908117909255601084528285208054821683179055601384528285208b881680875290855283862080548316841790558a881680875284872080548416851790557f000000000000000000000000e8876189a80b2079d8c0a7867e46c50361d972c1909816865283862080548316841790559585526014845282852095855294909252808320805485168317905593825292902080549091169091179055612ae381613c1d565b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560405133815288831692851691907f48d3c521fd0d5541640f58c6d6381eed7cb2e8c9df421ae165a4f4c2d221ee0d9060200160405180910390a495945050505050565b336000908152600f602052604090205460ff16612baa57600080fd5b604080518481526020810183905233916001600160a01b038516917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a3505050565b3360009081526011602052604090205460ff16612c555760405162461bcd60e51b815260206004820152601760248201527f566f7465723a206f6e6c7920666565206d616e616765720000000000000000006044820152606401610b41565b60008111612ca55760405162461bcd60e51b815260206004820152601d60248201527f466565206d7573742062652067726561746572207468616e207a65726f0000006044820152606401610b41565b600455565b6002546001600160a01b03163314612d045760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60005b8151811015612e3057818181518110612d4d57612d4d6142aa565b60200260200101516001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1925050508015612dcd575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612dca9181019061446b565b60015b612e2557818181518110612de357612de36142aa565b60200260200101516001600160a01b03167f653c837c1172ccbcf6fa68fcc2386f71a9e51930d8f53b738835a5a0c858e7fb60405160405180910390a2612e28565b50505b600101612d32565b5050565b60005b8151811015612e3057612e62828281518110612e5557612e556142aa565b6020026020010151613c1d565b600101612e37565b815b81811015610ae657306001600160a01b03166363453ae160078381548110612e9657612e966142aa565b60009182526020909120015460405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039091166004820152602401600060405180830381600087803b158015612efb57600080fd5b505af1925050508015612f0c575060015b612f655760078181548110612f2357612f236142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a2612fb6565b60078181548110612f7857612f786142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b600101612e6c565b600d6020528160005260406000208181548110612fda57600080fd5b6000918252602090912001546001600160a01b03169150829050565b336000908152600f602052604090205460ff1661301257600080fd5b604080518481526020810183905233916001600160a01b038516917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679101612be9565b6002546001600160a01b031633146130af5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60005b8151811015612e30576130d08282815181106114bc576114bc6142aa565b6001016130b2565b60005b8151811015612e3057306001600160a01b03166363453ae1838381518110613105576131056142aa565b60200260200101516040518263ffffffff1660e01b815260040161313891906001600160a01b0391909116815260200190565b600060405180830381600087803b15801561315257600080fd5b505af1925050508015613163575060015b6131bc576007818154811061317a5761317a6142aa565b60009182526020822001546040516001600160a01b03909116917f1581e4ca38f93a84a1117c3c9b3a843fd958b49bbe3372bf049bfd3276120fbe91a261320d565b600781815481106131cf576131cf6142aa565b60009182526020822001546040516001600160a01b03909116917f3a932c9554506f017c627364ab138bdc066bde4c4f94dfe88d71577ba83f854691a25b6001016130db565b6002546001600160a01b0316331461326f5760405162461bcd60e51b815260206004820152601160248201527f566f7465723a206f6e6c792061646d696e0000000000000000000000000000006044820152606401610b41565b60055460ff16156132c25760405162461bcd60e51b815260206004820152601760248201527f5065726d697373696f6e204d6f646520456e61626c65640000000000000000006044820152606401610b41565b6005805460ff19166001179055565b600781815481106132e157600080fd5b6000918252602090912001546001600160a01b0316905081565b6040517fc26defcd000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063c26defcd90602401602060405180830381865afa158015613379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339d9190614353565b6133e95760405162461bcd60e51b815260206004820152600c60248201527f566f7465204c6f636b65642100000000000000000000000000000000000000006044820152606401610b41565b6000818152600d6020526040812080549091805b8281101561359e576000848281548110613419576134196142aa565b6000918252602080832090910154888352600c825260408084206001600160a01b039092168085529190925291205490915080156135945761345a82613c1d565b6001600160a01b0382166000908152600b6020526040812080548392906134829084906144ac565b90915550506000878152600c602090815260408083206001600160a01b0386168452909152812080548392906134b99084906144ac565b90915550506001600160a01b038281166000908152600a6020526040908190205490517f9e2bf22c00000000000000000000000000000000000000000000000000000000815260048101849052602481018a9052911690639e2bf22c90604401600060405180830381600087803b15801561353357600080fd5b505af1158015613547573d6000803e3d6000fd5b5050505080846135579190614426565b60408051898152602081018490529195507fa9f3ca5f8a9e1580edb2741e0ba560084ec72e0067ba3423f9e9327a176882db910160405180910390a15b50506001016133fd565b5080600660008282546135b191906144ac565b90915550506000848152600e60209081526040808320839055600d9091528120610ee991613d32565b6135e3836132fb565b6040517f67279054000000000000000000000000000000000000000000000000000000008152600481018490527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b031690636727905490602401600060405180830381600087803b15801561365e57600080fd5b505af1158015613672573d6000803e3d6000fd5b505083516040517fe7e242d400000000000000000000000000000000000000000000000000000000815260048101879052909250600091507f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063e7e242d490602401602060405180830381865afa1580156136fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371f9190614439565b90506000806000805b8581101561375f57868181518110613742576137426142aa565b6020026020010151846137559190614426565b9350600101613728565b5060005b858110156139bf57600088828151811061377f5761377f6142aa565b6020908102919091018101516001600160a01b0381166000908152600f90925260409091205490915060ff16156139b657600085878a85815181106137c6576137c66142aa565b60200260200101516137d891906143ce565b6137e291906143eb565b60008c8152600c602090815260408083206001600160a01b03871684529091529020549091501561381257600080fd5b8060000361381f57600080fd5b61382882613c1d565b60008b8152600d6020908152604080832080546001810182559084528284200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387169081179091558352600b90915281208054839290613895908490614426565b909155505060008b8152600c602090815260408083206001600160a01b0386168452909152812080548392906138cc908490614426565b90915550506001600160a01b038281166000908152600a6020526040908190205490517ff320772300000000000000000000000000000000000000000000000000000000815260048101849052602481018e905291169063f320772390604401600060405180830381600087803b15801561394657600080fd5b505af115801561395a573d6000803e3d6000fd5b50505050808461396a9190614426565b93506139768186614426565b604080518d81526020810184905291965033917fea66f58e474bc09f580000e81f31b334d171db387d0c6098ba47bd897741679b910160405180910390a2505b50600101613763565b508015613a5a576040517ffd4a77f1000000000000000000000000000000000000000000000000000000008152600481018990527f0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc33426001600160a01b03169063fd4a77f190602401600060405180830381600087803b158015613a4157600080fd5b505af1158015613a55573d6000803e3d6000fd5b505050505b8160066000828254613a6c9190614426565b90915550506000978852600e602052604090972096909655505050505050565b6000846001600160a01b03163b11613aa357600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613b3591906144bf565b6000604051808303816000865af19150503d8060008114613b72576040519150601f19603f3d011682016040523d82523d6000602084013e613b77565b606091505b5091509150818015613ba1575080511580613ba1575080806020019051810190613ba19190614353565b61208e57600080fd5b6001600160a01b03811660009081526012602052604090205460ff1615613bd057600080fd5b6001600160a01b038116600081815260126020526040808220805460ff191660011790555133917f6661a7108aecd07864384529117d96c319c1163e3010c01390f6b704726e07de91a350565b6001600160a01b0381166000908152600b60205260409020548015613ce8576001600160a01b038216600090815260176020526040812080546016549182905591613c6883836144ac565b90508015610cf1576000670de0b6b3a7640000613c8583876143ce565b613c8f91906143eb565b6001600160a01b03871660009081526010602052604090205490915060ff161561208e576001600160a01b03861660009081526015602052604081208054839290613cdb908490614426565b9091555050505050505050565b6016546001600160a01b0383166000908152601760205260409020555050565b600062093a8080613d198142614426565b613d2391906143eb565b613d2d91906143ce565b905090565b5080546000825590600052602060002090810190611c0691905b80821115613d605760008155600101613d4c565b5090565b6001600160a01b0381168114611c0657600080fd5b600060208284031215613d8b57600080fd5b8135613d9681613d64565b9392505050565b60008060408385031215613db057600080fd5b8235613dbb81613d64565b91506020830135613dcb81613d64565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e4c57613e4c613dd6565b604052919050565b600067ffffffffffffffff821115613e6e57613e6e613dd6565b5060051b60200190565b600082601f830112613e8957600080fd5b81356020613e9e613e9983613e54565b613e05565b8083825260208201915060208460051b870101935086841115613ec057600080fd5b602086015b84811015613ee5578035613ed881613d64565b8352918301918301613ec5565b509695505050505050565b600082601f830112613f0157600080fd5b81356020613f11613e9983613e54565b82815260059290921b84018101918181019086841115613f3057600080fd5b8286015b84811015613ee557803567ffffffffffffffff811115613f545760008081fd5b613f628986838b0101613e78565b845250918301918301613f34565b60008060408385031215613f8357600080fd5b823567ffffffffffffffff80821115613f9b57600080fd5b613fa786838701613e78565b93506020850135915080821115613fbd57600080fd5b50613fca85828601613ef0565b9150509250929050565b600060208284031215613fe657600080fd5b5035919050565b6000806040838503121561400057600080fd5b823591506020830135613dcb81613d64565b6000806040838503121561402557600080fd5b823567ffffffffffffffff81111561403c57600080fd5b61404885828601613e78565b9250506020830135613dcb81613d64565b8015158114611c0657600080fd5b60008060006060848603121561407c57600080fd5b833561408781613d64565b9250602084013561409781613d64565b915060408401356140a781614059565b809150509250925092565b6000806000606084860312156140c757600080fd5b833567ffffffffffffffff808211156140df57600080fd5b6140eb87838801613e78565b9450602086013591508082111561410157600080fd5b5061410e86828701613ef0565b925050604084013590509250925092565b60008083601f84011261413157600080fd5b50813567ffffffffffffffff81111561414957600080fd5b6020830191508360208260051b850101111561416457600080fd5b9250929050565b60008060008060006060868803121561418357600080fd5b85359450602086013567ffffffffffffffff808211156141a257600080fd5b6141ae89838a0161411f565b909650945060408801359150808211156141c757600080fd5b506141d48882890161411f565b969995985093965092949392505050565b600080604083850312156141f857600080fd5b50508035926020909101359150565b60008060006060848603121561421c57600080fd5b83359250602084013561422e81613d64565b929592945050506040919091013590565b6000806040838503121561425257600080fd5b823561425d81613d64565b91506020830135613dcb81614059565b60006020828403121561427f57600080fd5b813567ffffffffffffffff81111561429657600080fd5b6142a284828501613e78565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151808452602080850194506020840160005b838110156143135781516001600160a01b0316875295820195908201906001016142ee565b509495945050505050565b6001600160a01b03831681526040602082015260006142a260408301846142d9565b602081526000613d9660208301846142d9565b60006020828403121561436557600080fd5b8151613d9681614059565b6000806040838503121561438357600080fd5b825161438e81613d64565b6020840151909250613dcb81613d64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176143e5576143e561439f565b92915050565b600082614421577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156143e5576143e561439f565b60006020828403121561444b57600080fd5b5051919050565b8281526040602082015260006142a260408301846142d9565b6000806040838503121561447e57600080fd5b505080516020909101519092909150565b6000602082840312156144a157600080fd5b8151613d9681613d64565b818103818111156143e5576143e561439f565b6000825160005b818110156144e057602081860181015185830152016144c6565b50600092019182525091905056fea2646970667358221220d3e452a1dc749ed306ee956c36c0692628aece3661ff637ed44222c050dfc73264736f6c63430008160033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc334200000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824000000000000000000000000b33f66f27d8d8282ac1f55f98cd83503e90128e9000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e

-----Decoded View---------------
Arg [0] : __ve (address): 0x6ACa098fa93DAD7A872F6dcb989F8b4A3aFC3342
Arg [1] : _factory (address): 0x12508dd9108Abab2c5fD8fC6E4984E46a3CF7824
Arg [2] : _gauges (address): 0xb33F66f27d8D8282AC1f55F98cd83503e90128e9
Arg [3] : _bribes (address): 0xc8c5172879f0b7E88cc03ca20835dbE9e283386e

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006aca098fa93dad7a872f6dcb989f8b4a3afc3342
Arg [1] : 00000000000000000000000012508dd9108abab2c5fd8fc6e4984e46a3cf7824
Arg [2] : 000000000000000000000000b33f66f27d8d8282ac1f55f98cd83503e90128e9
Arg [3] : 000000000000000000000000c8c5172879f0b7e88cc03ca20835dbe9e283386e


Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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