# PP\_Simple\_v1.sol

[Git Source](https://github.com/InverterNetwork/inverter-contracts/blob/649b450f02fc8b735c128ff0821467e71966c666/src/modules/paymentProcessor/PP_Simple_v1.sol)

**Inherits:** Module\_v1, IPaymentProcessor\_v1

**Author:** Inverter Network

Manages ERC20 payment processing for modules within the Inverter Network that are compliant with the {IERC20PaymentClientBase\_v1} interface.

*Inherits {Module\_v1} and implements {IPaymentProcessor\_v1} to handle payment orders from registered modules, ensuring only eligible modules can initiate payments. Utilizes {SafeERC20} for secure token transfers.*

### State Variables

#### unclaimableAmountsForRecipient

*Tracks all payments that could not be made to the paymentReceiver due to any reason.*

*paymentClient => token address => paymentReceiver => unclaimable Amount.*

```solidity
mapping(address => mapping(address => mapping(address => uint))) internal
    unclaimableAmountsForRecipient;
```

#### \_\_gap

*Gap for possible future upgrades.*

```solidity
uint[50] private __gap;
```

### Functions

#### supportsInterface

*See {IERC165-supportsInterface}.*

```solidity
function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(Module_v1)
    returns (bool);
```

#### onlyModule

*Checks that the caller is an active module.*

```solidity
modifier onlyModule();
```

#### validClient

*Checks that the client is calling for itself.*

```solidity
modifier validClient(IERC20PaymentClientBase_v1 client);
```

### Public Functions

init

```solidity
function init(
    IOrchestrator_v1 orchestrator_,
    Metadata memory metadata,
    bytes memory
) external override(Module_v1) initializer;
```

#### processPayments

Processes all payments from an {IERC20PaymentClientBase\_v1} instance. Please note: this function does not support callbacks on transfer of tokens.

*It's up to the the implementation to keep up with what has been paid out or not.*

```solidity
function processPayments(IERC20PaymentClientBase_v1 client)
    external
    onlyModule
    validClient(client);
```

**Parameters**

| Name     | Type                         | Description                                                            |
| -------- | ---------------------------- | ---------------------------------------------------------------------- |
| `client` | `IERC20PaymentClientBase_v1` | The {IERC20PaymentClientBase\_v1} instance to process its to payments. |

#### cancelRunningPayments

Cancels all unfinished payments from an {IERC20PaymentClientBase\_v1} instance.

*It's up to the the implementation to keep up with what has been paid out or not.*

```solidity
function cancelRunningPayments(IERC20PaymentClientBase_v1 client)
    external
    view
    onlyModule
    validClient(client);
```

**Parameters**

| Name     | Type                         | Description                                                            |
| -------- | ---------------------------- | ---------------------------------------------------------------------- |
| `client` | `IERC20PaymentClientBase_v1` | The {IERC20PaymentClientBase\_v1} instance to process its to payments. |

#### unclaimable

Getter for the amount of tokens that could not be claimed.

```solidity
function unclaimable(address client, address token, address paymentReceiver)
    public
    view
    returns (uint amount);
```

**Parameters**

| Name              | Type      | Description                    |
| ----------------- | --------- | ------------------------------ |
| `client`          | `address` | address of the payment client. |
| `token`           | `address` | address of the payment token.  |
| `paymentReceiver` | `address` | PaymentReceiver's address.     |

**Returns**

| Name     | Type      | Description                                 |
| -------- | --------- | ------------------------------------------- |
| `amount` | `uint256` | Amount of tokens that could not be claimed. |

#### claimPreviouslyUnclaimable

claim every unclaimable amount that the paymentClient owes to the \_msgSender and send it to a specified receiver.

*This function should be callable if the \_msgSender has unclaimedAmounts.*

```solidity
function claimPreviouslyUnclaimable(
    address client,
    address token,
    address receiver
) external;
```

**Parameters**

| Name       | Type      | Description                                                                                  |
| ---------- | --------- | -------------------------------------------------------------------------------------------- |
| `client`   | `address` | The IERC20PaymentClientBase\_v1 instance address that processes all claims from \_msgSender. |
| `token`    | `address` | address of the payment token.                                                                |
| `receiver` | `address` | The address that will receive the previously unclaimable amount.                             |

#### validPaymentOrder

Function that checks if the given PaymentOrder was valid.

```solidity
function validPaymentOrder(IERC20PaymentClientBase_v1.PaymentOrder memory order)
    external
    returns (bool);
```

**Parameters**

| Name    | Type                                      | Description                                                     |
| ------- | ----------------------------------------- | --------------------------------------------------------------- |
| `order` | `IERC20PaymentClientBase_v1.PaymentOrder` | The IERC20PaymentClientBase\_v1 Order that needs to be checked. |

**Returns**

| Name     | Type   | Description                               |
| -------- | ------ | ----------------------------------------- |
| `<none>` | `bool` | valid Bool if the Payment Order is valid. |

### Internal Functions

#### \_claimPreviouslyUnclaimable

used to claim the unclaimable amount of a particular `paymentReceiver` for a given payment client.

```solidity
function _claimPreviouslyUnclaimable(
    address client,
    address token,
    address paymentReceiver
) internal;
```

**Parameters**

| Name              | Type      | Description                                                                      |
| ----------------- | --------- | -------------------------------------------------------------------------------- |
| `client`          | `address` | address of the payment client.                                                   |
| `token`           | `address` | address of the payment token.                                                    |
| `paymentReceiver` | `address` | address of the paymentReceiver for which the unclaimable amount will be claimed. |

#### \_validPaymentReceiver

Validate address input.

```solidity
function _validPaymentReceiver(address addr) internal view returns (bool);
```

**Parameters**

| Name   | Type      | Description          |
| ------ | --------- | -------------------- |
| `addr` | `address` | Address to validate. |

**Returns**

| Name     | Type   | Description               |
| -------- | ------ | ------------------------- |
| `<none>` | `bool` | True if address is valid. |

#### \_validTotal

Validate uint total amount input.

```solidity
function _validTotal(uint _total) internal pure returns (bool);
```

**Parameters**

| Name     | Type      | Description       |
| -------- | --------- | ----------------- |
| `_total` | `uint256` | uint to validate. |

**Returns**

| Name     | Type   | Description            |
| -------- | ------ | ---------------------- |
| `<none>` | `bool` | True if uint is valid. |

#### \_validPaymentToken

Validate payment token input.

```solidity
function _validPaymentToken(address _token) internal returns (bool);
```

**Parameters**

| Name     | Type      | Description                       |
| -------- | --------- | --------------------------------- |
| `_token` | `address` | Address of the token to validate. |

**Returns**

| Name     | Type   | Description               |
| -------- | ------ | ------------------------- |
| `<none>` | `bool` | True if address is valid. |

#### \_validOriginAndTargetChain

```solidity
function _validOriginAndTargetChain(uint originChainId_, uint targetChainId_)
    internal
    view
    returns (bool);
```


---

# 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.inverter.network/contracts/technical-reference/modules/payment-processor/pp_simple_v1.sol.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.
