12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
- pragma solidity ^0.8.20;
- import {Math} from "./math/Math.sol";
- import {SignedMath} from "./math/SignedMath.sol";
- /**
- * @dev String operations.
- */
- library Strings {
- bytes16 private constant HEX_DIGITS = "0123456789abcdef";
- uint8 private constant ADDRESS_LENGTH = 20;
- /**
- * @dev The `value` string doesn't fit in the specified `length`.
- */
- error StringsInsufficientHexLength(uint256 value, uint256 length);
- /**
- * @dev Converts a `uint256` to its ASCII `string` decimal representation.
- */
- function toString(uint256 value) internal pure returns (string memory) {
- unchecked {
- uint256 length = Math.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), HEX_DIGITS))
- }
- value /= 10;
- if (value == 0) break;
- }
- return buffer;
- }
- }
- /**
- * @dev Converts a `int256` to its ASCII `string` decimal representation.
- */
- function toStringSigned(int256 value) internal pure returns (string memory) {
- return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
- }
- /**
- * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
- */
- function toHexString(uint256 value) internal pure returns (string memory) {
- unchecked {
- return toHexString(value, Math.log256(value) + 1);
- }
- }
- /**
- * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
- */
- function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
- uint256 localValue = value;
- bytes memory buffer = new bytes(2 * length + 2);
- buffer[0] = "0";
- buffer[1] = "x";
- for (uint256 i = 2 * length + 1; i > 1; --i) {
- buffer[i] = HEX_DIGITS[localValue & 0xf];
- localValue >>= 4;
- }
- if (localValue != 0) {
- revert StringsInsufficientHexLength(value, length);
- }
- return string(buffer);
- }
- /**
- * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
- * representation.
- */
- function toHexString(address addr) internal pure returns (string memory) {
- return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
- }
- /**
- * @dev Returns true if the two strings are equal.
- */
- function equal(string memory a, string memory b) internal pure returns (bool) {
- return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
- }
- }
|