# Cross-Chain Token (CCT) Tutorials
Source: https://docs.chain.link/ccip/evm/tutorials/cross-chain-tokens
Last Updated: 2025-05-19

> For the complete documentation index, see [llms.txt](/llms.txt).

> **NOTE: Prerequisites**
>
> Familiarize yourself with the [CCT standard](/ccip/concepts/cross-chain-token/overview) and [CCIP
> architecture](/ccip/concepts/architecture/overview) before proceeding with these tutorials.

Before diving into the [tutorials](#tutorials), it's important first to understand the overall procedure for enabling your tokens in CCIP. This procedure involves deploying tokens and token pools, registering administrative roles, and configuring token pools to enable secure token transfers using CCIP. The diagram below outlines the entire process:

![Process for enabling a token in CCIP.](/images/ccip/CCIP_enabled_tokens_flowchart.jpg)

### Understanding the Procedure

The steps in the diagram highlight the flow of actions needed to enable a token for cross-chain transfers. These steps will be the foundation of the tutorials. Whether you're working with an Externally Owned Account (EOA) or a **Smart Account** (such as one using a multisig scheme), the overall logic remains the same. You'll follow the same process to enable cross-chain token transfers, configure pools, and register administrative roles.

In the following tutorials, we will walk through each step of the process to give you hands-on experience, from deploying your token to registering and configuring token pools. The process will apply equally whether you use an EOA or a Smart Account (such as with multisig transactions), ensuring flexibility across different account types.

### Key Steps to Keep in Mind:

1. **Token Deployment**: If the token is not yet deployed, you'll deploy an ERC20-compatible token.
2. **Admin Registration**: The token administrator must be registered in the [`TokenAdminRegistry`](https://github.com/smartcontractkit/chainlink-ccip/tree/contracts-ccip-v2.0.0/chains/evm/contracts/tokenAdminRegistry/TokenAdminRegistry.sol) via self-service.
3. **Pool Deployment and Configuration**: Token pools are deployed, linked to tokens, and configured to manage cross-chain token transfers.

The tutorials will implement the logic of this process, which involves deploying and configuring token pools and registering administrative roles, step-by-step.

## Tutorials

- [Register from an EOA (Burn & Mint)](/ccip/evm/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-foundry): Register a cross-chain token with the Burn & Mint mechanism using an EOA. Hardhat and Foundry versions available.
- [Register from an EOA (Lock & Mint)](/ccip/evm/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-foundry): Register a cross-chain token with the Lock & Mint mechanism using an EOA. Hardhat and Foundry versions available.
- [Set Token Pool Rate Limits](/ccip/evm/tutorials/cross-chain-tokens/update-rate-limiters-foundry): Set rate limits for token pools to control cross-chain token transfer flow. Hardhat and Foundry versions available.
- [Set Token Transfer Fee Config](/ccip/evm/tutorials/cross-chain-tokens/set-transfer-fee-config-foundry): Configure token transfer fee parameters directly on your v2 token pool, overriding FeeQuoter defaults. Hardhat and Foundry versions available.
- [Configure a Sender Allowlist with AdvancedPoolHooks](/ccip/evm/tutorials/cross-chain-tokens/configure-sender-allowlist-advanced-pool-hooks-foundry): Deploy and attach AdvancedPoolHooks to your v2 token pool to restrict outbound transfers to approved sender addresses. Hardhat and Foundry versions available.
- [Enforce ACE Policies on CCIP Token Transfers](/ccip/evm/tutorials/cross-chain-tokens/enforce-ace-policies-foundry): Connect source and destination AdvancedPoolHooks to Chainlink ACE Policy Engines and exercise preflight and postflight rejections with live transfers. Hardhat and Foundry versions available.

> **CAUTION: Educational Example Disclaimer**
>
> Please note, this page contains community examples only — these are not Chainlink products or services and are not
> supported or maintained by Chainlink. This code represents an example of using a Chainlink product or service, and is
> intended for demonstration and educational purposes only. It is provided "AS IS" and "AS AVAILABLE" without warranties
> of any kind, may not have been audited, and may omit checks or error handling. Each party intending to use this
> example code does so entirely at their own risk and must perform its own audits, security and code review, key
> management, and testing before any production deployment and ensure the operation and performance of such code matches
> expectations. Neither Chainlink Labs nor the Chainlink Foundation deploys, operates, monitors, maintains or endorses
> any deployment of this code. Note that this is not a Chainlink product, feature or service, and there are no
> commitments made with respect to the code, including compatibility with future Chainlink releases. You should not rely
> on this code without first conducting your own technical, engineering, and security review. This code is also outside
> the scope of any Chainlink bug bounty programs. Neither Chainlink Labs, the Chainlink Foundation, nor Chainlink node
> operators are responsible for outcomes due to errors in this example or how it is deployed or operated, or liable for
> any resulting claims or damages. Use of the Chainlink Network is subject to the Chainlink Foundation [Terms of
> Service](https://chain.link/terms), which provides important information and disclosures. By using this code, you
> acknowledge and agree to these terms.