You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:45:35