Soy un principiante de solidez...
Este
Chainlink.Request memory request = buildChainlinkRequest(clJobId, address(this), this.registerConfirm.selector);
request.add("repo", msg.sender);
diceTypeError: Invalid type for argument in function call. Invalid implicit conversion from bytes20 to bytes memory requested.
Los documentos de Chainlink me dicen que también existen los métodos addBytes, addInt, addUint, addStringArray y setBuffer.
Mi primer pensamiento fue convertir la dirección en una cadena, pero eso no parece ser tan trivial en solidez. Así que me pregunto cómo manejar todo esto en general.
Respuestas como esta me confunden porque los comentarios dicen que no hace lo que esperarías.
Puede pasar la dirección como una cadena o uint256.
Aquí hay una función que convertirá su dirección en una cadena:
function addressToString(address _address) public pure returns (string memory _uintAsString) {
uint _i = uint256(_address);
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);
}
Luego simplemente páselo a su solicitud de Chainlink:
Chainlink.Request memory request = buildChainlinkRequest(clJobId, address(this), this.registerConfirm.selector);
request.add("repo", addressToString(msg.sender));
¡Esto es exactamente lo que necesitas! Devolver la dirección real, no la representación de números
Funciona con solidez ^0.6.0
function addressToString(address _address) public pure returns(string memory) {
bytes32 _bytes = bytes32(uint256(_address));
bytes memory HEX = "0123456789abcdef";
bytes memory _string = new bytes(42);
_string[0] = '0';
_string[1] = 'x';
for(uint i = 0; i < 20; i++) {
_string[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
_string[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
}
return string(_string);
}
Markus Kottländer
patricio collins
Anupam
Neo