CCIP v2.0.0 USDCTokenPoolProxy API Reference

Summary

USDCTokenPoolProxy is a forwarding pool that routes USDC lockOrBurn and releaseOrMint flows to specific child pool implementations.

It:

  • Implements [IPoolV1V2](/ccip/evm/api-reference/v2.0.0/i-pool-v1-v2)
  • Does not inherit [TokenPool](/ccip/evm/api-reference/v2.0.0/token-pool)
  • Forwards calls using call
  • Selects child pools based on:
    • LockOrBurnMechanism
    • Version tag prefix embedded in sourcePoolData

Supported routing targets:

  • CCTP v1 pool
  • CCTP v2 pool
  • CCTP v2 with CCV
  • Siloed lock-release pool

Contract

chains/evm/contracts/pools/usdc/USDCTokenPoolProxy.sol


Import

import {USDCTokenPoolProxy} from "chainlink-ccip/chains/evm/contracts/pools/usdc/USDCTokenPoolProxy.sol";

Target + upgrade model

This contract is not a storage proxy.

  • All calls are forwarded via call
  • No delegatecall is used
  • State is isolated from child pools
  • Owner can update child pool addresses

Inheritance

contract USDCTokenPoolProxy
  is IPoolV1V2,
     Ownable2StepMsgSender,
     ITypeAndVersion

typeAndVersion

string public constant override typeAndVersion =
  "USDCTokenPoolProxy 2.0.0-dev";

State

Constants

uint16 internal constant WAIT_FOR_FINALITY = 0;

Immutables

IERC20 internal immutable i_token;
IRouter internal immutable i_router;
ICrossChainVerifierResolver internal immutable i_cctpVerifier;

Storage

mapping(uint64 => LockOrBurnMechanism)
  internal s_lockOrBurnMechanism;

address internal s_cctpV1Pool;
address internal s_cctpV2Pool;
address internal s_cctpV2PoolWithCCV;
address internal s_siloedLockReleasePool;

address internal s_feeAggregator;

Structs & Enums

LockOrBurnMechanism

enum LockOrBurnMechanism {
  NONE,
  CCTP_V1,
  CCTP_V2,
  CCTP_V2_CCV,
  LOCK_RELEASE
}

PoolAddresses

struct PoolAddresses {
  address cctpV1Pool;
  address cctpV2Pool;
  address cctpV2PoolWithCCV;
  address siloedLockReleasePool;
}

External API (forwarded surface)

lockOrBurn (V1)

function lockOrBurn(
  Pool.LockOrBurnInV1 calldata lockOrBurnIn
)
  public
  override
  returns (Pool.LockOrBurnOutV1 memory)
  • Requires caller equals i_router.getOnRamp(...)
  • Routes according to s_lockOrBurnMechanism
  • Reverts if no mechanism configured

lockOrBurn (V2)

function lockOrBurn(
  Pool.LockOrBurnInV1 calldata lockOrBurnIn,
  uint16 blockConfirmationRequested,
  bytes memory tokenArgs
)
  public
  override
  returns (Pool.LockOrBurnOutV1 memory, uint256)
  • Supports CCV and LOCK_RELEASE mechanisms
  • Resolves outbound verifier via i_cctpVerifier

releaseOrMint (V1)

function releaseOrMint(
  Pool.ReleaseOrMintInV1 calldata releaseOrMintIn
)
  public
  override
  returns (Pool.ReleaseOrMintOutV1 memory)
  • Requires caller equals authorized OffRamp
  • Extracts version tag from sourcePoolData
  • Routes accordingly

releaseOrMint (V2)

function releaseOrMint(
  Pool.ReleaseOrMintInV1 calldata releaseOrMintIn,
  uint16 blockConfirmationRequested
)
  public
  override
  returns (Pool.ReleaseOrMintOutV1 memory)
  • Supports CCV and LOCK_RELEASE
  • Routes based on version tag

getFee

Delegates to underlying pool supporting V2.


updatePoolAddresses

function updatePoolAddresses(
  PoolAddresses calldata pools
)
  external
  onlyOwner

updateLockOrBurnMechanisms

function updateLockOrBurnMechanisms(
  uint64[] calldata chainSelectors,
  LockOrBurnMechanism[] calldata mechanisms
)
  external
  onlyOwner

withdrawFeeTokens

function withdrawFeeTokens(
  address[] calldata feeTokens
) external

Permissionless. Forwards to FeeTokenHandler.


Events

event LockOrBurnMechanismUpdated(
  uint64 indexed remoteChainSelector,
  LockOrBurnMechanism mechanism
);

event PoolAddressesUpdated(PoolAddresses pools);

Errors

error AddressCannotBeZero();
error ChainNotSupportedByVerifier(uint64 remoteChainSelector);
error InvalidLockOrBurnMechanism(LockOrBurnMechanism mechanism);
error InvalidMessageVersion(bytes4 version);
error MismatchedArrayLengths();
error NoLockOrBurnMechanismSet(uint64 remoteChainSelector);
error CallerIsNotARampOnRouter(address caller);
error TokenPoolUnsupported(address pool);
error MustSetPoolForMechanism(
  uint64 remoteChainSelector,
  LockOrBurnMechanism mechanism
);

Security model

  • Owner controls routing configuration.
  • Router enforces ramp authorization.
  • No delegatecall — child pool storage remains isolated.
  • Version tag must match expected child pool semantics.
  • Misconfiguration can halt lane until corrected.

Get the latest Chainlink content straight to your inbox.