Как преобразовать адрес в строку (для использования в запросе цепочки)?

Я новичок в солидности...

Этот

Chainlink.Request memory request = buildChainlinkRequest(clJobId, address(this), this.registerConfirm.selector);
request.add("repo", msg.sender);

говоритTypeError: Invalid type for argument in function call. Invalid implicit conversion from bytes20 to bytes memory requested.

Документы цепочки говорят мне, что есть также методы addBytes, addInt, addUint, addStringArray и setBuffer.

Моей первой мыслью было преобразовать адрес в строку, но это не кажется таким уж тривиальным. Вот и думаю, как с этим вообще справиться.

Такие ответы смущают меня, потому что в комментариях говорится, что это не то, что вы ожидаете.

Ответы (2)

Вы можете передать адрес в виде строки или uint256.

Вот функция, которая преобразует ваш адрес в строку:

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);
    }

Затем просто передайте это в свой запрос Chainlink:

Chainlink.Request memory request = buildChainlinkRequest(clJobId, address(this), this.registerConfirm.selector);
request.add("repo", addressToString(msg.sender));
Большое спасибо. Я не был уверен, действительно ли мне нужна моя собственная функция или какая-то библиотека.
Вероятно, есть библиотека, которая это делает, и в идеале мы хотели бы ее увидеть в будущем. Но сейчас события развиваются так быстро, что часто не выдерживают испытания временем.
Не работает с 0.6.6. Его преобразование адреса во все числа. Алфавиты отсутствуют.
Больше не работает, но это работает.

Это именно то, что Вам нужно!!! Вернуть реальный адрес, а не числовое представление

Работает с Solidity ^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);
    }
Больше не работает, но это работает.