我已经创建了一个ERC20令牌,并想让它支付与戴。
我读了一些相关的问题,但没有找到任何正确的答案。
由于dai是一个ERC20令牌,所以我如何接受任何令牌作为支付而不是以太?
function () external payable {}
这只接受乙醚,对吗?
抱歉,我的英语很难理解,也不懂。
发布于 2020-01-12 19:50:33
以下是如何实现这一目标的示例:
IERC20 public daiInstance;
uint256 public totalSupply;
mapping(address => uint256) public balances;
constructor(IERC20 _daiInstance) public {
daiInstance = _daiInstance;
}
function buyXXX(uint256 daiAmount) external {
uint256 xxxAmount = toXXX(daiAmount);
bool success = daiInstance.transferFrom(msg.sender, address(this), daiAmount);
require(success, "buy failed");
totalSupply = totalSupply.add(xxxAmount);
balances[msg.sender] = balances[msg.sender].add(xxxAmount);
}
function sellXXX(uint256 xxxAmount) external {
uint256 daiAmount = toDAI(xxxAmount);
totalSupply = totalSupply.sub(xxxAmount);
balances[msg.sender] = balances[msg.sender].sub(xxxAmount);
bool success = daiInstance.transfer(msg.sender, daiAmount);
require(success, "sell failed");
}
function toXXX(uint256 daiAmount) internal view returns (uint256) {
// do some logic here
}
function toDAI(uint256 xxxAmount) internal view returns (uint256) {
// do some logic here
}在调用您的buyXXX函数之前,您的用户将需要调用DAI合同上的approve函数,并将您作为托管人的合同地址(即被批准的托管地址)传递给它。
当然,由于您使用address(this)作为向用户传输DAI令牌的目的地,这些令牌将被传输到您的合同中。而且,由于您没有私钥,所以需要实现一个内部机制(函数),它将允许您提取这些令牌。或者,您可以将一个address(this)类型的状态变量添加到您的合同中,而不是address类型的状态变量,这样您就可以在合同中的某个地方(例如,构造函数中)进行预配置。
https://ethereum.stackexchange.com/questions/78904
复制相似问题