¿Qué hace exactamente la función “abi.encodeWithSelector(bytes4 selector, …) devuelve (bytes de memoria)”?

Oct 05 2020

Traté de editar esta función de acuerdo con mi contrato inteligente pero no pude entender esta función. Ya leí los documentos. ¿alguien puede explicarme esto con más detalles y ejemplos? Gracias.

Respuestas

5 goodvibration Oct 05 2020 at 16:06

Un selector de función son los primeros 4 bytes en el hash del prototipo de la función.

Un prototipo de función se define como el nombre de la función y sus tipos de argumentos por orden.

Le permite, por ejemplo, llamar a una función sin conocer su tipo de valor de retorno exacto:

bytes4 private constant FUNC_SELECTOR = bytes4(keccak256("someFunc(address,uint256)"));

function func(address _contract, address _param1, uint256 _param2) view returns (uint256, uint256) {
    bytes memory data = abi.encodeWithSelector(FUNC_SELECTOR, _param1, _param2);
    (bool success, bytes memory returnData) = address(_contract).staticcall(data);
    if (success) {
        if (returnData.length == 64)
            return abi.decode(returnData, (uint256, uint256));
        if (returnData.length == 32)
            return (abi.decode(returnData, (uint256)), 0);
    }
    return (0, 0);
}

De manera más general, le permite llamar a una función por su nombre de cadena (de manera similar a la reflexión en Java).