首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能合同设计:与DAI的交互

智能合同设计:与DAI的交互
EN

Ethereum用户
提问于 2019-11-03 17:52:46
回答 2查看 711关注 0票数 0

比方说,我想要建立一种产品,让公司用DAI (https://makerdao.com/en/dai/)作为交换媒介来结算发票的跨境支付,以确保交易的稳定价值。

我已经开始建造Prototyp了,但在某个时候被困住了。其想法如下:

  • Biller创建存储在智能合同上的发票。
  • 接收方与dapp就智能合同在DAI中的付款进行交互
  • Smart合同在发票全部付清后充当托管和重定向支付给biller (接收方也可以部分支付)。

我已经能够做到以下几点:

  • 创建了一份智能合同,允许biller创建和管理发票。
  • 创建了一个基于ethers.js的dapp,它允许接收者:
    • 解除DAI令牌的使用( DAI智能合同上的“批准”功能)
    • 结算付款(使用transferFrom将DAI令牌发送给smart合同)

然而,这正是我被困的地方。缺少的部分:

  • 从接收方收到的付款被存储在智能契约中。
  • Smart合同运行一些功能来触发对biller的付款(如果发票已全部付清)

这一问题:

我的理解是,一旦接收方发送DAI令牌,就无法触发我的智能合同,因此DAI令牌将被转移到智能合同中,但不会触发智能合同逻辑来更新发票状态并将付款转发给biller。在这种情况下,可能的解决方案会是什么样子?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2019-11-04 03:33:40

使用ERC20解决这一问题的方法之一是由合同调用transferFrom,并在全额付款后立即将资金转寄给收款人。

代码语言:javascript
复制
function payInvoice(uint id, uint amount) public {
    Invoice storage invoice = getInvoice(id);
    // Accept payment
    dai.transferFrom(msg.sender, address(this), amount);
    invoice.paid += amount;

    // If paid in full send payment to recipient
    if (invoice.paid >= invoice.total) {
        dai.transfer(invoice.recipient, invoice.total);
    }
}

另一个选项是该函数生成一个事件,并将响应能力留给接收方提取资金。

代码语言:javascript
复制
function payInvoice(uint id, uint amount) public {
    Invoice storage invoice = getInvoice(id);
    // Accept payment
    dai.transferFrom(msg.sender, address(this), amount);
    invoice.paid += amount;

    // If paid in full
    if (invoice.paid >= invoice.total) {
        // Notify recipient
        emit FullPayment(invoice.recipient, invoice.total);
    }
}

现在接受者不得不提取资金。

代码语言:javascript
复制
function withdrawInvoice(uint id, uint amount) public {
    Invoice storage invoice = getInvoice(id);
    if (invoice.paid >= invoice.total) {
        // Notify recipient
        dai.transfer(invoice.recipient, invoice.total);
    }
}

ERC20没有提供一种在收到付款后通知合同的机制。有一个新的标准ERC-777提供这样的机制,但它需要重新部署。

对于ERC20,您可以运行一个侦听合同的Transfer事件的服务。

票数 1
EN

Ethereum用户

发布于 2019-11-06 06:48:57

我刚试过这个:

代码语言:javascript
复制
address dai = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2;
dai.call.gas(999999)(abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _amount));

但是,即使已批准的具有智能契约地址的函数已经成功运行。我现在确实有个错误,上面写的是汽油。

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

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

复制
相关文章

相似问题

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