19

In Solidity, how can I convert the sender address to a string?

The comments in How to convert an address to bytes in Solidity? did not provide a working solution

  • function toString(address x) internal pure returns (string) { bytes memory b = new bytes(20); for (uint i = 0; i < 20; i++) b[i] = byte(uint8(uint(x) / (2**(8*(19 - i))))); return string(b); } Use internal pure keyword, otherwise you will get a warning. For more information about pure function. – Kushan Gunasekera Jun 18 '18 at 11:12
26

Use abi.encodePacked(x)

where x is the address. (Thanks @k06a)

| improve this answer | |
  • It works, but the result is not a human-readable string. For a human-readable string, see toAsciiString example in the other answer. – rustyx Apr 9 '18 at 13:22
11

I was not able to read the ABI-encoded string with web3.js. Therefore I added some conversion to the ascii-characters:

function toAsciiString(address x) returns (string) {
    bytes memory s = new bytes(40);
    for (uint i = 0; i < 20; i++) {
        byte b = byte(uint8(uint(x) / (2**(8*(19 - i)))));
        byte hi = byte(uint8(b) / 16);
        byte lo = byte(uint8(b) - 16 * uint8(hi));
        s[2*i] = char(hi);
        s[2*i+1] = char(lo);            
    }
    return string(s);
}

function char(byte b) returns (byte c) {
    if (uint8(b) < 10) return byte(uint8(b) + 0x30);
    else return byte(uint8(b) + 0x57);
}
| improve this answer | |
  • 1
    There was a problem with the function char(byte b). "TypeError: Operator < not compatible with types bytes1 and int_const 10" I suppose this comparison does work anyway since you probably meant if b is a number then add 0x30 to it. But how do you know if a byte is less than 10 or not anyways? – Billie Jan 16 '19 at 12:25
  • if (b < 10) has to be changed to if (uint8(b) < 10), then the Operator < not compatible with types bytes1 ... error is fixed. I made an edit to the answer. Hope it gets approved. – Jack O'neill Sep 5 '19 at 13:35
  • Thanks for the answer - so far this works in v0.5.10 – pizzarob Sep 5 '19 at 15:04
6

This is method to convert address to hex string:

function toString(address account) public pure returns(string memory) {
    return toString(abi.encodePacked(account));
}

function toString(uint256 value) public pure returns(string memory) {
    return toString(abi.encodePacked(value));
}

function toString(bytes32 value) public pure returns(string memory) {
    return toString(abi.encodePacked(value));
}

function toString(bytes memory data) public pure returns(string memory) {
    bytes memory alphabet = "0123456789abcdef";

    bytes memory str = new bytes(2 + data.length * 2);
    str[0] = "0";
    str[1] = "x";
    for (uint i = 0; i < data.length; i++) {
        str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
        str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
    }
    return string(str);
}
| improve this answer | |
0

This works with solidity 0.6.0

function addressToString(address _pool) public pure returns (string memory _uintAsString) {
      uint _i = uint256(_pool);
      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);
    }

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.