# 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);
```
