Solidity

如何部署託管智能合約並將其與令人興奮的 erc20 代幣一起使用

  • June 22, 2018

我想用一種特定的 ERC20 標準代幣建立託管智能合約。我想在託管中持有代幣作為交易的保證。在某些情況下,這些代幣應該回到賣家賬戶。

> > 所以在我的應用程序中,甲方使用乙方的一些服務,但乙方不受信任,因此乙方將在託管中保留一些令牌,在某些條件後,乙方將取回這些令牌。它就像一種方式交易託管。 > > > 但是我們可以使用什麼條件,比如 if 條件。我也可以將代幣發送到智能合約嗎?如果可以的話,如何將這些代幣發送回乙方的錢包,或者如何將收到的代幣從託管智能合約發送給任何錢包所有者 > > > 如果我是代幣的所有者並且我無法理解誰可以部署託管。因為如果我部署託管並且我是代幣的所有者,那麼我可以轉到該代幣函式並使用 transferfrom() 函式並使用託管地址來取回我的代幣,那麼如何防止這個問題。那麼如何安全地將這些代幣鎖定在託管中。因為幾乎 90% 的教程都是關於乙太幣而不是乙太幣上的代幣。 > > >

在你的寫作之後我遇到了一些困難,所以我會更概括一點。

如果您是發行代幣的人,那麼您已經決定瞭如何轉移代幣。作為合約所有者,您很可能擁有將任何數量的代幣轉移給您希望的任何人的全部權力,甚至可能從某人身上移除代幣(是的,代幣可以被移除,因為它們只存在於同一個合約中,它們實際上從未被發送’ 任何地方)。

因此,如果你對代幣擁有完全的權力,你就可以對它們做任何你想做的事情——例如,如果你的合約支持這樣的功能,可以在任何形式的託管中持有一些。

如果您沒有創建代幣合約(但它是由其他人創建的),您可以充當託管人並將代幣轉移到您的帳戶。當不再需要託管服務時,您可以授權(approveERC20 中的功能)轉回給某人或直接使用該transfer功能將他們轉出。

我們為 ERC20 代幣的託管功能創建了一個解決方案。

我們使用的程式碼如下。

pragma solidity ^0.4.21;

import "../zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "../zeppelin-solidity/contracts/ownership/Ownable.sol";
import "../webshop/Webshop.sol";

contract Escrow is Ownable {
   enum PaymentStatus { Pending, Completed, Refunded }

   event PaymentCreation(uint indexed orderId, address indexed customer, uint value);
   event PaymentCompletion(uint indexed orderId, address indexed customer, uint value, PaymentStatus status);

   struct Payment {
       address customer;
       uint value;
       PaymentStatus status;
       bool refundApproved;
   }

   mapping(uint => Payment) public payments;
   ERC20 public currency;
   address public collectionAddress;
   Webshop public webshop;

   function Escrow(ERC20 _currency, address _collectionAddress) public {
       currency = _currency;
       collectionAddress = _collectionAddress;
       webshop = Webshop(msg.sender);
   }

   function createPayment(uint _orderId, address _customer, uint _value) external onlyOwner {
       payments[_orderId] = Payment(_customer, _value, PaymentStatus.Pending, false);
       emit PaymentCreation(_orderId, _customer, _value);
   }

   function release(uint _orderId) external {
       completePayment(_orderId, collectionAddress, PaymentStatus.Completed);
   }

   function refund(uint _orderId) external {
       completePayment(_orderId, msg.sender, PaymentStatus.Refunded);
   }

   function approveRefund(uint _orderId) external {
       require(msg.sender == collectionAddress);
       Payment storage payment = payments[_orderId];
       payment.refundApproved = true;
   }

   function completePayment(uint _orderId, address _receiver, PaymentStatus _status) private {
       Payment storage payment = payments[_orderId];
       require(payment.customer == msg.sender);
       require(payment.status == PaymentStatus.Pending);
       if (_status == PaymentStatus.Refunded) {
           require(payment.refundApproved);
       }
       currency.transfer(_receiver, payment.value);
       webshop.changeOrderStatus(_orderId, Webshop.OrderStatus.Completed);
       payment.status = _status;
       emit PaymentCompletion(_orderId, payment.customer, payment.value, _status);
   }
}

這篇文章,包括程式碼可以在https://medium.com/@s_van_laar/how-to-build-an-escrow-contract-with-an-ethereum-erc20-token-bfc4825b0dd7找到

引用自:https://ethereum.stackexchange.com/questions/45944