跳转到主要内容

概述

GeodeFactory 处理一笔交易的代币发行。它部署 GeodeToken ERC20,将全部供应量铸造给 Hook,初始化 v4 池为空壳,配置 Hook,并注册永久联合曲线——全部原子化完成。

不可变量

IPoolManager public immutable poolManager;
GeodeHook public immutable hook;
Currency public immutable weth;

发行参数

struct LaunchParams {
    string name;                    // 代币名称
    string symbol;                  // 代币符号
    uint256 totalSupply;            // 总供应量(18 位小数)
    uint256 virtualTokenReserve;    // Vt(>= totalSupply)
    uint256 virtualEthReserve;      // Ve(起始价格 = Ve / Vt)
    uint24 deployerRoyaltyBps;      // 部署者盈余份额(最大 50%)
    uint256 batchInterval;          // 结算间隔区块数
    uint24 directSwapFeeBps;        // 直接交换费用
    uint256 settlementFeeBps;       // 每意图结算费用
    uint256 maxBatchSize;           // 每侧最大意图数
    int24 tickSpacing;              // 池 tick 间距
}

发行流程

launch()

function launch(LaunchParams calldata params)
    external returns (address tokenAddress, PoolId poolId)
1

验证

  • totalSupply > 0
  • virtualTokenReserve > 0virtualEthReserve > 0
  • deployerRoyaltyBps <= 5000(最大 50%)
  • virtualTokenReserve >= totalSupply(全部代币给曲线)
2

部署 ERC20

GeodeToken token = new GeodeToken(
    params.name, params.symbol,
    params.totalSupply, address(hook)
);
全部供应量铸造给 Hook 合约。
3

确定货币排序

Uniswap v4 要求 address(currency0) < address(currency1)。WETH 始终是 currency0。
4

构建池键并初始化

池在 v4 中初始化为 sqrtPriceAtTick(0) — 没有流动性的空壳。Hook 处理所有定价。
5

配置 Hook

调用 hook.geodeInitializePool(key, config) 配置曲线参数。
6

注册发行

调用 hook.registerLaunch() 设置永久 LaunchState 追踪。
7

初始化价格信标

初始化第二个 v4 池(相同代币对,无 Hook),以曲线起始价格。零流动性——社区成员可以有机地添加 LP。

事件

event TokenLaunched(
    PoolId indexed poolId,
    address indexed deployer,
    address indexed tokenAddress,
    string name, string symbol,
    uint256 totalSupply,
    uint256 virtualTokenReserve, uint256 virtualEthReserve,
    uint24 deployerRoyaltyBps
);

源代码

GeodeFactory.sol

在 GitHub 上查看完整源代码(约 230 行)。