Cargue los valores públicos de otro contrato implementado

solidez de pragma ^0.4.24;

Estoy tratando de llamar a las funciones de otro contrato para devolver valores.

Tengo el siguiente que devuelve con éxito un verdadero/falso

_childAddress.call(bytes4(keccak256("isValidChild(uint256, uint256)")), _childModule6, 6) == true)

Pero cuando trato de devolver un valor real así:

uint256 tokenId = _childAddress.call(bytes4(keccak256("totalSupply()")));

Obtuve el siguiente error:

El tipo bool no se puede convertir implícitamente al tipo esperado uint256. tokenId

No puedo encontrar la sintaxis en ninguna parte para devolver un valor.

Cualquier ayuda apreciada.

¡Debe compartir el código relevante de cada uno de estos contratos, ya que nadie aquí puede adivinar cuál es!
agregue más código por favor y use trufa, porque la remezcla no siempre funciona como se esperaba

Respuestas (2)

Con solc v0.5 la firma de callchanges devuelve una tupla (bool, bytes). El primer parámetro indica si la llamada fue exitosa y el segundo parámetro es el resultado de la función.

    bool success;
    bytes memory result;
    uint totalSupply;

Realice la llamada usando abi.encodeWithSignaturepara codificar los parámetros y la firma de la función

    (success, result) = childContract.call(abi.encodeWithSignature("totalSupply()"));
    if (success) {

Si la llamada fue exitosa, decodifique el resultado de la función.

        (totalSupply) = abi.decode(result, (uint));
        return totalSupply;
    }

Con v0.4, crea una interfaz para su contrato secundario o usa ensamblar para obtener el valor devuelto por la llamada.

La otra respuesta es correcta y también muy utilizada. sin embargo, si lo hace, address.callel compilador no permitirá marcar la función viewincluso si solo está leyendo el valor. Eso es porque address.callpodría usarse para escribir el estado también.

si desea una viewfunción con una llamada de bajo nivel para totalSupply()hacer esto

function readTotalSupply() external view returns(uint) {
    (, bytes memory data) = childContract.staticcall(abi.encodeWithSignature("totalSupply()"));
    return abi.decode(data, (uint));
}