// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library StringToAddress { error InvalidAddressString(); function toAddress(string memory addressString) internal pure returns (address) { bytes memory stringBytes = bytes(addressString); uint160 addressNumber = 0; uint8 stringByte; if (stringBytes.length != 42 || stringBytes[0] != '0' || stringBytes[1] != 'x') revert InvalidAddressString(); for (uint256 i = 2; i < 42; ++i) { stringByte = uint8(stringBytes[i]); if ((stringByte >= 97) && (stringByte <= 102)) stringByte -= 87; else if ((stringByte >= 65) && (stringByte <= 70)) stringByte -= 55; else if ((stringByte >= 48) && (stringByte <= 57)) stringByte -= 48; else revert InvalidAddressString(); addressNumber |= uint160(uint256(stringByte) << ((41 - i) << 2)); } return address(addressNumber); } } library AddressToString { function toString(address address_) internal pure returns (string memory) { bytes memory addressBytes = abi.encodePacked(address_); bytes memory characters = '0123456789abcdef'; bytes memory stringBytes = new bytes(42); stringBytes[0] = '0'; stringBytes[1] = 'x'; for (uint256 i; i < 20; ++i) { stringBytes[2 + i * 2] = characters[uint8(addressBytes[i] >> 4)]; stringBytes[3 + i * 2] = characters[uint8(addressBytes[i] & 0x0f)]; } return string(stringBytes); } }