So fordern Sie Tokens von msg.sender innerhalb der Vertragsfunktion an

Das Übertragen von Ethereum vom Benutzer Ihres Smart Contracts ist einfach genug, Sie verwenden einfach msg.value und können dies innerhalb der Funktionen Ihres Vertrags verwenden. Aber das Gleiche mit Token zu tun, ist etwas kniffliger, wenn man sich den folgenden Vertrag ansieht

pragma solidity ^0.4.24;
import "../node_modules/zeppelin-solidity/contracts/math/SafeMath.sol";
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
contract TokenExchange{
  enum State {OPEN, FILLED, CLOSED, CANCELED}
  struct Order {
    uint id;
    State state;
    address buyer;
    address seller;
    uint antAmmount;
    uint daiAmmount;
  }
  ERC20 public token1;
  ERC20 public token2;
  mapping (uint => Order) public globalOrders;      
  uint private nextOrderId;
  constructor () public {
      token1 = ERC20(0x1111111111111111111111111111111111111111); 
      token2 = ERC20(0x2222222222222222222222222222222222222222); 
  }
  function createBuyOrder(uint _buyAmmount, uint _sellAmmount) external payable {
    uint deposit = _buyAmmount.div(2);    

    // How to transfer tokens from message sender to this contract

    Order memory newOrder = Order({
            id: 0, 
            state: State.OPEN, 
            buyer: msg.sender, 
            seller: 0x0000000000000000000000000000000000000000, 
            token1Ammount: _buyAmmount, 
            token2Ammount: _sellAmmount 
        });
    globalOrders[nextBuyOrderId] = newOrder;
    nextBuyOrderId++;
  }
}

Wenn wir es mit eth zu tun hätten, könnten wir einfach verlangen, dass msg.sender dem Einzahlungswert entspricht. Außerdem können wir token.aprove() und transferFrom() innerhalb der Funktion nicht verwenden, da dies den Vertragssaldo bestätigen würde und nicht msg.sender

Meine Frage lautet also: Wie fordere ich den Absender der Nachricht auf, die Anzahlung an den Vertrag zu senden, und wie teste ich, ob der Absender der Nachricht den erforderlichen Betrag gesendet hat?

Antworten (1)

approve()und transferFrom()ist ein zweistufiger Prozess. Sie erwarten/verlangen eine Abstimmung auf Anwender-/Auftraggeberseite.

Schritt 1. Der Kunde genehmigt den Vertrag, um von seinem Konto zu ziehen.

Schritt 2. Der Client sendet eine Transaktion an den Vertrag und der Vertrag versucht, auf transferFrom()die Token zuzugreifen. Ihr Vertrag würde sich nur auf diesen Teil beziehen. Es sieht so aus, als würde es genau dort hinpassen, wo Ihr Kommentar steht.

Sie könnten auch ERC223 in Betracht ziehen, wenn Sie ein Token implementieren. Ein solcher Token-Vertrag erwartet, dass der Empfänger, falls es sich um einen Vertrag handelt, eine implementiert, tokenFallback()die er aufruft, wenn ihm Token übertragen werden.

Ich hoffe es hilft.

Danke schön! Meine Verwirrung war also mit der Genehmigungsfunktion. Ich dachte, es gäbe eine Möglichkeit, den Benutzer aufzufordern, die Übertragung innerhalb des Vertrags zu genehmigen.
Beispiele sind schön... 😢