# GatewayStaking.sol

The `GatewayStaking` contract facilitates staking of FUNC tokens for gateways, enabling operations like staking, unstaking, usage tracking, and balance management. It integrates with other ecosystem components for secure and efficient functionality.

***

## Key Features

1. **FUNC Token Staking**:
   * Users can stake FUNC tokens for specific gateways.
   * Supports secure and efficient staking with role-based access controls.
2. **Gateway Lifecycle Management**:
   * Includes operations to wind down gateways, restart them, and track their states.
3. **Overdraw Handling**:
   * Tracks overdrawn stakes for gateways and adjusts balances accordingly.
4. **Burn Functionality**:
   * Implements optional burning of FUNC tokens during gateway operations.
5. **Integration with Ecosystem**:
   * Interacts with Router, GatewayRegistry, and GatewayCheckpoint contracts.

***

## Contract Roles

### Access Control

The contract uses `AccessControlledPausable` for role-based access and pause functionality.

* **`DEFAULT_ADMIN_ROLE`**:
  * Grants access to administrative functions like toggling burn functionality.
* **`onlyCheckpoint` Modifier**:
  * Restricts certain functions to the GatewayCheckpoint contract.

***

## Data Structures

### Gateway State

* **`gatewayShutdownEpochs`**: Tracks shutdown epochs for gateways.
* **`gatewayMostRecentStakeEpochs`**: Tracks the most recent staked epoch for gateways.
* **`gatewayStakeOverdrawn`**: Tracks overdrawn FUNC amounts for gateways.
* **`gatewayStakes`**: Tracks staked FUNC balances for gateways.

***

## Key Functions

### Constructor

#### `constructor(IERC20 _token, IRouter _router)`

Initializes the `GatewayStaking` contract.

* **Parameters**:
  * `_token`: Address of the FUNC ERC20 token contract.
  * `_router`: Address of the Router contract.

***

### Staking Operations

#### `stakeForGateway(bytes calldata _id, uint256 amount)`

Stakes FUNC tokens for a gateway.

* **Parameters**:
  * `_id`: ID of the gateway.
  * `amount`: Amount of FUNC tokens to stake.
* **Requirements**:
  * Gateway must be registered and whitelisted.
  * Caller must be the gateway owner or the registry.
* **Emits**:
  * `GatewayStaked`.

***

#### `unstakeForGateway(bytes calldata _id)`

Unstakes FUNC tokens for a gateway.

* **Parameters**:
  * `_id`: ID of the gateway.
* **Requirements**:
  * Gateway must meet conditions like being shut down and not overdrawn.
  * Minimum epochs locked must be satisfied.
* **Emits**:
  * `GatewayUnstaked`.

***

#### `windDownGateways(bytes[] calldata _gatewayIdsToWindDown)`

Winds down specified gateways.

* **Parameters**:
  * `_gatewayIdsToWindDown`: List of gateway IDs to wind down.
* **Emits**:
  * `GatewayWoundDown`.

***

### Burn and Usage Tracking

#### `checkpointUpdateGatewayUsage(bytes[] calldata _gatewayIds, uint256[] calldata _computeUnits)`

Updates gateway usage and burns FUNC tokens if enabled.

* **Parameters**:
  * `_gatewayIds`: List of gateway IDs.
  * `_computeUnits`: Compute units consumed by the gateways.

***

#### `toggleBurn()`

Toggles the burn functionality.

* **Emits**:
  * `BurnToggled`.

***

### Gateway State Management

#### `restartGateway(bytes calldata _id)`

Restarts a gateway by resetting its shutdown state.

* **Parameters**:
  * `_id`: ID of the gateway.
* **Emits**:
  * `GatewayRestarted`.

***

### Query Functions

#### `getAvailableComputeUnitsForGateways(bytes[] calldata _ids)`

Returns available compute units for specified gateways.

* **Parameters**:
  * `_ids`: List of gateway IDs.
* **Returns**:
  * Array of available compute units for each gateway.

***

#### `getGatewayShutdownEpoch(bytes calldata _id)`

Returns the shutdown epoch for a gateway.

* **Parameters**:
  * `_id`: ID of the gateway.
* **Returns**:
  * Shutdown epoch or `0` if not shut down.

***

#### `getGatewayMostRecentStakedEpoch(bytes calldata _id)`

Returns the most recent staked epoch for a gateway.

* **Parameters**:
  * `_id`: ID of the gateway.
* **Returns**:
  * Most recent staked epoch.

***

#### `getGatewayStakeOverdrawnAmount(bytes calldata _id)`

Returns the overdrawn FUNC amount for a gateway.

* **Parameters**:
  * `_id`: ID of the gateway.
* **Returns**:
  * Overdrawn FUNC amount.

***

#### `getGatewayStakedAmount(bytes calldata _id)`

Returns the staked FUNC amount for a gateway.

* **Parameters**:
  * `_id`: ID of the gateway.
* **Returns**:
  * Staked FUNC amount.

***

#### `getGatewayTotalBalance()`

Returns the total FUNC balance staked across all gateways.

* **Returns**:
  * Total staked FUNC balance.

***

## Events

* **`GatewayStaked(bytes id, uint256 epoch, uint256 amount)`**\
  Emitted when FUNC is staked for a gateway.
* **`GatewayUnstaked(bytes id, uint256 epoch, uint256 amount)`**\
  Emitted when FUNC is unstaked for a gateway.
* **`GatewayWoundDown(bytes id, uint256 epoch)`**\
  Emitted when a gateway is wound down.
* **`GatewayRestarted(bytes id, uint256 epoch)`**\
  Emitted when a gateway is restarted.
* **`GatewayBurn(bytes id, uint256 epoch, uint256 amount)`**\
  Emitted when FUNC is burned during a gateway operation.
* **`GatewayOverdrawn(bytes id, uint256 epoch, uint256 amount)`**\
  Emitted when a gateway becomes overdrawn.
* **`BurnToggled()`**\
  Emitted when burn functionality is toggled.


---

# 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/gatewaystaking.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.
