# Kinto Wallet

**Deployment Address**

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

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

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

***

## **Basics**

* Executes transactions according to the Account Abstraction standard.
* Validates user operations signatures.
* Manages signers and signers policy.
* The emergency recovery process can be triggered through a unique signer.
* Approves applications explicitly.
* Manages the funder whitelist.
* Implements an insurance policy system.

***

## **State functions**

```
initialize(address anOwner, address _recoverer) external virtual initializer onlyFactory

execute(address dest, uint256 value, bytes calldata func) external override

executeBatch(address[] calldata dest, uint256[] calldata values, bytes[] calldata func) external override

setSignerPolicy(uint8 newPolicy) public override onlySelf

resetSigners(address[] calldata newSigners, uint8 newPolicy) external override onlySelf

setFunderWhitelist(address[] calldata newWhitelist, bool[] calldata flags) external override onlySelf

whitelistApp(address[] calldata apps, bool[] calldata flags) external override onlySelf

setAppKey(address app, address signer) public override onlySelf

whitelistAppAndSetKey(address app, address signer) external override onlySelf

startRecovery() external override onlyFactory

completeRecovery(address[] calldata newSigners) external override onlyFactory

changeRecoverer(address newRecoverer) external override onlyFactory

cancelRecovery() public override onlySelf

setInsurancePolicy(uint256 newPolicy, address paymentToken) external override onlySelf
```

***

**1. initialize (Factory only)**

Initializes the KintoWallet with an owner and a recoverer.

```solidity
function initialize(address anOwner, address _recoverer) external virtual initializer onlyFactory;
```

| Parameter    | Type      | Explanation                                             |
| ------------ | --------- | ------------------------------------------------------- |
| `anOwner`    | `address` | The initial owner of the KintoWallet.                   |
| `_recoverer` | `address` | The address designated as the recoverer for the wallet. |

**2. execute (EntryPoint only)**

Executes a transaction.

```solidity
function execute(address dest, uint256 value, bytes calldata func) external override;
```

| Parameter | Type      | Explanation                   |
| --------- | --------- | ----------------------------- |
| `dest`    | `address` | The destination address.      |
| `value`   | `uint256` | The value to be transferred.  |
| `func`    | `bytes`   | The calldata of the function. |

**3. executeBatch (EntryPoint only)**

Executes a batch of transactions.

```solidity
function executeBatch(address[] calldata dest, uint256[] calldata values, bytes[] calldata func) external override;
```

| Parameter | Type        | Explanation                          |
| --------- | ----------- | ------------------------------------ |
| `dest`    | `address[]` | Array of destination addresses.      |
| `values`  | `uint256[]` | Array of values to be transferred.   |
| `func`    | `bytes[]`   | Array of calldata for each function. |

**4. setSignerPolicy (only callable by Wallet itself)**

Sets the signer policy of the wallet.

```solidity
function setSignerPolicy(uint8 newPolicy) public override onlySelf;
```

| Parameter   | Type    | Explanation            |
| ----------- | ------- | ---------------------- |
| `newPolicy` | `uint8` | The new signer policy. |

**5. resetSigners (only callable by Wallet itself)**

Resets the signers of the wallet.

```solidity
function resetSigners(address[] calldata newSigners, uint8 newPolicy) external override onlySelf;
```

| Parameter    | Type        | Explanation                 |
| ------------ | ----------- | --------------------------- |
| `newSigners` | `address[]` | Array of new signers.       |
| `newPolicy`  | `uint8`     | The signer policy to apply. |

**6. setFunderWhitelist (only callable by Wallet itself)**

Sets the funder whitelist.

```solidity
function setFunderWhitelist(address[] calldata newWhitelist, bool[] calldata flags) external override onlySelf;
```

| Parameter      | Type        | Explanation                         |
| -------------- | ----------- | ----------------------------------- |
| `newWhitelist` | `address[]` | Array of addresses to whitelist.    |
| `flags`        | `bool[]`    | Flags to allow or disallow funders. |

**7. whitelistApp (only callable by Wallet itself)**

Sets the app whitelist.

```solidity
function whitelistApp(address[] calldata apps, bool[] calldata flags) external override onlySelf;
```

| Parameter | Type        | Explanation                      |
| --------- | ----------- | -------------------------------- |
| `apps`    | `address[]` | Array of app addresses.          |
| `flags`   | `bool[]`    | Flags to allow or disallow apps. |

**8. setAppKey (only callable by Wallet itself)**

Sets the app key for a specific app.

```solidity
function setAppKey(address app, address signer) public override onlySelf;
```

| Parameter | Type      | Explanation                |
| --------- | --------- | -------------------------- |
| `app`     | `address` | Address of the app.        |
| `signer`  | `address` | Address of the app signer. |

**9. whitelistAppAndSetKey (only callable by Wallet itself)**

Whitelists an app and sets its app key.

```solidity
function whitelistAppAndSetKey(address app, address signer) external override onlySelf;
```

| Parameter | Type      | Explanation                |
| --------- | --------- | -------------------------- |
| `app`     | `address` | Address of the app.        |
| `signer`  | `address` | Address of the app signer. |

**10. startRecovery (only callable by Wallet Factory)**

Starts the recovery process.

```solidity
function startRecovery() external override onlyFactory;
```

No parameters.

**11. completeRecovery (only callable by Wallet Factory)**

Completes the recovery process and resets the signers.

```solidity
function completeRecovery(address[] calldata newSigners) external override onlyFactory;
```

| Parameter    | Type        | Explanation           |
| ------------ | ----------- | --------------------- |
| `newSigners` | `address[]` | Array of new signers. |

**12. changeRecoverer (only callable by Wallet Factory)**

Changes the recoverer.

```solidity
function changeRecoverer(address newRecoverer) external override onlyFactory;
```

| Parameter      | Type      | Explanation                   |
| -------------- | --------- | ----------------------------- |
| `newRecoverer` | `address` | Address of the new recoverer. |

**13. cancelRecovery (only callable by Wallet itself)**

Cancels the recovery process.

```solidity
function cancelRecovery() public override onlySelf;
```

No parameters.

**14. setInsurancePolicy (only callable by Wallet itself)**

Sets the insurance policy for the wallet.

```solidity
function setInsurancePolicy(uint256 newPolicy, address paymentToken) external override onlySelf;
```

| Parameter      | Type      | Explanation                         |
| -------------- | --------- | ----------------------------------- |
| `newPolicy`    | `uint256` | The new insurance policy to set.    |
| `paymentToken` | `address` | The token address used for payment. |

***

## **View Functions**

```
isFunderWhitelisted(address funder) external view override returns (bool)

entryPoint() public view virtual override returns (IEntryPoint)

getNonce() public view virtual override(BaseAccount, IKintoWallet) returns (uint256)

getOwnersCount() external view override returns (uint256)

getOwners() external view override returns (address[] memory)

getInsurancePrice(uint256 newPolicy, address paymentToken) public pure override returns (uint256)
```

**1. isFunderWhitelisted**

Checks if a funder is whitelisted.

```solidity
function isFunderWhitelisted(address funder) external view override returns (bool);
```

| Parameter | Type      | Explanation                  |
| --------- | --------- | ---------------------------- |
| `funder`  | `address` | The funder address to check. |

**2. entryPoint**

Returns the entry point of the wallet.

```solidity
function entryPoint() public view virtual override returns (IEntryPoint);
```

No parameters.

**3. getNonce**

Gets the current nonce of the wallet.

```solidity
function getNonce() public view virtual override(BaseAccount, IKintoWallet) returns (uint256);
```

No parameters.

**4. getOwnersCount**

Returns the count of owners of the wallet.

```solidity
function getOwnersCount() external view override returns (uint256);
```

No parameters.

**5. getOwners**

Returns an array of the wallet's owners.

```solidity
function getOwners() external view override returns (address[] memory);
```

No parameters.

**6. getInsurancePrice**

Returns the price of the insurance policy.

```solidity
function getInsurancePrice(uint256 newPolicy, address paymentToken) public pure override returns (uint256);
```

| Parameter      | Type      | Explanation                         |
| -------------- | --------- | ----------------------------------- |
| `newPolicy`    | `uint256` | The insurance policy to price.      |
| `paymentToken` | `address` | The token address used for payment. |


---

# 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/kinto-wallet.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.
