Solidity实现钱包锁定解锁及代币按月释放至初始供应量需求
实现带锁仓释放机制的Solidity代币合约
需求概述
- 初始供应量为1000代币
- 向指定钱包地址
0x5B38Da6a701c568545dCfcB03FcB875f56beddC4发放1000代币,该部分代币锁仓1年 - 每月从锁定的1000代币中释放5%(即50代币),释放的代币计入可流通范畴
修改后的完整合约代码
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract LockedToken { // 初始供应量 uint256 public initialSupply = 1000; // 锁定的目标钱包地址(不可变更) address public immutable lockedWallet = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4; // 合约所有者 address public owner; // 记录地址的可支配余额 mapping(address => uint256) public balances; // 锁定的总代币量 uint256 public constant lockedAmount = 1000; // 每月释放比例(5%) uint256 public constant monthlyReleasePercent = 5; // 锁仓开始时间 uint256 public lockStartTime; // 锁仓时长(1年,按秒计算) uint256 public constant lockDuration = 365 days; // 已释放的总代币量 uint256 public releasedAmount; // 上次释放的时间戳 uint256 public lastReleaseTime; constructor() { owner = msg.sender; // 初始供应量分配给合约所有者 balances[owner] = initialSupply; // 初始化锁仓时间节点 lockStartTime = block.timestamp; lastReleaseTime = lockStartTime; } // 仅所有者调用的权限修饰器 modifier onlyOwner() { require(msg.sender == owner, "Only owner can call this"); _; } // 触发代币释放的函数(任何人可调用) function releaseTokens() public { // 校验锁仓周期已启动 require(block.timestamp >= lockStartTime, "Lock period not started yet"); // 计算上次释放后过去的完整月份数(按30天/月简化计算) uint256 monthsPassed = (block.timestamp - lastReleaseTime) / 30 days; require(monthsPassed > 0, "No full month has passed since last release"); // 计算可释放代币量:不超过剩余锁定额度 uint256 remainingLocked = lockedAmount - releasedAmount; uint256 releaseAmount = (lockedAmount * monthlyReleasePercent / 100) * monthsPassed; releaseAmount = releaseAmount > remainingLocked ? remainingLocked : releaseAmount; // 更新释放记录 releasedAmount += releaseAmount; lastReleaseTime += monthsPassed * 30 days; // 将释放代币转入目标钱包的可支配余额 balances[lockedWallet] += releaseAmount; // 若需求为"释放至初始供应量"(即增加总供应量),可替换为以下代码: // initialSupply += releaseAmount; } // 查询剩余锁定代币量 function getRemainingLocked() public view returns (uint256) { return lockedAmount - releasedAmount; } // 查询下一次可释放时间 function getNextReleaseTime() public view returns (uint256) { return lastReleaseTime + 30 days; } }
关键逻辑说明
- 锁仓时间管理:通过
lockStartTime和lastReleaseTime记录时间节点,按30天/月简化计算周期(若需精确日历月,需额外实现日历逻辑) - 释放额度控制:每次调用释放函数时,自动计算可释放金额,确保不超过剩余锁定代币量
- 余额分配:初始供应量直接归属合约所有者,锁定代币通过释放函数逐步转为目标钱包的可支配余额;若需将释放代币加入初始供应量,可替换对应代码行
- 权限预留:
onlyOwner修饰器为后续管理功能(如紧急调整)预留扩展空间
内容的提问来源于stack exchange,提问作者me boros
相关产品推荐
相关产品推荐

