CT Wrapper Contract
TheCTWrapper is a pivotal contract in the Bayex ecosystem. It serves as a bridge between the ERC1155 tokens used by the Conditional Tokens Framework and the ERC20 standard required by most DeFi applications, including Uniswap V4.
Key Functions
wrap
Wraps ERC1155 conditional tokens into ERC20 tokens.
- Inputs:
ctid(uint256),amount(uint256),name(string),symbol(string). - Logic: Transfers the ERC1155 tokens from the user to the Wrapper contract using
safeTransferFrom. Mints the corresponding amount of ERC20 tokens to the user. - Design: Encodes
nameandsymbolas data for the transfer.
unwrap
Unwraps ERC20 tokens back into the underlying ERC1155 conditional tokens.
- Inputs:
ctid(uint256),amount(uint256). - Logic: Burns the user’s ERC20 tokens and transfers the stored ERC1155 tokens back to the user via
safeTransferFrom. - Event: Emits
Unwrapped(caller, ctid, amount).
predictTokenAddress (CREATE3)
Returns the deterministic address for a given condition ID before deployment.
- Logic:
CREATE3.predictDeterministicAddress(keccak256(ctid), address(this)) - Benefit: Allows the frontend to know the token address without querying the blockchain state significantly.
Admin Functions
The contract owner has specific privileges to maintain metadata quality:updateBaseURI: sets the base URI for the deployed ERC20 tokens.updateTrimSize: Updates the string trimming size (default: 32 bytes).updateTokenMetadata: Fixes the metadata (name/symbol/uri) of an already deployed token if initial values were incorrect.
Design Decisions
ERC1155 Receiver Hooks
The contract implementsonERC1155Received and onERC1155BatchReceived.
- Feature: This enables “push” wrapping patterns. Users can send tokens to the wrapper to wrap them in a single transaction.
- Auto-Wrap: If tokens are received with data encoding
(string name, string symbol), they are automatically wrapped and ERC20s are minted to the sender.
Gas Optimization
- String Trimming: To prevent gas griefing or excessive storage costs, names and symbols are trimmed to a fixed size (default: 32 bytes) using the internal
_trimfunction. - CREATE3: Ensures address determinism regardless of the salt or bytecode changes, simplifying indexer logic.

