Browse Source

Strings library (#1746)

* Feature Issue #1745

* Feature Issue #1745 remove whitespace in contract

* Feature Issue #1745 fix Solidity linter issues

* Feature Issue #1745 fix JS lint issues

* Update contracts/drafts/Strings.sol

Co-Authored-By: Nicolás Venturo <nicolas.venturo@gmail.com>

* Update contracts/drafts/Strings.sol

Co-Authored-By: Nicolás Venturo <nicolas.venturo@gmail.com>

* Update contracts/drafts/Strings.sol

Co-Authored-By: Nicolás Venturo <nicolas.venturo@gmail.com>

* Updates based on PR feedback

* Remove trailing whitespace

* Update tests based on @nventuro feedback

* Removed return name

* Rename length as suggested

* Rename temp variables in uint256ToString

* Renamed bytes variable to buffer

* Change concatenate to use abi.encodePacked

* Moved OraclizeAPI reference to unit256ToString

* Add emoji concat test

* Remove concatenate

* Remove concatenate from StringsMock and test

* Rename function to fromUint256

* Update StringsMock.sol
Andrew B Coathup 6 years ago
parent
commit
fbbff53528
3 changed files with 70 additions and 0 deletions
  1. 38 0
      contracts/drafts/Strings.sol
  2. 9 0
      contracts/mocks/StringsMock.sol
  3. 23 0
      test/drafts/Strings.test.js

+ 38 - 0
contracts/drafts/Strings.sol

@@ -0,0 +1,38 @@
+pragma solidity ^0.5.0;
+
+/**
+ * @title Strings
+ * @dev String operations.
+ */
+library Strings {
+    /**
+     * Concatenates two strings.
+     * string(abi.encodePacked(a, b))
+     * https://solidity.readthedocs.io/en/latest/types.html?highlight=concatenate
+     */
+
+    /**
+     * @dev Converts a uint256 to a string.
+     * via OraclizeAPI - MIT licence
+     * https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
+     */
+    function fromUint256(uint256 value) internal pure returns (string memory) {
+        if (value == 0) {
+            return "0";
+        }
+        uint256 temp = value;
+        uint256 digits;
+        while (temp != 0) {
+            digits++;
+            temp /= 10;
+        }
+        bytes memory buffer = new bytes(digits);
+        uint256 index = digits - 1;
+        temp = value;
+        while (temp != 0) {
+            buffer[index--] = byte(uint8(48 + temp % 10));
+            temp /= 10;
+        }
+        return string(buffer);
+    }
+}

+ 9 - 0
contracts/mocks/StringsMock.sol

@@ -0,0 +1,9 @@
+pragma solidity ^0.5.0;
+
+import "../drafts/Strings.sol";
+
+contract StringsMock {
+    function fromUint256(uint256 value) public pure returns (string memory) {
+        return Strings.fromUint256(value);
+    }
+}

+ 23 - 0
test/drafts/Strings.test.js

@@ -0,0 +1,23 @@
+const { constants } = require('openzeppelin-test-helpers');
+
+const StringsMock = artifacts.require('StringsMock');
+
+contract('Strings', function () {
+  beforeEach(async function () {
+    this.strings = await StringsMock.new();
+  });
+
+  describe('from uint256', function () {
+    it('converts 0', async function () {
+      (await this.strings.fromUint256(0)).should.equal('0');
+    });
+
+    it('converts a positive number', async function () {
+      (await this.strings.fromUint256(4132)).should.equal('4132');
+    });
+
+    it('converts MAX_UINT256', async function () {
+      (await this.strings.fromUint256(constants.MAX_UINT256)).should.equal(constants.MAX_UINT256.toString());
+    });
+  });
+});