A cross-chain bridge for an algorithmic stablecoin is a specialized system that enables the minting, burning, and governance of a stable asset across different blockchain networks. Unlike simple asset bridges that lock-and-mint tokens, an algorithmic stablecoin bridge must also manage the core monetary policy functions—like collateral ratios and rebase mechanisms—in a synchronized, decentralized manner. This architecture typically involves a canonical hub chain (e.g., Ethereum, Arbitrum) where the primary protocol logic and governance reside, and spoke chains (e.g., Polygon, Base) where bridged, synthetic versions of the stablecoin are used for transactions and DeFi.
Launching a Cross-Chain Stablecoin Bridge Architecture
Launching a Cross-Chain Stablecoin Bridge Architecture
A practical guide to designing and implementing a secure, decentralized bridge for an algorithmic stablecoin to operate across multiple blockchains.
The core technical challenge is maintaining state consistency and liveness guarantees across chains. A common pattern uses a set of decentralized relayers or a light client bridge to pass messages. For example, when a user mints stablecoins on the hub, a message must be securely transmitted to the spoke chain to mint the corresponding synthetic token. This is often implemented using a message-passing protocol like Axelar's General Message Passing (GMP), LayerZero's Ultra Light Node, or Wormhole's cross-chain messaging. The bridge contract on the spoke chain must verify the message's authenticity before executing the mint or burn function.
Security is paramount. A bridge is a high-value target, and its compromise could break the stablecoin's peg. Key design considerations include: - Decentralization of relayers/validators to avoid single points of failure. - Economic security via staking and slashing mechanisms for relayers. - Graceful failure modes, such as pausing minting on spokes if the hub detects an attack. - Time-delayed or multi-signature execution for critical governance actions like parameter changes. Audits from firms like Trail of Bits or OpenZeppelin are essential before mainnet deployment.
For developers, implementing a basic proof-of-concept involves writing smart contracts for the hub and each spoke. The hub contract manages the total stablecoin supply and emits events with signed proofs. A relayer service (which could be a decentralized network) listens for these events, generates a Merkle proof, and submits it to the spoke chain's bridge contract. The spoke contract verifies the proof against a known root (stored in a light client state) and then mints tokens to the user's address. Tools like the Solidity SDK for Wormhole can abstract much of this complexity.
Finally, successful deployment requires rigorous testing on testnets, incentivizing a diverse set of relayers, and establishing clear governance for upgrades. The end goal is a trust-minimized system where users on any supported chain can interact with the stablecoin as if they were on the native chain, with the underlying protocol ensuring cross-chain solvency and peg stability. This architecture unlocks liquidity and utility for algorithmic stablecoins beyond a single ecosystem.
Prerequisites and Required Knowledge
Before building a cross-chain stablecoin bridge, you need a solid grasp of core blockchain concepts, smart contract security, and the specific mechanics of stablecoins and interoperability protocols.
A deep understanding of blockchain fundamentals is non-negotiable. You must be proficient in how blockchains like Ethereum, Avalanche, or Polygon operate at the consensus and state transition level. This includes knowledge of accounts, transactions, gas, and the role of validators or miners. Familiarity with the Ethereum Virtual Machine (EVM) is particularly crucial, as it's the runtime environment for most bridge smart contracts and the target for many Layer 2 and alternative Layer 1 chains. You should understand concepts like storage slots, opcodes, and how contract calls are executed and validated.
Expertise in smart contract development and security is the most critical technical skill. You must be fluent in Solidity or Vyper and understand advanced patterns like upgradeable proxies (e.g., using OpenZeppelin's TransparentUpgradeableProxy), pausable contracts, and access control (e.g., Ownable, AccessControl). Security is paramount; you need to be intimately familiar with common vulnerabilities like reentrancy, integer overflows, and improper access control, as a bridge flaw can lead to catastrophic fund loss. Experience with testing frameworks like Hardhat or Foundry and formal verification tools is essential.
You must thoroughly understand stablecoin mechanics. For fiat-backed stablecoins like USDC, you need to know the mint/burn authority models and compliance layers. For algorithmic or crypto-backed stablecoins, you must grasp the mechanisms for maintaining peg stability, such as collateral ratios, liquidation engines, and governance. The bridge architecture must preserve the canonical representation and redeemability of the stablecoin across chains without creating unbacked synthetic versions, unless that is the explicit design goal (introducing significant risk).
A working knowledge of cross-chain communication protocols is required. Study the dominant models: lock-and-mint (assets locked on Chain A, minted on Chain B), burn-and-mint (assets burned on Chain B to unlock on Chain A), and liquidity pool-based models. You should understand the trust assumptions of each, including the roles of external validators (e.g., Axelar, Wormhole), optimistic relayers (e.g., Nomad), and light clients (e.g., IBC). Each model has different implications for security, latency, and capital efficiency.
Finally, practical DevOps and node operation knowledge is needed. You will likely need to run or interact with nodes/validators for multiple chains, set up secure relayers, and manage private keys for multi-signature wallets or oracle networks. Understanding how to monitor blockchain events, handle chain reorganizations, and manage gas costs across different networks is critical for maintaining a reliable and cost-effective bridge service in production.
Launching a Cross-Chain Stablecoin Bridge Architecture
A technical guide to designing and implementing a secure, scalable bridge for transferring stablecoins between blockchains.
A cross-chain stablecoin bridge is a specialized infrastructure designed to facilitate the secure transfer of value for a single, pegged asset like USDC or DAI across different blockchain networks. Unlike a general-purpose bridge that handles arbitrary tokens, its architecture is optimized for a specific asset, allowing for deep liquidity pools, streamlined messaging, and tailored security models. The primary goal is to maintain the stablecoin's peg and ensure a 1:1 representation of the underlying asset on all connected chains. This requires a robust system for minting and burning synthetic representations, verifying the legitimacy of cross-chain messages, and managing liquidity to prevent slippage.
The core architectural decision lies in choosing a trust model. A trust-minimized bridge relies on decentralized networks of validators or light clients to verify state proofs from the source chain, as seen with LayerZero's Ultra Light Nodes or IBC's light client protocol. In contrast, a federated or multi-sig bridge uses a permissioned set of signers to attest to cross-chain events, which is simpler to implement but introduces centralization risk. For stablecoins, many projects like Circle's CCTP for USDC utilize a hybrid approach, combining attestations from the issuing entity with on-chain verification to balance security and efficiency.
The technical implementation involves three key components: a lock-and-mint/burn-and-release mechanism, a message relayer network, and liquidity management. When a user locks USDC on Ethereum, a smart contract on the destination chain (e.g., Avalanche) mints an equivalent amount of bridged USDC.e. The bridge's oracle or relayer submits a cryptographic proof of this lock event. The smart contract verifies this proof against a known verification contract or a set of guardian signatures before executing the mint. For the return trip, the bridged tokens are burned, and a message is sent to release the original locked funds.
Security is paramount. Common risks include validator set compromise in federated models, smart contract vulnerabilities in the bridge contracts, and liquidity crises. Mitigations include implementing time-delays for large withdrawals, using multi-party computation (MPC) for signing, regularly auditing all contracts, and ensuring adequate liquidity pools are managed by algorithms or professional market makers. Monitoring tools like Chainscore can track the bridge's health, including total value locked (TVL) across chains, transaction volume, and validator uptime, providing early warnings for potential issues.
To launch, you must deploy a set of synchronized smart contracts on each supported chain. For Ethereum and EVM-compatible chains, you can use a Solidity template. The core contract on the source chain handles locking and emitting events, while the destination chain contract manages verification and minting/burning. A backend relayer service (written in Go or TypeScript) must listen to these events, fetch Merkle proofs via an RPC node, and submit transactions to the destination chain. Start with a testnet deployment, using faucets for stablecoin test tokens, and rigorously test cross-chain transfers before considering a mainnet launch with a phased rollout and insured custodial holdings.
Canonical vs. Wrapped Bridge Model Comparison
A technical comparison of the two primary stablecoin bridge architectures, focusing on security, liquidity, and operational trade-offs.
| Feature / Metric | Canonical (Lock & Mint) | Wrapped (Burn & Mint) |
|---|---|---|
Native Asset Backing | Original asset locked in source chain vault | Wrapped token minted by bridge contract |
Custody Model | Multi-sig or MPC vault on source chain | Bridge admin keys or DAO governance |
Liquidity Requirement | High (1:1 collateral required) | Low to moderate (algorithmic or partial) |
Settlement Finality | Depends on source chain finality (e.g., ~15 min for Ethereum) | Instant on destination chain |
Bridge-Specific Risk | Vault compromise or slashing | Minting key compromise or governance attack |
User Redemption Rights | Direct claim on locked source assets | Reliant on bridge solvency and liquidity |
Protocol Examples | Polygon PoS Bridge (USDC), Arbitrum Bridge | Wormhole (wETH), Multichain (anyUSDC) |
Typical Fee Structure | Gas cost + protocol fee (~0.05-0.3%) | Gas cost + relay fee + protocol fee (~0.1-0.5%) |
Step 1: Design the Core Stablecoin Contracts
The first step in building a cross-chain stablecoin bridge is designing the smart contracts that will mint, burn, and manage the stablecoin supply across different blockchains.
The core of your bridge is a pair of smart contracts: a minting contract on the destination chain and a locking contract on the source chain. The minting contract is responsible for creating new tokens when assets are bridged over, while the locking contract securely holds the original collateral. For a stablecoin like a bridged USDC, the source chain contract (e.g., on Ethereum) would lock user-deposited USDC, and the destination chain contract (e.g., on Arbitrum) would mint a canonical representation, often called USDC.e or USDC (Arbitrum Bridge). This 1:1 pegging mechanism is the fundamental guarantee of your bridge's stability.
These contracts must implement a secure, permissioned mint-and-burn logic. Typically, only a designated bridge relayer or guardian multisig address is authorized to call the mint function on the destination chain. This call is only executed after the source chain locking contract has provably received the user's funds and emitted a Deposit event. The burn function on the destination chain, used when a user wants to move assets back, should destroy the tokens and emit an event that the relayer watches to release the locked funds on the source chain. This two-way, event-driven flow is the basic state machine of the bridge.
Security considerations are paramount at this stage. Key design patterns include using OpenZeppelin's Ownable or AccessControl for administrative functions, implementing pause mechanisms in case of an exploit, and ensuring there are no unlimited minting vulnerabilities. For upgradability, consider using transparent proxy patterns (like OpenZeppelin's) to allow for future fixes, but ensure upgrade rights are managed by a decentralized multisig or DAO to avoid centralization risks. Every function must include robust access controls and event emissions for off-chain monitoring.
A critical technical decision is choosing the token standard. For Ethereum Virtual Machine (EVM) chains, you will likely use ERC-20 for the minted stablecoin. However, you must decide if your minted token will be a standard ERC-20 or a more bridge-optimized variant. Some bridges implement the ERC-677 transferAndCall standard or similar to allow tokens to interact with the bridge contract in a single transaction, improving user experience. The contract should also be designed to be chain-agnostic, with chain IDs and bridge adapter addresses stored as configurable variables to support future expansion.
Finally, thorough testing is non-negotiable. Deploy your contracts to a testnet and simulate the entire cross-chain lifecycle: deposit, event emission, relayer mint, burn, and release. Use frameworks like Hardhat or Foundry to write comprehensive unit and integration tests that cover edge cases, such as re-entrancy attacks, front-running, and relayer failure scenarios. The integrity of your entire cross-chain architecture depends on the security and correctness of these foundational contracts.
Step 2: Integrate a Cross-Chain Messaging Layer
A cross-chain messaging layer is the communication backbone that enables your stablecoin bridge to securely transfer state and instructions between blockchains.
The messaging layer is responsible for proving and relaying that a transaction occurred on the source chain and delivering a verifiable message to the destination chain. This is distinct from the asset custody model (lock-and-mint, burn-and-mint). You must choose a protocol that provides sufficient security guarantees for the value being transferred. For a stablecoin bridge, where the asset is pegged and high-volume, security is non-negotiable. Popular options include LayerZero, Wormhole, Axelar, and Hyperlane, each with different trust assumptions ranging from light-client verification to permissioned validator sets.
Integration typically involves deploying a set of smart contracts: an endpoint or adapter on each chain your bridge supports. On the source chain, your bridge contract calls this endpoint to send a message containing the burn/lock proof and recipient details. The messaging protocol's off-chain relayers or oracles then fetch this message, generate attestations, and submit them to the destination chain. There, the endpoint contract verifies the message's validity before allowing your bridge contract on that chain to mint or release the stablecoins. Your code must handle message encoding, gas payment on the destination chain (often via gas abstraction), and error states like failed deliveries.
Consider this simplified example using a generic messaging interface. Your bridge contract on Ethereum would call the messenger after locking funds:
solidity// After locking USDC, send a message to Polygon messagingEndpoint.sendMessage{ value: msgFee }( chainIdPolygon, // Destination chain ID abi.encode(recipient, amount, nonce), // Payload address(this) // Callback address for delivery receipt );
The payload must be decoded by your counterpart contract on Polygon, which should verify the message's origin and prevent replay attacks using the nonce before minting bridged tokens.
Key evaluation criteria for a messaging layer include security model (economic, cryptographic, trusted), latency (time to finality), cost (fees for relayers and destination gas), and supported chains. For production, you must also implement circuit breakers and governance controls to pause message reception in case of an exploit. Monitoring tools like Chainlink Functions or Gelato can watch for failed messages and trigger retries, ensuring reliability for end-users.
Ultimately, the messaging layer abstracts away the complexity of cross-chain communication but introduces critical dependencies. Your architecture's security is now a function of both your bridge's smart contract integrity and the chosen messaging protocol's robustness. Thoroughly audit the message flow and consider defense-in-depth by adding secondary verification for large transfers or implementing a delay for governance-controlled upgrades to the messaging adapter contracts.
Step 3: Deploy Remote Token Contracts on Target Chains
This step involves deploying the token representation contracts on the destination chains, which will be controlled by the bridge's message-passing layer.
The core of a cross-chain stablecoin bridge is the remote token contract deployed on each target chain (e.g., Arbitrum, Polygon, Base). This contract is not the canonical source of truth for the token but a locked/minted representation. It holds the logic to mint new tokens when assets are bridged in and burn them when they are bridged back to the source chain. For ERC-20 stablecoins, this is typically an implementation of the ERC-20 standard with additional mint and burn functions that are restricted to the bridge's message relayer or verifier contract.
When deploying, you must ensure the token's metadata—name, symbol, and decimals—matches the canonical token on the source chain (e.g., Ethereum) to prevent user confusion. A common pattern is to prefix the name with the chain, like "Arbitrum USDC" or "Polygon DAI". The deployment script must also set the correct owner or minter role to the address of the bridge's message receiver (like an Axelar Gateway, Wormhole Core Bridge, or LayerZero Endpoint) on that chain. This authorization is critical for security; only this verified component should be able to mint tokens.
Here is a simplified example of a deploy script using Foundry and a basic remote token contract. The contract inherits from OpenZeppelin's ERC20 and Ownable and adds a mint function restricted to the owner, which will be the bridge adapter.
solidity// RemoteToken.sol import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract RemoteToken is ERC20, Ownable { constructor( string memory name_, string memory symbol_, address initialOwner ) ERC20(name_, symbol_) Ownable(initialOwner) {} function mint(address to, uint256 amount) external onlyOwner { _mint(to, amount); } }
bash# Deploy script (Foundry) forge create src/RemoteToken.sol:RemoteToken \ --constructor-args "Arbitrum USDC" "USDC" 0x123...bridgeReceiverAddress \ --rpc-url $ARBITRUM_RPC \ --private-key $DEPLOYER_KEY
After deployment, you must verify the contract on the target chain's block explorer (like Arbiscan or Polygonscan) and register its address with your bridge infrastructure. This registration is often done by calling a function on the bridge's control contract to whitelist the new token representation. Failure to properly configure this link will result in bridged messages failing to execute mints or burns. Always conduct a test transfer of a small amount using the full bridge flow before considering the deployment complete.
Step 4: Implement a Cross-Chain Supply Oracle
A supply oracle is the critical component that maintains the stablecoin's total supply integrity across all connected chains, preventing double-spending and ensuring the 1:1 peg.
A cross-chain supply oracle is a decentralized service that tracks and broadcasts the total circulating supply of your stablecoin across all supported blockchains. Its primary function is to prevent double-spending, where the same collateral is used to mint tokens on two different chains. For a stablecoin like USDC or DAI, the oracle ensures that the sum of all minted tokens on Ethereum, Arbitrum, and Polygon, for example, never exceeds the total collateral locked in the primary vault. This is a non-trivial challenge in an asynchronous, multi-chain environment where state updates are not atomic.
The oracle's architecture typically involves off-chain relayers or a decentralized network of nodes (like Chainlink or Pyth) that monitor the mint and burn events on each connected chain. When a user mints tokens on Chain A, the oracle's watcher service submits a signed message containing the new total supply to an on-chain verifier contract on all other connected chains. This contract validates the signature and updates its local view of the global supply. A common pattern is to implement a threshold signature scheme, where a quorum of oracle nodes must attest to the new supply figure before it is accepted, enhancing security and censorship resistance.
Here is a simplified example of a verifier contract function that updates the supply based on an oracle attestation. This contract would be deployed on every destination chain.
solidity// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; contract SupplyOracleVerifier { address public immutable owner; uint256 public currentAttestedSupply; mapping(address => bool) public isApprovedOracle; event SupplyUpdated(uint256 newTotalSupply, uint256 timestamp); constructor(address[] memory _oracles) { owner = msg.sender; for (uint i = 0; i < _oracles.length; i++) { isApprovedOracle[_oracles[i]] = true; } } function updateSupply(uint256 _newTotalSupply, bytes calldata _signature) external { require(isApprovedOracle[msg.sender], "Unauthorized oracle"); // In production, verify _signature against a signed message hash of _newTotalSupply // e.g., using ECDSA.recover() currentAttestedSupply = _newTotalSupply; emit SupplyUpdated(_newTotalSupply, block.timestamp); } }
The stablecoin's mint/burn contract on each chain must query this verifier to ensure any local minting operation would not cause the global supply to exceed the collateral cap.
Key design considerations include update frequency and finality. You must decide how often the oracle updates supply (e.g., per block, per minute) and how to handle chain reorganizations. Using block headers and Merkle proofs for event verification, rather than trusting plain event logs, provides stronger security. Furthermore, the system must have circuit breakers or pause mechanisms that halt minting on all chains if the oracle fails to update or reports a suspicious supply change, protecting the system during an attack or network partition.
In practice, integrating with an existing oracle network like Chainlink's CCIP or Wormhole's Generic Relayer can accelerate development, as they provide the secure messaging layer. However, for maximum control and cost-efficiency, a custom solution using a set of permissioned relayers operated by DAO-selected entities is also viable. The chosen design directly impacts the security model, latency of cross-chain operations, and operational overhead of your bridge architecture.
Ultimately, a robust supply oracle transforms your multi-chain stablecoin from a collection of independent tokens into a unified financial primitive. It is the source of truth that allows users on any chain to have verifiable confidence that their tokens are fully backed, enabling seamless composability with DeFi protocols across the ecosystem while maintaining the core promise of a stable store of value.
Step 5: Set Up Cross-Chain Governance Message Passing
Implement a secure, decentralized mechanism for managing your stablecoin bridge's parameters across multiple blockchains.
Cross-chain governance message passing is the system that allows a decentralized autonomous organization (DAO) or a multisig council to manage your bridge's core parameters—like mint/burn limits, fee structures, and supported asset lists—from a single home chain. Instead of requiring manual, chain-by-chain configuration, governance decisions are made once and then securely propagated to all connected spoke chains. This architecture is critical for maintaining operational consistency and enabling rapid, coordinated responses to market conditions or security events without centralized control.
The technical implementation typically involves a governance module on the home chain (e.g., a DAO smart contract on Ethereum) and corresponding receiver contracts on each spoke chain (e.g., on Arbitrum, Polygon). When a governance proposal passes, it doesn't execute directly. Instead, it encodes the intended action—like setMintLimit(1000000)—into a standardized message. This message is then dispatched via your chosen cross-chain messaging protocol, such as LayerZero, Axelar, Wormhole, or a custom validator set. The security of your entire governance system hinges on the reliability of this underlying message layer.
On the receiving end, each spoke chain must have a secure message verification and execution contract. This contract authenticates incoming messages, confirming they originated from the authorized governance module on the home chain via the trusted cross-chain protocol. Once verified, it executes the encoded function call. It's essential to implement strict access controls here; only the designated message relay or verifier address should be able to trigger execution. A common pattern is to use OpenZeppelin's Ownable or access control lists to lock down the executeGovernanceMessage function.
Let's examine a simplified code snippet for a governance message executor on a spoke chain. This contract expects messages from a specific homeChainGateway address via a trusted relayer.
solidity// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts/access/Ownable.sol"; contract SpokeGovernanceExecutor is Ownable { address public homeChainGateway; address public trustedRelayer; event GovernanceActionExecuted(bytes32 proposalId, string action); constructor(address _homeChainGateway, address _trustedRelayer) { homeChainGateway = _homeChainGateway; trustedRelayer = _trustedRelayer; } function executeGovernanceMessage( bytes32 proposalId, address targetContract, bytes calldata callData, bytes memory signature // Proof from cross-chain protocol ) external onlyRelayer { // 1. Verify the signature proves the message originated from homeChainGateway require(verifyCrossChainProof(signature, proposalId, targetContract, callData), "Invalid proof"); // 2. Execute the encoded call on the target contract (e.g., the bridge contract) (bool success, ) = targetContract.call(callData); require(success, "Execution failed"); emit GovernanceActionExecuted(proposalId, "ConfigUpdate"); } modifier onlyRelayer() { require(msg.sender == trustedRelayer, "Caller is not the relayer"); _; } function verifyCrossChainProof(...) internal view returns (bool) { // Implementation depends on the chosen cross-chain protocol (LayerZero, Axelar, etc.) } }
Key considerations for a production system include message ordering and nonces to prevent replay attacks, timelocks on the home chain to give users time to react to parameter changes, and failure handling for when a message fails to execute on a spoke chain (requiring a retry mechanism or emergency pause). Furthermore, you must decide if governance is permissioned (multisig) or permissionless (token-weighted voting). Each choice impacts the speed and decentralization of your system. Tools like OpenZeppelin Governor, Tally, or Snapshot for off-chain signaling can be integrated into the home-chain module.
Finally, thorough testing is non-negotiable. Use forked mainnet environments with tools like Foundry or Hardhat to simulate governance proposals and their cross-chain execution. Test edge cases: a relayer submitting a fraudulent message, a target contract that reverts, or network congestion on a spoke chain. By implementing a robust cross-chain governance layer, you ensure your stablecoin bridge remains adaptable, secure, and truly decentralized, with control vested in the community or designated stewards rather than a single private key.
Essential Tools and Documentation
Core tools, protocols, and documentation required to design, implement, and audit a production-grade cross-chain stablecoin bridge. Each resource focuses on security, interoperability, or operational reliability.
Threat Modeling and Bridge Security Research
Cross-chain bridges account for a disproportionate share of DeFi exploits, making formal threat modeling mandatory for stablecoin designs.
Recommended research sources and practices:
- Review post-mortems from Wormhole, Nomad, and Ronin incidents
- Model attack surfaces across messaging, verification, and liquidity layers
- Explicitly document trust assumptions for oracles, relayers, and signers
Key risk categories:
- Message forgery or replay
- Validator or relayer collusion
- Infinite mint or liquidity drain bugs
Actionable steps:
- Define invariant conditions for total stablecoin supply
- Require independent audits for both on-chain and off-chain components
- Add circuit breakers tied to mint volume and velocity
Security research is not optional for stablecoin bridges operating at scale.
Frequently Asked Questions on Cross-Chain Stablecoin Bridges
Common technical questions and solutions for developers building or integrating cross-chain stablecoin bridge infrastructure.
These are the two primary architectural models for cross-chain stablecoin transfers.
Mint-and-Burn (Canonical Bridging):
- A canonical bridge mints a wrapped version (e.g., USDC.e) on the destination chain and burns it on the source chain. The canonical issuer (like Circle for USDC) controls the minting contract. This model maintains a 1:1 backing with the issuer's reserves but requires their official deployment.
Lock-and-Mint (Lockbox Model):
- Assets are locked in a smart contract (a "lockbox") on the source chain, and a representative token is minted by a third-party bridge (e.g., Across, Stargate) on the destination chain. The bridge's liquidity pools or relayers facilitate the transfer. This is faster for user experience but introduces trust in the bridge's security and solvency.
Choosing between them depends on whether you prioritize canonical backing and regulatory compliance (mint-and-burn) or liquidity availability and speed (lock-and-mint).