¿Cómo convertir la dirección en cadena (para usar en la solicitud de enlace de cadena)?

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.

Respuestas (2)

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));
Muchas gracias. No estaba seguro de si realmente necesitaba tener mi propia función o alguna biblioteca.
Probablemente haya una biblioteca que lo haga, e idealmente en el futuro nos gustaría ver una. Pero en este momento las cosas se están moviendo tan rápido que a menudo no resisten la prueba del tiempo.
No funciona con 0.6.6. Su dirección de conversión a todos los números. Faltan los alfabetos.
Ya no funciona, pero esto sí.

¡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);
    }
Ya no funciona, pero esto sí.