ETH Price: $2,475.76 (+1.06%)

Contract

0x1D0fdCb628b2f8c0e22354d45B3B2D4cE9936F8B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Register195744632024-04-03 9:50:11192 days ago1712137811IN
Yearn: Gauge registry
0 ETH0.0028937723.51933846
Register195744472024-04-03 9:46:59192 days ago1712137619IN
Yearn: Gauge registry
0 ETH0.0025552120.76770748
Register195744432024-04-03 9:46:11192 days ago1712137571IN
Yearn: Gauge registry
0 ETH0.0028208422.92659841
Set_management195740912024-04-03 8:34:47192 days ago1712133287IN
Yearn: Gauge registry
0 ETH0.0010411322.16974514
Register195740872024-04-03 8:33:59192 days ago1712133239IN
Yearn: Gauge registry
0 ETH0.0025730121.37939455
Register195740842024-04-03 8:33:23192 days ago1712133203IN
Yearn: Gauge registry
0 ETH0.0026202721.77210495
Register195740802024-04-03 8:32:35192 days ago1712133155IN
Yearn: Gauge registry
0 ETH0.0024240120.14140672
Register195740762024-04-03 8:31:47192 days ago1712133107IN
Yearn: Gauge registry
0 ETH0.0025182120.92413514
Register195740732024-04-03 8:31:11192 days ago1712133071IN
Yearn: Gauge registry
0 ETH0.0028579520.79271182
0x3461004d195739152024-04-03 7:59:11192 days ago1712131151IN
 Create: Gauge registry
0 ETH0.0116001823.92541442

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Gauge registry

Compiler Version
vyper:0.3.10

Optimization Enabled:
N/A

Other Settings:
GNU AGPLv3 license

Contract Source Code (Vyper language format)

# @version 0.3.10
"""
@title Gauge registry
@author Yearn Finance
@license GNU AGPLv3
@notice
    Registry for approved gauges.
    Gauges can be added by governance, which makes them eligible
    to be voted on in the gauge controller.
    Each registered gauge corresponds to a unique underlying vault.
"""

interface Controller:
    def whitelist(_gauge: address, _whitelisted: bool): nonpayable

interface Factory:
    def gauge_versions(_gauge: address) -> uint256: view

interface Gauge:
    def asset() -> address: view

management: public(address)
pending_management: public(address)
controller: public(Controller)
factory: public(Factory)

vault_count: public(uint256)
vaults: public(address[99999])
vault_gauge_map: public(HashMap[address, address]) # vault => gauge

event Register:
    gauge: indexed(address)
    idx: uint256

event Deregister:
    gauge: indexed(address)
    idx: uint256

event UpdateIndex:
    old_idx: indexed(uint256)
    idx: uint256

event SetController:
    controller: address

event SetFactory:
    factory: address

event PendingManagement:
    management: indexed(address)

event SetManagement:
    management: indexed(address)

@external
def __init__(_controller: address, _factory: address):
    """
    @notice Constructor
    @param _controller Gauge controller
    @param _factory Gauge factory
    """
    self.management = msg.sender
    self.controller = Controller(_controller)
    self.factory = Factory(_factory)

@external
@view
def gauges(_idx: uint256) -> address:
    """
    @notice Get a gauge at a certain index in the list
    @param _idx Index of the gauge
    @return Gauge at the specified index
    """
    vault: address = self.vaults[_idx]
    assert vault != empty(address)
    return self.vault_gauge_map[vault]

@external
def register(_gauge: address) -> uint256:
    """
    @notice Add a gauge to the registry
    @param _gauge Gauge address
    @return Index of the vault
    @dev Gauge has to originate from the factory
    @dev Underlying vault cannot already have a registered gauge
    @dev Only callable by management
    """
    assert msg.sender == self.management
    assert self.factory.gauge_versions(_gauge) > 0
    vault: address = Gauge(_gauge).asset()
    assert self.vault_gauge_map[vault] == empty(address)

    idx: uint256 = self.vault_count
    self.vault_count = idx + 1
    self.vaults[idx] = vault
    self.vault_gauge_map[vault] = _gauge
    self.controller.whitelist(_gauge, True)
    log Register(_gauge, idx)
    return idx

@external
def deregister(_gauge: address, _idx: uint256):
    """
    @notice Remove a gauge from the registry
    @param _gauge Gauge address
    @param _idx Vault index
    @dev Only callable by management
    """
    assert msg.sender == self.management
    vault: address = Gauge(_gauge).asset()
    assert self.vault_gauge_map[vault] == _gauge
    assert self.vaults[_idx] == vault

    # swap last entry in array with the one being deleted
    # and shorten array by one
    max_idx: uint256 = self.vault_count - 1
    self.vault_count = max_idx
    log Deregister(_gauge, _idx)
    if _idx != max_idx:
        self.vaults[_idx] = self.vaults[max_idx]
        log UpdateIndex(max_idx, _idx)
    self.vaults[max_idx] = empty(address)
    self.vault_gauge_map[vault] = empty(address)
    self.controller.whitelist(_gauge, False)

@external
@view
def registered(_gauge: address) -> bool:
    """
    @notice Check whether a gauge is registered
    @param _gauge Gauge address
    @return Registration status
    """
    vault: address = Gauge(_gauge).asset()
    return self.vault_gauge_map[vault] == _gauge

@external
def set_controller(_controller: address):
    """
    @notice Set a new gauge controller
    @param _controller New gauge controller
    @dev Only callable by management
    """
    assert msg.sender == self.management
    assert _controller != empty(address)
    self.controller = Controller(_controller)
    log SetController(_controller)

@external
def set_factory(_factory: address):
    """
    @notice Set a new factory
    @param _factory New factory
    @dev Only callable by management
    """
    assert msg.sender == self.management
    assert _factory != empty(address)
    self.factory = Factory(_factory)
    log SetFactory(_factory)

@external
def set_management(_management: address):
    """
    @notice 
        Set the pending management address.
        Needs to be accepted by that account separately to transfer management over
    @param _management New pending management address
    """
    assert msg.sender == self.management
    self.pending_management = _management
    log PendingManagement(_management)

@external
def accept_management():
    """
    @notice 
        Accept management role.
        Can only be called by account previously marked as pending management by current management
    """
    assert msg.sender == self.pending_management
    self.pending_management = empty(address)
    self.management = msg.sender
    log SetManagement(msg.sender)

Contract Security Audit

Contract ABI

[{"name":"Register","inputs":[{"name":"gauge","type":"address","indexed":true},{"name":"idx","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Deregister","inputs":[{"name":"gauge","type":"address","indexed":true},{"name":"idx","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"UpdateIndex","inputs":[{"name":"old_idx","type":"uint256","indexed":true},{"name":"idx","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetController","inputs":[{"name":"controller","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetFactory","inputs":[{"name":"factory","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"PendingManagement","inputs":[{"name":"management","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"SetManagement","inputs":[{"name":"management","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_controller","type":"address"},{"name":"_factory","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"gauges","inputs":[{"name":"_idx","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"register","inputs":[{"name":"_gauge","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"deregister","inputs":[{"name":"_gauge","type":"address"},{"name":"_idx","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"registered","inputs":[{"name":"_gauge","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"set_controller","inputs":[{"name":"_controller","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_factory","inputs":[{"name":"_factory","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_management","inputs":[{"name":"_management","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"accept_management","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"management","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"pending_management","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"controller","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"factory","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"vault_count","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"vaults","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"vault_gauge_map","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"address"}]}]

3461004d5760206106f65f395f518060a01c61004d5760405260206107165f395f518060a01c61004d57606052335f5560405160025560605160035561069061005161000039610690610000f35b5f80fd5f3560e01c6002600c820660011b61067801601e395f51565b6388a8d60281186106705734610674575f5460405260206040f3610670565b63770817ec811861005357346106745760015460405260206040f35b63759be10c81186106705734610674576001543318610674575f600155335f55337fafe23f9e1f603b288748a507d5a993957e9f14313a5889d5a070851299939d595f6040a200610670565b63f77c4791811861067057346106745760025460405260206040f3610670565b63c45a0155811861067057346106745760035460405260206040f3610670565b63ed20cb3081186100fb57346106745760045460405260206040f35b63eef6c450811861067057604436103417610674576004358060a01c610674576040525f543318610674576040516338d52e0f608052602060806004609c845afa610148573d5f5f3e3d5ffd5b60203d10610674576080518060a01c6106745760c05260c0905051606052604051620186a46060516020525f5260405f205418610674576060516024356201869e811161067457600501541861067457600454600181038181116106745790506080526080516004556040517ff974f9b9976eab09e5a66d08a91feff28233bd865bdc3124015b69640bb31f4560243560a052602060a0a26080516024351461023d576080516201869e811161067457600501546024356201869e811161067457600501556080517fc9d12a7659bfe5207e3439ef54f3218cb66f9fe3ec60af9da1f1c8878533cb4660243560a052602060a0a25b5f6080516201869e811161067457600501555f620186a46060516020525f5260405f205560025463f59c370860a05260405160c0525f60e052803b15610674575f60a0604460bc5f855af1610294573d5f5f3e3d5ffd5b5000610670565b638c64ea4a81186102ca57602436103417610674576004356201869e8111610674576005015460405260206040f35b6391b10ffa811861067057602436103417610674576004358060a01c610674576040525f5433186106745760405115610674576040516002557f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f7060405160605260206060a100610670565b63dfe3d284811861037257602436103417610674576004358060a01c61067457604052620186a46040516020525f5260405f205460605260206060f35b63fd066ecc811861067057602436103417610674576004358060a01c610674576040525f543318610674576040516001556040517fe7b5cc087e6e47e33e86bdfe4720b7e849891938b18ff6e0c3f92299de79e60c5f6060a200610670565b63b0539187811861067057602436103417610674576004356201869e811161067457600501546040526040511561067457620186a46040516020525f5260405f205460605260206060f3610670565b634420e486811861067057602436103417610674576004358060a01c610674576040525f5433186106745760035463a0d4b907606052604051608052602060606024607c845afa610473573d5f5f3e3d5ffd5b60203d1061067457606090505115610674576040516338d52e0f608052602060806004609c845afa6104a7573d5f5f3e3d5ffd5b60203d10610674576080518060a01c6106745760c05260c0905051606052620186a46060516020525f5260405f205461067457600454608052608051600181018181106106745790506004556060516080516201869e81116106745760050155604051620186a46060516020525f5260405f205560025463f59c370860a05260405160c052600160e052803b15610674575f60a0604460bc5f855af161054f573d5f5f3e3d5ffd5b506040517e7dc6ab80cc84c043b7b8d4fcafc802187470087f7ea7fccd2e17aecd0256a160805160a052602060a0a260206080f3610670565b63b2dd5c07811861060957602436103417610674576004358060a01c610674576040526040516338d52e0f608052602060806004609c845afa6105cd573d5f5f3e3d5ffd5b60203d10610674576080518060a01c6106745760c05260c0905051606052604051620186a46060516020525f5260405f20541460805260206080f35b63ee2af3fb811861067057602436103417610674576004358060a01c610674576040525f5433186106745760405115610674576040516003557f1c893ef9379093af30f458b9e74d2aba13c499660b68dec5e29af7b199c188b960405160605260206060a1005b5f5ffd5b5f80fd03350670029b058800df009f04200670003700bf001803d18419069081181800a16576797065728300030a001500000000000000000000000046b38522422d597ddbaa2d6e98d6c9b397028d5b00000000000000000000000043cfc64f00b4e45619cfbc7964d982fa022e0b91

Deployed Bytecode

0x5f3560e01c6002600c820660011b61067801601e395f51565b6388a8d60281186106705734610674575f5460405260206040f3610670565b63770817ec811861005357346106745760015460405260206040f35b63759be10c81186106705734610674576001543318610674575f600155335f55337fafe23f9e1f603b288748a507d5a993957e9f14313a5889d5a070851299939d595f6040a200610670565b63f77c4791811861067057346106745760025460405260206040f3610670565b63c45a0155811861067057346106745760035460405260206040f3610670565b63ed20cb3081186100fb57346106745760045460405260206040f35b63eef6c450811861067057604436103417610674576004358060a01c610674576040525f543318610674576040516338d52e0f608052602060806004609c845afa610148573d5f5f3e3d5ffd5b60203d10610674576080518060a01c6106745760c05260c0905051606052604051620186a46060516020525f5260405f205418610674576060516024356201869e811161067457600501541861067457600454600181038181116106745790506080526080516004556040517ff974f9b9976eab09e5a66d08a91feff28233bd865bdc3124015b69640bb31f4560243560a052602060a0a26080516024351461023d576080516201869e811161067457600501546024356201869e811161067457600501556080517fc9d12a7659bfe5207e3439ef54f3218cb66f9fe3ec60af9da1f1c8878533cb4660243560a052602060a0a25b5f6080516201869e811161067457600501555f620186a46060516020525f5260405f205560025463f59c370860a05260405160c0525f60e052803b15610674575f60a0604460bc5f855af1610294573d5f5f3e3d5ffd5b5000610670565b638c64ea4a81186102ca57602436103417610674576004356201869e8111610674576005015460405260206040f35b6391b10ffa811861067057602436103417610674576004358060a01c610674576040525f5433186106745760405115610674576040516002557f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f7060405160605260206060a100610670565b63dfe3d284811861037257602436103417610674576004358060a01c61067457604052620186a46040516020525f5260405f205460605260206060f35b63fd066ecc811861067057602436103417610674576004358060a01c610674576040525f543318610674576040516001556040517fe7b5cc087e6e47e33e86bdfe4720b7e849891938b18ff6e0c3f92299de79e60c5f6060a200610670565b63b0539187811861067057602436103417610674576004356201869e811161067457600501546040526040511561067457620186a46040516020525f5260405f205460605260206060f3610670565b634420e486811861067057602436103417610674576004358060a01c610674576040525f5433186106745760035463a0d4b907606052604051608052602060606024607c845afa610473573d5f5f3e3d5ffd5b60203d1061067457606090505115610674576040516338d52e0f608052602060806004609c845afa6104a7573d5f5f3e3d5ffd5b60203d10610674576080518060a01c6106745760c05260c0905051606052620186a46060516020525f5260405f205461067457600454608052608051600181018181106106745790506004556060516080516201869e81116106745760050155604051620186a46060516020525f5260405f205560025463f59c370860a05260405160c052600160e052803b15610674575f60a0604460bc5f855af161054f573d5f5f3e3d5ffd5b506040517e7dc6ab80cc84c043b7b8d4fcafc802187470087f7ea7fccd2e17aecd0256a160805160a052602060a0a260206080f3610670565b63b2dd5c07811861060957602436103417610674576004358060a01c610674576040526040516338d52e0f608052602060806004609c845afa6105cd573d5f5f3e3d5ffd5b60203d10610674576080518060a01c6106745760c05260c0905051606052604051620186a46060516020525f5260405f20541460805260206080f35b63ee2af3fb811861067057602436103417610674576004358060a01c610674576040525f5433186106745760405115610674576040516003557f1c893ef9379093af30f458b9e74d2aba13c499660b68dec5e29af7b199c188b960405160605260206060a1005b5f5ffd5b5f80fd03350670029b058800df009f04200670003700bf001803d1

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

00000000000000000000000046b38522422d597ddbaa2d6e98d6c9b397028d5b00000000000000000000000043cfc64f00b4e45619cfbc7964d982fa022e0b91

-----Decoded View---------------
Arg [0] : _controller (address): 0x46b38522422D597dDbAA2D6E98D6C9b397028d5B
Arg [1] : _factory (address): 0x43CfC64f00B4E45619cFBC7964D982fa022E0b91

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000046b38522422d597ddbaa2d6e98d6c9b397028d5b
Arg [1] : 00000000000000000000000043cfc64f00b4e45619cfbc7964d982fa022e0b91


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.