# 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.


---

# 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.kinto.xyz/kinto-the-modular-exchange/building-on-kinto/smart-contract-reference/sponsorpaymaster.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.
