Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0x81a8CAb6bb568fC94bCa70C9AdbFCF05592dEd7b
Balance 0 ETH
Nonce 1
Code Size 4852 bytes
Indexed Transactions 0 (1 on-chain, 0.8% indexed)
External Etherscan · Sourcify

Contract Bytecode

4852 bytes
0x608060405234801561001057600080fd5b50600436106101415760003560e01c80639d63848a116100b8578063cfad57a21161007c578063cfad57a2146102da578063d826f88f146102ed578063e4fc6b6d146102f5578063e6c09edf146102fd578063f2a1a8ed14610310578063f94e4e801461032357600080fd5b80639d63848a1461023e578063a7cac84614610253578063b1a997ac14610273578063b9a09fd514610286578063cad1b906146102af57600080fd5b80635bfa1b681161010a5780635bfa1b68146101ca5780636a42b8f8146101dd5780636f816a20146101e75780637bc6729b146101fa57806396c82e571461020257806398afdfe31461020b57600080fd5b80622f8de41461014657806312d43a511461017957806316209165146101a45780631f7b6d32146101b95780632196bcd7146101c1575b600080fd5b610166610154366004611043565b60096020526000908152604090205481565b6040519081526020015b60405180910390f35b60015461018c906001600160a01b031681565b6040516001600160a01b039091168152602001610170565b6101b76101b2366004611065565b610336565b005b600454610166565b61016660035481565b6101b76101d8366004611043565b610444565b6101666201518081565b6101b76101f53660046110c2565b61047f565b6101b76104ff565b61016660005481565b61022e610219366004611043565b600a6020526000908152604090205460ff1681565b6040519015158152602001610170565b610246610547565b60405161017091906111a4565b610166610261366004611043565b60066020526000908152604090205481565b6101b7610281366004611043565b6105a9565b61018c610294366004611043565b6005602052600090815260409020546001600160a01b031681565b6101666102bd366004611065565b600760209081526000928352604080842090915290825290205481565b6101b76102e8366004611043565b6107ce565b6101b7610813565b6101b761081e565b6101b761030b366004611043565b610afb565b61018c61031e366004611098565b610b33565b60025461018c906001600160a01b031681565b6001546001600160a01b0316331461034d57600080fd5b6001600160a01b0382811660009081526005602052604090205416156103a25760405162461bcd60e51b815260206004820152600660248201526565786973747360d01b604482015260640160405180910390fd5b6103c373edb67ee1b171c4ec66e6c10ec43edbba20fae8e982600019610b6b565b6001600160a01b0391821660008181526005602090815260408083208054969095166001600160a01b031996871617909455600a9052918220805460ff191660019081179091556004805491820181559092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9091018054909216179055565b6001546001600160a01b0316331461045b57600080fd5b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b82811461048b57600080fd5b6104f93385858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250610c4392505050565b50505050565b6002546001600160a01b03163314801561051a575042600354105b61052357600080fd5b600254600180546001600160a01b0319166001600160a01b03909216919091179055565b6060600480548060200260200160405190810160405280929190818152602001828054801561059f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610581575b5050505050905090565b6001600160a01b03811660009081526008602090815260408083208054825181850281018501909352808352919290919083018282801561061357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105f5575b5050505050905060008151905060008167ffffffffffffffff81111561063b5761063b6112a8565b604051908082528060200260200182016040528015610664578160200160208202803683370190505b506001600160a01b03851660008181526009602052604080822054905163057e116160e41b815260048101939093526024830182905292935090732fc52c61fb0c03489649311989ce2689d93dc1a2906357e116109060440160206040518083038186803b1580156106d557600080fd5b505afa1580156106e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070d9190611150565b905060005b848110156107ba576001600160a01b03871660009081526007602052604081208751829089908590811061074857610748611292565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020549050838382610780919061122b565b61078a9190611209565b85838151811061079c5761079c611292565b602090810291909101015250806107b281611261565b915050610712565b506107c6868685610c43565b505050505050565b6001546001600160a01b031633146107e557600080fd5b600280546001600160a01b0319166001600160a01b03831617905561080d62015180426111f1565b60035550565b61081c33610e9d565b565b6001546001600160a01b0316331461083557600080fd5b6040516370a0823160e01b815230600482015260009073edb67ee1b171c4ec66e6c10ec43edbba20fae8e9906370a082319060240160206040518083038186803b15801561088257600080fd5b505afa158015610896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ba9190611150565b90506000811180156108cd575060008054115b15610af85760008054905b60045481101561098057600a6000600483815481106108f9576108f9611292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1661096e57600660006004838154811061093c5761093c611292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461096b908361124a565b91505b8061097881611261565b9150506108d8565b5060005b600454811015610af557600a6000600483815481106109a5576109a5611292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1615610ae35760008260066000600485815481106109ec576109ec611292565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610a1b908661122b565b610a259190611209565b90508015610ae15760006005600060048581548110610a4657610a46611292565b6000918252602080832091909101546001600160a01b03908116845290830193909352604091820190205490516393f7aa6760e01b815273edb67ee1b171c4ec66e6c10ec43edbba20fae8e96004820152602481018590529116915081906393f7aa6790604401600060405180830381600087803b158015610ac757600080fd5b505af1158015610adb573d6000803e3d6000fd5b50505050505b505b80610aed81611261565b915050610984565b50505b50565b6001546001600160a01b03163314610b1257600080fd5b6001600160a01b03166000908152600a60205260409020805460ff19169055565b60086020528160005260406000208181548110610b4f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691610bc79190611169565b6000604051808303816000865af19150503d8060008114610c04576040519150601f19603f3d011682016040523d82523d6000602084013e610c09565b606091505b5091509150818015610c33575080511580610c33575080806020019051810190610c33919061112e565b610c3c57600080fd5b5050505050565b610c4c83610e9d565b815160405163057e116160e41b81526001600160a01b038516600482015260006024820181905290732fc52c61fb0c03489649311989ce2689d93dc1a2906357e116109060440160206040518083038186803b158015610cab57600080fd5b505afa158015610cbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce39190611150565b905060008060005b84811015610d2c57858181518110610d0557610d05611292565b602002602001015183610d1891906111f1565b925080610d2481611261565b915050610ceb565b5060005b84811015610e78576000878281518110610d4c57610d4c611292565b6020908102919091018101516001600160a01b038082166000908152600590935260408320548a51929450169190869088908b9087908110610d9057610d90611292565b6020026020010151610da2919061122b565b610dac9190611209565b90506001600160a01b03821615610e6257610dc781866111f1565b945080600080828254610dda91906111f1565b90915550506001600160a01b03831660009081526006602052604081208054839290610e079084906111f1565b90915550506001600160a01b038b8116600081815260086020908152604080832080546001810182559084528284200180546001600160a01b0319169589169586179055928252600781528282209382529290925290208190555b5050508080610e7090611261565b915050610d30565b506001600160a01b039096166000908152600960205260409020959095555050505050565b6001600160a01b0381166000908152600860205260408120805490915b81811015610f91576000838281548110610ed657610ed6611292565b60009182526020808320909101546001600160a01b038881168452600783526040808520919092168085529252909120549091508015610f7c5780600080828254610f21919061124a565b90915550506001600160a01b03821660009081526006602052604081208054839290610f4e90849061124a565b90915550506001600160a01b0380871660009081526007602090815260408083209386168352929052908120555b50508080610f8990611261565b915050610eba565b506001600160a01b0383166000908152600860209081526040822080548382559083529120610af591610af891908101905b80821115610fd75760008155600101610fc3565b5090565b80356001600160a01b0381168114610ff257600080fd5b919050565b60008083601f84011261100957600080fd5b50813567ffffffffffffffff81111561102157600080fd5b6020830191508360208260051b850101111561103c57600080fd5b9250929050565b60006020828403121561105557600080fd5b61105e82610fdb565b9392505050565b6000806040838503121561107857600080fd5b61108183610fdb565b915061108f60208401610fdb565b90509250929050565b600080604083850312156110ab57600080fd5b6110b483610fdb565b946020939093013593505050565b600080600080604085870312156110d857600080fd5b843567ffffffffffffffff808211156110f057600080fd5b6110fc88838901610ff7565b9096509450602087013591508082111561111557600080fd5b5061112287828801610ff7565b95989497509550505050565b60006020828403121561114057600080fd5b8151801515811461105e57600080fd5b60006020828403121561116257600080fd5b5051919050565b6000825160005b8181101561118a5760208186018101518583015201611170565b81811115611199576000828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156111e55783516001600160a01b0316835292840192918401916001016111c0565b50909695505050505050565b600082198211156112045761120461127c565b500190565b60008261122657634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156112455761124561127c565b500290565b60008282101561125c5761125c61127c565b500390565b60006000198214156112755761127561127c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212204a5a471cc34551bd921f532b44b037b192138960f29b4d1cd3823027c5a57cf364736f6c63430008070033

Verified Source Code Partial Match

Compiler: v0.8.7+commit.e28d00a7 EVM: london Optimization: Yes (200 runs)
GaugeProxy.sol 196 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

library Math {
    function max(uint a, uint b) internal pure returns (uint) {
        return a >= b ? a : b;
    }
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
}

interface erc20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function approve(address spender, uint value) external returns (bool);
}

interface ve {
    function locked__end(address) external view returns (uint);
    function deposit_for(address, uint) external;
}

interface delegate {
    function get_adjusted_ve_balance(address, address) external view returns (uint);
}

interface Gauge {
    function deposit_reward_token(address, uint) external;
}

contract GaugeProxy {
    address constant _rkp3r = 0xEdB67Ee1B171c4eC66E6c10EC43EDBbA20FaE8e9;
    address constant _vkp3r = 0x2FC52C61fB0C03489649311989CE2689D93dC1a2;
    address constant ZERO_ADDRESS = 0x0000000000000000000000000000000000000000;

    uint public totalWeight;

    address public gov;
    address public nextgov;
    uint public commitgov;
    uint public constant delay = 1 days;

    address[] internal _tokens;
    mapping(address => address) public gauges; // token => gauge
    mapping(address => uint) public weights; // token => weight
    mapping(address => mapping(address => uint)) public votes; // msg.sender => votes
    mapping(address => address[]) public tokenVote;// msg.sender => token
    mapping(address => uint) public usedWeights;  // msg.sender => total voting weight of user
    mapping(address => bool) public enabled;

    function tokens() external view returns (address[] memory) {
        return _tokens;
    }

    constructor() {
        gov = msg.sender;
    }

    modifier g() {
        require(msg.sender == gov);
        _;
    }

    function setGov(address _gov) external g {
        nextgov = _gov;
        commitgov = block.timestamp + delay;
    }

    function acceptGov() external {
        require(msg.sender == nextgov && commitgov < block.timestamp);
        gov = nextgov;
    }

    function reset() external {
        _reset(msg.sender);
    }

    function _reset(address _owner) internal {
        address[] storage _tokenVote = tokenVote[_owner];
        uint _tokenVoteCnt = _tokenVote.length;

        for (uint i = 0; i < _tokenVoteCnt; i ++) {
            address _token = _tokenVote[i];
            uint _votes = votes[_owner][_token];

            if (_votes > 0) {
                totalWeight -= _votes;
                weights[_token] -= _votes;
                votes[_owner][_token] = 0;
            }
        }

        delete tokenVote[_owner];
    }

    function poke(address _owner) public {
        address[] memory _tokenVote = tokenVote[_owner];
        uint _tokenCnt = _tokenVote.length;
        uint[] memory _weights = new uint[](_tokenCnt);

        uint _prevUsedWeight = usedWeights[_owner];
        uint _weight = delegate(_vkp3r).get_adjusted_ve_balance(_owner, ZERO_ADDRESS);

        for (uint i = 0; i < _tokenCnt; i ++) {
            uint _prevWeight = votes[_owner][_tokenVote[i]];
            _weights[i] = _prevWeight * _weight / _prevUsedWeight;
        }

        _vote(_owner, _tokenVote, _weights);
    }

    function _vote(address _owner, address[] memory _tokenVote, uint[] memory _weights) internal {
        // _weights[i] = percentage * 100
        _reset(_owner);
        uint _tokenCnt = _tokenVote.length;
        uint _weight = delegate(_vkp3r).get_adjusted_ve_balance(_owner, ZERO_ADDRESS);
        uint _totalVoteWeight = 0;
        uint _usedWeight = 0;

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

        for (uint i = 0; i < _tokenCnt; i ++) {
            address _token = _tokenVote[i];
            address _gauge = gauges[_token];
            uint _tokenWeight = _weights[i] * _weight / _totalVoteWeight;

            if (_gauge != address(0x0)) {
                _usedWeight += _tokenWeight;
                totalWeight += _tokenWeight;
                weights[_token] += _tokenWeight;
                tokenVote[_owner].push(_token);
                votes[_owner][_token] = _tokenWeight;
            }
        }

        usedWeights[_owner] = _usedWeight;
    }

    function vote(address[] calldata _tokenVote, uint[] calldata _weights) external {
        require(_tokenVote.length == _weights.length);
        _vote(msg.sender, _tokenVote, _weights);
    }

    function addGauge(address _token, address _gauge) external g {
        require(gauges[_token] == address(0x0), "exists");
        _safeApprove(_rkp3r, _gauge, type(uint).max);
        gauges[_token] = _gauge;
        enabled[_token] = true;
        _tokens.push(_token);
    }

    function disable(address _token) external g {
        enabled[_token] = false;
    }

    function enable(address _token) external g {
        enabled[_token] = true;
    }

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

    function distribute() external g {
        uint _balance = erc20(_rkp3r).balanceOf(address(this));
        if (_balance > 0 && totalWeight > 0) {
            uint _totalWeight = totalWeight;
            for (uint i = 0; i < _tokens.length; i++) {
                if (!enabled[_tokens[i]]) {
                    _totalWeight -= weights[_tokens[i]];
                }
            }
            for (uint x = 0; x < _tokens.length; x++) {
                if (enabled[_tokens[x]]) {
                    uint _reward = _balance * weights[_tokens[x]] / _totalWeight;
                    if (_reward > 0) {
                        address _gauge = gauges[_tokens[x]];
                        Gauge(_gauge).deposit_reward_token(_rkp3r, _reward);
                    }
                }
            }
        }
    }

    function _safeApprove(address token, address spender, uint256 value) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(erc20.approve.selector, spender, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

Read Contract

commitgov 0x2196bcd7 → uint256
delay 0x6a42b8f8 → uint256
enabled 0x98afdfe3 → bool
gauges 0xb9a09fd5 → address
gov 0x12d43a51 → address
length 0x1f7b6d32 → uint256
nextgov 0xf94e4e80 → address
tokenVote 0xf2a1a8ed → address
tokens 0x9d63848a → address[]
totalWeight 0x96c82e57 → uint256
usedWeights 0x002f8de4 → uint256
votes 0xcad1b906 → uint256
weights 0xa7cac846 → uint256

Write Contract 9 functions

These functions modify contract state and require a wallet transaction to execute.

acceptGov 0x7bc6729b
No parameters
addGauge 0x16209165
address _token
address _gauge
disable 0xe6c09edf
address _token
distribute 0xe4fc6b6d
No parameters
enable 0x5bfa1b68
address _token
poke 0xb1a997ac
address _owner
reset 0xd826f88f
No parameters
setGov 0xcfad57a2
address _gov
vote 0x6f816a20
address[] _tokenVote
uint256[] _weights

Recent Transactions

This address has 1 on-chain transactions, but only 0.8% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →