No se puede llamar a balanceOf() de ERC20 desde otro contrato (ERC20)

Logré usar la función de transferencia () del token de mi contrato, sin embargo, la función balanceOf () solo devolverá 0. (o parece en MyEtherWallet)

Estaba probando un caso en el que el contrato inteligente recibe un token de EOA (cuenta Bittrex) y se transfiere a otro EOA (cuenta MyEtherWallet).

Así que implementé mi contrato inteligente a continuación desde MyEtherWallet y envié tokens (Golem en este caso) a este contrato.

Luego, llamé a la función de transferencia () del token (Golem) y transfirí con éxito el token a mi cuenta MyEtherWallet.

Verifiqué el saldo visitando el contrato del token (Golem) en Etherscan que se transfirió con éxito a mi cuenta (cuenta MyEtherWallet).

Lectura del saldo del contrato de token

Sin embargo, cada vez que trato de leer el saldo del token de mi contrato, solo muestra 0.

Pensé que esto se debía a los decimales, así que intenté multiplicar, dividiendo la cantidad que habría regresado de la función balanceOf(). Sin embargo, ninguno de ellos funciona. Solo muestra 0.

Estoy tan perdido aquí y pido ayuda de un desarrollador de solidez más avanzado. ¿Qué puedo hacer para hacer un contrato que lea el saldo del token?

Gracias por escuchar.

Aquí está el código de contrato inteligente que he hecho.

PD Pensé que el problema era constante , intenté usar la vista, no funcionó. Además, este código no tiene una función que multiplique el saldo devuelto.

pragma solidity ^0.4.24;

contract ERC20Basic{

function balanceOf(address _owner) external constant returns (uint256 balance);
function transfer(address to, uint256 value) public returns (bool);


}

library SafeMath {//SafeMath Code}

contract TokenTransferContract{

using SafeMath for uint256;

address _owner;
address _tokenAddress;
ERC20Basic erc20Instance;

constructor () public {

    _owner = msg.sender; //Contract distributor is the owner of this contract.

}

// Setting the instance to call functions from different contract (In this case ERC20 Token's function)

function setTokenInstance(address _tokenContractAddress) public {

    _tokenAddress = _tokenContractAddress;
    erc20Instance = ERC20Basic(_tokenContractAddress);

}

//transfer function works.

function transferContractTokenToOwner(uint256 _tokenAmount) public {
    require(_owner == msg.sender);

    erc20Instance.transfer(_owner, _tokenAmount); //Transfering the amount of token that was allocated with the address of this(UserTokenWalletContract) address to Owner(EOA).

}

function getAmountOfTokenOfOwner() view public returns (uint256 _amount){
    require(_owner == msg.sender);

    _amount = (erc20Instance.balanceOf(_owner)).div(1000000000000000000);

}

function getAmountOfTokenOfContract() view public returns (uint256 _amount){

    require(_owner == msg.sender);

    _amount = (erc20Instance.balanceOf(address(this))).div(1000000000000000000);

}

 function noneDecimalGetAmountOfTokenOfOwner() view public returns (uint256 _amount){
    require(_owner == msg.sender);

    _amount = erc20Instance.balanceOf(_owner);

}

function noneDecimalgetAmountOfTokenOfWalletContract() view public returns (uint256 _amount){
    require(_owner == msg.sender);

    _amount = erc20Instance.balanceOf(address(this));

}


function getOwnerAddress() view public returns (address _ownerAddress){
    _ownerAddress = _owner;

}

function getContractAddress() view public returns (address _contractAddress){
    _contractAddress = address(this);

}

function getContractInstanceAddress() view public returns (address _contractInstanceAddress){ 
    _contractInstanceAddress = _tokenAddress;

}

}

Respuestas (1)

Encontré la respuesta.

El problema era el estado require() en la función balanceOf.

La función balanceOf no necesita transacción, lo que significa que no tiene msg.sender. El msg.sender es 0x00000000000000000.

Realmente no necesita tener una instrucción require(). Es una persona que llama.

Así que gracias a mí, supongo.

¡Buen día!

¡Buen dia para ti tambien!