pragma solidity ^0.8.4; library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Converts a `bool` to its ASCII `string` decimal representation. */ function toString(bool value) internal pure returns (string memory) { return (value ? "true" : "false"); } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } ///@dev converts bytes array to its ASCII hex string representation /// TODO: Definitely more efficient way to do this by processing multiple (16?) bytes at once /// but really a helper function for the tests, efficiency not key. function toHexString(bytes memory input) public pure returns (string memory) { require(input.length < type(uint256).max / 2 - 1); bytes16 symbols = "0123456789abcdef"; bytes memory hex_buffer = new bytes(2 * input.length + 2); hex_buffer[0] = "0"; hex_buffer[1] = "x"; uint pos = 2; uint256 length = input.length; for (uint i = 0; i < length; ++i) { uint _byte = uint8(input[i]); hex_buffer[pos++] = symbols[_byte >> 4]; hex_buffer[pos++] = symbols[_byte & 0xf]; } return string(hex_buffer); } }