Flaunch.sol 合约功能梳理
📋 合约整体架构
Flaunch 是一个 ERC721 NFT 合约,每个 NFT 代表一个 Meme 币项目的所有权凭证。它整合了:
- ERC721:持有者拥有该 Meme 币项目的管理权
- 跨链桥接:支持 Superchain L2 之间的代币跨链
- 工厂模式:使用 Clone 模式部署 Memecoin 和 Treasury
🎯 核心功能模块
1️⃣ 代币发行系统 (Flaunch)
函数: flaunch(PositionManager.FlaunchParams calldata _params)
流程:
-
✅ 参数验证
- 检查发行时间是否超过最大调度时长(30天)
- 验证初始供应量是否在允许范围内
- 检查预挖数量是否超过初始供应量
- 验证创建者费用分配是否超过最大值(100%)
-
🎫 铸造所有权 NFT
- 将 ERC721 NFT 铸造给创建者(
_params.creator) - 每个 NFT 代表一个 Memecoin 项目的所有权
- 将 ERC721 NFT 铸造给创建者(
-
💰 部署 Memecoin 合约
- 使用
LibClone.cloneDeterministic部署 ERC20 Memecoin - 使用
tokenId作为 salt,确保地址确定性 - 初始化代币元数据(name, symbol, tokenUri)
- 使用
-
🏦 部署 MemecoinTreasury 合约
- 使用相同的 salt 部署金库合约
- 用于管理项目的资金
-
📦 铸造初始供应量
- 将
TokenSupply.INITIAL_SUPPLY铸造到PositionManager - 用于后续的公平启动和流动性提供
- 将
关键代码位置: src/contracts/Flaunch.sol:146-192
2️⃣ 跨链桥接系统
初始化桥接:initializeBridge(uint _tokenId, uint _chainId)
功能:
- 验证目标链不是当前链
- 检查桥接是否已完成
- 防止在桥接窗口期内重复触发(1小时窗口)
- 获取 Memecoin 元数据
- 通过
L2ToL2CrossDomainMessenger发送跨链消息
关键代码位置: src/contracts/Flaunch.sol:334-387
完成桥接:finalizeBridge(uint _tokenId, MemecoinMetadata memory _metadata)
功能:
- 验证跨域消息来源(只能由自己发送的消息触发)
- 使用相同的 salt(tokenId)在目标链部署 Memecoin
- 初始化元数据,保持跨链地址一致性
- 标记桥接为已完成
关键代码位置: src/contracts/Flaunch.sol:396-408
跨链流程:
L2-A 链:initializeBridge()
↓
L2ToL2CrossDomainMessenger.sendMessage()
↓
L2-B 链:finalizeBridge() (自动触发)
↓
部署相同地址的 Memecoin
3️⃣ 权限管理与元数据
setMemecoinMetadata(address _memecoin, string calldata name_, string calldata symbol_)
- 允许合约所有者修复不当的元数据(恶意内容、格式错误等)
setBaseURI(string memory _baseURI)
- 更新 ERC721 NFT 的基础 URI
setMemecoinImplementation(address _memecoinImplementation)
- 升级 Memecoin 实现合约地址
setMemecoinTreasuryImplementation(address _memecoinTreasuryImplementation)
- 升级 MemecoinTreasury 实现合约地址
关键代码位置: src/contracts/Flaunch.sol:203-239
4️⃣ 查询接口
memecoin(uint _tokenId) → address
- 根据 NFT tokenId 返回对应的 Memecoin 地址
memecoinTreasury(uint _tokenId) → address payable
- 根据 NFT tokenId 返回对应的 MemecoinTreasury 地址
poolId(uint _tokenId) → PoolId
- 根据 NFT tokenId 返回对应的 Uniswap V4 PoolId
tokenURI(uint _tokenId) → string
- 返回 NFT 的元数据 URI
- 如果 baseURI 为空,返回 Memecoin 的 tokenURI
- 否则返回
baseURI + tokenId
关键代码位置: src/contracts/Flaunch.sol:283-307
🔐 安全机制
访问控制
onlyPositionManager 修饰符
- 只有
PositionManager合约可以调用flaunch()函数 - 防止未授权的代币发行
onlyCrossDomainCallback 修饰符
- 验证消息发送者必须是
L2ToL2CrossDomainMessenger - 验证跨域消息来源必须是合约自身
- 防止恶意跨链调用
关键代码位置: src/contracts/Flaunch.sol:413-428
参数限制
uint public constant MAX_FAIR_LAUNCH_TOKENS = TokenSupply.INITIAL_SUPPLY;
uint public constant MAX_CREATOR_ALLOCATION = 100_00; // 100%
uint public constant MAX_SCHEDULE_DURATION = 30 days;
uint public constant MAX_BRIDGING_WINDOW = 1 hours;
🔄 关键设计模式
1. 确定性部署(Deterministic Deployment)
- 使用
LibClone.cloneDeterministic+tokenId作为 salt - 保证跨链部署时地址一致
- 便于跨链状态同步
2. 代理模式(Clone Pattern)
- 所有 Memecoin 和 Treasury 都是最小代理(minimal proxy)
- 大幅降低部署成本
- 便于统一升级
3. 所有权 NFT 模式
- 持有 ERC721 NFT = 拥有 Memecoin 项目的控制权
- 可以转移所有权
- 便于治理和收益分配
4. 重试机制
- 桥接失败后,1小时窗口期后可重试
- 防止永久锁定状态
📊 数据流总结
用户 → PositionManager.flaunch()
↓
Flaunch.flaunch()
├─ 铸造 ERC721 NFT
├─ 部署 Memecoin (ERC20)
├─ 部署 MemecoinTreasury
└─ 铸造初始供应到 PositionManager
ERC721 持有者 → initializeBridge()
↓
L2ToL2Messenger
↓
目标链 finalizeBridge()
└─ 部署相同地址的 Memecoin
📝 重要事件
TokenBridging(uint _tokenId, uint _chainId, address _memecoin)- 开始桥接TokenBridged(uint _tokenId, uint _chainId, address _memecoin, uint _messageSource)- 完成桥接BaseURIUpdated(string _newBaseURI)- 更新基础 URIMemecoinImplementationUpdated(address _newImplementation)- 更新实现地址MemecoinTreasuryImplementationUpdated(address _newImplementation)- 更新金库实现地址
🔗 相关合约
- PositionManager: 调用
flaunch()创建新代币 - Memecoin: ERC20 代币实现
- MemecoinTreasury: 金库合约实现
- L2ToL2CrossDomainMessenger: Optimism 跨链消息传递
💡 设计亮点
- 跨链一致性:通过确定性部署保证跨链地址相同
- 成本优化:使用 Clone 模式大幅降低部署成本
- 灵活治理:通过 NFT 所有权实现项目控制权转移
- 安全可靠:多重验证机制防止恶意操作