注册并分享邀请链接,可获得视频播放与邀请奖励。

小筑
@inSmallhome
@BoredApeYC #3241# Sharing on-chain narratives & alpha threads Built @Jeerclub & @Rats_Friend tg:@inSmallhome
加入 September 2016
1.4K 正在关注    90.7K 粉丝
这个打币给kol。kol不建设还砸盘的解决方案,我思考了一下和之前构建的一个项目的需求很像。分享给各位dev。 原理就是70%既确权给kol。但是又不能让人一把掏了!最大限度降低dev和社区的归零风险,又能激发想干的kol动力!把下面的上下文交给你的codex 让他给你开发出来就行。 核心逻辑是:有人往合约里面打币,然后这个币就会自动每天释放1% 100天后释放完毕。 codex开发完之后再说俩句:按照binance合约审计的水准审计下全部代码。 下面这段可以直接交给另一个用户的 Codex,当作项目交付上下文。 # 项目上下文:BSC 代币 100 天每日 1% 释放 DApp ## 目标 交付一个运行在 BSC / BSC Testnet 上的锁仓释放系统。 用户把指定 BEP20 代币存入合约后,该笔存款从存入时间开始释放:每天释放 1%,100 天释放完毕。用户通过网页连接钱包,完成 approve、deposit、claim 操作。 ## 核心规则 - 链:BSC,先支持 BSC Testnet,后续可部署主网。 - 资产:一个固定 BEP20 token,部署合约时传入 token 地址。 - 存款方式:用户不能只靠直接 transfer 到合约。必须: 1. 用户在网页点击 `Approve` 2. 用户点击 `Deposit` 3. 合约通过 `transferFrom` 收币并记录释放计划 - 释放方式: - 每笔 deposit 独立生成一个 position。 - 从该笔 deposit 的 `startTime` 开始计算。 - 满 1 天释放 1%。 - 满 100 天释放 100%。 - 第 0 天可领取 0%。 - 第 100 天及之后可领取全部剩余未领取数量。 - 领取方式: - 用户主动点击 `Claim`。 - 合约不需要每天自动转账。 - `claim()` 领取当前所有已释放但未领取的 token。 - 管理权限: - 管理员不能提走用户锁仓资金。 - 管理员最多只能暂停新 deposit。 - 即使暂停 deposit,也不应阻止用户 claim。 - 不需要后端服务,前端直接读写合约。 ## 推荐技术栈 ### 合约 - Solidity `^0.8.24` 或更新稳定版本 - OpenZeppelin Contracts - `SafeERC20` - `ReentrancyGuard` - `Ownable` - 可选:`Pausable` - Hardhat 或 Foundry 均可,推荐 Hardhat + TypeScript,方便和前端共享 ABI。 ### 前端 - Vite + React + TypeScript - wagmi + viem - RainbowKit 或 ConnectKit 用于钱包连接 - 支持 MetaMask / Trust Wallet - 网络:BSC Testnet,后续支持 BSC Mainnet ## 合约建议接口 合约名称建议:`DailyReleaseVault` 核心常量: - `DURATION_DAYS = 100` - `BPS_DENOMINATOR = 10000` - 每天释放 1%,也可以直接用天数除以 100 计算。 建议数据结构: ```solidity struct Position { uint256 amount; uint256 claimed; uint64 startTime; } 状态: IERC20 public immutable token; mapping(address => Position[]) private positions; 外部函数建议: function deposit(uint256 amount) external nonReentrant whenNotPaused; function claim() external nonReentrant; function claimable(address user) external view returns (uint256); function totalDeposited(address user) external view returns (uint256); function totalClaimed(address user) external view returns (uint256); function positionCount(address user) external view returns (uint256); function getPosition(address user, uint256 index) external view returns (...); function pauseDeposits() external onlyOwner; function unpauseDeposits() external onlyOwner; 释放计算: elapsedDays = (block.timestamp - startTime) / 1 days if elapsedDays >= 100: vested = amount else: vested = amount * elapsedDays / 100 claimable = vested - claimed 注意处理: amount == 0 应 revert。 claimable == 0 时 claim 应 revert 或返回 0,推荐 revert,提示无可领取数量。 使用 SafeERC20.safeTransferFrom 和 safeTransfer。 claim 时先更新 claimed,再转账,配合 nonReentrant。 不要写管理员提取用户 token 的函数。 如果要支持误转其他 token,可加 rescueToken(address otherToken),但必须禁止 rescue 主锁仓 token。 前端页面需求 首页就是实际操作界面,不做营销 landing page。 页面模块: 钱包连接区Connect Wallet 当前地址 当前网络 如果不是 BSC Testnet,提示并提供切换网络按钮 用户资产区钱包 token 余额 allowance 已存入总量 已领取总量 当前可领取数量 未释放数量 预计完全释放时间 存入区输入 deposit 数量 如果 allowance 不足,显示 Approve allowance 足够后显示 Deposit 显示交易 pending / success / error 状态 领取区显示 claimable 数量 Claim 按钮 没有可领取数量时按钮禁用 仓位列表每笔 deposit 一行 amount start date released % claimed claimable full unlock date 测试要求 合约测试必须覆盖: 用户 deposit 成功,position 被记录。 deposit 前必须 approve。 amount 为 0 时失败。 第 0 天 claimable 为 0。 第 1 天 claimable 为 1%。 第 50 天 claimable 为 50%。 第 100 天 claimable 为 100%。 第 120 天不会超过 100%。 多笔 deposit 分别按各自 startTime 释放。 claim 后 claimed 正确增加。 重复 claim 不能重复领取已领取部分。 pause 后不能 deposit。 pause 后仍然可以 claim。 管理员不能取走用户锁仓 token。 rescueToken 不能 rescue 主 token,如实现该函数。 前端测试或手动验收: 能连接钱包。 能切换到 BSC Testnet。 能读取 token balance / allowance / claimable。 allowance 不足时先 approve。 approve 成功后可以 deposit。 deposit 后仓位列表更新。 时间推进后 claimable 正确展示。 claim 成功后余额增加,claimable 归零或减少。 交付物 必须交付: Solidity 合约源码 合约测试 部署脚本 前端 DApp ABI 地址配置方式 README README 至少包含: 安装依赖 运行测试 部署到 BSC Testnet 配置前端合约地址和 token 地址 启动前端 用户操作流程:Connect Wallet -> Approve -> Deposit -> Claim 安全说明:合约不会自动每天打款,用户需要主动 claim 推荐项目结构 project/ contracts/ DailyReleaseVault.sol scripts/ deploy.ts test/ DailyReleaseVault.test.ts frontend/ src/ abi/ config/ components/ pages/ README.md 明确不做 不做自动每天给所有用户转账。 不做后端数据库。 不做多 token 锁仓。 不做管理员代用户提币。 不做用户直接 transfer 到合约后的自动识别。 不做复杂推荐返佣、白名单、手续费,除非后续明确要求。 验收标准 项目完成后,应能在 BSC Testnet 上完成完整流程: 部署测试 BEP20 token 或使用现有测试 token。 部署 DailyReleaseVault,传入 token 地址。 前端配置 vault 地址和 token 地址。 用户连接钱包。 用户 approve。 用户 deposit。 前端显示仓位。 合约测试中通过时间推进验证每日 1% 释放。 用户 claim 后收到已释放 token。 这份上下文已经够另一个 Codex 开始交付了。最重要的是让它坚持 `approve -> deposit -> claim`,不要设计成“用户直接转币到合约自动释放”,那个方向在 BEP20 里会把归属记录搞得很不可靠。
显示更多