首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接受Dai或任何ERC20令牌作为付款

接受Dai或任何ERC20令牌作为付款
EN

Ethereum用户
提问于 2020-01-12 14:43:09
回答 1查看 3K关注 0票数 6

我已经创建了一个ERC20令牌,并想让它支付与戴。

我读了一些相关的问题,但没有找到任何正确的答案。

由于dai是一个ERC20令牌,所以我如何接受任何令牌作为支付而不是以太?

function () external payable {}

这只接受乙醚,对吗?

抱歉,我的英语很难理解,也不懂。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2020-01-12 19:50:33

以下是如何实现这一目标的示例:

代码语言:javascript
复制
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类型的状态变量,这样您就可以在合同中的某个地方(例如,构造函数中)进行预配置。

票数 8
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/78904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档