Ich versuche, die Funktion transfer () auf einem ERC20-Token mithilfe von "delegatecall" aufzurufen, mein Proxy-Vertrag gibt jedoch "false" von "delegatecall" zurück.
Wenn ich versuche, Ansichtsfunktionen wie balanceOf() aufzurufen, gibt mein Proxy-Vertrag true zurück. Da es jedoch keine möglichen Ausnahmen in der balanceOf-Funktion gibt, würde ich auch "true" erhalten, selbst wenn "0" anstelle von "100000" zurückgegeben wird.
Der Token-Vertrag wird über den Konstruktor des Proxy-Vertrags bereitgestellt. Der Eigentümer des Token-Vertrags ist der Proxy-Vertrag. Bei der Bereitstellung prägt der Proxy-Vertrag 10.000 Token für den Ersteller.
Der importierte token.sol-Vertrag stammt von open-zeppelin und funktioniert eigenständig.
pragma solidity ^0.4.20;
import './token.sol';
contract Test {
Token public token;
constructor () {
token = new Token("Test", "TST", 18);
token.mint(msg.sender, 10000);
}
function call(address _to, uint256 _value) returns (bool) {
return address(token).delegatecall(bytes4(sha3('transfer(address, uint256)')), _to, _value);
}
}
status 0x1 Transaction mined and execution succeed
decoded input {
"address _to": "0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C",
"uint256 _value": "50"
}
decoded output {
"0": "bool: false"
}
Ich glaube du missverstehst den Zweck von delegatecall()
. Er führt den aufgerufenen Vertrag im Kontext des aufrufenden Vertrags aus.
Mit anderen Worten, es wird der Code aus dem aufgerufenen Vertrag verwendet, aber der Code aus msg
dem aufrufenden Vertrag. Da es nur Zugriff auf den Speicher des aufrufenden Vertrags hat, kann es keine Salden oder irgendetwas anderes über das Token selbst nachschlagen oder ändern.
Abhängig von Ihren Zielen möchten Sie möglicherweise stattdessen die Freibetragsfunktion des Tokens verwenden.
Nico
mafrasi2
Test
Vertrags nachzuschlagen , nicht im eigentlichen Token-Vertrag. Da diese Variablen einfach nicht imTest
Vertrag vorhanden sind, führen alle derartigen Suchen wahrscheinlich zu einer0
.