Estoy tratando de llamar a la función de transferencia () en un token ERC20 mediante el uso de la llamada delegada, sin embargo, mi contrato de proxy devuelve falso de la llamada delegada.
Cuando trato de llamar a funciones de vista como balanceOf(), mi contrato de proxy devuelve verdadero. Sin embargo, dado que no hay posibles excepciones en la función balanceOf, también obtendría 'verdadero' incluso cuando se devuelva "0" en lugar de "100000"
El contrato de token se implementa a través del constructor del contrato de proxy. El propietario del contrato de token es el contrato de proxy. Cuando se implemente, el contrato de proxy emitirá 10000 tokens para el creador.
El contrato token.sol importado es de open-zeppelin y funciona por sí solo.
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"
}
Creo que estás malinterpretando el propósito de delegatecall()
. Ejecuta el contrato de llamada en el contexto del contrato de llamada.
En otras palabras, utilizará el código del contrato de llamada, pero el msg
almacenamiento del contrato de llamada. Dado que solo tiene acceso al almacenamiento del contrato de llamada, no puede buscar ni modificar saldos ni nada más sobre el token en sí.
Dependiendo de sus objetivos, es posible que desee utilizar la funcionalidad de asignación del token en su lugar.
Nico
mafrasi2
Test
contrato , no en el contrato de token real. Dado que esas variables simplemente no existen en elTest
contrato, todas esas búsquedas probablemente darán como resultado un archivo0
.