Эх сурвалжийг харах

Add Strings.toHexString(bytes) (#5761)

Hadrien Croubois 3 сар өмнө
parent
commit
a5350ecdd3

+ 5 - 0
.changeset/new-days-tease.md

@@ -0,0 +1,5 @@
+---
+'openzeppelin-solidity': minor
+---
+
+`Strings`: Add `toHexString(bytes)`.

+ 17 - 0
contracts/utils/Strings.sol

@@ -128,6 +128,23 @@ library Strings {
         return string(buffer);
     }
 
+    /**
+     * @dev Converts a `bytes` buffer to its ASCII `string` hexadecimal representation.
+     */
+    function toHexString(bytes memory input) internal pure returns (string memory) {
+        unchecked {
+            bytes memory buffer = new bytes(2 * input.length + 2);
+            buffer[0] = "0";
+            buffer[1] = "x";
+            for (uint256 i = 0; i < input.length; ++i) {
+                uint8 v = uint8(input[i]);
+                buffer[2 * i + 2] = HEX_DIGITS[v >> 4];
+                buffer[2 * i + 3] = HEX_DIGITS[v & 0xf];
+            }
+            return string(buffer);
+        }
+    }
+
     /**
      * @dev Returns true if the two strings are equal.
      */

+ 11 - 0
test/utils/Strings.test.js

@@ -186,6 +186,17 @@ describe('Strings', function () {
     });
   });
 
+  describe('bytes', function () {
+    describe('toHexString', function () {
+      for (const length of [0, 17, 20, 32, 42, 64, 512]) {
+        const input = ethers.hexlify(ethers.randomBytes(length));
+        it(`hexlify buffer of length ${length}`, async function () {
+          expect(await this.mock.getFunction('$toHexString(bytes)')(input)).to.equal(input);
+        });
+      }
+    });
+  });
+
   describe('equal', function () {
     it('compares two empty strings', async function () {
       expect(await this.mock.$equal('', '')).to.be.true;