RootChainGaugeFactory
The RootChainLiquiditiyGaugeFactory is used to deploy Root- and ChildGauges. For further implementation details pelase refer to this.
Contract Source & Deployment
RootChainGaugeFactory contract is deployed on the Ethereum mainnet at: 0xabC000d88f23Bb45525E447528DBF656A9D55bf5. 
 Source code available on Github. 
Transmitting Emissions¶
transmit_emissions¶
 RootChainFactory.transmit_emissions(_gauge: address):
Function to call transmit_emissions an RootGauge _gauge. Mints and transmits emissions to sidechains/L2.
| Input | Type | Description | 
|---|---|---|
_gauge |  address |  RootChainGauge Address | 
Info
transmit_emissions can also be called on the RootGauge itself.
Source code
@external
def transmit_emissions(_gauge: address):
    """
    @notice Call `transmit_emissions` on a root gauge
    @dev Entrypoint for anycall to request emissions for a child gauge.
        The way that gauges work, this can also be called on the root
        chain without a request.
    """
    # in most cases this will return True
    # for special bridges *cough cough Multichain, we can only do
    # one bridge per tx, therefore this will verify msg.sender in [tx.origin, self.call_proxy]
    assert Bridger(RootGauge(_gauge).bridger()).check(msg.sender)
    RootGauge(_gauge).transmit_emissions()
Implementations and Gauges¶
The RootChainGaugeFactory uses implementations to create ChildGauges through this implementation.
get_implementation¶
 RootChainFactory.get_implementation() -> address: view
Getter for the RootChainLiquidityGauge implementation.
Returns: implementation (address).
Source code
get_implementation: public(address)
@external
def set_implementation(_implementation: address):
    """
    @notice Set the implementation
    @param _implementation The address of the implementation to use
    """
    assert msg.sender == self.owner  # dev: only owner
    log UpdateImplementation(self.get_implementation, _implementation)
    self.get_implementation = _implementation
set_implementation¶
 RootChainFactory.set_implementation(_implementation: address):
Guarded Method
This function is only callable by the owner of the contract.
Function to set the RootGauge implementation.
Emits: UpdateImplementation
| Input | Type | Description | 
|---|---|---|
_implementation |  address |  RootGauge Implementation | 
Source code
event UpdateImplementation:
    _old_implementation: address
    _new_implementation: address
get_implementation: public(address)    
@external
def set_implementation(_implementation: address):
    """
    @notice Set the implementation
    @param _implementation The address of the implementation to use
    """
    assert msg.sender == self.owner  # dev: only owner
    log UpdateImplementation(self.get_implementation, _implementation)
    self.get_implementation = _implementation
get_gauge¶
 RootChainFactory.get_gauge(arg0: uint256, arg1: uint256) -> address: view
Getter for the liquidity gauge address at index arg1 on chain arg0 (ID).
Returns: gauge (address).
| Input | Type | Description | 
|---|---|---|
arg0 |  uint256 |  Chain ID | 
arg0 |  uint256 |  Gauge Index | 
get_gauge_count¶
 RootChainFactory.get_gauge(arg0: uint256, arg1: uint256) -> address: view
Getter for the number of gauges deployed on a specific chain.
Returns: gauge (address).
| Input | Type | Description | 
|---|---|---|
arg0 |  uint256 |  Chain ID | 
arg1 |  uint256 |  Gauge Index | 
Source code
get_gauge_count: public(HashMap[uint256, uint256])
@payable
@external
def deploy_gauge(_chain_id: uint256, _salt: bytes32) -> address:
    """
    @notice Deploy a root liquidity gauge
    @param _chain_id The chain identifier of the counterpart child gauge
    @param _salt A value to deterministically deploy a gauge
    """
    bridger: address = self.get_bridger[_chain_id]
    assert bridger != ZERO_ADDRESS  # dev: chain id not supported
    implementation: address = self.get_implementation
    gauge: address = create_forwarder_to(
        implementation,
        value=msg.value,
        salt=keccak256(_abi_encode(_chain_id, msg.sender, _salt))
    )
    idx: uint256 = self.get_gauge_count[_chain_id]
    self.get_gauge[_chain_id][idx] = gauge
    self.get_gauge_count[_chain_id] = idx + 1
    self.is_valid_gauge[gauge] = True
    RootGauge(gauge).initialize(bridger, _chain_id)
    log DeployedGauge(implementation, _chain_id, msg.sender, _salt, gauge)
    return gauge
is_valid_gauge¶
 RootChainFactory.get_gauge(arg0: address) -> bool: view
Getter method to check if gauge arg0 is valid.
Returns: gauge (address).
| Input | Type | Description | 
|---|---|---|
arg0 |  uint256 |  Chain ID | 
arg0 |  uint256 |  Gauge Index | 
Source code
is_valid_gauge: public(HashMap[address, bool])
@payable
@external
def deploy_gauge(_chain_id: uint256, _salt: bytes32) -> address:
    """
    @notice Deploy a root liquidity gauge
    @param _chain_id The chain identifier of the counterpart child gauge
    @param _salt A value to deterministically deploy a gauge
    """
    bridger: address = self.get_bridger[_chain_id]
    assert bridger != ZERO_ADDRESS  # dev: chain id not supported
    implementation: address = self.get_implementation
    gauge: address = create_forwarder_to(
        implementation,
        value=msg.value,
        salt=keccak256(_abi_encode(_chain_id, msg.sender, _salt))
    )
    idx: uint256 = self.get_gauge_count[_chain_id]
    self.get_gauge[_chain_id][idx] = gauge
    self.get_gauge_count[_chain_id] = idx + 1
    self.is_valid_gauge[gauge] = True
    RootGauge(gauge).initialize(bridger, _chain_id)
    log DeployedGauge(implementation, _chain_id, msg.sender, _salt, gauge)
    return gauge
Deploying Gauges¶
deploy_gauge¶
 RootChainFactory.deploy_gauge(_chain_id: uint256, _salt: bytes32) -> address:
Function to deploy a RootGauge.
Returns: gauge (address).
Emits: DeployedGauge
| Input | Type | Description | 
|---|---|---|
_chain_id |  uint256 |  Chain ID | 
_salt |  bytes32 |  todo | 
Source code
event DeployedGauge:
    _implementation: indexed(address)
    _chain_id: indexed(uint256)
    _deployer: indexed(address)
    _salt: bytes32
    _gauge: address
@payable
@external
def deploy_gauge(_chain_id: uint256, _salt: bytes32) -> address:
    """
    @notice Deploy a root liquidity gauge
    @param _chain_id The chain identifier of the counterpart child gauge
    @param _salt A value to deterministically deploy a gauge
    """
    bridger: address = self.get_bridger[_chain_id]
    assert bridger != ZERO_ADDRESS  # dev: chain id not supported
    implementation: address = self.get_implementation
    gauge: address = create_forwarder_to(
        implementation,
        value=msg.value,
        salt=keccak256(_abi_encode(_chain_id, msg.sender, _salt))
    )
    idx: uint256 = self.get_gauge_count[_chain_id]
    self.get_gauge[_chain_id][idx] = gauge
    self.get_gauge_count[_chain_id] = idx + 1
    self.is_valid_gauge[gauge] = True
    RootGauge(gauge).initialize(bridger, _chain_id)
    log DeployedGauge(implementation, _chain_id, msg.sender, _salt, gauge)
    return gauge
deploy_child_gauge¶
 RootChainFactory.deploy_gauge(_chain_id: uint256, _salt: bytes32) -> address:
Function to deploy a ChildGauge.
| Input | Type | Description | 
|---|---|---|
_chain_id |  uint256 |  Chain ID | 
_salt |  bytes32 |  todo | 
_manager |  bytes32 |  Gauge Manager | 
Source code
@external
def deploy_child_gauge(_chain_id: uint256, _lp_token: address, _salt: bytes32, _manager: address = msg.sender):
    bridger: address = self.get_bridger[_chain_id]
    assert bridger != ZERO_ADDRESS  # dev: chain id not supported
    CallProxy(self.call_proxy).anyCall(
        self,
        _abi_encode(
            _lp_token,
            _salt,
            _manager,
            method_id=method_id("deploy_gauge(address,bytes32,address)")
        ),
        ZERO_ADDRESS,
        _chain_id
    )
Call Proxy and Bridgers¶
Different bridgers for different chains!
call_proxy¶
 RootChainFactory.integrate_fraction(_user: address) -> uint256:
Getter for the anycall proxy.
Returns: anycall proxy (address).
Source code
get_bridger¶
 RootChainFactory.get_bridger(arg0: uint256) -> address: view
Getter for the bridger contract for chain id arg0.
Returns: bridger contract (address).
| Input | Type | Description | 
|---|---|---|
arg0 |  uint256 |  Chain ID | 
set_call_proxy¶
 RootChainFactory.set_call_proxy(_new_call_proxy: address):
Guarded Method
This function is only callable by the owner of the contract.
Function to set a new call proxy contract.
Emits: UpdateCallProxy
| Input | Type | Description | 
|---|---|---|
_new_call_proxy |  address |  New CallProxy Contract | 
Source code
event UpdateCallProxy:
    _old_call_proxy: address
    _new_call_proxy: address
@external
def set_call_proxy(_new_call_proxy: address):
    """
    @notice Set the address of the call proxy used
    @dev _new_call_proxy should adhere to the same interface as defined
    @param _new_call_proxy Address of the cross chain call proxy
    """
    assert msg.sender == self.owner
    log UpdateCallProxy(self.call_proxy, _new_call_proxy)
    self.call_proxy = _new_call_proxy
set_bridger¶
 RootChainFactory.set_bridger(_chain_id: uint256, _bridger: address):
Guarded Method
This function is only callable by the owner of the contract.
Function to set new bridger contract _bridger for _chain_id.
Emits: BridgerUpdated
| Input | Type | Description | 
|---|---|---|
_chain_id |  uint256 |  Chain ID | 
_bridger |  address |  New Bridger Contract | 
Source code
event BridgerUpdated:
    _chain_id: indexed(uint256)
    _old_bridger: address
    _new_bridger: address
@external
def set_bridger(_chain_id: uint256, _bridger: address):
    """
    @notice Set the bridger for `_chain_id`
    @param _chain_id The chain identifier to set the bridger for
    @param _bridger The bridger contract to use
    """
    assert msg.sender == self.owner  # dev: only owner
    log BridgerUpdated(_chain_id, self.get_bridger[_chain_id], _bridger)
    self.get_bridger[_chain_id] = _bridger
Admin Ownership¶
owner¶
 RootChainFactory.owner() -> address: view
Getter for the owner of the RootChainFactory.
Returns: owner (address).
future_owner¶
 RootChainFactory.future_owner() -> address: view
Getter for the future owner of the RootChainFactory.
Returns: future owner (address).
commit_transfer_ownership¶
 RootChainFactory.commit_transfer_ownership(_future_owner: address):
Guarded Method
This function is only callable by the owner of the contract.
Function to commit the transfer of contract ownership to _future_owner.
| Input | Type | Description | 
|---|---|---|
_future_owner |  address |  Future Owner | 
Source code
owner: public(address)
future_owner: public(address)
@external
def commit_transfer_ownership(_future_owner: address):
    """
    @notice Transfer ownership to `_future_owner`
    @param _future_owner The account to commit as the future owner
    """
    assert msg.sender == self.owner  # dev: only owner
    self.future_owner = _future_owner
accept_transfer_ownership¶
 RootChainFactory.accept_transfer_ownership():
Guarded Method
This function is only callable by the future_owner of the contract.
Function to accept the transfer of ownership.
Emits: TransferOwnership
Source code
event TransferOwnership:
    _old_owner: address
    _new_owner: address
owner: public(address)
future_owner: public(address)
@external
def accept_transfer_ownership():
    """
    @notice Accept the transfer of ownership
    @dev Only the committed future owner can call this function
    """
    assert msg.sender == self.future_owner  # dev: only future owner
    log TransferOwnership(self.owner, msg.sender)
    self.owner = msg.sender