# Router.sol

The `Router` contract serves as the central registry for key FUNC system contracts, managing their addresses and ensuring seamless integration and communication between components.

***

## Key Features

1. **Centralized Management**:
   * Stores and manages addresses of all core contracts within the FUNC ecosystem.
2. **Role-Based Access Control**:
   * Ensures only authorized entities can update the stored contract addresses.
3. **Initializable Design**:
   * Supports initialization to securely set up the contract with required addresses.
4. **Provider Staking Management**:
   * Links staking pools with models and facilitates updates.

***

## Roles and Access Control

* **`DEFAULT_ADMIN_ROLE`**:
  * Full administrative control over the contract.
  * Can update the addresses of core system contracts and staking pools.

***

## State Variables

### Core Contracts

* `providerStakingFactory`: Factory contract for creating provider staking pools.
* `providerRegistry`: Registry for managing providers.
* `providerCheckpoint`: Tracks provider state history and checkpoints.
* `gatewayStaking`: Manages staking operations for gateways.
* `gatewayRegistry`: Registry for managing gateways.
* `gatewayCheckpoint`: Tracks gateway state history and checkpoints.
* `epochController`: Handles epoch-based logic and scheduling.
* `permissions`: Manages permissions for providers and gateways.
* `treasury`: Treasury contract for managing funds.
* `model`: Model contract for managing models.
* `logic`: Logic contract for managing computation and reward functions.

### Provider Staking Pools

* `providerStakingPools`: Mapping of model IDs to their associated staking pools.

***

## Key Functions

### Initialization

#### `initialize`

Initializes the `Router` contract with addresses of all core contracts.

* **Parameters**:
  * `_initializeAddresses`: A struct containing the addresses of all required contracts.

***

### Contract Address Management

#### `setProviderStakingFactory`

Updates the `ProviderStakingFactory` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_providerStakingFactory`: New address of the `ProviderStakingFactory`.

#### `setProviderCheckpoint`

Updates the `ProviderCheckpoint` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_providerCheckpoint`: New address of the `ProviderCheckpoint`.

#### `setProviderRegistry`

Updates the `ProviderRegistry` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_providerRegistry`: New address of the `ProviderRegistry`.

#### `setGatewayStaking`

Updates the `GatewayStaking` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_gatewayStaking`: New address of the `GatewayStaking`.

#### `setGatewayCheckpoint`

Updates the `GatewayCheckpoint` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_gatewayCheckpoint`: New address of the `GatewayCheckpoint`.

#### `setGatewayRegistry`

Updates the `GatewayRegistry` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_gatewayRegistry`: New address of the `GatewayRegistry`.

#### `setEpochController`

Updates the `EpochController` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_epochController`: New address of the `EpochController`.

#### `setTreasury`

Updates the `Treasury` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_treasury`: New address of the `Treasury`.

#### `setPermissions`

Updates the `Permissions` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_permissions`: New address of the `Permissions`.

#### `setLogic`

Updates the `Logic` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_logic`: New address of the `Logic`.

#### `setModel`

Updates the `Model` address.

* **Access**: `DEFAULT_ADMIN_ROLE`
* **Parameters**:
  * `_model`: New address of the `Model`.

***

### Provider Staking Pool Management

#### `providerStaking`

Retrieves the staking pool associated with a given model ID.

* **Parameters**:
  * `_modelId`: Model ID to retrieve the staking pool for.
* **Returns**: Address of the associated `ProviderStaking` contract.

#### `setStakingPool`

Updates the staking pool associated with a given model ID.

* **Access**: `DEFAULT_ADMIN_ROLE` or `Model` contract.
* **Parameters**:
  * `_modelId`: Model ID to update.
  * `_stakingPool`: New staking pool address.

***

## Events

* **`ProviderStakingFactoryUpdated(IProviderStakingFactory providerStakingFactory)`**:
  * Emitted when the `ProviderStakingFactory` address is updated.
* **`ProviderCheckpointUpdated(IProviderCheckpoint providerCheckpoint)`**:
  * Emitted when the `ProviderCheckpoint` address is updated.
* **`ProviderRegistryUpdated(IProviderRegistry providerRegistry)`**:
  * Emitted when the `ProviderRegistry` address is updated.
* **`GatewayStakingUpdated(IGatewayStaking gatewayStaking)`**:
  * Emitted when the `GatewayStaking` address is updated.
* **`GatewayCheckpointUpdated(IGatewayCheckpoint gatewayCheckpoint)`**:
  * Emitted when the `GatewayCheckpoint` address is updated.
* **`GatewayRegistryUpdated(IGatewayRegistry gatewayRegistry)`**:
  * Emitted when the `GatewayRegistry` address is updated.
* **`EpochControllerUpdated(IEpochController epochController)`**:
  * Emitted when the `EpochController` address is updated.
* **`TreasuryUpdated(ITreasury treasury)`**:
  * Emitted when the `Treasury` address is updated.
* **`PermissionsUpdated(IPermissions permissions)`**:
  * Emitted when the `Permissions` address is updated.
* **`LogicUpdated(ILogic logic)`**:
  * Emitted when the `Logic` address is updated.
* **`ModelUpdated(IModel model)`**:
  * Emitted when the `Model` address is updated.
* **`ProviderStakingUpdated(uint256 modelId, IProviderStaking stakingPool)`**:
  * Emitted when the staking pool for a model is updated.

***

## Fallback Functions

* **`receive()`**: Rejects Ether transfers.
* **`fallback()`**: Rejects Ether transfers and invalid calls.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.function.network/function-network/contracts/router.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
