Skip to content

Commit

Permalink
Uint and Time helpers (#375)
Browse files Browse the repository at this point in the history
* Add uint64 conversion library

* Add timestamp getter to Initializable and 64 bit version for block
  • Loading branch information
bingen authored and sohkai committed Aug 10, 2018
1 parent bfb2dd1 commit 898310f
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 10 deletions.
12 changes: 2 additions & 10 deletions contracts/common/Initializable.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
pragma solidity ^0.4.18;

import "../apps/AppStorage.sol";
import "../common/TimeHelpers.sol";


contract Initializable is AppStorage {
contract Initializable is AppStorage, TimeHelpers {
modifier onlyInit {
require(initializationBlock == 0);
_;
Expand All @@ -31,13 +32,4 @@ contract Initializable is AppStorage {
function initialized() internal onlyInit {
initializationBlock = getBlockNumber();
}

/**
* @dev Returns the current block number.
* Using a function rather than `block.number` allows us to easily mock the block number in
* tests.
*/
function getBlockNumber() internal view returns (uint256) {
return block.number;
}
}
48 changes: 48 additions & 0 deletions contracts/common/TimeHelpers.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* SPDX-License-Identitifer: MIT
*/

pragma solidity ^0.4.18;

import "./Uint256Helpers.sol";


contract TimeHelpers {
using Uint256Helpers for uint256;

/**
* @dev Returns the current block number.
* Using a function rather than `block.number` allows us to easily mock the block number in
* tests.
*/
function getBlockNumber() internal view returns (uint256) {
return block.number;
}

/**
* @dev Returns the current block number, converted to uint64.
* Using a function rather than `block.number` allows us to easily mock the block number in
* tests.
*/
function getBlockNumber64() internal view returns (uint64) {
return getBlockNumber().toUint64();
}

/**
* @dev Returns the current timestamp.
* Using a function rather than `now` allows us to easily mock it in
* tests.
*/
function getTimestamp() internal view returns (uint256) {
return now;
}

/**
* @dev Returns the current timestamp, covnerted to uint64.
* Using a function rather than `now` allows us to easily mock it in
* tests.
*/
function getTimestamp64() internal view returns (uint64) {
return getTimestamp().toUint64();
}
}
11 changes: 11 additions & 0 deletions contracts/common/Uint256Helpers.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
pragma solidity ^0.4.18;


library Uint256Helpers {
uint256 public constant MAX_UINT64 = uint64(-1);

function toUint64(uint256 a) internal pure returns (uint64) {
require(a <= MAX_UINT64);
return uint64(a);
}
}
21 changes: 21 additions & 0 deletions test/lib_uint256_helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const { assertRevert } = require('./helpers/assertThrow')

contract('Uint256 Helpers test', accounts => {
let uint256Mock

before(async () => {
uint256Mock = await artifacts.require('Uint256Mock').new()
})

it('converts from uint256 to uint64', async () => {
const a = 1234
assert.equal((await uint256Mock.convert.call(a)).toString(), a, "Values should match")
})

it('fails converting from uint256 to uint64 if too big', async () => {
const a = new web3.BigNumber(2).pow(64)
return assertRevert(async () => {
await uint256Mock.convert(a)
})
})
})
30 changes: 30 additions & 0 deletions test/mocks/TimeHelpersMock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
pragma solidity 0.4.18;

import "../../contracts/common/TimeHelpers.sol";


contract TimeHelpersMock is TimeHelpers {
function getBlockNumberDirect() public view returns (uint256) {
return block.number;
}

function getBlockNumberExt() public view returns (uint256) {
return getBlockNumber();
}

function getBlockNumber64Ext() public view returns (uint64) {
return getBlockNumber64();
}

function getTimestampDirect() public view returns (uint256) {
return now;
}

function getTimestampExt() public view returns (uint256) {
return getTimestamp();
}

function getTimestamp64Ext() public view returns (uint64) {
return getTimestamp64();
}
}
12 changes: 12 additions & 0 deletions test/mocks/Uint256Mock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
pragma solidity 0.4.18;

import "../../contracts/common/Uint256Helpers.sol";


contract Uint256Mock {
using Uint256Helpers for uint256;

function convert(uint256 a) public pure returns (uint64) {
return a.toUint64();
}
}
17 changes: 17 additions & 0 deletions test/time_helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
contract('TimeHelpers test', accounts => {
let timeHelpersMock

before(async () => {
timeHelpersMock = await artifacts.require('TimeHelpersMock').new()
})

it('checks block number', async () => {
assert.equal((await timeHelpersMock.getBlockNumberExt.call()).toString(), (await timeHelpersMock.getBlockNumber64Ext.call()).toString(), "block numbers should match")
assert.equal((await timeHelpersMock.getBlockNumberExt.call()).toString(), (await timeHelpersMock.getBlockNumberDirect.call()).toString(), web3.eth.blockNumber, "block number should match with real one", "block number should match with real one")
})

it('checks time stamp', async () => {
assert.equal((await timeHelpersMock.getTimestampExt.call()).toString(), (await timeHelpersMock.getTimestamp64Ext.call()).toString(), "time stamps should match")
assert.equal((await timeHelpersMock.getTimestampExt.call()).toString(), (await timeHelpersMock.getTimestampDirect.call()).toString(), "time stamp should match with real one")
})
})

0 comments on commit 898310f

Please sign in to comment.