# SponsorPaymaster

**Deployment Address**

Mainnet: [<mark style="color:purple;">0x1842a4EFf3eFd24c50B63c3CF89cECEe245Fc2bd</mark>](https://explorer.kinto.xyz/address/0x1842a4EFf3eFd24c50B63c3CF89cECEe245Fc2bd)

Interface: [<mark style="color:purple;">ISponsorPaymaster.sol</mark>](https://github.com/KintoXYZ/kinto-core/blob/main/src/interfaces/ISponsorPaymaster.sol)

***

## **Basics**

* An ETH-based paymaster contract for handling ETH deposits.
* Ensures that the user pays for transactions with their ETH deposited at the entry point.
* Features deposit management functions like adding, locking, unlocking, and withdrawing deposits.
* Implements global, per-app, and per-user rate and cost-limiting features to control gas usage and prevent abuse.
* Includes view functions to provide information about user limits and deposit statuses.
* Integrates with KintoID for KYC verification and KintoAppRegistry for app-specific limits.

***

## **State functions**

```solidity
function addDepositFor(address account) external payable override

function unlockTokenDeposit() public override

function lockTokenDeposit() public override

function withdrawTokensTo(address target, uint256 amount) external override nonReentrant

function setAppRegistry(address _newRegistry) external override onlyOwner

function setUserOpMaxCost(uint256 _newUserOpMaxCost) external onlyOwner
```

1. **addDepositFor**

Deposits ETH for a specific account, allowing it to be used to pay for gas.

```solidity
function addDepositFor(address account) external payable override;
```

| Parameter | Type      | Explanation                       |
| --------- | --------- | --------------------------------- |
| `account` | `address` | The account for which to deposit. |

2. **unlockTokenDeposit**

Unlocks the deposit, enabling it to be withdrawn.

```solidity
function unlockTokenDeposit() public override;
```

No parameters.

3. **lockTokenDeposit**

Locks the ETH deposited for an account so they can be used to pay for gas.

```solidity
function lockTokenDeposit() public override;
```

No parameters.

4. **withdrawTokensTo**

Withdraws ETH to a specified target address.

```solidity
function withdrawTokensTo(address target, uint256 amount) external override nonReentrant;
```

| Parameter | Type      | Explanation                |
| --------- | --------- | -------------------------- |
| `target`  | `address` | Address to send ETH to.    |
| `amount`  | `uint256` | Amount of ETH to withdraw. |

5. **setAppRegistry**

Sets the app registry address. Can only be called by the owner.

```solidity
function setAppRegistry(address _newRegistry) external override onlyOwner;
```

| Parameter      | Type      | Explanation               |
| -------------- | --------- | ------------------------- |
| `_newRegistry` | `address` | New app registry address. |

6. **setUserOpMaxCost**

Sets the maximum cost allowed for a user operation. Can only be called by the owner.

```solidity
function setUserOpMaxCost(uint256 _newUserOpMaxCost) external onlyOwner;
```

| Parameter           | Type      | Explanation                           |
| ------------------- | --------- | ------------------------------------- |
| `_newUserOpMaxCost` | `uint256` | New maximum cost for user operations. |

***

## **View functions**

```solidity
function depositInfo(address account) external view returns (uint256 amount, uint256 _unlockBlock)

function appUserLimit(address wallet, address app) external view override returns (uint256, uint256, uint256, uint256)

function walletFactory() external view override returns (IKintoWalletFactory)

function appRegistry() external view override returns (IKintoAppRegistry)
```

1. **depositInfo**

Returns deposit information for a specific account.

```solidity
function depositInfo(address account) external view returns (uint256 amount, uint256 _unlockBlock);
```

| Parameter | Type      | Explanation                        |
| --------- | --------- | ---------------------------------- |
| `account` | `address` | The account to query deposit info. |

2. **appUserLimit**

Returns current user limits for an app.

```solidity
function appUserLimit(address wallet, address app) external view override returns (uint256, uint256, uint256, uint256);
```

| Parameter | Type      | Explanation         |
| --------- | --------- | ------------------- |
| `wallet`  | `address` | The wallet address. |
| `app`     | `address` | The app contract.   |

3. **walletFactory**

Returns the address of the KintoWalletFactory contract.

```solidity
function walletFactory() external view override returns (IKintoWalletFactory);
```

No parameters.

4. **appRegistry**

Returns the address of the KintoAppRegistry contract.

```solidity
function appRegistry() external view override returns (IKintoAppRegistry);
```

No parameters.

***

## **Constants**

* `COST_OF_POST`: 200,000
* `MAX_COST_OF_VERIFICATION`: 530,000
* `MAX_COST_OF_PREVERIFICATION`: 2,500,000
* `RATE_LIMIT_PERIOD`: 1 minute
* `RATE_LIMIT_THRESHOLD_TOTAL`: 50

These constants are used for various limits and calculations within the contract.
