estoy usando solidity 0.5.0 y cuando trato de compilar mi contrato me da este error
Explicit type conversion not allowed from "bytes memory" to "address"
mi codigo es este:
/// @dev get broker address for endpoint
function getEndpointBroker(address oracleAddress, bytes32 endpoint) public view returns (address)
{
return address(db.getBytes(keccak256(abi.encodePacked('oracles', oracleAddress, endpoint, 'broker'))));
}
Se omitió la función db.getBytes()
para evitar errores de compilación en remix. Tu puedes elegir:
function getEndpointBroker(address oracleAddress, bytes32 endpoint) public view returns (address) {
return address(uint160(uint256(keccak256(abi.encodePacked('oracles', oracleAddress, endpoint, 'broker')))));
}
O:
function getEndpointBroker(address oracleAddress, bytes32 endpoint) public view returns (address) {
return address(uint160(bytes20(keccak256(abi.encodePacked('oracles', oracleAddress, endpoint, 'broker')))));
}
Editar: Solidity doc .
Si convierte un tipo que usa un tamaño de byte más grande a un
address
, por ejemplobytes32
, entonces seaddress
trunca. Para reducir la ambigüedad de la conversión, la versión 0.4.24 y posteriores del compilador obligan a que el truncamiento sea explícito en la conversión. Tomemos por ejemplo la dirección0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFFCCCC
.Puede usar
address(uint160(bytes20(b)))
, que da como resultado0x111122223333444455556666777788889999aAaa
, o puede usaraddress(uint160(uint256(b)))
, que da como resultado0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc
.
Majd TL