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
This commit is contained in:
committed by
Nicolás Venturo
parent
a83f680a63
commit
fbbff53528
38
contracts/drafts/Strings.sol
Normal file
38
contracts/drafts/Strings.sol
Normal file
@ -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
contracts/mocks/StringsMock.sol
Normal file
9
contracts/mocks/StringsMock.sol
Normal file
@ -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
test/drafts/Strings.test.js
Normal file
23
test/drafts/Strings.test.js
Normal file
@ -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());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user