networking - 有没有办法在 Solidity 的转移函数中检查买卖?
问题描述
我的目标是在 PancakeSwap 上签订合约,允许人们购买代币并仅在预定时间后出售。
例如,合约在 09:00 pm 部署,人们可以购买但还不能出售,并且在 09:10 pm 开始出售。
我正在考虑在出售功能上添加修饰符,但我不明白如何执行单独的功能。
我也在考虑在转移功能中添加一些支票,但这仍然是一样的,我不知道如何检查谁是卖者,谁是买方。
这是我尝试执行的方法之一:
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;
}
}
解决方案
首先,使用区块时间将不可能获得准确的时间。您可以使用块时间粗略估计时间跨度,使用预言机进行精确计时。“现在”与“block.timestamp”相同。您需要存储为该地址调用购买功能的时间。然后,您可以在调用 sell 函数时检查“现在”,并将其与买入时间进行比较,以检查是否经过了足够的时间。
在出售功能或转移功能中进行这样的检查,否则地址可能会转移到其他地址进行出售。
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 分钟,但这也可以是一个变量,需要一个单独的辅助函数来设置它。
按照目前的逻辑,一旦一个地址设置了buyTime,它会等待等待时间,它可以随时出售,想卖多少就卖多少。如果这是您想要的,取决于您的应用程序。
推荐阅读
- spring-boot - java 8日期在spring boot put请求中为null
- android - 当我单击第一行中的单选按钮时,为什么还会单击另一行中的单选按钮?
- php - PHP libcurl socks5 不工作
- c - 错误:'->' 的类型参数无效(有 'Queue {aka struct Queue}
- c# - Elasticsearch.Net 和 NEST、IGetResponse 来记录 POCO?
- google-cloud-platform - Google Cloud SQL 导出无中断
- c - fclose 会立即释放文件吗?
- date - 提示:日期,%Sysfunc(year(&myvar.));
- php - CakePHP 密码迁移到 Laravel 5.6
- css - 在 react-native 中更改文本项的字体?