Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Uint and Time helpers #375

Merged
merged 8 commits into from
Aug 10, 2018
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions contracts/common/Initializable.sol
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,31 @@ contract Initializable is AppStorage {
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) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it'd be nice if we moved these time helpers into their own contract file, e.g. TimeHelpers.

return uint64(block.number);
}

/**
* @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 uint64(now);
}
}
11 changes: 11 additions & 0 deletions contracts/lib/misc/Uint64Helpers.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
pragma solidity ^0.4.18;


library Uint64Helpers {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd call this Uint256Helpers, since it's working on uint256s.

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_uint64_helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const { assertRevert } = require('./helpers/assertThrow')

contract('Uint64 Helpers test', accounts => {
let uint64Mock

before(async () => {
uint64Mock = await artifacts.require('Uint64Mock').new()
})

it('converts from uint256 to uint64', async () => {
const a = 1234
assert.equal((await uint64Mock.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 () => {
assert.equal((await uint64Mock.convert(a)).toString(), a, "Values should match")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small nitpick: this can just be await uint64Mock.convert(a) rather than an assert() test.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haha, yes, problems of copy-pasting...

})
})
})
12 changes: 12 additions & 0 deletions test/mocks/Uint64Mock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
pragma solidity 0.4.18;

import "../../contracts/lib/misc/Uint64Helpers.sol";


contract Uint64Mock {
using Uint64Helpers for uint256;

function convert(uint256 a) public pure returns (uint64) {
return a.toUint64();
}
}