运维部署
部署 Uniswap CCA 连续清算拍卖合约时使用:通过…
当用户要求部署已配置的 CCA 拍卖,或在支持链上用 ContinuousClearingAuctionFactory 创建拍卖实例时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
部署 Uniswap CCA 连续清算拍特定
解决思路
- 当用户调用此技能时,引导他们完成 CCA 部署过程,提供安全警告和验证。
- 部署前必须显示教育免责声明并获得用户确认。
- 部署前如果提供了配置文件,验证配置文件。
- 部署前验证目标网络的 factory 地址。
- 部署前与用户确认部署参数。
- 按部署工作流执行:显示教育免责声明(必需)。
- 加载或请求配置。
- 验证配置。
- 显示部署计划。
- 获取用户确认。
- 提供部署命令。
- 执行部署后步骤。
- 显示教育用途免责声明:该工具和部署说明仅供教育用途,AI 生成的部署命令可能包含错误或安全漏洞。
- 要求用户确认:仔细审查所有配置;验证所有参数(地址、定价、时间表)正确;先在测试网测试;审计合约。
- 使用 AskUserQuestion 确认用户已确认这些警告后再继续部署步骤;如果运行时没有 AskUserQuestion,则通过自然语言对话收集相同参数。
- 在将任何用户提供值插入 forge/cast 命令或部署脚本前进行输入验证。
- Ethereum 地址必须匹配 ^0x[a-fA-F0-9]{40}$,否则拒绝。
- Chain ID 必须来自支持链列表 (1, 130, 1301, 8453, 42161, 11155111)。
- 数值(supply、prices、blocks、chain IDs)必须非负且匹配 ^[0-9]+\.?[0-9]*$。
- RPC endpoint URL ($RPC_URL) 必须是 https:// scheme,且不得包含任何元字符或空白。
- RPC URL 第一次提供时验证,赋值给 $RPC_URL,之后只引用该变量;绝不要重新读取原始 URL 到后续命令。
- 需要查询字符串的 RPC endpoint(如 provider API key)通过 out of band 导出到环境并作为 $RPC_URL 引用,绝不要粘贴到命令文本。
- 拒绝任何包含 shell 元字符或空白的输入:; | & $ ` ( ) > < \ ' " 空格、制表符、换行符。
- 如果输入包含上述字符,中止并报告哪个值和哪个字符失败,而不是剥离违规字符继续。
- 绝不将原始用户输入直接传给 shell 命令而不验证。
- 始终在生成命令中双引号包裹每个插值(写 --rpc-url "$RPC_URL",绝不写裸未引号形式);先验证值,再引号。
- 不要在 Claude Code settings 自动批准 Bash(forge:*) 或 Bash(cast:*)。
- 始终要求每个调用批准花费 gas 或广播交易;.claude/hooks/ 中的 PreToolUse hooks 仅作为安全网,用户逐命令批准是主要控制。
- 私钥安全:绝不将私钥存储在 git 仓库或配置文件。
- 绝不在命令行直接粘贴私钥(shell 历史可见)。
- 绝不共享私钥或存储在共享环境。
- 绝不在不可信电脑上使用主网私钥。
- 绝不使用 --private-key 标志(被 PreToolUse hook 阻止)。
- 推荐 Option 1:使用 Ledger 或 Trezor 硬件钱包配合 --ledger:forge script script/Example.s.sol:ExampleScript --rpc-url "$RPC_URL" --broadcast --ledger。
- 推荐 Option 2:使用加密 keystore:先执行 cast wallet import deployer --interactive,再执行 forge script script/Example.s.sol:ExampleScript --rpc-url "$RPC_URL" --broadcast --account deployer --sender "$DEPLOYER_ADDRESS"。
- 推荐 Option 3(仅测试):使用环境变量时,确保在安全 .env 文件(绝不提交 git),通过 source .env 或 dotenv 加载,仅在可信安全电脑使用,开发用测试网密钥。
- 环境变量示例:在 .env 中设置 PRIVATE_KEY=0x... 和 RPC_URL=https://...;执行 source .env;部署时使用加密 keystore 而不是 --private-key:cast wallet import deployer --interactive;forge script ... --account deployer --sender "$DEPLOYER_ADDRESS"。
- 始终先在测试网测试再主网:Sepolia 从 faucet 获取免费 ETH;Base Sepolia 获取免费 ETH;在测试网部署并验证完整工作流;彻底测试后才部署主网。
- 使用 ContinuousClearingAuctionFactory 部署 CCA 实例,它使用 CREATE2 实现跨链一致地址。
- 使用 v1.1.0 factory 地址 0xCCccCcCAE7503Cac057829BF2811De42E16e0bD5(推荐)。
- 如果本地没有 CCA 合约,克隆仓库并安装依赖:git clone https://github.com/Uniswap/continuous-clearing-auction.git;cd continuous-clearing-auction;forge install。
- 准备有效配置文件(由 configurator skill 生成或手动创建)。
- 配置文件字段包括 token、totalSupply、currency、tokensRecipient、fundsRecipient、startBlock、endBlock、claimBlock、tickSpacing、validationHook、floorPrice、requiredCurrencyRaised、supplySchedule(数组,每项 mps 和 blockDelta)。
- 部署前验证配置通过所有 Validation Rules。
- 通过 factory 接口部署:initializeDistribution(address token, uint256 amount, bytes calldata configData, bytes32 salt) external returns (IDistributionContract)。
- 其中 token 是要出售的代币地址;amount 是拍卖出售的代币数量;configData 是 ABI 编码的 AuctionParameters 结构;salt 是可选 bytes32 用于 vanity address mining。
- 将 JSON 配置编码为 configData:使用 cast 命令 `cast abi-encode "initializeDistribution(address,uint256,bytes,bytes32)" "$TOKEN_ADDRESS" "$TOTAL_SUPPLY" "$(cast abi-encode "(address,address,address,uint64,uint64,uint64,uint256,address,uint256,uint128,bytes)" "$CURRENCY" "$TOKENS_RECIPIENT" "$FUNDS_RECIPIENT" "$START_BLOCK" "$END_BLOCK" "$CLAIM_BLOCK" "$TICK_SPACING" "$VALIDATION_HOOK" "$FLOOR_PRICE" "$REQUIRED_CURRENCY_RAISED" "$ENCODED_SUPPLY_SCHEDULE")" "0x0000000000000000000000000000000000000000000000000000000000000000"`。
- 或使用 Foundry 脚本:从 vm.envAddress/vm.envUint/vm.envBytes 加载配置值;用 abi.encode 编码 AuctionParameters;vm.startBroadcast();IERC20(token).approve(0xCCccCcCAE7503Cac057829BF2811De42E16e0bD5, amount);调用 ICCAFactory(0xCCccCcCAE7503Cac057829BF2811De42E16e0bD5).initializeDistribution(token, amount, configData, bytes32(0));vm.stopBroadcast();console.log("Auction deployed at:", auction)。
- 必须在调用 initializeDistribution 前批准 token 转账给 factory;factory 会从你的地址转 amount 代币到新拍卖合约。
- 使用 Foundry 部署 factory(如新网络需要):`forge script script/deploy/DeployContinuousAuctionFactory.s.sol:DeployContinuousAuctionFactoryScript --rpc-url "$RPC_URL" --broadcast --account deployer --sender "$DEPLOYER_ADDRESS"`。
- 使用 Foundry 部署拍卖实例:`forge script script/Example.s.sol:ExampleScript --rpc-url "$RPC_URL" --broadcast --account deployer --sender "$DEPLOYER_ADDRESS"`。
- 部署后必须调用 onTokensReceived():`cast send "$AUCTION_ADDRESS" "onTokensReceived()" --rpc-url "$RPC_URL" --account deployer --sender "$DEPLOYER_ADDRESS"`;这是拍卖接受出价前的必需前置条件。
- 替代部署:可直接通过构造函数 `constructor(address token, uint128 amount, AuctionParameters memory parameters) {}` 部署;不需要 salt,但没有 CREATE2 确定性地址优势。
- 在区块浏览器验证:`forge verify-contract "$AUCTION_ADDRESS" src/ContinuousClearingAuction.sol:ContinuousClearingAuction --rpc-url "$RPC_URL" --show-standard-json-input > standard-json-input.json`;上传该文件到区块浏览器。
- 验证规则:startBlock < endBlock <= claimBlock。
- 验证规则:所有地址是有效 Ethereum 地址(0x + 40 hex)。
- 验证规则:所有数值 >= 0。
- 验证规则:floor price 必须是 tick spacing 的倍数。
- 验证规则:tick spacing 至少为 floor price 的 1 basis point(推荐 1%、10%)。
- 验证规则:supply schedule 最后区块出售显著数量代币(约 30%+)。
- 验证规则:总供应上限 1e30 wei(1 trillion 18-decimal tokens)。
- 验证规则:不支持 fee-on-transfer 代币。
- 验证规则:不要使用 decimals < 6 的代币。
- 部署前检查清单:区块序列有效(start < end <= claim)。
- 检查 floor price 是 tick spacing 的倍数。
- 检查 tick spacing >= floor price 的 1%。
- 检查所有地址是有效 Ethereum 地址。
- 检查总供应 <= 1e30 wei。
- 检查 currency 比 token 更有价值。
- 检查区块时间与网络匹配(主网 12s,L2 2s)。
- 检查接收者地址已设置(不是占位符)。
- 检查 currency 地址对网络正确。
- 检查最后一个 supply step 出售约 30%+ 代币。
- 检查没有使用 fee-on-transfer 代币。
- 检查 token decimals >= 6。
- 检查部署后调用了 onTokensReceived()。
- 仅支持链:1 Mainnet、130 Unichain、1301 Unichain Sepolia、8453 Base、42161 Arbitrum、11155111 Sepolia。
- 故障排除:出现 "Invalid block sequence" 时确保 startBlock < endBlock <= claimBlock。
- 故障排除:出现 "Floor price not aligned" 时将 floor price 舍入到 tick spacing 的倍数。
- 故障排除:出现 "Tick spacing too small" 时使用至少 floor price 的 1%。
- 故障排除:出现 "Total supply too large" 时最大 1e30 wei。
- 故障排除:出现 "Gas inefficiency" 时增加 tick spacing。
- 故障排除:出现 "Invalid address" 时验证地址是 42 字符以 0x 开头。
- 了解拍卖使用 Q96 定点数学:Q96 = 0x1000000000000000000000000 (2^96);价格是 Q96 定点数;需求是货币金额按 Q96 缩放。
- 了解 Auction steps 打包为 bytes,每步 uint64:前 24 bits 是 mps(每区块发行率 MPS),后 40 bits 是 blockDelta(区块数);数据部署到外部 SSTORE2 合约以便更便宜读取。
- 了解关键合约函数:submitBid(maxPrice, amount, owner, prevTickPrice, hookData);checkpoint() 每区块有新出价时执行一次,决定代币分配;exitBid()/exitPartiallyFilledBid() 在出价被超越或拍卖结束(仅毕业后)后可退出;isGraduated() 当 currencyRaised >= requiredCurrencyRaised 返回 true,毕业前不能退出;claimTokens() 在 claimBlock 后领取购买代币(仅毕业拍卖);sweepCurrency() 和 sweepUnsoldTokens() 拍卖结束后提取。
- 参考资源:CCA Repository https://github.com/Uniswap/continuous-clearing-auction.git;Technical Documentation 看 docs/TechnicalDocumentation.md;Deployment Guide 看 docs/DeploymentGuide.md;Whitepaper 看 docs/assets/whitepaper.pdf;Audits 看 docs/audits/README.md;Uniswap Docs https://docs.uniswap.org/contracts/liquidity-launchpad/CCA;Bug Bounty https://cantina.xyz/code/f9df94db-c7b1-434b-bb06-d1360abdd1be/overview。
适用边界 · 注意事项
- 目标网络不在支持链列表(1、130、1301、8453、42161、11155111)时不要使用。
- 代币是 fee-on-transfer 或 decimals < 6 时不要使用。
- 未先在测试网验证完整工作流或未审计合约时,不要用于主网真实资金部署。