# ProviderCheckpoint.sol

The `ProviderCheckpoint` contract manages state tracking, checkpoint creation, and reward distribution for Providers. It integrates with other system components, including the Router, to facilitate operations like staking, unstaking, and rewards management.

***

## Key Features

1. **Provider Checkpoints**:
   * Tracks provider-related operations (e.g., staking, unstaking, rewards) using operation checkpoints.
2. **Scheduler Integration**:
   * Creates scheduler checkpoints for models to aggregate and finalize shard contributions and rewards.
3. **Reward Management**:
   * Tracks and finalizes provider reward checkpoints for specific epochs.
4. **Access Control**:
   * Securely restricts functions to admin or scheduler roles.
5. **Router Integration**:
   * Facilitates interactions with other system components via the Router.

***

## Roles

### Access Control

The contract uses `AccessControl` to manage roles and permissions.

* **`DEFAULT_ADMIN_ROLE`**:
  * Grants full administrative access to the contract.
* **`SCHEDULER_ROLE`**:
  * Allows schedulers to perform operations like creating checkpoints.

***

## State Variables

* **Router Reference**:
  * `router`: The Router contract used to interact with other system components.
* **Checkpoint Mappings**:
  * `providerSchedulerCheckpoints`: Maps model IDs and epochs to scheduler checkpoints.
  * `providerOperationCheckpoints`: Maps model IDs to an array of operation checkpoints.
  * `providerOperationCheckpointsByEpoch`: Maps model IDs and epochs to an array of operation checkpoints.
  * `providerRewardCheckpoints`: Maps provider IDs and epochs to reward checkpoints.
  * `shardSumsForEpoch`: Tracks the sum of shards for each model ID and epoch.
  * `providerShardsInEpoch`: Tracks provider shards for each model ID and epoch.
  * `rewardCheckpointBatch`: Tracks the reward batch ID for each model ID and epoch.
* **Last Updated Epoch**:
  * `lastSchedulerUpdatedEpochForModel`: Tracks the last epoch where a scheduler checkpoint was updated for each model.

***

## Key Functions

### Constructor

#### `constructor(IRouter _router)`

Initializes the contract and assigns the deployer the `DEFAULT_ADMIN_ROLE`.

* **Parameters**:
  * `_router`: Address of the `Router` contract.

***

### Checkpoint Creation

#### `createProviderRewardsCheckpoints`

Creates provider reward checkpoints for a specified model ID and epoch.

* **Parameters**:
  * `_batchId`: The reward batch ID.
  * `_modelId`: The ID of the model.
  * `_epoch`: The epoch for the rewards.
  * `_providerShards`: Array of provider shards contributing to the rewards.
* **Access Control**:
  * Callable by accounts with `DEFAULT_ADMIN_ROLE` or `SCHEDULER_ROLE`.

***

#### `createProviderSchedulerCheckpoint`

Creates a scheduler checkpoint for a specified model ID and epoch.

* **Parameters**:
  * `_modelId`: The ID of the model.
  * `_epoch`: The epoch for the checkpoint.
  * `_totalShards`: Total shards in the epoch.
  * `_totalRewardsForEpoch`: Total rewards for the epoch.
  * `_expectedRewardBatchId`: The expected batch ID for rewards.
* **Access Control**:
  * Callable by accounts with `DEFAULT_ADMIN_ROLE` or `SCHEDULER_ROLE`.

***

#### `createProviderOperationCheckpoint`

Creates an operation checkpoint for a specific provider.

* **Parameters**:
  * `_id`: The ID of the provider.
  * `_amount`: The amount involved in the operation.
  * `_poolBalanceAfterOperation`: The balance after the operation.
  * `_operation`: The type of operation (unstake, stake, or claim rewards).
* **Access Control**:
  * Callable only by authorized staking addresses.

***

### Data Retrieval

#### `getProviderSchedulerCheckpoint`

Retrieves the scheduler checkpoint for a specified model ID and epoch.

* **Parameters**:
  * `_modelId`: The ID of the model.
  * `_epoch`: The epoch for which the checkpoint is requested.
* **Returns**:
  * A `ProviderSchedulerCheckpoint` struct.

***

#### `getProviderOperationCheckpoints`

Retrieves all operation checkpoints for a specified model ID.

* **Parameters**:
  * `_modelId`: The ID of the model.
* **Returns**:
  * An array of `ProviderOperationCheckpoint` structs.

***

#### `getProviderOperationCheckpointsByEpoch`

Retrieves operation checkpoints for a specific model ID and epoch.

* **Parameters**:
  * `_modelId`: The ID of the model.
  * `_epoch`: The epoch for which the checkpoints are requested.
* **Returns**:
  * An array of `ProviderOperationCheckpoint` structs.

***

#### `getProviderRewardCheckpoint`

Retrieves the reward checkpoint for a specific provider ID and epoch.

* **Parameters**:
  * `_id`: The ID of the provider.
  * `_epoch`: The epoch for which the reward checkpoint is requested.
* **Returns**:
  * A `ProviderRewardCheckpoint` struct.

***

## Events

* **`ProviderSchedulerCheckpointUpdated(uint256 indexed modelId, uint256 indexed epoch)`**:
  * Emitted when a scheduler checkpoint is updated.
* **`ProviderOperationCheckpointUpdated(bytes id, uint256 amount, uint8 operation)`**:
  * Emitted when an operation checkpoint is created.
