BurnMint Token Pool Deployment (Canton)

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, or any instrument supporting CIP-56 with the BurnMintFactory interface.

Scope: On-ledger connection — deploy the pool, register on the Token Admin Registry (TAR), and enable a lane. Does not cover standing up the Explicit Disclosure Service or end-to-end transfer tests.

Prerequisites

  • Instrument on Canton with known InstrumentId = { admin, id }. The admin party must be the same party that will own the token pool.
  • Burn/mint authorityinstrumentId.admin == poolOwner (enforced by the template).
  • CCIP DAR packages on your participant from contracts/dars/v2_0_0.
  • CCIP contract references from Chainlink ops: CCIP owner party, Token Admin Registry, RMNRemote, FeeQuoter.

Step 1 — Deploy the BurnMint Token Pool

Create one BurnMintTokenPool contract. poolOwner + instanceId uniquely identifies the pool. Signatory: poolOwner.

ArgumentGuidance
instanceIdUnique string for your party, e.g. acme-eur-bm-pool
poolOwnerParty that owns the pool. Recommended: instrument admin.
ccipOwnerChainlink CCIP owner party from ops
instrumentIdYour underlying asset's InstrumentId
decimalsStandard value: 10
rateLimitAdminOptional — leave unset unless a separate party manages limits
remoteChainConfigsLeave empty — configure via ApplyChainUpdates (Step 3)
tokenTransferFeeConfigsOptional per-destination fees — set at deploy or via ApplyTokenTransferFeeConfigUpdates
poolReceiveContextLeave empty at creation
transferTimeoutIndefinite to disable expiry on pending outgoing transfers
depstokenAdminRegistry, rmnRemote, feeQuoter references from ops

Transfer-fee fields

When setting tokenTransferFeeConfigs (map keyed by destination chain selector):

FieldMeaning
isEnabledMust be true to apply the config
feeUSDCentsFlat fee in USD cents (non-negative)
destGasOverheadGas for destination execution (> 0 when set via choice)
destBytesOverheadData-availability bytes overhead (≥ 32)
feeBpsProportional fee in basis points (< 10000)

CCIP hosted addresses

FieldTestnetMainnet
Token Admin Registrytokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551tokenadminregistry-ckswd@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093
RMNRemotermn_remote-nzvtd@rmnOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551rmn_remote-mnprd@rmnOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093
FeeQuoterfeequoter-scxln@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551feequoter-fpxih@ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093
CCIP owner partyccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551ccipOwner::122012714685760dc1927c4cfe119ce2126c48756154e95c06f5c181da05a5519093
Global EDShttps://eds.testnet.ccip.chain.linkhttps://eds.ccip.chain.link
Indexerhttps://indexer-1.testnet.ccip.chain.linkhttps://indexer-1.ccip.chain.link (backup: indexer-2)
Canton chain selector92687312186494980742308837218439511688
Default CommitteeVerifiercommitteeverifier-tqkny@ccvOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551committeeverifier-mnprd@ccvOwner::122096accf0a84fc7d80d5fce5ea3135317a03eb22e62e0d8cdd7548865f984f11ff

After creation, your pool address is {instanceId}@{poolOwner}.

Step 2 — Register on the Token Admin Registry

TAR maps each instrument to a single token pool. Registration: propose → accept → set pool.

Fetch TAR explicit disclosure

Your party is not an observer on TAR. Query the Global EDS batch endpoint:

curl --request POST \
  --url https://eds.testnet.ccip.chain.link/ccip/v1/global/disclosure/batch \
  --header 'content-type: application/json' \
  --data '{
  "addresses": [
    "tokenadminregistry-lzrnd@ccipOwner::1220e382f4e57b0815e6be737006e381e6b7de448e06bd033ece6df498017879f551"
  ]
}'

Include disclosed contracts in subsequent ledger submissions. OpenAPI: eds-global.yaml.

TAR choices

  1. ProposeAdministrator — CCIP owner or instrument admin. Pass instrumentId, newAdmin, caller. For new instruments, leave tokenConfigCid as None. Returns TokenConfig CID for next steps.
  2. AcceptAdminRole — Proposed admin exercises with tokenConfigCid, instrumentId, caller.
  3. SetPool — Admin links instrument to pool via PoolRegistration (poolOwner, poolInstanceId from Step 1).

Admin role can be transferred with TransferAdminRoleAcceptAdminRole.

Step 3 — Enable a lane

1. Deploy three rate limiters

Each lane requires RateLimiter contracts (for testing, deploy disabled with zero capacity/rate):

  • Inbound (default finality)
  • Inbound (custom finality)
  • Outbound

Created by poolOwner with matching poolInstanceId, poolOwner, and remoteChainSelector.

2. Apply the chain update

Call ApplyChainUpdates on the pool:

ChainUpdate fieldGuidance
remoteChainSelectorDestination chain selector — see CCIP Directory
remotePoolsRemote token pool address(es)
remoteTokenAddressRemote token address
inboundCCVs / outboundCCVsDefault CommitteeVerifier (testnet address above) unless custom
finalityConfigWaitForFinality for default finalized source tx
inboundRateLimiterInbound default limiter CID
inboundCustomBlockConfirmationsRateLimiterInbound custom limiter CID
outboundRateLimiterOutbound limiter CID

Once applied, the on-ledger lane is complete.

Step 4 — Go live

Verification checklist

  1. InstrumentId.admin equals pool owner.
  2. TAR maps your instrument to your pool with your party as admin.
  3. Pool exists at {instanceId}@{poolOwner} with matching InstrumentId.
  4. Lane rate limiters are in place.

Stand up EDS for your pool

Users need explicit disclosures for your pool to send and execute transfers. The reference EDS Docker image supports BurnMint out of the box.

Test transactions

See CCIP on Canton — Overview for user flows. Track messages in CCIP Explorer.

For Registry-issued tokens, also complete SetBurnMintFactory with your AllocationFactory contract ID.

What's next

Get the latest Chainlink content straight to your inbox.