CrossChainToken you own. The per-token
layer is independent of the service-level denylist that Circle configures on
every blockchain—see
Denylist layers for the
two-layer model. The service-level layer always runs; this guide only covers the
layer the CCT owner controls.
Only
CrossChainToken contracts deployed as NATIVE_CROSSCHAIN_TOKEN have a
per-token denylist. BURN_MINT and LOCK_UNLOCK configurations of pre-existing
ERC-20 tokens rely on whatever screening the underlying token already
implements.Prerequisites
Before you begin, ensure that you’ve:- Obtained the
tokenIdof theCrossChainTokenyou want to configure. - Confirmed that the wallet you’ll use owns the
CrossChainToken(the value returned byowner()on the CCT). The denylist provider can only be changed by the owner.
Steps
1
Choose a denylist provider
A denylist provider is any contract that implements:Common choices:
Solidity
- Reuse Circle’s screening list. Read the service-level provider from the
local
CrossChainTokenServiceand configure your CCT to use the same one. Per-token screening then matches Circle’s central list. - Bridge a FiatToken denylist. Wrap an existing FiatToken’s
isBlacklistedview in anIDenylistProvideradapter (Circle shipsFiatTokenDenylistAdapter). - Implement your own. Any contract that exposes
isDenylisted(address)can serve as a provider. - Compose multiple lists. Write a small provider that combines results from several upstream lists using a logical OR.
2
Discover the CrossChainToken address
TypeScript
3
Set the denylist provider
Call
The contract emits
updateDenylistProvider
on the CrossChainToken with the address of your chosen provider.TypeScript
DenylistProviderUpdated(oldProvider, newProvider).4
Verify the new provider
TypeScript
5
Disable per-token screening (optional)
To remove per-token screening, set the provider to The service-level layer continues to apply. There is no way for a CCT owner to
opt out of the service-level layer.
address(0):TypeScript