比方说,我想要建立一种产品,让公司用DAI (https://makerdao.com/en/dai/)作为交换媒介来结算发票的跨境支付,以确保交易的稳定价值。
我已经开始建造Prototyp了,但在某个时候被困住了。其想法如下:
我已经能够做到以下几点:
然而,这正是我被困的地方。缺少的部分:
这一问题:
我的理解是,一旦接收方发送DAI令牌,就无法触发我的智能合同,因此DAI令牌将被转移到智能合同中,但不会触发智能合同逻辑来更新发票状态并将付款转发给biller。在这种情况下,可能的解决方案会是什么样子?
发布于 2019-11-04 03:33:40
使用ERC20解决这一问题的方法之一是由合同调用transferFrom,并在全额付款后立即将资金转寄给收款人。
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);
}
}另一个选项是该函数生成一个事件,并将响应能力留给接收方提取资金。
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);
}
}现在接受者不得不提取资金。
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事件的服务。
发布于 2019-11-06 06:48:57
我刚试过这个:
address dai = 0xC4375B7De8af5a38a93548eb8453a498222C4fF2;
dai.call.gas(999999)(abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _amount));但是,即使已批准的具有智能契约地址的函数已经成功运行。我现在确实有个错误,上面写的是汽油。
https://ethereum.stackexchange.com/questions/77164
复制相似问题