Skip to main content
WrapperFactory enforces a one-wrapper-per-ERC-20 policy. Anyone can create a wrapper for any ERC-20 that has at least 6 decimals. Once created, the wrapper is permanently registered and discoverable. Mainnet address: 0xde8d3122329916968BA9c5E034Bbade431687408

createWrapper

function createWrapper(address erc20Token) external returns (address wrapper)
Deploy a new ConfidentialWrapper for the given ERC-20 token.
erc20Token
address
required
The underlying ERC-20 token address. Must have decimals() >= 6. Cannot be address(0). A wrapper must not already exist for this token.
Returns the address of the deployed ConfidentialWrapper.
ConfidentialPaymentRouterV2 calls this automatically if a wrapper doesn’t exist yet when you send a payment.

getWrapper

function getWrapper(address erc20Token) external view returns (address)
Returns the wrapper address for a given ERC-20, or address(0) if none exists.

totalWrappers

function totalWrappers() external view returns (uint256)
Returns the total number of wrappers deployed through this factory.

getWrappersPaginated

function getWrappersPaginated(uint256 offset, uint256 limit)
    external view returns (WrapperInfo[] memory)
Paginated list of all wrappers with token metadata.

WrapperInfo struct

erc20Token
address
The underlying ERC-20 token address.
wrapper
address
The deployed ConfidentialWrapper address.
tokenName
string
Underlying token name.
tokenSymbol
string
Underlying token symbol.
tokenDecimals
uint8
Underlying token decimals.
wrapperName
string
cToken name (e.g. "Confidential Wrapped Ether").
wrapperSymbol
string
cToken symbol (e.g. "cWETH").

Events

EventParameters
WrapperCreatederc20Token, wrapper, name, symbol, creator

ConfidentialWrapper

Full reference for the wrapper contract.

PaymentRouterV2

How the router uses WrapperFactory to find wrappers.

Build docs developers (and LLMs) love