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.
Con solc v0.5 la firma de call
changes 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.encodeWithSignature
para 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.call
el compilador no permitirá marcar la función view
incluso si solo está leyendo el valor. Eso es porque address.call
podría usarse para escribir el estado también.
si desea una view
funció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));
}
buena vibración
Majd TL