繁体   English   中英

有没有办法在 Solidity 的转移函数中检查买卖?

[英]Is there a way to check sells and buys in transfer function on Solidity?

我的目标是在 PancakeSwap 上签订合同,允许人们购买代币,并且只能在预定的时间后出售这些代币。

例如,合约在晚上 09:00 部署,人们可以购买但尚未出售,并且在晚上 09:10 开始出售。

我正在考虑在销售功能上添加一个修饰符,但我不明白如何做一个单独的功能。

我也在考虑在转移功能中添加一些检查,但这仍然是一样的,我不知道如何检查谁是卖方,谁是买方。

这是我执行它的尝试之一:

pragma solidity ^0.8.2;

contract Token {
    mapping(address => uint256) public balances;
    mapping(address => mapping(address => uint256)) public allowance;

    uint256 public decimals = 18;
    uint256 public totalSupply = 1000000000000 * 10**decimals;
    string public name = "Maxi Pump Token Try 2";
    string public symbol = "$MPT2";
    uint256 public allowedSellTime;
    uint256 public totalTime = 30;

    modifier sellNotAllowed() {
        require(
            block.timestamp > allowedSellTime,
            "You are not allowed to sell yet"
        );
        _;
    }

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    constructor() {
        balances[msg.sender] = totalSupply;
        allowedSellTime = block.timestamp + totalTime;
    }

    function balanceOf(address owner) public view returns (uint256) {
        return balances[owner];
    }

    function transfer(address to, uint256 value)
        public
        sellNotAllowed
        returns (bool)
    {
        require(balanceOf(msg.sender) >= value, "balance too low buddy");
        // Check if user wants to sell his tokens, if true then check time

        balances[to] += value;
        balances[msg.sender] -= value;
        emit Transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public returns (bool) {
        require(balanceOf(from) >= value, "balance too low buddy");
        require(allowance[from][msg.sender] >= value, "allowance too low");
        balances[to] += value;
        balances[from] -= value;
        emit Transfer(from, to, value);
        return true;
    }

    function approve(address spender, uint256 value) public returns (bool) {
        allowance[msg.sender][spender] = value;
        return true;
    }
}

首先,使用阻塞时间获取准确时间是不可能的。 您可以使用 blocktime 粗略估计时间跨度,为了精确计时,请使用 oracle。 “现在”与“block.timestamp”相同。 您需要存储为该地址调用购买函数的时间。 然后,您可以在调用卖出函数时检查“现在”,并将其与买入时间进行比较,以检查是否经过了足够的时间。

在销售功能或转移功能中进行这样的检查,否则地址可以转移到其他地址进行销售。

require(now > timeOfBuy + 10 min && timeOfBuy > 0, "Not enough time -10 min- has passed");

您可以使用映射存储每个购买地址的购买时间。 但是,映射会将所有可能的地址初始化为等于 0。

mapping (address => uint) addrToTimeOfBuy;

所以在购买功能中:

addrToTimeOfBuy[msg.sender] = now;

将在该地址购买时将映射设置为 blockstamp.time。

等待时间是 10 分钟,但这也可以是一个变量,有一个单独的辅助函数来设置它。

按照当前的逻辑,一旦地址为它设置了购买时间并等待等待时间,它就可以随时出售,卖多少就卖多少。 如果这是您想要的,则取决于您的应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM