这个打币给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 里会把归属记录搞得很不可靠。
显示更多