diff --git a/src/components/CCIP/ChainHero/ChainHero.tsx b/src/components/CCIP/ChainHero/ChainHero.tsx
index 1604fde5580..3aa054601a8 100644
--- a/src/components/CCIP/ChainHero/ChainHero.tsx
+++ b/src/components/CCIP/ChainHero/ChainHero.tsx
@@ -206,7 +206,7 @@ function ChainHero({ chains, tokens, network, token, environment, lanes, isDecom
<>
- {isCanton ? "Per party router factroy" : "Router"}
+ {isCanton ? "Per party router factory" : "Router"}
- Starter kit scripts cover **pool creation** and **TAR registration** only. You still configure **rate limiters**, **`ApplyChainUpdates`**, **LockRelease liquidity and pre-approval**, **EDS**, and **lane validation** manually — each guide documents those steps.
+ Starter kit scripts cover **pool creation** and **TAR registration** only. You still configure **rate limiters**, **`ApplyChainUpdates`**, **LockRelease liquidity and preapproval**, **EDS**, and **lane validation** manually — each guide documents those steps.
## On-ledger checklist (all guides)
@@ -27353,7 +27353,7 @@ Last Updated: 2026-07-06
Deploy a **BurnMint** token pool on Canton, register it on the Token Admin Registry (TAR), and enable a cross-chain lane. Use the [`ccip-starter-kit-canton`](https://github.com/smartcontractkit/ccip-starter-kit-canton) for pool deployment and TAR registration, or submit Ledger API commands directly.
-This guide assumes you already have a token instrument live on Canton with supply minted on-ledger — for example a Registry instrument from Digital Asset's [Registry utility](https://docs.digitalasset.com/registry/overview), or any instrument supporting CIP-56 with the `BurnMintFactory` interface.
+This guide assumes you already have a token instrument live on Canton — for example a Registry instrument from Digital Asset's [Registry utility](https://docs.digitalasset.com/registry/overview), or any instrument supporting CIP-56 with the `BurnMintFactory` interface.
**Scope:** On-ledger pool connection — deploy, TAR registration, and lane enablement. Does not cover [EDS setup](/ccip/concepts/canton/explicit-disclosure) or end-to-end transfer tests.
@@ -27402,14 +27402,14 @@ When setting `tokenTransferFeeConfigs` (map keyed by destination chain selector)
| Field | Testnet | Mainnet |
| :------------------------ | :--------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- |
-| Token Admin Registry | `tokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
-| RMNRemote | `rmn_remote-nzvtd@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-mnprd@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
-| FeeQuoter | `feequoter-scxln@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-fpxih@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| Token Admin Registry | `tokenadminregistry-nbehb@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
+| RMNRemote | `rmn_remote-pttst@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-zqxpl@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| FeeQuoter | `feequoter-koyox@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-dwxyx@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| CCIP owner party | `ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| Global EDS | `https://eds.testnet.ccip.chain.link` | `https://eds.ccip.chain.link` |
| Indexer | `https://indexer-1.testnet.ccip.chain.link` | Primary: `https://indexer-1.ccip.chain.link` · Backup: `https://indexer-2.ccip.chain.link` |
| Canton chain selector | `9268731218649498074` | `2308837218439511688` |
-| Default CommitteeVerifier | `committeeverifier-tqkny@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-mnprd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
+| Default CommitteeVerifier | `committeeverifier-pttst@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-vnmkd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
## Step 2 — Register on the Token Admin Registry
@@ -27433,16 +27433,16 @@ Created by `poolOwner` with matching `poolInstanceId`, `poolOwner`, and `remoteC
Call [`ApplyChainUpdates`](https://github.com/smartcontractkit/chainlink-canton/blob/main/contracts/ccip/pools/burn-mint-token-pool/daml/CCIP/BurnMintTokenPoolV2.daml) on the pool:
-| ChainUpdate field | Guidance |
-| :------------------------------------------- | :------------------------------------------------------------------------- |
-| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
-| `remotePools` | Remote token pool address(es) |
-| `remoteTokenAddress` | Remote token address |
-| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
-| `finalityConfig` | `WaitForFinality` for default finalized source tx |
-| `inboundRateLimiter` | Inbound default limiter CID |
-| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter CID |
-| `outboundRateLimiter` | Outbound limiter CID |
+| ChainUpdate field | Guidance |
+| :------------------------------------------- | :------------------------------------------------------------------------------ |
+| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
+| `remotePools` | Remote token pool address(es). Padded to 32 bytes in the case of EVM addresses. |
+| `remoteTokenAddress` | Remote token address. Padded to 32 bytes in the case of EVM addresses. |
+| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
+| `finalityConfig` | `WaitForFinality` for default finalized source tx |
+| `inboundRateLimiter` | Inbound default limiter address |
+| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter address |
+| `outboundRateLimiter` | Outbound limiter address |
Once applied, the on-ledger lane is complete.
@@ -27463,8 +27463,6 @@ Users need [explicit disclosures](/ccip/concepts/canton/explicit-disclosure) for
See [CCIP on Canton — Overview](/ccip/concepts/canton/overview) for user flows. Track messages in [CCIP Explorer](/ccip/tools-resources/ccip-explorer).
-For Registry-issued tokens, also complete [`SetBurnMintFactory`](/ccip/tutorials/canton/cross-chain-tokens/registry-issuer-guide) with your `AllocationFactory` contract ID.
-
This page includes an educational example to use a Chainlink system, product, or service and is provided to
demonstrate how to interact with Chainlink's systems, products, and services to integrate them into your own. This
@@ -27487,7 +27485,7 @@ Last Updated: 2026-07-06
Deploy a **LockRelease** token pool on Canton, fund pool-owner liquidity, register on the Token Admin Registry (TAR), and enable a cross-chain lane. Use the [`ccip-starter-kit-canton`](https://github.com/smartcontractkit/ccip-starter-kit-canton) for pool deployment and TAR registration, or submit Ledger API commands directly.
-This guide assumes you have a token instrument live on Canton with supply minted on-ledger, supporting the CIP-56 `TransferFactory` interface and transfer pre-approvals.
+This guide assumes you have a token instrument live on Canton with supply minted on-ledger, supporting the CIP-56 `TransferFactory` interface and transfer preapprovals.
**LockRelease** is for **fixed total supply** tokens where cross-chain transfers are backed by locked liquidity — not mint/burn. On send, tokens lock to the pool owner; on receive, the pool releases from its holdings.
@@ -27499,7 +27497,7 @@ This guide assumes you have a token instrument live on Canton with supply minted
## Prerequisites
-- **Instrument (token managed on Canton Ledger)** with known `InstrumentId = { admin, id }` supporting `TransferFactory` and pre-approvals.
+- **Instrument (token managed on Canton Ledger)** with known `InstrumentId = { admin, id }` supporting `TransferFactory` and preapprovals.
- Token liquidity held by the pool owner party for expected release volume.
- **LockRelease token pool DAR** on your participant — [`ccip-lock-release-token-pool-2.1.0.dar`](https://github.com/smartcontractkit/chainlink-canton/blob/main/contracts/dars/released/ccip-lock-release-token-pool-v2-2.1.0.dar) (bundles its CCIP dependencies — the only DAR you upload).
- CCIP contract references from Chainlink ops.
@@ -27511,13 +27509,13 @@ This guide assumes you have a token instrument live on Canton with supply minted
## Deployment overview
-| Step | Action | Starter kit | Manual |
-| :--- | :------------------------------- | :------------------------ | :---------------------------------- |
-| 1 | Deploy `LockReleaseTokenPool` | `cct:deploy-lock-release` | Ledger API `CreateCommand` |
-| 2 | Fund holdings + set pre-approval | — | Ledger API choices |
-| 3 | Register on TAR | `cct:set-token` | TAR choices via Ledger API |
-| 4 | Enable lane | — | Rate limiters + `ApplyChainUpdates` |
-| 5 | Go live | — | EDS + verification |
+| Step | Action | Starter kit | Manual |
+| :--- | :------------------------------ | :------------------------ | :---------------------------------- |
+| 1 | Deploy `LockReleaseTokenPool` | `cct:deploy-lock-release` | Ledger API `CreateCommand` |
+| 2 | Fund holdings + set preapproval | — | Ledger API choices |
+| 3 | Register on TAR | `cct:set-token` | TAR choices via Ledger API |
+| 4 | Enable lane | — | Rate limiters + `ApplyChainUpdates` |
+| 5 | Go live | — | EDS + verification |
## Step 1 — Deploy the LockRelease Token Pool
@@ -27539,26 +27537,42 @@ When setting `tokenTransferFeeConfigs` (map keyed by destination chain selector)
| Field | Testnet | Mainnet |
| :------------------------ | :--------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- |
-| Token Admin Registry | `tokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
-| RMNRemote | `rmn_remote-nzvtd@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-mnprd@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
-| FeeQuoter | `feequoter-scxln@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-fpxih@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| Token Admin Registry | `tokenadminregistry-nbehb@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
+| RMNRemote | `rmn_remote-pttst@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-zqxpl@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| FeeQuoter | `feequoter-koyox@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-dwxyx@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| CCIP owner party | `ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| Global EDS | `https://eds.testnet.ccip.chain.link` | `https://eds.ccip.chain.link` |
| Indexer | `https://indexer-1.testnet.ccip.chain.link` | Primary: `https://indexer-1.ccip.chain.link` · Backup: `https://indexer-2.ccip.chain.link` |
| Canton chain selector | `9268731218649498074` | `2308837218439511688` |
-| Default CommitteeVerifier | `committeeverifier-tqkny@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-mnprd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
+| Default CommitteeVerifier | `committeeverifier-pttst@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-vnmkd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
-## Step 2 — Fund the pool and configure pre-approval
+## Step 2 — Fund the pool and configure preapproval
-LockRelease liquidity comes from the **pool owner's token holdings**. Top up those holdings to match expected outbound volume — there is no separate on-pool deposit step. When a receiver executes an inbound transfer on Canton, tokens move from the pool owner's holdings to the recipient.
+LockRelease liquidity comes from the **pool owner's token holdings**. Top up those holdings to match expected inbound volume — there is no separate on-pool deposit step. When a receiver executes an inbound transfer on Canton, tokens move from the pool owner's holdings to the recipient.
- The starter kit does not automate funding or pre-approval. Complete this step via the Ledger API before registering on TAR.
+ The starter kit does not automate funding or preapproval. If necessary, complete this step via the Ledger API before registering on TAR.
### Set pool receive preapproval
-Record the token's transfer preapproval in `poolReceiveContext` so inbound transfers to the pool owner succeed atomically on send:
+During outgoing transfers (sending) the LockRelease Token Pool will create a Transfer from the sender party to the pool's owner party.
+The pool requires this transfer to complete immediately, which requires a preapproval to be created by the pool's owner party that is passed in during the relevant TransferFactory call.
+
+There are two options for passing the necessary preapproval to the TransferFactory:
+
+1. Off-Chain: the explicit disclosure server will provide the preapproval as part of its ChoiceContext response, which the user will pass on to the pool. The pool will then pass the relevant values on to the TransferFactory. (See [External APIs](/ccip/concepts/canton/explicit-disclosure#external-apis-third-party-operated) for details)
+2. On-Chain: hard-code the preapproval's CID in the token pool's `poolReceiveContext`, which the pool will always inject in all calls to the TransferFactory. (Covered in this section)
+
+
+ Hard-coding the preapproval's ContractId in the pool's `poolReceiveContext` will only work if the contract itself is long-lived and will not be archived.
+ Any change in the preapproval's ContractId will require the pool's `poolReceiveContext` to be updated with the new ContractId.
+
+ Consult your token's implementation on details of the preapproval contract's lifecycle.
+
+
+The pool allows for the pool owner to configure hard-coded context values that will automatically be passed to the instrument's TransferFactory.
+To configure, record the token's transfer preapproval in `poolReceiveContext` so inbound transfers to the pool owner succeed atomically on send:
```shell
curl --request POST \
@@ -27569,7 +27583,7 @@ curl --request POST \
"commands": [
{
"ExerciseCommand": {
- "templateId": "#ccip-lock-release-token-pool:CCIP.LockReleaseTokenPool:LockReleaseTokenPool",
+ "templateId": "#ccip-lock-release-token-pool-v2:CCIP.LockReleaseTokenPoolV2:LockReleaseTokenPool",
"contractId": "",
"choice": "AddPoolReceiveContextContractValue",
"choiceArgument": {
@@ -27613,16 +27627,16 @@ Created by `poolOwner` with matching `poolInstanceId`, `poolOwner`, and `remoteC
Call [`ApplyChainUpdates`](https://github.com/smartcontractkit/chainlink-canton/blob/main/contracts/ccip/pools/lock-release-token-pool/daml/CCIP/LockReleaseTokenPoolV2.daml) on the pool:
-| ChainUpdate field | Guidance |
-| :------------------------------------------- | :------------------------------------------------------------------------- |
-| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
-| `remotePools` | Remote token pool address(es) |
-| `remoteTokenAddress` | Remote token address |
-| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
-| `finalityConfig` | `WaitForFinality` for default finalized source tx |
-| `inboundRateLimiter` | Inbound default limiter CID |
-| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter CID |
-| `outboundRateLimiter` | Outbound limiter CID |
+| ChainUpdate field | Guidance |
+| :------------------------------------------- | :------------------------------------------------------------------------------ |
+| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
+| `remotePools` | Remote token pool address(es). Padded to 32 bytes in the case of EVM addresses. |
+| `remoteTokenAddress` | Remote token address. Padded to 32 bytes in the case of EVM addresses. |
+| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
+| `finalityConfig` | `WaitForFinality` for default finalized source tx |
+| `inboundRateLimiter` | Inbound default limiter address |
+| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter address |
+| `outboundRateLimiter` | Outbound limiter address |
Once applied, the on-ledger lane is complete.
@@ -27637,7 +27651,7 @@ Once applied, the on-ledger lane is complete.
### Stand up EDS
-The [reference EDS](https://github.com/smartcontractkit/chainlink-canton/blob/main/eds/eds.Dockerfile) supports LockRelease, including holdings and TransferFactory context for pre-approvals.
+The [reference EDS](https://github.com/smartcontractkit/chainlink-canton/blob/main/eds/eds.Dockerfile) supports LockRelease, including holdings and TransferFactory context for preapprovals.
### Test transactions
diff --git a/src/content/ccip/tutorials/canton/cross-chain-tokens/burn-mint-token-pool.mdx b/src/content/ccip/tutorials/canton/cross-chain-tokens/burn-mint-token-pool.mdx
index b25fa189177..145f77eeaa3 100644
--- a/src/content/ccip/tutorials/canton/cross-chain-tokens/burn-mint-token-pool.mdx
+++ b/src/content/ccip/tutorials/canton/cross-chain-tokens/burn-mint-token-pool.mdx
@@ -23,7 +23,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
Deploy a **BurnMint** token pool on Canton, register it on the Token Admin Registry (TAR), and enable a cross-chain lane. Use the [`ccip-starter-kit-canton`](https://github.com/smartcontractkit/ccip-starter-kit-canton) for pool deployment and TAR registration, or submit Ledger API commands directly.
-This guide assumes you already have a token instrument live on Canton with supply minted on-ledger — for example a Registry instrument from Digital Asset's [Registry utility](https://docs.digitalasset.com/registry/overview), or any instrument supporting CIP-56 with the `BurnMintFactory` interface.
+This guide assumes you already have a token instrument live on Canton — for example a Registry instrument from Digital Asset's [Registry utility](https://docs.digitalasset.com/registry/overview), or any instrument supporting CIP-56 with the `BurnMintFactory` interface.
**Scope:** On-ledger pool connection — deploy, TAR registration, and lane enablement. Does not cover [EDS setup](/ccip/concepts/canton/explicit-disclosure) or end-to-end transfer tests.
@@ -109,7 +109,7 @@ Submit a `CreateCommand` for `BurnMintTokenPool` via your participant's JSON Led
| Argument | Guidance |
| :------------------------ | :---------------------------------------------------------------------------------------- |
| `instanceId` | Unique string for your party, e.g. `acme-eur-bm-pool` |
-| `poolOwner` | Party that owns the pool. Recommended: instrument admin. |
+| `poolOwner` | Party that owns the pool. Must be the same as `instrumentId.admin`. |
| `ccipOwner` | Chainlink CCIP owner party from ops |
| `instrumentId` | Your underlying asset's `InstrumentId` |
| `decimals` | Standard value: `10` |
@@ -141,14 +141,14 @@ When setting `tokenTransferFeeConfigs` (map keyed by destination chain selector)
| Field | Testnet | Mainnet |
| :------------------------ | :--------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- |
-| Token Admin Registry | `tokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
-| RMNRemote | `rmn_remote-nzvtd@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-mnprd@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
-| FeeQuoter | `feequoter-scxln@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-fpxih@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| Token Admin Registry | `tokenadminregistry-nbehb@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
+| RMNRemote | `rmn_remote-pttst@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-zqxpl@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| FeeQuoter | `feequoter-koyox@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-dwxyx@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| CCIP owner party | `ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| Global EDS | `https://eds.testnet.ccip.chain.link` | `https://eds.ccip.chain.link` |
| Indexer | `https://indexer-1.testnet.ccip.chain.link` | Primary: `https://indexer-1.ccip.chain.link` · Backup: `https://indexer-2.ccip.chain.link` |
| Canton chain selector | `9268731218649498074` | `2308837218439511688` |
-| Default CommitteeVerifier | `committeeverifier-tqkny@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-mnprd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
+| Default CommitteeVerifier | `committeeverifier-pttst@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-vnmkd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
## Step 2 — Register on the Token Admin Registry
@@ -209,7 +209,7 @@ curl --request POST \
--header 'content-type: application/json' \
--data '{
"addresses": [
- "tokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551"
+ "tokenadminregistry-nbehb@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551"
]
}'
```
@@ -245,16 +245,16 @@ Created by `poolOwner` with matching `poolInstanceId`, `poolOwner`, and `remoteC
Call [`ApplyChainUpdates`](https://github.com/smartcontractkit/chainlink-canton/blob/main/contracts/ccip/pools/burn-mint-token-pool/daml/CCIP/BurnMintTokenPoolV2.daml) on the pool:
-| ChainUpdate field | Guidance |
-| :------------------------------------------- | :------------------------------------------------------------------------- |
-| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
-| `remotePools` | Remote token pool address(es) |
-| `remoteTokenAddress` | Remote token address |
-| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
-| `finalityConfig` | `WaitForFinality` for default finalized source tx |
-| `inboundRateLimiter` | Inbound default limiter CID |
-| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter CID |
-| `outboundRateLimiter` | Outbound limiter CID |
+| ChainUpdate field | Guidance |
+| :------------------------------------------- | :------------------------------------------------------------------------------ |
+| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
+| `remotePools` | Remote token pool address(es). Padded to 32 bytes in the case of EVM addresses. |
+| `remoteTokenAddress` | Remote token address. Padded to 32 bytes in the case of EVM addresses. |
+| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
+| `finalityConfig` | `WaitForFinality` for default finalized source tx |
+| `inboundRateLimiter` | Inbound default limiter address |
+| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter address |
+| `outboundRateLimiter` | Outbound limiter address |
Once applied, the on-ledger lane is complete.
@@ -275,6 +275,4 @@ Users need [explicit disclosures](/ccip/concepts/canton/explicit-disclosure) for
See [CCIP on Canton — Overview](/ccip/concepts/canton/overview) for user flows. Track messages in [CCIP Explorer](/ccip/tools-resources/ccip-explorer).
-For Registry-issued tokens, also complete [`SetBurnMintFactory`](/ccip/tutorials/canton/cross-chain-tokens/registry-issuer-guide) with your `AllocationFactory` contract ID.
-
diff --git a/src/content/ccip/tutorials/canton/cross-chain-tokens/index.mdx b/src/content/ccip/tutorials/canton/cross-chain-tokens/index.mdx
index 0aa6668c06b..e062148d350 100644
--- a/src/content/ccip/tutorials/canton/cross-chain-tokens/index.mdx
+++ b/src/content/ccip/tutorials/canton/cross-chain-tokens/index.mdx
@@ -32,7 +32,7 @@ Starter kit `cct:*` scripts target **Canton testnet** only.
| :----------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- |
| [Registry Issuer Guide](/ccip/tutorials/canton/cross-chain-tokens/registry-issuer-guide) | Issue a new token via Digital Asset Registry and connect CCIP end to end |
| [BurnMint Token Pool Deployment](/ccip/tutorials/canton/cross-chain-tokens/burn-mint-token-pool) | Existing CIP-56 instrument with burn/mint authority |
-| [LockRelease Token Pool Deployment](/ccip/tutorials/canton/cross-chain-tokens/lock-release-token-pool) | Fixed-supply instrument with transfer pre-approvals |
+| [LockRelease Token Pool Deployment](/ccip/tutorials/canton/cross-chain-tokens/lock-release-token-pool) | Fixed-supply instrument with transfer preapprovals |
## Starter kit (`cct:*` scripts)
@@ -78,7 +78,7 @@ npm run cct:set-token -- \
-Starter kit scripts cover **pool creation** and **TAR registration** only. You still configure **rate limiters**, **`ApplyChainUpdates`**, **LockRelease liquidity and pre-approval**, **EDS**, and **lane validation** manually — each guide documents those steps.
+Starter kit scripts cover **pool creation** and **TAR registration** only. You still configure **rate limiters**, **`ApplyChainUpdates`**, **LockRelease liquidity and preapproval**, **EDS**, and **lane validation** manually — each guide documents those steps.
diff --git a/src/content/ccip/tutorials/canton/cross-chain-tokens/lock-release-token-pool.mdx b/src/content/ccip/tutorials/canton/cross-chain-tokens/lock-release-token-pool.mdx
index 68500410540..e87fd8efadc 100644
--- a/src/content/ccip/tutorials/canton/cross-chain-tokens/lock-release-token-pool.mdx
+++ b/src/content/ccip/tutorials/canton/cross-chain-tokens/lock-release-token-pool.mdx
@@ -4,7 +4,7 @@ date: Last Modified
title: "LockRelease Token Pool Deployment (Canton)"
metadata:
description: "Deploy a CCIP LockRelease token pool on Canton for fixed-supply CIP-56 instruments, register on TAR, and enable a cross-chain lane."
- excerpt: "CCIP Canton LockRelease token pool, pre-approval, TAR registration, starter kit, cct scripts"
+ excerpt: "CCIP Canton LockRelease token pool, preapproval, TAR registration, starter kit, cct scripts"
datePublished: "2026-06-27"
lastModified: "2026-07-06"
difficulty: "advanced"
@@ -23,7 +23,7 @@ import CcipCommon from "@features/ccip/CcipCommon.astro"
Deploy a **LockRelease** token pool on Canton, fund pool-owner liquidity, register on the Token Admin Registry (TAR), and enable a cross-chain lane. Use the [`ccip-starter-kit-canton`](https://github.com/smartcontractkit/ccip-starter-kit-canton) for pool deployment and TAR registration, or submit Ledger API commands directly.
-This guide assumes you have a token instrument live on Canton with supply minted on-ledger, supporting the CIP-56 `TransferFactory` interface and transfer pre-approvals.
+This guide assumes you have a token instrument live on Canton with supply minted on-ledger, supporting the CIP-56 `TransferFactory` interface and transfer preapprovals.
**LockRelease** is for **fixed total supply** tokens where cross-chain transfers are backed by locked liquidity — not mint/burn. On send, tokens lock to the pool owner; on receive, the pool releases from its holdings.
@@ -37,7 +37,7 @@ Starter kit `cct:*` scripts target **Canton testnet** only.
## Prerequisites
-- **Instrument (token managed on Canton Ledger)** with known `InstrumentId = { admin, id }` supporting `TransferFactory` and pre-approvals.
+- **Instrument (token managed on Canton Ledger)** with known `InstrumentId = { admin, id }` supporting `TransferFactory` and preapprovals.
- Token liquidity held by the pool owner party for expected release volume.
- **LockRelease token pool DAR** on your participant — [`ccip-lock-release-token-pool-2.1.0.dar`](https://github.com/smartcontractkit/chainlink-canton/blob/main/contracts/dars/released/ccip-lock-release-token-pool-v2-2.1.0.dar) (bundles its CCIP dependencies — the only DAR you upload).
- CCIP contract references from Chainlink ops.
@@ -51,13 +51,13 @@ CCIP fully trusts the pool owner. Strongly recommend pool owner equals instrumen
## Deployment overview
-| Step | Action | Starter kit | Manual |
-| :--- | :------------------------------- | :------------------------ | :---------------------------------- |
-| 1 | Deploy `LockReleaseTokenPool` | `cct:deploy-lock-release` | Ledger API `CreateCommand` |
-| 2 | Fund holdings + set pre-approval | — | Ledger API choices |
-| 3 | Register on TAR | `cct:set-token` | TAR choices via Ledger API |
-| 4 | Enable lane | — | Rate limiters + `ApplyChainUpdates` |
-| 5 | Go live | — | EDS + verification |
+| Step | Action | Starter kit | Manual |
+| :--- | :------------------------------ | :------------------------ | :---------------------------------- |
+| 1 | Deploy `LockReleaseTokenPool` | `cct:deploy-lock-release` | Ledger API `CreateCommand` |
+| 2 | Fund holdings + set preapproval | — | Ledger API choices |
+| 3 | Register on TAR | `cct:set-token` | TAR choices via Ledger API |
+| 4 | Enable lane | — | Rate limiters + `ApplyChainUpdates` |
+| 5 | Go live | — | EDS + verification |
## Step 1 — Deploy the LockRelease Token Pool
@@ -139,28 +139,46 @@ When setting `tokenTransferFeeConfigs` (map keyed by destination chain selector)
| Field | Testnet | Mainnet |
| :------------------------ | :--------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------- |
-| Token Admin Registry | `tokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
-| RMNRemote | `rmn_remote-nzvtd@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-mnprd@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
-| FeeQuoter | `feequoter-scxln@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-fpxih@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| Token Admin Registry | `tokenadminregistry-nbehb@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | Contact the [CCIP team](https://chain.link/ccip-contact) for the Token Admin Registry address to register a token pool |
+| RMNRemote | `rmn_remote-pttst@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `rmn_remote-zqxpl@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
+| FeeQuoter | `feequoter-koyox@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `feequoter-dwxyx@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| CCIP owner party | `ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093` |
| Global EDS | `https://eds.testnet.ccip.chain.link` | `https://eds.ccip.chain.link` |
| Indexer | `https://indexer-1.testnet.ccip.chain.link` | Primary: `https://indexer-1.ccip.chain.link` · Backup: `https://indexer-2.ccip.chain.link` |
| Canton chain selector | `9268731218649498074` | `2308837218439511688` |
-| Default CommitteeVerifier | `committeeverifier-tqkny@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-mnprd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
+| Default CommitteeVerifier | `committeeverifier-pttst@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551` | `committeeverifier-vnmkd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff` |
-## Step 2 — Fund the pool and configure pre-approval
+## Step 2 — Fund the pool and configure preapproval
-LockRelease liquidity comes from the **pool owner's token holdings**. Top up those holdings to match expected outbound volume — there is no separate on-pool deposit step. When a receiver executes an inbound transfer on Canton, tokens move from the pool owner's holdings to the recipient.
+LockRelease liquidity comes from the **pool owner's token holdings**. Top up those holdings to match expected inbound volume — there is no separate on-pool deposit step. When a receiver executes an inbound transfer on Canton, tokens move from the pool owner's holdings to the recipient.
-The starter kit does not automate funding or pre-approval. Complete this step via the Ledger API before registering on TAR.
+The starter kit does not automate funding or preapproval. If necessary, complete this step via the Ledger API before registering on TAR.
### Set pool receive preapproval
-Record the token's transfer preapproval in `poolReceiveContext` so inbound transfers to the pool owner succeed atomically on send:
+During outgoing transfers (sending) the LockRelease Token Pool will create a Transfer from the sender party to the pool's owner party.
+The pool requires this transfer to complete immediately, which requires a preapproval to be created by the pool's owner party that is passed in during the relevant TransferFactory call.
+
+There are two options for passing the necessary preapproval to the TransferFactory:
+
+1. Off-Chain: the explicit disclosure server will provide the preapproval as part of its ChoiceContext response, which the user will pass on to the pool. The pool will then pass the relevant values on to the TransferFactory. (See [External APIs](/ccip/concepts/canton/explicit-disclosure#external-apis-third-party-operated) for details)
+2. On-Chain: hard-code the preapproval's CID in the token pool's `poolReceiveContext`, which the pool will always inject in all calls to the TransferFactory. (Covered in this section)
+
+
+
+Hard-coding the preapproval's ContractId in the pool's `poolReceiveContext` will only work if the contract itself is long-lived and will not be archived.
+Any change in the preapproval's ContractId will require the pool's `poolReceiveContext` to be updated with the new ContractId.
+
+Consult your token's implementation on details of the preapproval contract's lifecycle.
+
+
+
+The pool allows for the pool owner to configure hard-coded context values that will automatically be passed to the instrument's TransferFactory.
+To configure, record the token's transfer preapproval in `poolReceiveContext` so inbound transfers to the pool owner succeed atomically on send:
```shell
curl --request POST \
@@ -171,7 +189,7 @@ curl --request POST \
"commands": [
{
"ExerciseCommand": {
- "templateId": "#ccip-lock-release-token-pool:CCIP.LockReleaseTokenPool:LockReleaseTokenPool",
+ "templateId": "#ccip-lock-release-token-pool-v2:CCIP.LockReleaseTokenPoolV2:LockReleaseTokenPool",
"contractId": "",
"choice": "AddPoolReceiveContextContractValue",
"choiceArgument": {
@@ -221,7 +239,7 @@ curl --request POST \
--header 'content-type: application/json' \
--data '{
"addresses": [
- "tokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551"
+ "tokenadminregistry-nbehb@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551"
]
}'
```
@@ -257,16 +275,16 @@ Created by `poolOwner` with matching `poolInstanceId`, `poolOwner`, and `remoteC
Call [`ApplyChainUpdates`](https://github.com/smartcontractkit/chainlink-canton/blob/main/contracts/ccip/pools/lock-release-token-pool/daml/CCIP/LockReleaseTokenPoolV2.daml) on the pool:
-| ChainUpdate field | Guidance |
-| :------------------------------------------- | :------------------------------------------------------------------------- |
-| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
-| `remotePools` | Remote token pool address(es) |
-| `remoteTokenAddress` | Remote token address |
-| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
-| `finalityConfig` | `WaitForFinality` for default finalized source tx |
-| `inboundRateLimiter` | Inbound default limiter CID |
-| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter CID |
-| `outboundRateLimiter` | Outbound limiter CID |
+| ChainUpdate field | Guidance |
+| :------------------------------------------- | :------------------------------------------------------------------------------ |
+| `remoteChainSelector` | Destination chain selector — see [CCIP Directory](/ccip/directory/testnet) |
+| `remotePools` | Remote token pool address(es). Padded to 32 bytes in the case of EVM addresses. |
+| `remoteTokenAddress` | Remote token address. Padded to 32 bytes in the case of EVM addresses. |
+| `inboundCCVs` / `outboundCCVs` | Default CommitteeVerifier (testnet address above) unless custom |
+| `finalityConfig` | `WaitForFinality` for default finalized source tx |
+| `inboundRateLimiter` | Inbound default limiter address |
+| `inboundCustomBlockConfirmationsRateLimiter` | Inbound custom limiter address |
+| `outboundRateLimiter` | Outbound limiter address |
Once applied, the on-ledger lane is complete.
@@ -281,7 +299,7 @@ Once applied, the on-ledger lane is complete.
### Stand up EDS
-The [reference EDS](https://github.com/smartcontractkit/chainlink-canton/blob/main/eds/eds.Dockerfile) supports LockRelease, including holdings and TransferFactory context for pre-approvals.
+The [reference EDS](https://github.com/smartcontractkit/chainlink-canton/blob/main/eds/eds.Dockerfile) supports LockRelease, including holdings and TransferFactory context for preapprovals.
### Test transactions