# Paymaster

AbstractionKit includes two paymaster clients. `CandidePaymaster` can sponsor one-shot UserOperations, but new integrations should prefer the standard `Erc7677Paymaster` for one-shot sponsorship and ERC-20 token gas flows. `Erc7677Paymaster` auto-detects supported providers such as Candide and Pimlico and handles provider-specific metadata, supported token data, exchange rates, and paymaster addresses internally. Use `CandidePaymaster` when you need Candide-specific APIs or the EntryPoint v0.9 two-phase `commit -> sign -> finalize` flow.

**Supports:**

* Gas sponsorship through Gas Policies
* ERC-20 Token Sponsorship
* Multi-EntryPoint

## Which Paymaster Client to Use[​](#which-paymaster-client-to-use "Direct link to Which Paymaster Client to Use")

| Flow                                                              | Recommended client | Method                                                                   |
| ----------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------ |
| Sponsored gas, one-shot                                           | `Erc7677Paymaster` | Recommended standard path: `createPaymasterUserOperation(..., context?)` |
| ERC-20 token gas                                                  | `Erc7677Paymaster` | `createPaymasterUserOperation(..., { token })`                           |
| Provider metadata and supported token details for Candide/Pimlico | `Erc7677Paymaster` | Handled automatically from the paymaster URL                             |
| Candide-specific one-shot sponsorship                             | `CandidePaymaster` | Supported via `createSponsorPaymasterUserOperation(...)`                 |
| Two-phase paymaster signing to reduce user waiting time           | `CandidePaymaster` | `createSponsorPaymasterUserOperation(..., { signingPhase })`             |

## Usage[​](#usage "Direct link to Usage")

### Import[​](#import "Direct link to Import")

```
import { CandidePaymaster } from "abstractionkit";
```

### How to Use[​](#how-to-use "Direct link to How to Use")

Initialize a Paymaster with your RPC URL. Get an API key from the [dashboard](https://dashboard.candide.dev).

paymaster.ts

```
import { CandidePaymaster } from "abstractionkit";



const paymasterRPC = "https://api.candide.dev/public/v3/11155111";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);
```

Then consume Paymaster methods:

```
const supportedEntryPoints = await paymaster.getSupportedEntrypoints();
```

## Methods[​](#methods "Direct link to Methods")

### createSponsorPaymasterUserOperation[​](#createsponsorpaymasteruseroperation "Direct link to createSponsorPaymasterUserOperation")

Returns the paymaster data if the the userOperation has a Gas Policy. Otherwise it returns an error message. Supports two types of Gas Policies:

* **Public Gas Policies**: These are gas policies provided by third parties, which do not require a sponsorship policy ID.
* **Private Gas Policies**: These require a sponsorship policy ID and can be used if no public gas policy matches the user operation.

#### Usage[​](#usage-1 "Direct link to Usage")

* example.ts
* Param Type
* Return Type

example.ts

```
import { CandidePaymaster } from "abstractionkit";



const paymasterRPC = "https://api.candide.dev/public/v3/11155111";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);

const sponsorshipPolicyId = '1234';



// Use createUserOperation() to help you construct a userOp

const userOperation = smartAccount.createUserOperation(..)



const { userOperation: sponsoredUserOperation, sponsorMetadata } =

  await paymaster.createSponsorPaymasterUserOperation(

    smartAccount,

    userOperation,

    bundlerUrl,

    sponsorshipPolicyId, // optional

  );
```

| key                   | type                                                                                                                                                                                                                                                                                                                                                                                                                                                 | description                                                                                                 |
| :-------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- |
| `smartAccount`        | `SmartAccountWithEntrypoint`                                                                                                                                                                                                                                                                                                                                                                                                                         | The smart account instance. Used to resolve the EntryPoint address.                                         |
| `userOperation`       | `UserOperationV6 \| UserOperationV7 \| UserOperationV8 \| UserOperationV9`                                                                                                                                                                                                                                                                                                                                                                           | UserOperation to Sponsor. Supports EntryPoint v0.6, v0.7, v0.8, and v0.9                                    |
| `bundlerRpc`          | `string`                                                                                                                                                                                                                                                                                                                                                                                                                                             | Bundler URL to estimate the gas                                                                             |
| `sponsorshipPolicyId` | `string?`                                                                                                                                                                                                                                                                                                                                                                                                                                            | Optional sponsorship policy id if using a Private Gas Policy                                                |
| `context`             | `key	type	descriptiontoken	string?	ERC-20 token address, if paying gas in erc-20 tokens (optional)
sponsorshipPolicyId	string?	Sponsorship Policy ID if using a private gas policy (optional)
signingPhase	"commit" \| "finalize"?	Opt into the parallel signing two-phase flow (EntryPoint v0.9 only). Use "commit" to request initial paymaster fields and gas limits before the user signs, then "finalize" to attach the final paymaster signature after.` | Optional additional context to pass to the paymaster RPC (token, signingPhase).                             |
| `overrides`           | `GasPaymasterUserOperationOverrides?`                                                                                                                                                                                                                                                                                                                                                                                                                | Optional overrides for gas limits, multipliers, entrypoint, and state overrides used during gas estimation. |

| key               | type                                                                                                                                                                                                                                              | description                                |
| :---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------- |
| `userOperation`   | `UserOperationV6 \| UserOperationV7 \| UserOperationV8 \| UserOperationV9`                                                                                                                                                                        | UserOperation with paymaster data included |
| `sponsorMetadata` | `key	type	descriptionname	string	Name of Sponsor who is sponsoring the Gas Policy
description	string	A short description of the sponsor
url	string	Website of the Sponsor
icons	string[]	Logos or Icons that the Sponsor is using to promote their Gas Policy` | Information about the Gas Policy Sponsor   |

#### Source code[​](#source-code "Direct link to Source code")

[createSponsorPaymasterUserOperation](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L571)

### fetchSupportedERC20TokensAndPaymasterMetadata[​](#fetchsupportederc20tokensandpaymastermetadata "Direct link to fetchSupportedERC20TokensAndPaymasterMetadata")

Returns a promise with the supported erc20 tokens and their exchange rate, along with the paymaster metadata

#### Usage[​](#usage-2 "Direct link to Usage")

* example.ts
* Param Types
* Response Type

example.ts

```
import { CandidePaymaster, SafeAccountV0_3_0 as SafeAccount } from "abstractionkit";



const paymasterRPC="https://api.candide.dev/public/v3/11155111";

const paymaster = new CandidePaymaster(paymasterRPC);



const supportedERC20Tokens = await paymaster.fetchSupportedERC20TokensAndPaymasterMetadata(SafeAccount.DEFAULT_ENTRYPOINT_ADDRESS);
```

| key          | type      | description                          |
| :----------- | :-------- | :----------------------------------- |
| `entrypoint` | `string?` | EntryPoint Address. Defaults to V0.7 |

| key                                               | type                                                                                                              | description                                                               |
| :------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------ |
| `SupportedERC20TokensAndMetadataWithExchangeRate` | `Promise<SupportedERC20TokensAndMetadataV7WithExchangeRate \| SupportedERC20TokensAndMetadataV6WithExchangeRate>` | A promise with the list of supported erc20 tokens and their exchange rate |

SupportedERC20TokensAndMetadataV7WithExchangeRate

| key                 | type                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | description                               |
| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- |
| `paymasterMetadata` | `key	type	descriptionname	string	The name of the Paymaster.
description	string	A brief description of the Paymaster.
icons	string[]	An array of icon URLs representing the Paymaster's brand or logo.
address	string	The contract address of the Paymaster.
sponsoredEventTopic	string	The event topic that will be emitted when a UserOperation is sponsored by the Paymaster.
dummyPaymasterAndData	key	type	descriptionpaymaster	string	The address of the Paymaster.
paymasterVerificationGasLimit	bigint	The amount of gas allocated for the Paymaster verification step.
paymasterPostOpGasLimit	bigint	The amount of gas allocated for the Paymaster post-operation step.
paymasterData	string	Encoded data for the Paymaster.	Dummy Paymaster data used for gas estimation.` | The Paymaster metadata                    |
| `tokens`            | `key	type	descriptionname	string	The name of the ERC20 token.
symbol	string	The symbol representing the ERC20 token.
address	string	The contract address of the ERC20 token.
decimals	number	The number of decimal places for the token.
exchangeRate	bigint	The exchange rate of the token.`                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | Supported erc20 tokens with Exchange Rate |

SupportedERC20TokensAndMetadataV6WithExchangeRate

| key                 | type                                                                                                                                                                                                                                                                                                                                                                                                                                     | description                               |
| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------- |
| `paymasterMetadata` | `key	type	descriptionname	string	The name of the Paymaster.
description	string	A brief description of the Paymaster.
icons	string[]	An array of icon URLs representing the Paymaster's brand or logo.
address	string	The contract address of the Paymaster.
sponsoredEventTopic	string	The event topic that will be emitted when a UserOperation is sponsored by the Paymaster.
dummyPaymasterAndData	string	Dummy Paymaster data used for gas estimation.` | The Paymaster metadata                    |
| `tokens`            | `key	type	descriptionname	string	The name of the ERC20 token.
symbol	string	The symbol representing the ERC20 token.
address	string	The contract address of the ERC20 token.
decimals	number	The number of decimal places for the token.
exchangeRate	bigint	The exchange rate of the token.`                                                                                                                                                            | Supported erc20 tokens with Exchange Rate |

Example Response

```
{

  tokens: [

    {

      name: 'USD Coin',

      symbol: 'USDC',

      address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',

      decimals: 6,

      exchangeRate: 123n

    },

    {

      name: 'Tether USDT',

      symbol: 'USDT',

      address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',

      decimals: 6,

      exchangeRate: 123n

    },

    {

      name: 'Dai Stablecoin',

      symbol: 'DAI',

      address: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',

      decimals: 18,

      exchangeRate: 123n

    }

  ],

  paymasterMetadata: {

    name: 'CANDIDE Paymaster',

    description: 'CANDIDE Paymaster a fast, secure and feature-rich 4337 Paymaster',

    icons: [],

    address: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',

    sponsoredEventTopic: '0xa050a122b4c0e369e3385eb6b7cccd8019638b2764de67bec0af99130ddf8471',

    dummyPaymasterAndData: {

      paymaster: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',

      paymasterVerificationGasLimit: '0xffff',

      paymasterPostOpGasLimit: '0xffff',

      paymasterData: '0x00010000000000ffff000000000000000000000000000000000000000000000000000000000000ffff010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011c'

    }

  }

}
```

### createTokenPaymasterUserOperation[​](#createtokenpaymasteruseroperation "Direct link to createTokenPaymasterUserOperation")

Estimates gas limits and returns the user operation with the paymaster data for ERC-20 Token sponsorship.

Token Approval Reset

Some tokens like USDT do not allow changing a non-zero allowance directly. For known tokens (e.g. USDT on Ethereum mainnet), the SDK automatically prepends an `approve(0)` call before the actual approval. You can also manually trigger this behavior for other tokens by setting `resetApproval: true` in the overrides.

The `overrides` parameter also accepts an `entrypoint` field, which allows you to manually specify the EntryPoint address instead of relying on auto-detection from the UserOperation structure.

#### Usage[​](#usage-3 "Direct link to Usage")

* example.ts
* Param Types
* Response Type

```
import { SafeAccountV0_3_0 as SafeAccount, CandidePaymaster } from "abstractionkit";



const paymasterRPC="https://api.candide.dev/public/v3/11155111";

const erc20TokenAddress = "0xFa5854FBf9964330d761961F46565AB7326e5a3b"; // CTT test token

const bundlerRPC = "https://api.candide.dev/public/v3/11155111";



const ownerPublicAddress = "0x2Ef844456580b6e1E22e1D584EBbC2467D9298B2"

const smartAccount = SafeAccount.initializeNewAccount([ownerPublicAddress])



// Use createUserOperation() to help you construct a userOp

let userOperation = smartAccount.createUserOperation(..);



const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);



const { userOperation: sponsoredUserOperation, tokenQuote } =

  await paymaster.createTokenPaymasterUserOperation(

    smartAccount,

    userOperation,

    erc20TokenAddress,

    bundlerRPC,

  );

userOperation = sponsoredUserOperation;
```

| key             | type                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | description                                                                                                                                                                              |
| :-------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `smartAccount`  | `PrependTokenPaymasterApproveAccount`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | The smart account object that created the target userOperation. Must implement prependTokenPaymasterApproveToCallData so the paymaster token approval can be prepended to the callData.  |
| `userOperation` | `UserOperationV6 \| UserOperationV7 \| UserOperationV8 \| UserOperationV9`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | The userOperation to sponsor gas with erc-20 paymaster                                                                                                                                   |
| `tokenAddress`  | `string`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | The address of the token to approve.                                                                                                                                                     |
| `bundlerRpc`    | `string`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | The Bundler RPC to estimate the gas                                                                                                                                                      |
| `context`       | `key	type	descriptiontoken	string?	ERC-20 token address, if paying gas in erc-20 tokens (optional)
sponsorshipPolicyId	string?	Sponsorship Policy ID if using a private gas policy (optional)
signingPhase	"commit" \| "finalize"?	Opt into the parallel signing two-phase flow (EntryPoint v0.9 only). Use "commit" to request initial paymaster fields and gas limits before the user signs, then "finalize" to attach the final paymaster signature after.`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Optional additional context to pass to the paymaster RPC. \`token\` is always derived from \`tokenAddress\`, so pass \`undefined\` unless you need other fields (e.g. \`signingPhase\`). |
| `overrides`     | `key	type	descriptionentrypoint	string?	Set the EntryPoint address instead of auto-detecting it from the UserOperation structure.
resetApproval	boolean?	When true, prepend an approve(0) call before the actual token approval. Required for tokens like USDT that do not allow changing a non-zero allowance directly. Automatically applied for known tokens (e.g. USDT on Ethereum mainnet).
callGasLimit	bigint	Set the callGasLimit instead of estimating gas using the bundler.
verificationGasLimit	bigint	Set the verificationGasLimit instead of estimating gas using the bundler.
preVerificationGas	bigint	Set the preVerificationGas instead of estimating gas using the bundler.
callGasLimitPercentageMultiplier	number	Set the callGasLimitPercentageMultiplier instead of estimating gas using the bundler.
verificationGasLimitPercentageMultiplier	number	Set the verificationGasLimitPercentageMultiplier instead of estimating gas using the bundler.
preVerificationGasPercentageMultiplier	number	Set the preVerificationGasPercentageMultiplier instead of estimating gas using the bundler.
stateOverrideSetType	key	type	description[address: string]	key	type	descriptionbalance	bigint	Override the balance of the address
nonce	bigint	Override the nonce of the address
code	string	Override the code of the address
state	Dictionary<string>	Override the storage slots of the address
stateDiff	Dictionary<string>	Apply state differences to the storage slots of the address	Overrides for a specific address	Pass state overrides for gas estimation, including balance, nonce, code, and state or stateDiff for the account at each address.` | Overrides for gas limits, multipliers, entrypoint, and the approval reset behavior.                                                                                                      |

| key             | type                                                                                                                                                                                                                                                               | description                                                                                                                                                                                                        |
| :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `userOperation` | `UserOperationV6 \| UserOperationV7 \| UserOperationV8 \| UserOperationV9`                                                                                                                                                                                         | The userOperation with paymaster data and token approval prepended                                                                                                                                                 |
| `tokenQuote`    | `key	type	descriptiontoken	string	ERC-20 token contract address used to pay gas
exchangeRate	bigint	Exchange rate scaled by 10^18 (1 ETH expressed in the token's smallest unit)
tokenCost	bigint	Maximum token cost charged for this UserOperation (token's smallest unit)` | The exchange rate and maximum token cost the paymaster applied to this UserOperation. Populated on the token-payment flow; absent when called under the \`signingPhase: "finalize"\` path (no cost recomputation). |

Example Response

```
{

  userOperation: {

    sender: '0xb8741a449d50ed0dcfe395287f85be152884c8d9',

    nonce: 10n,

    initCode: '0x',

    callData: '0x541d63c8...095ea7b3...',

    callGasLimit: 116807n,

    verificationGasLimit: 75441n,

    preVerificationGas: 50444n,

    maxFeePerGas: 66195658616n,

    maxPriorityFeePerGas: 120000n,

    paymasterAndData: '0x3fE285DcD76BCcE4Ac92d38A6F2F8E964041e020...',

    signature: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'

  },

  tokenQuote: {

    token: '0xFa5854FBf9964330d761961F46565AB7326e5a3b',

    exchangeRate: 1001219705870085130n,

    tokenCost: 3391931975665260n,

  },

}
```

#### Source code[​](#source-code-1 "Direct link to Source code")

[createTokenPaymasterUserOperation](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L612)

### calculateUserOperationErc20TokenMaxGasCost[​](#calculateuseroperationerc20tokenmaxgascost "Direct link to calculateUserOperationErc20TokenMaxGasCost")

Calculates the maximum gas cost in ERC-20 tokens for a given userOperation

#### Usage[​](#usage-4 "Direct link to Usage")

* example.ts
* Param Types
* Return Types

```
import { CandidePaymaster } from "abstractionkit";



const erc20TokenAddress = "0xFa5854FBf9964330d761961F46565AB7326e5a3b"; // CTT test token

// Use createUserOperation() to help you construct a userOp

const userOperation = smartAccount.createUserOperation(..)



const paymasterRPC="https://api.candide.dev/public/v3/11155111";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);



const cost = await paymaster.calculateUserOperationErc20TokenMaxGasCost(

  userOperation,

  erc20TokenAddress,

);
```

| key                 | type                                                                       | description                                                                         |
| :------------------ | :------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- |
| `userOperation`     | `UserOperationV6 \| UserOperationV7 \| UserOperationV8 \| UserOperationV9` | UserOperation to calculate cost for. Supports EntryPoint v0.6, v0.7, v0.8, and v0.9 |
| `erc20TokenAddress` | `string`                                                                   | ERC-20 Token Address                                                                |

| key    | type              | description                                                             |
| :----- | :---------------- | :---------------------------------------------------------------------- |
| `cost` | `Promise<bigint>` | Returns maximum amount that the operation will cost in the erc-20 token |

Example Response

```
3391931975665260
```

#### Source code[​](#source-code-2 "Direct link to Source code")

[calculateUserOperationErc20TokenMaxGasCost](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L711)

## Advanced Methods[​](#advanced-methods "Direct link to Advanced Methods")

### getPaymasterMetaData[​](#getpaymastermetadata "Direct link to getPaymasterMetaData")

Returns the metadata associated with the Paymaster, along with dummyPaymasterAndData useful for gas estimates

#### Usage[​](#usage-5 "Direct link to Usage")

* example.ts
* Param Type
* Return Type

example.ts

```
import { CandidePaymaster, SafeAccountV0_3_0 as SafeAccount } from "abstractionkit";



const paymasterRPC="https://api.candide.dev/public/v3/11155111";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);



const paymasterResult = await paymaster.getPaymasterMetaData(SafeAccount.DEFAULT_ENTRYPOINT_ADDRESS);
```

| key          | type     | description                        |
| :----------- | :------- | :--------------------------------- |
| `entrypoint` | `string` | Target EntryPoint Contract Address |

| key                 | type                                                          | description                                                                         |
| :------------------ | :------------------------------------------------------------ | :---------------------------------------------------------------------------------- |
| `paymastermetadata` | `Promise<PaymasterMetadataV7 \| PaymasterMetadataV6 \| null>` | Returns a promise with the paymaster metadata associated with the target entrypoint |

PaymasterMetadataV7

| key                     | type                                                                                                                                                                                                                                                                                                                 | description                                                                              |
| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- |
| `name`                  | `string`                                                                                                                                                                                                                                                                                                             | The name of the Paymaster.                                                               |
| `description`           | `string`                                                                                                                                                                                                                                                                                                             | A brief description of the Paymaster.                                                    |
| `icons`                 | `string[]`                                                                                                                                                                                                                                                                                                           | An array of icon URLs representing the Paymaster's brand or logo.                        |
| `address`               | `string`                                                                                                                                                                                                                                                                                                             | The contract address of the Paymaster.                                                   |
| `sponsoredEventTopic`   | `string`                                                                                                                                                                                                                                                                                                             | The event topic that will be emitted when a UserOperation is sponsored by the Paymaster. |
| `dummyPaymasterAndData` | `key	type	descriptionpaymaster	string	The address of the Paymaster.
paymasterVerificationGasLimit	bigint	The amount of gas allocated for the Paymaster verification step.
paymasterPostOpGasLimit	bigint	The amount of gas allocated for the Paymaster post-operation step.
paymasterData	string	Encoded data for the Paymaster.` | Dummy Paymaster data used for gas estimation.                                            |

PaymasterMetadataV6

| key                     | type       | description                                                                              |
| :---------------------- | :--------- | :--------------------------------------------------------------------------------------- |
| `name`                  | `string`   | The name of the Paymaster.                                                               |
| `description`           | `string`   | A brief description of the Paymaster.                                                    |
| `icons`                 | `string[]` | An array of icon URLs representing the Paymaster's brand or logo.                        |
| `address`               | `string`   | The contract address of the Paymaster.                                                   |
| `sponsoredEventTopic`   | `string`   | The event topic that will be emitted when a UserOperation is sponsored by the Paymaster. |
| `dummyPaymasterAndData` | `string`   | Dummy Paymaster data used for gas estimation.                                            |

Example Response

```
{

  name: 'CANDIDE Paymaster',

  description: 'CANDIDE Paymaster a fast, secure and feature-rich 4337 Paymaster',

  icons: [],

  address: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',

  sponsoredEventTopic: '0xa050a122b4c0e369e3385eb6b7cccd8019638b2764de67bec0af99130ddf8471',

  dummyPaymasterAndData: {

    paymaster: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',

    paymasterVerificationGasLimit: '0xffff',

    paymasterPostOpGasLimit: '0xffff',

    paymasterData: '0x00010000000000ffff000000000000000000000000000000000000000000000000000000000000ffff010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011c'

  }

}
```

#### source code[​](#source-code-3 "Direct link to source code")

[getPaymasterMetaData](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L334)

### getSupportedEntrypoints[​](#getsupportedentrypoints "Direct link to getSupportedEntrypoints")

Returns the supported Entrypoints by the paymaster

#### Usage[​](#usage-6 "Direct link to Usage")

* example.ts
* Return Type

example.ts

```
import { CandidePaymaster } from "abstractionkit";



const paymasterRPC="https://api.candide.dev/public/v3/11155111";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);



const paymasterResult = await paymaster.getSupportedEntrypoints();
```

| key                    | type                | description                                  |
| :--------------------- | :------------------ | :------------------------------------------- |
| `entrypoint addresses` | `Promise<string[]>` | A promise of a list of entrypoints addresses |

Example Response

```
[

  '0x0000000071727De22E5E9d8BAf0edAc6f37da032',

  '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789'

]
```

#### source code[​](#source-code-4 "Direct link to source code")

[getSupportedEntrypoints](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L311)

### isSupportedERC20Token[​](#issupportederc20token "Direct link to isSupportedERC20Token")

Checks if a particular ERC-20 token is accepted as gas payment by the paymaster. Returns a boolean

#### Usage[​](#usage-7 "Direct link to Usage")

* example.ts
* Param Types
* Response Type

example.ts

```
import { CandidePaymaster } from "abstractionkit";



const paymasterRPC="https://api.candide.dev/public/v3/11155111";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);



const erc20TokenAddress = "0xFa5854FBf9964330d761961F46565AB7326e5a3b"; // CTT on sepolia testnet



const isSupported = await paymaster.isSupportedERC20Token(erc20TokenAddress);
```

| key                 | type     | description                                           |
| :------------------ | :------- | :---------------------------------------------------- |
| `erc20TokenAddress` | `string` | ERC-20 Token Address                                  |
| `entrypoint?`       | `string` | Target EntryPoint Address. Defaults to ENTRYPOINT\_V7 |

| key           | type      | description                                  |
| :------------ | :-------- | :------------------------------------------- |
| `isSupported` | `boolean` | Returns true if the erc20 token is supported |

Example Response

```
true
```

#### Source[​](#source "Direct link to Source")

[isSupportedERC20Token](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L351)

### getSupportedERC20TokenData[​](#getsupportederc20tokendata "Direct link to getSupportedERC20TokenData")

Returns the token data given an erc20 address

#### Usage[​](#usage-8 "Direct link to Usage")

* example.ts
* Param Types
* Return Type

example.ts

```
import { CandidePaymaster } from "abstractionkit";



const paymasterRPC = "https://api.candide.dev/public/v3/11155111";



const erc20TokenAddress = "0xFa5854FBf9964330d761961F46565AB7326e5a3b";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);

const erc20TokenData = await paymaster.getSupportedERC20TokenData(erc20TokenAddress);
```

| key                 | type     | description                                           |
| :------------------ | :------- | :---------------------------------------------------- |
| `erc20TokenAddress` | `string` | ERC-20 Token Address                                  |
| `entrypoint?`       | `string` | Target EntryPoint Address. Defaults to ENTRYPOINT\_V7 |

| key          | type                          | description  |
| :----------- | :---------------------------- | :----------- |
| `ERC20Token` | `Promise<ERC20Token \| null>` | ERC-20 Token |

| key        | type     | description                                 |
| :--------- | :------- | :------------------------------------------ |
| `name`     | `string` | The name of the ERC20 token.                |
| `symbol`   | `string` | The symbol representing the ERC20 token.    |
| `address`  | `string` | The contract address of the ERC20 token.    |
| `decimals` | `number` | The number of decimal places for the token. |

Example Response

```
{

  name: 'Candide Test Token',

  symbol: 'CTT',

  address: '0xFa5854FBf9964330d761961F46565AB7326e5a3b',

  decimals: 18,

  fee: 0n,

  exchangeRate: 1001219705870085130n

}
```

#### Source code[​](#source-code-5 "Direct link to Source code")

[getSupportedERC20TokenData](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L367)

### fetchTokenPaymasterExchangeRate[​](#fetchtokenpaymasterexchangerate "Direct link to fetchTokenPaymasterExchangeRate")

Fetches the current exchange rate for an ERC-20 token from the paymaster. The exchange rate represents the token cost per unit of native currency, used to calculate how much of the token is needed to cover gas fees.

#### Usage[​](#usage-9 "Direct link to Usage")

* example.ts
* Param Types
* Return Type

example.ts

```
import { CandidePaymaster } from "abstractionkit";



const paymasterRPC = "https://api.candide.dev/public/v3/11155111";

const paymaster: CandidePaymaster = new CandidePaymaster(paymasterRPC);



const erc20TokenAddress = "0xFa5854FBf9964330d761961F46565AB7326e5a3b"; // CTT on sepolia testnet



const exchangeRate = await paymaster.fetchTokenPaymasterExchangeRate(erc20TokenAddress);
```

| key                 | type      | description                                                                     |
| :------------------ | :-------- | :------------------------------------------------------------------------------ |
| `erc20TokenAddress` | `string`  | ERC-20 Token Address                                                            |
| `entrypoint`        | `string?` | EntryPoint Address that the paymaster is supporting. Defaults to ENTRYPOINT\_V7 |

| key            | type     | description                                   |
| :------------- | :------- | :-------------------------------------------- |
| `exchangeRate` | `bigInt` | Returns the exchange rate to the native token |

Example Response

```
1001219705870085130n
```

#### Source code[​](#source-code-6 "Direct link to Source code")

[fetchTokenPaymasterExchangeRate](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L748)

### createPaymasterUserOperation[​](#createpaymasteruseroperation "Direct link to createPaymasterUserOperation")

Internal Method

`createPaymasterUserOperation` is an internal method. Use [`createSponsorPaymasterUserOperation`](#createsponsorpaymasteruseroperation) for gas sponsorship or [`createTokenPaymasterUserOperation`](#createtokenpaymasteruseroperation) for ERC-20 token payment instead.

#### Source code[​](#source-code-7 "Direct link to Source code")

[createPaymasterUserOperation](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/CandidePaymaster.ts#L530)

## Erc7677Paymaster[​](#erc7677paymaster "Direct link to Erc7677Paymaster")

`Erc7677Paymaster` is a provider-agnostic [ERC-7677](https://eips.ethereum.org/EIPS/eip-7677) paymaster client. It speaks `pm_getPaymasterStubData` and `pm_getPaymasterData`, so it works with any compliant provider (Candide, Pimlico, Alchemy, or a self-hosted paymaster). Provider is auto-detected from the RPC URL; for Candide and Pimlico it also fetches exchange rates and paymaster addresses automatically for ERC-20 token flows.

For new one-shot sponsorship and ERC-20 gas flows, prefer `Erc7677Paymaster`. For Candide and Pimlico URLs, it handles provider-specific metadata and token quote details behind the scenes. `CandidePaymaster` also supports one-shot sponsorship, but it is most useful when you need Candide-specific APIs or two-phase paymaster signing with `signingPhase: "commit"` and `signingPhase: "finalize"`, which lets the user sign while the paymaster prepares its signature in parallel and reduces wallet or remote-signer latency.

### Usage[​](#usage-10 "Direct link to Usage")

#### Import[​](#import-1 "Direct link to Import")

```
import { Erc7677Paymaster } from "abstractionkit";
```

#### Sponsored UserOperation[​](#sponsored-useroperation "Direct link to Sponsored UserOperation")

example.ts

```
import { Erc7677Paymaster } from "abstractionkit";



const bundlerRpc = "https://api.candide.dev/public/v3/11155111";

const paymaster = new Erc7677Paymaster(bundlerRpc);



// Use createUserOperation() to help you construct a userOp

let userOperation = await smartAccount.createUserOperation(/* ... */);



const { userOperation: sponsoredOp } = await paymaster.createPaymasterUserOperation(

  smartAccount,

  userOperation,

  bundlerRpc,

  { sponsorshipPolicyId: "sp_..." }, // provider-specific context

);

userOperation = sponsoredOp;
```

#### ERC-20 token sponsorship[​](#erc-20-token-sponsorship "Direct link to ERC-20 token sponsorship")

Passing `{ token }` in the context triggers the ERC-20 gas flow automatically. For Candide and Pimlico the exchange rate is fetched for you; for unknown providers, supply `exchangeRate` in the context. `tokenQuote` surfaces the exchange rate and max token cost applied to the UserOperation so you can display the charge to the user without a second round trip.

example.ts

```
const bundlerRpc = "https://api.candide.dev/public/v3/11155111";

const usdcAddress = "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238"; // USDC on sepolia



// Candide or Pimlico (auto-detected): exchange rate fetched from the RPC

const { userOperation: tokenOp, tokenQuote } = await paymaster.createPaymasterUserOperation(

  smartAccount,

  userOperation,

  bundlerRpc,

  { token: usdcAddress },

);

userOperation = tokenOp;



// Unknown provider: supply exchangeRate (scaled by 1e18)

const { userOperation: tokenOp2 } = await paymaster.createPaymasterUserOperation(

  smartAccount,

  userOperation,

  bundlerRpc,

  { token: usdcAddress, exchangeRate: "1000000000000000000" },

);

userOperation = tokenOp2;
```

#### Source code[​](#source-code-8 "Direct link to Source code")

[Erc7677Paymaster](https://github.com/candidelabs/abstractionkit/blob/v0.3.8/src/paymaster/Erc7677Paymaster.ts#L186)
