# Session Payment

The `SessionPayment` smart contract forms the **financial backbone** of the Cortensor session system. It manages **deposits, payments, and withdrawals** between users (sessions) and service providers (nodes/miners), ensuring a secure and transparent accounting process for AI inference services across the decentralized network.

***

### Purpose

* Allow users to deposit ETH or ERC20 tokens for session-based inference requests.
* Track session ownership and network contribution per session.
* Facilitate and allocate payments to nodes based on actual usage.
* Enable nodes to claim their earned payments securely.

***

### Inheritance

* **`AccessControl`**: Provides role-based permissions for contract functions.
* **`ReentrancyGuard`**: Prevents reentrant calls during fund transfers.

***

### Roles

| Role                    | Description                                                                         |
| ----------------------- | ----------------------------------------------------------------------------------- |
| `ADMIN_ROLE`            | Full administrative control for emergency actions or token recovery                 |
| `SESSION_CONTRACT_ROLE` | Authorized to call payment-related session functions (usually the Session contract) |

***

### Key Data Structures

* **`Account`**: Tracks session data like ID, owner, payment amount, and timestamps.
* **`sessionBalances`**: ETH/token balance associated with each session.
* **`nodeLastUsedTimestamps`**: Timestamp logs for node activity.
* **`sessions`**: Maps session IDs to owner addresses.
* **`sessionNetworkUsage`**: Records cumulative session payments made to the network.
* **`totalNetworkBalance`**: Tracks available funds for node payments.
* **`nodePendingPayments`**: Accumulated payments owed to nodes before withdrawal.

***

### Core Payment Flow

#### 1. Session Deposits

Users deposit ETH (or tokens) via `depositToSession`. Funds are held in the session’s internal balance.

#### 2. Network Contribution

Session-based tasks pay into the network treasury using `payFromSessionToNetwork`, recording usage via `sessionNetworkUsage`.

#### 3. Node Allocation

Payments are distributed to eligible nodes through `allocateNodePayments`, using tracked usage and performance metrics.

#### 4. Node Withdrawals

Nodes can withdraw earned funds via `withdrawNodePayment` once they’re allocated.

***

### Key Functions

#### Session Management

* `registerSession(sessionId, owner)`: Registers a new session.
* `getSessionBalance(sessionId)`: Returns balance of the session.
* `depositToSession(sessionId)`: Allows ETH deposits to a session.
* `withdrawFromSession(sessionId)`: Allows ETH withdrawal by session owner.

#### Network Treasury

* `payFromSessionToNetwork(sessionId, amount)`: Transfers balance from session to network.
* `getSessionNetworkUsage(sessionId)`: Returns total contribution of a session to the network.

#### Node Payments

* `allocateNodePayments(address[] nodes, uint256 amountPerNode)`: Allocates payments to active nodes.
* `withdrawNodePayment(address node)`: Allows nodes to withdraw their funds.
* `updateNodeLastUsedTimestamp(address node)`: Updates node's last usage.
* `deleteNodeLastUsedTimestamp(address node)`: Removes node usage entry.

#### Admin & Emergency

* `adminWithdrawToken(tokenAddress)`: Allows recovery of mistakenly sent tokens.
* Emergency ETH withdrawal for recovery and debugging.

***

### Security Features

* **Role-Based Access**: Only authorized contracts and admins can perform sensitive actions.
* **ReentrancyGuard**: Protects ETH withdrawal functions.
* **Balance & Session Validations**: Prevent overdrafts or unauthorized access.
* **Per-Session Tracking**: Clear accounting for funds paid into the network.

***

### Events

| Event                                    | Trigger                          |
| ---------------------------------------- | -------------------------------- |
| `DepositToSession(sessionId, amount)`    | When user deposits ETH           |
| `WithdrawFromSession(sessionId, amount)` | When session owner withdraws ETH |
| `SessionRegistered(sessionId, owner)`    | New session registration         |
| `NodeTimestampUpdated(node)`             | Node activity timestamp update   |
| `PaymentToNetwork(sessionId, amount)`    | Session pays into the network    |
| `NodePaymentAllocated(node, amount)`     | Payment allocated to node        |
| `NodePaymentWithdrawn(node, amount)`     | Node claims their earned payment |

***

### Summary

The `SessionPayment` contract plays a **crucial role in managing payments** between users and the network. It ensures:

* Transparent and secure session-level accounting.
* Accurate tracking of network contributions.
* Fair and reliable reward distribution to nodes.
* Protection against common security vulnerabilities.

This module is essential for sustaining Cortensor's decentralized economic model while maintaining operational accountability and trust across participants.
