# Token2022 Payment Guard

Both the number of tokens and the destination address can also be configured.

If the payer does not have the required amount of tokens to pay, minting will fail.

Transfer x Amount tokens

from the payer

Core Candy Machine

Owner: Core Candy Machine Core Program

Core Candy Guard

Owner: Core Candy Guard Program

GuardsToken 2022 Payment- Amount- Token Mint- Destination ATA...

Mint Account

Owner: Token 2022 Program

Token Account

Owner: Token 2022 Program

Destination Wallet

Owner: System Program

Mint from

*Core Candy Guard Program*

Access Control

Mint from

*Core Candy Machine Program*

Mint Logic

Asset

[React Flow](https://reactflow.dev/)

The **Token2022 Payment** guard works the same way as the **Token Payment** guard—the only difference is that the mint and token accounts should be from the [SPL Token-2022 program](https://spl.solana.com/token-2022).

### Guard Settings <a href="#guard-settings" id="guard-settings"></a>

The Token Payment guard contains the following settings:

* **Amount**: The number of tokens to charge the payer.
* **Mint**: The address of the mint account defining the SPL Token we want to pay with.
* **Destination Associated Token Address (ATA)**: The address of the associated token account to send the tokens to. We can get this address by finding the Associated Token Address PDA using the **Token Mint** attribute and the address of any wallet that should receive these tokens.

Set up a Core Candy Machine using the Token Payment guard

JavaScript

Note that, in this example, we’re using the current identity as the destination wallet.

```
import { findAssociatedTokenPda } from '@metaplex-foundation/mpl-toolbox'
create(umi, {
  // ...
  guards: {
    token2022Payment: some({
      amount: 300,
      mint: tokenMint.publicKey,
      destinationAta: findAssociatedTokenPda(umi, {
        mint: tokenMint.publicKey,
        owner: umi.identity.publicKey,
      })[0],
    }),
  },
})
```

API References: [create](https://mpl-core-candy-machine.typedoc.metaplex.com/functions/create.html), [TokenPayment](https://mpl-core-candy-machine.typedoc.metaplex.com/types/TokenPaymentArgs.html)

### Mint Settings <a href="#mint-settings" id="mint-settings"></a>

The Token Payment guard contains the following Mint Settings:

* **Mint**: The address of the mint account defining the SPL Token we want to pay with.
* **Destination Associated Token Address (ATA)**: The address of the associated token account to send the tokens to.

Note that, if you’re planning on constructing instructions without the help of our SDKs, you will need to provide these Mint Settings and more as a combination of instruction arguments and remaining accounts. See the [Candy Guard’s program documentation](https://github.com/metaplex-foundation/mpl-core-candy-machine/tree/main/programs/candy-guard#tokenpayment) for more details.

Mint with the NFT Burn Guard

JavaScript

You may pass the Mint Settings of the Token Payment guard using the `mintArgs` argument like so.

```
mintV1(umi, {
  // ...
  mintArgs: {
    tokenPayment: some({
      mint: tokenMint.publicKey,
      destinationAta,
    }),
  },
})
```

API References: [mintV1](https://mpl-core-candy-machine.typedoc.metaplex.com/functions/mintV1.html), [TokenPaymentMintArgs](https://mpl-core-candy-machine.typedoc.metaplex.com/types/Token2022PaymentMintArgs.html)

### Route Instruction <a href="#route-instruction" id="route-instruction"></a>

*The Token Payment guard does not support the route instruction.*


---

# 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://8bit-1.gitbook.io/solibrary/token2022-payment-guard.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.
