Transferencia de token ERC20 a través de llamadas de delegado

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"
    }

Respuestas (1)

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 msgalmacenamiento 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.

Correcto, tal como lo entendí, conservaría el objeto msg, pero ¿entonces ese es solo el caso de las cuentas de contrato? ¿No hay forma de conservar la dirección de usuario original que llamó a la función? Conozco los métodos de asignación y transferFrom, pero parecía una solución 'aburrida'.
Conserva la dirección del usuario. El problema es que el almacenamiento también se conserva. Entonces, el contrato de token intenta buscar el saldo, etc. en el almacenamiento de su Testcontrato , no en el contrato de token real. Dado que esas variables simplemente no existen en el Testcontrato, todas esas búsquedas probablemente darán como resultado un archivo 0.