ETH Price: $2,613.48 (-0.44%)

Contract

0x0e4E9D97440182EA72D988d48eB9b156a0c02e11
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Pool162188942022-12-19 12:59:11652 days ago1671454751IN
0x0e4E9D97...6a0c02e11
0 ETH0.0005159112.31264972
0x60a06040161870432022-12-15 2:14:23656 days ago1671070463IN
 Create: PoolManagerV4
0 ETH0.0147166525

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PoolManagerV4

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : PoolManagerV4.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./Interfaces.sol";
import "./interfaces/IGaugeController.sol";
import "./interfaces/IPoolAddHook.sol";

/*
Pool Manager v4

Changes:
- add is killed check
- add block list for things like vefunder
- add post pool add hook
*/

contract PoolManagerV4{
    address public constant gaugeController = address(0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB);
    address public immutable pools;

    address public operator;

    mapping(address => bool) public blockList;
    address public postAddHook;
    
    constructor(address _pools) public {
        //default to multisig
        operator = address(0xa3C5A1e09150B75ff251c1a7815A07182c3de2FB);
        pools = _pools;

        //add vefunder
        blockList[address(0xbAF05d7aa4129CA14eC45cC9d4103a9aB9A9fF60)] = true;
    }

    function setOperator(address _operator) external {
        require(msg.sender == operator, "!auth");
        operator = _operator;
    }

    function setPostAddHook(address _hook) external {
        require(msg.sender == operator, "!auth");
        postAddHook = _hook;
    }

    //add a new curve pool to the system. (default stash to v3)
    function addPool(address _gauge) external returns(bool){
        _addPool(_gauge,3);
        return true;
    }

    //add a new curve pool to the system.
    function addPool(address _gauge, uint256 _stashVersion) external returns(bool){
        _addPool(_gauge,_stashVersion);
        return true;
    }

    function _addPool(address _gauge, uint256 _stashVersion) internal{
        require(!blockList[_gauge],"!blocked");
        require(!ICurveGauge(_gauge).is_killed(), "!killed");

        //get lp token from gauge
        address lptoken = ICurveGauge(_gauge).lp_token();

        //gauge/lptoken address checks will happen in the next call
        IPools(pools).addPool(lptoken,_gauge,_stashVersion);

        //call hook if not 0 address
        if(postAddHook != address(0)){
            IPoolAddHook(postAddHook).poolAdded(_gauge, _stashVersion, IPools(pools).poolLength()-1);
        }
    }

    function forceAddPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool){
        require(msg.sender==operator, "!auth");
        
        //force add pool without weight checks (can only be used on new token and gauge addresses)
        return IPools(pools).forceAddPool(_lptoken, _gauge, _stashVersion);
    }

    function shutdownPool(uint256 _pid) external returns(bool){
        require(msg.sender==operator, "!auth");

        IPools(pools).shutdownPool(_pid);
        return true;
    }

}

File 2 of 4 : IPoolAddHook.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IPoolAddHook {
    function poolAdded(address _gauge, uint256 _stashVersion, uint256 _poolId) external;
}

File 3 of 4 : IGaugeController.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IGaugeController {
    function get_gauge_weight(address _gauge) external view returns(uint256);
    function vote_user_slopes(address,address) external view returns(uint256,uint256,uint256);//slope,power,end
    function vote_for_gauge_weights(address,uint256) external;
    function add_gauge(address,int128,uint256) external;
}

File 4 of 4 : Interfaces.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;



interface ICurveGauge {
    function deposit(uint256) external;
    function balanceOf(address) external view returns (uint256);
    function withdraw(uint256) external;
    function claim_rewards() external;
    function reward_tokens(uint256) external view returns(address);//v2
    function rewarded_token() external view returns(address);//v1
    function lp_token() external view returns(address);
    function is_killed() external view returns(bool);
}

interface ICurveVoteEscrow {
    function create_lock(uint256, uint256) external;
    function increase_amount(uint256) external;
    function increase_unlock_time(uint256) external;
    function withdraw() external;
    function smart_wallet_checker() external view returns (address);
}

interface IWalletChecker {
    function check(address) external view returns (bool);
}

interface IVoting{
    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided
    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory); 
    function vote_for_gauge_weights(address,uint256) external;
}

interface IMinter{
    function mint(address) external;
}

interface IRegistry{
    function get_registry() external view returns(address);
    function get_address(uint256 _id) external view returns(address);
    function gauge_controller() external view returns(address);
    function get_lp_token(address) external view returns(address);
    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);
}

interface IStaker{
    function deposit(address, address) external;
    function withdraw(address) external;
    function withdraw(address, address, uint256) external;
    function withdrawAll(address, address) external;
    function createLock(uint256, uint256) external;
    function increaseAmount(uint256) external;
    function increaseTime(uint256) external;
    function release() external;
    function claimCrv(address) external returns (uint256);
    function claimRewards(address) external;
    function claimFees(address,address) external;
    function setStashAccess(address, bool) external;
    function vote(uint256,address,bool) external;
    function voteGaugeWeight(address,uint256) external;
    function balanceOfPool(address) external view returns (uint256);
    function operator() external view returns (address);
    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);
}

interface IRewards{
    function stake(address, uint256) external;
    function stakeFor(address, uint256) external;
    function withdraw(address, uint256) external;
    function exit(address) external;
    function getReward(address) external;
    function queueNewRewards(uint256) external;
    function notifyRewardAmount(uint256) external;
    function addExtraReward(address) external;
    function stakingToken() external view returns (address);
    function rewardToken() external view returns(address);
    function earned(address account) external view returns (uint256);
}

interface IStash{
    function stashRewards() external returns (bool);
    function processStash() external returns (bool);
    function claimRewards() external returns (bool);
    function initialize(uint256 _pid, address _operator, address _staker, address _gauge, address _rewardFactory) external;
}

interface IFeeDistro{
    function claim() external;
    function token() external view returns(address);
}

interface ITokenMinter{
    function mint(address,uint256) external;
    function burn(address,uint256) external;
}

interface IDeposit{
    function isShutdown() external view returns(bool);
    function balanceOf(address _account) external view returns(uint256);
    function totalSupply() external view returns(uint256);
    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);
    function rewardClaimed(uint256,address,uint256) external;
    function withdrawTo(uint256,uint256,address) external;
    function claimRewards(uint256,address) external returns(bool);
    function rewardArbitrator() external returns(address);
    function setGaugeRedirect(uint256 _pid) external returns(bool);
    function owner() external returns(address);
}

interface ICrvDeposit{
    function deposit(uint256, bool) external;
    function lockIncentive() external view returns(uint256);
}

interface IRewardFactory{
    function setAccess(address,bool) external;
    function CreateCrvRewards(uint256,address) external returns(address);
    function CreateTokenRewards(address,address,address) external returns(address);
    function activeRewardCount(address) external view returns(uint256);
    function addActiveReward(address,uint256) external returns(bool);
    function removeActiveReward(address,uint256) external returns(bool);
}

interface IStashFactory{
    function CreateStash(uint256,address,address,uint256) external returns(address);
}

interface ITokenFactory{
    function CreateDepositToken(address) external returns(address);
}

interface IPools{
    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);
    function forceAddPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);
    function shutdownPool(uint256 _pid) external returns(bool);
    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);
    function poolLength() external view returns (uint256);
    function gaugeMap(address) external view returns(bool);
    function setPoolManager(address _poolM) external;
}

interface IVestedEscrow{
    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_pools","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_stashVersion","type":"uint256"}],"name":"addPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"addPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blockList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_stashVersion","type":"uint256"}],"name":"forceAddPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gaugeController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postAddHook","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hook","type":"address"}],"name":"setPostAddHook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"shutdownPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60a060405234801561001057600080fd5b506040516109c63803806109c68339818101604052602081101561003357600080fd5b5051600080546001600160a01b03191673a3c5a1e09150b75ff251c1a7815a07182c3de2fb1781556001600160601b031960609290921b9190911660805273baf05d7aa4129ca14ec45cc9d4103a9ab9a9ff609052600160208190527f99759ab0d944a9dab202f9bba719ac12ab3ac10bef2be080c5ca0bceaef84730805460ff1916909117905560805160601c6108da6100ec60003980610294528061039852806104c852806106fd52806107af52506108da6000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806399eecb3b1161007157806399eecb3b1461016d578063b3ab15fb14610175578063b53992831461019d578063c5c51dca146101c3578063d914cd4b146101cb578063edaabe0a146101f1576100a9565b8063201070ef146100ae57806332a9caba146100d2578063570ca735146101125780635744887d1461011a57806360cafe8414610150575b600080fd5b6100b6610217565b604080516001600160a01b039092168252519081900360200190f35b6100fe600480360360408110156100e857600080fd5b506001600160a01b038135169060200135610226565b604080519115158252519081900360200190f35b6100b661023b565b6100fe6004803603606081101561013057600080fd5b506001600160a01b0381358116916020810135909116906040013561024a565b6100fe6004803603602081101561016657600080fd5b503561034e565b6100b6610430565b61019b6004803603602081101561018b57600080fd5b50356001600160a01b0316610448565b005b6100fe600480360360208110156101b357600080fd5b50356001600160a01b03166104b1565b6100b66104c6565b6100fe600480360360208110156101e157600080fd5b50356001600160a01b03166104ea565b61019b6004803603602081101561020757600080fd5b50356001600160a01b03166104ff565b6002546001600160a01b031681565b60006102328383610568565b50600192915050565b6000546001600160a01b031681565b600080546001600160a01b03163314610292576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635744887d8585856040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561031a57600080fd5b505af115801561032e573d6000803e3d6000fd5b505050506040513d602081101561034457600080fd5b5051949350505050565b600080546001600160a01b03163314610396576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166360cafe84836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b505050506040513d602081101561042657600080fd5b5060019392505050565b732f50d538606fa9edd2b11e2446beb18c9d5846bb81565b6000546001600160a01b0316331461048f576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60016020526000908152604090205460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006104f7826003610568565b506001919050565b6000546001600160a01b03163314610546576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03821660009081526001602052604090205460ff16156105c1576040805162461bcd60e51b815260206004820152600860248201526708589b1bd8dad95960c21b604482015290519081900360640190fd5b816001600160a01b0316639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fa57600080fd5b505afa15801561060e573d6000803e3d6000fd5b505050506040513d602081101561062457600080fd5b505115610662576040805162461bcd60e51b8152602060048201526007602482015266085ada5b1b195960ca1b604482015290519081900360640190fd5b6000826001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561069d57600080fd5b505afa1580156106b1573d6000803e3d6000fd5b505050506040513d60208110156106c757600080fd5b505160408051633f14eb6160e11b81526001600160a01b03808416600483015286811660248301526044820186905291519293507f000000000000000000000000000000000000000000000000000000000000000090911691637e29d6c2916064808201926020929091908290030181600087803b15801561074857600080fd5b505af115801561075c573d6000803e3d6000fd5b505050506040513d602081101561077257600080fd5b50506002546001600160a01b03161561089f57600260009054906101000a90046001600160a01b03166001600160a01b0316634b8843d5848460017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663081e3eda6040518163ffffffff1660e01b815260040160206040518083038186803b15801561080657600080fd5b505afa15801561081a573d6000803e3d6000fd5b505050506040513d602081101561083057600080fd5b5051604080516001600160e01b031960e088901b1681526001600160a01b039095166004860152602485019390935203604483015251606480830192600092919082900301818387803b15801561088657600080fd5b505af115801561089a573d6000803e3d6000fd5b505050505b50505056fea2646970667358221220ce6255e311c0833efc84696f0edf314756787c265a2d703c8324e8f712b9772664736f6c634300060c0033000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806399eecb3b1161007157806399eecb3b1461016d578063b3ab15fb14610175578063b53992831461019d578063c5c51dca146101c3578063d914cd4b146101cb578063edaabe0a146101f1576100a9565b8063201070ef146100ae57806332a9caba146100d2578063570ca735146101125780635744887d1461011a57806360cafe8414610150575b600080fd5b6100b6610217565b604080516001600160a01b039092168252519081900360200190f35b6100fe600480360360408110156100e857600080fd5b506001600160a01b038135169060200135610226565b604080519115158252519081900360200190f35b6100b661023b565b6100fe6004803603606081101561013057600080fd5b506001600160a01b0381358116916020810135909116906040013561024a565b6100fe6004803603602081101561016657600080fd5b503561034e565b6100b6610430565b61019b6004803603602081101561018b57600080fd5b50356001600160a01b0316610448565b005b6100fe600480360360208110156101b357600080fd5b50356001600160a01b03166104b1565b6100b66104c6565b6100fe600480360360208110156101e157600080fd5b50356001600160a01b03166104ea565b61019b6004803603602081101561020757600080fd5b50356001600160a01b03166104ff565b6002546001600160a01b031681565b60006102328383610568565b50600192915050565b6000546001600160a01b031681565b600080546001600160a01b03163314610292576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b0316635744887d8585856040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561031a57600080fd5b505af115801561032e573d6000803e3d6000fd5b505050506040513d602081101561034457600080fd5b5051949350505050565b600080546001600160a01b03163314610396576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b03166360cafe84836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b505050506040513d602081101561042657600080fd5b5060019392505050565b732f50d538606fa9edd2b11e2446beb18c9d5846bb81565b6000546001600160a01b0316331461048f576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60016020526000908152604090205460ff1681565b7f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae3181565b60006104f7826003610568565b506001919050565b6000546001600160a01b03163314610546576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03821660009081526001602052604090205460ff16156105c1576040805162461bcd60e51b815260206004820152600860248201526708589b1bd8dad95960c21b604482015290519081900360640190fd5b816001600160a01b0316639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fa57600080fd5b505afa15801561060e573d6000803e3d6000fd5b505050506040513d602081101561062457600080fd5b505115610662576040805162461bcd60e51b8152602060048201526007602482015266085ada5b1b195960ca1b604482015290519081900360640190fd5b6000826001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561069d57600080fd5b505afa1580156106b1573d6000803e3d6000fd5b505050506040513d60208110156106c757600080fd5b505160408051633f14eb6160e11b81526001600160a01b03808416600483015286811660248301526044820186905291519293507f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae3190911691637e29d6c2916064808201926020929091908290030181600087803b15801561074857600080fd5b505af115801561075c573d6000803e3d6000fd5b505050506040513d602081101561077257600080fd5b50506002546001600160a01b03161561089f57600260009054906101000a90046001600160a01b03166001600160a01b0316634b8843d5848460017f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b031663081e3eda6040518163ffffffff1660e01b815260040160206040518083038186803b15801561080657600080fd5b505afa15801561081a573d6000803e3d6000fd5b505050506040513d602081101561083057600080fd5b5051604080516001600160e01b031960e088901b1681526001600160a01b039095166004860152602485019390935203604483015251606480830192600092919082900301818387803b15801561088657600080fd5b505af115801561089a573d6000803e3d6000fd5b505050505b50505056fea2646970667358221220ce6255e311c0833efc84696f0edf314756787c265a2d703c8324e8f712b9772664736f6c634300060c0033

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

000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31

-----Decoded View---------------
Arg [0] : _pools (address): 0xF403C135812408BFbE8713b5A23a04b3D48AAE31

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31


Block Transaction Difficulty 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
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.