# XICPresale 合约部署操作手册 **版本:** v2.0 **日期:** 2026-03-09 **合约文件:** `XICPresale.sol` --- ## 一、合约参数总览 | 参数 | 值 | 说明 | |---|---|---| | 预售总量(硬顶) | 2,500,000,000 XIC(25亿) | 合约内置,可通过 setHardCap 修改 | | 代币价格 | $0.02 USDT / XIC | tokenPrice = 2e16(18位精度) | | 预售时长 | 180 天(半年) | 从 startPresale() 调用时开始计时 | | 最小购买 | 无限制 | 任意金额均可 | | 最大购买 | 无限制 | 任意金额均可 | | 支持支付方式 | USDT(BSC)、BNB | USDT 即时到账,BNB 通过预言机换算 | | 未售出回收 | 预售结束后 Owner 可回收 | recoverUnsoldTokens() | --- ## 二、部署前准备 ### 2.1 需要准备的地址 | 地址 | 说明 | 当前值 | |---|---|---| | XIC Token 合约 | XIC 代币地址(不变) | `0x59FF34dD59680a7125782b1f6df2A86ed46F5A24` | | BSC USDT 合约 | BSC 链 USDT 地址(不变) | `0x55d398326f99059fF775485246999027B3197955` | | 收款钱包(wallet) | 接收 USDT 和 BNB 的地址 | 您的收款钱包地址 | | 价格预言机(oracle) | BNB/USD 价格来源 | `0xefdab9b5...`(原合约预言机,或填 address(0) 禁用 BNB 购买) | ### 2.2 部署工具 推荐使用 **Remix IDE**(https://remix.ethereum.org)或 **Hardhat**。 --- ## 三、部署步骤(Remix IDE) ### Step 1:打开 Remix IDE 访问 https://remix.ethereum.org,新建文件 `XICPresale.sol`,粘贴合约源码。 ### Step 2:编译 - Compiler 版本:`0.8.20` - 勾选 `Optimize`,runs = `200` - 点击 `Compile XICPresale.sol` ### Step 3:部署 切换到 **Deploy & Run Transactions** 面板: - Environment:选择 `Injected Provider - MetaMask`(确保 MetaMask 连接 BSC 主网,Chain ID: 56) - Contract:选择 `XICPresale` - 填写构造函数参数: ``` _xicToken: 0x59FF34dD59680a7125782b1f6df2A86ed46F5A24 _usdt: 0x55d398326f99059fF775485246999027B3197955 _wallet: [您的收款钱包地址] _oracle: 0xefdab9b5...(或 0x0000000000000000000000000000000000000000 禁用BNB购买) ``` - 点击 `Deploy`,MetaMask 弹出确认,支付 Gas 费(约 0.01~0.02 BNB) ### Step 4:记录合约地址 部署成功后,记录新合约地址(格式:`0x...`),更新前端 `contracts.ts` 中的 `presale` 字段。 --- ## 四、部署后操作(Owner 钱包执行) ### Step A:向新合约转入 25亿 XIC 在 XIC Token 合约(`0x59FF34dD59680a7125782b1f6df2A86ed46F5A24`)的 BscScan 写入页面: 访问:https://bscscan.com/address/0x59FF34dD59680a7125782b1f6df2A86ed46F5A24#writeContract 1. 连接 Owner 钱包 2. 找到 `transfer` 函数 3. 填写参数: - `recipient`:新预售合约地址 - `amount`:`2500000000000000000000000000`(25亿 × 10^18,共28位数字) 4. 点击 Write,确认交易 **验证:** 在 BscScan 上查看新合约地址的 XIC 余额,应显示 2,500,000,000 XIC。 ### Step B:启动预售 在新预售合约的 BscScan 写入页面: 1. 连接 Owner 钱包 2. 找到 `startPresale()` 函数 3. 点击 Write,确认交易 **此操作将:** - 设置 `presaleStarted = true` - 记录 `presaleStartTime = 当前时间` - 设置 `presaleEndTime = 当前时间 + 180天` **从此刻起,用户即可购买 XIC!** --- ## 五、合约函数说明 ### 用户函数 | 函数 | 说明 | |---|---| | `buyWithUSDT(uint256 usdtAmount)` | 用 USDT 购买,usdtAmount 为 6 decimals(如 100 USDT = 100000000) | | `buyWithBNB()` | 用 BNB 购买,发送 BNB 时调用(payable) | ### 查询函数 | 函数 | 说明 | |---|---| | `isPresaleActive()` | 预售是否当前可购买 | | `timeRemaining()` | 预售剩余秒数 | | `availableXIC()` | 合约当前可售 XIC 余额 | | `calculateTokenAmount(usdtAmount)` | 计算 USDT 对应的 XIC 数量 | | `presaleProgress()` | 预售进度(已售/硬顶/百分比) | | `totalTokensSold()` | 已售 XIC 总量 | | `totalRaised()` | 已筹 USDT 总量 | | `userPurchases(address)` | 查询用户购买的 XIC 总量 | ### Owner 管理函数 | 函数 | 说明 | |---|---| | `startPresale()` | 启动预售(只能调用一次) | | `setPaused(bool)` | 暂停/恢复预售 | | `recoverUnsoldTokens()` | 预售结束后回收未售出 XIC | | `setTokenPrice(uint256)` | 修改价格(18 decimals) | | `setHardCap(uint256)` | 修改硬顶 | | `setWallet(address)` | 修改收款钱包 | | `setPriceOracle(address)` | 修改 BNB 价格预言机 | | `emergencyWithdraw(address, uint256)` | 紧急提取代币(预售中禁止提取 XIC) | | `withdrawBNB()` | 提取误转入的 BNB | | `transferOwnership(address)` | 转移合约所有权 | --- ## 六、预售结束后操作 ### 6.1 自动结束 预售在以下任一条件满足时自动停止: - 距 `startPresale()` 已过 180 天 - 25亿 XIC 全部售完 ### 6.2 回收未售出 XIC 预售结束后,Owner 调用 `recoverUnsoldTokens()`: 1. 访问新合约 BscScan 写入页面 2. 连接 Owner 钱包 3. 调用 `recoverUnsoldTokens()` 4. 合约将剩余 XIC 全部转回 Owner 钱包 --- ## 七、安全注意事项 1. **部署后立即在 BscScan 上 Verify 合约源码**,增加透明度和信任度 2. **转入 XIC 前三次核对合约地址**,防止转错 3. **amount 精度**:25亿 XIC = `2500000000000000000000000000`(25后跟26个零,共28位) 4. **预售进行中禁止提取 XIC**:合约内置保护,`emergencyWithdraw` 在预售活跃期间无法提取 XIC 5. **BNB 购买**:如不需要 BNB 购买功能,部署时 `_oracle` 填 `0x0000000000000000000000000000000000000000` --- ## 八、前端更新 部署完成后,更新前端 `client/src/lib/contracts.ts`: ```typescript BSC: { presale: "0x[新合约地址]", // 替换为新部署的合约地址 // 其他不变 } ``` 同时更新 `PRESALE_CONFIG`: ```typescript export const PRESALE_CONFIG = { tokenPrice: 0.02, // $0.02 per XIC ✅ presaleAllocation: 2_500_000_000, // 25亿 XIC ✅ presaleDuration: 180, // 180天 ✅ minPurchaseUSDT: 0, // 无最小限制 ✅ maxPurchaseUSDT: 0, // 无最大限制(0 = 无限制)✅ }; ```