ERC20 genehmigen und transferFrom aus einem Vertrag

Ich habe einen Vertrag mit folgender Funktion:

function offerTokenTribute(address[] _tokenContractAddresses, uint256[] _tokenTributes) public {
  require(_tokenContractAddresses.length == _tokenTributes.length);

  Member storage member = members[msg.sender];
  member.approved = false; // should be already, but lets be safe

  for (uint8 i = 0; i < _tokenContractAddresses.length; i++) {
    ERC20 erc20 = ERC20(_tokenContractAddresses[i]);
    erc20.approve(this, _tokenTributes[i]);
    member.tokenTributeAddresses.push(_tokenContractAddresses[i]);
    member.tokenTributeAmounts.push(_tokenTributes[i]);
  }

  TokenTributeOffered(msg.sender, _tokenContractAddresses, _tokenTributes);
}

Das Problem ist, dass die erc20.approveFunktion nicht im Namen des ursprünglichen msg.sender genehmigt wird, sie ändert msg.sendersich zur Vertragsadresse (ich habe dies durch Überprüfen der Berechtigungen überprüft).

Gibt es eine Möglichkeit, dies von meinem Vertrag aus zu tun, oder ist die einzige Lösung, die Genehmigung außerhalb meines Vertrags aufzurufen (nicht ideal)?

Antworten (1)

Nein, daran führt kein Weg vorbei.

Es ist eine Sicherheitsfunktion, ein Vertrag kann sich nicht als ein anderes Konto ausgeben.

Ein gut durchdachter Anwendungsfall kann jedoch erfordern, dass beides in einer einzigen Transaktion ausgeführt wird: Alice genehmigt (Bob, 1000) UND Bob überträgt von (Alice an Charlie, 1000). Wie kann dies bewerkstelligt werden?
Zuzulassen, dass ein Vertrag einen Benutzer oder einen anderen Vertrag imitiert, kann auf EVM-Ebene ein Sicherheitsalptraum sein, wenn er nicht korrekt implementiert wird. Es ist praktischer, wenn es auf Vertragsebene implementiert wird, vielleicht kann ERC 777 für diese Funktionalität verwendet werden.