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
delegatecallis 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.