我的目标是在PancakeSwap上建立一个合约,允许人们购买代币,并在预定的时间后出售。
例如,合约在晚上9点部署,人们可以购买但还不能出售,而在晚上9点10分开始出售。
我正在考虑在sell函数上添加修饰符,但我不明白如何做一个单独的函数。
我也在考虑在传递函数中添加一些检查,但这仍然是一样的,我不知道如何检查谁是卖家,谁是买家。
这是我尝试执行它的一个:
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获取精确时间是不可能的。您可以使用blocktime粗略地估计时间跨度,为了精确计时,请使用oracle。"now"与"block.timestamp"相同。您需要存储为该地址调用buy函数的时间。然后,你可以检查"现在"当卖出函数被调用时,将其与买入的时间进行比较,以检查是否已经过了足够的时间。
在sell函数中这样的检查,或者可能是transfer函数,否则地址可以转移到其他地址进行出售。
require(now > timeOfBuy + 10 min && timeOfBuy > 0, "Not enough time -10 min- has passed");
可以存储使用映射进行购买的每个地址的购买时间。然而,映射将初始化所有可能的地址为0。
mapping (address => uint) addrToTimeOfBuy;
那么在buy函数中:
addrToTimeOfBuy[msg.sender] = now;
将映射设置为区块戳。当那个地址买东西的时候
等待时间为10分钟,但这也可以是一个变量,使用单独的辅助函数来设置它。
在当前的逻辑下,一旦一个地址为它设置了一个buyTime,它等待等待时间,它可以随时出售,想卖多少就卖多少。这取决于你的应用程序,如果这是你想要的。