Skip to content
This repository was archived by the owner on Mar 5, 2025. It is now read-only.

Commit f33e5d5

Browse files
GregTheGreekwbtfrankiebee
authored
Add function compare blocks (#3682)
* Add function compareBlockNumbers(a, b) No tests yet; BigNumber values not presently included * Fix format of fn declaration & add to exports * Finish fixing format of fn declaration * refactor exisiting pr * update changelog * more tests * more tests * move to web3-utils * fix if clause Co-authored-by: wbt <[email protected]> Co-authored-by: Frankie <[email protected]>
1 parent 9edd908 commit f33e5d5

File tree

3 files changed

+119
-2
lines changed

3 files changed

+119
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ Released with 1.0.0-beta.37 code base.
271271
### Added
272272

273273
- Support for typescript files (.ts) to be writtern alongside regular .js files (#3652)
274+
- Add compareBlock function that allows for complex block comparisons (#3682)
274275

275276
### Changed
276277

packages/web3-utils/src/index.js

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var ethjsUnit = require('ethjs-unit');
2727
var utils = require('./utils.js');
2828
var soliditySha3 = require('./soliditySha3.js');
2929
var randombytes = require('randombytes');
30-
30+
var BN = require('bn.js');
3131

3232

3333
/**
@@ -316,6 +316,62 @@ var toChecksumAddress = function (address) {
316316
return checksumAddress;
317317
};
318318

319+
/**
320+
* Returns -1 if a<b, 1 if a>b; 0 if a == b.
321+
* For more details on this type of function, see
322+
* developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
323+
*
324+
* @method compareBlockNumbers
325+
*
326+
* @param {String|Number|BN} a
327+
*
328+
* @param {String|Number|BN} b
329+
*
330+
* @returns {Number} -1, 0, or 1
331+
*/
332+
var compareBlockNumbers = function(a, b) {
333+
if (a == b) {
334+
return 0;
335+
} else if (("genesis" == a || "earliest" == a || 0 == a) && ("genesis" == b || "earliest" == b || 0 == b)) {
336+
return 0;
337+
} else if ("genesis" == a || "earliest" == a) {
338+
// b !== a, thus a < b
339+
return -1;
340+
} else if ("genesis" == b || "earliest" == b) {
341+
// b !== a, thus a > b
342+
return 1;
343+
} else if (a == "latest") {
344+
if (b == "pending") {
345+
return -1;
346+
} else {
347+
// b !== ("pending" OR "latest"), thus a > b
348+
return 1;
349+
}
350+
} else if (b === "latest") {
351+
if (a == "pending") {
352+
return 1;
353+
} else {
354+
// b !== ("pending" OR "latest"), thus a > b
355+
return -1
356+
}
357+
} else if (a == "pending") {
358+
// b (== OR <) "latest", thus a > b
359+
return 1;
360+
} else if (b == "pending") {
361+
return -1;
362+
} else {
363+
let bnA = new BN(a);
364+
let bnB = new BN(b);
365+
if(bnA.lt(bnB)) {
366+
return -1;
367+
} else if(bnA.eq(bnB)) {
368+
return 0;
369+
} else {
370+
return 1;
371+
}
372+
}
373+
};
374+
319375
module.exports = {
320376
_fireError: _fireError,
321377
_jsonInterfaceMethodToString: _jsonInterfaceMethodToString,
@@ -379,5 +435,7 @@ module.exports = {
379435
isContractAddressInBloom: utils.isContractAddressInBloom,
380436
isTopic: utils.isTopic,
381437
isTopicInBloom: utils.isTopicInBloom,
382-
isInBloom: utils.isInBloom
438+
isInBloom: utils.isInBloom,
439+
440+
compareBlockNumbers: compareBlockNumbers
383441
};

test/utils.compareBlockNumbers.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
const chai = require('chai');
2+
const assert = chai.assert;
3+
const BN = require('bn.js');
4+
const formatters = require('../packages/web3-utils/src/index.js');
5+
6+
const pending = "pending";
7+
const latest = "latest";
8+
const genesis = "genesis";
9+
const earliest = "earliest";
10+
11+
const tests = [
12+
// Base cases for numbers
13+
{ input: {a: 1, b: 1}, result: 0 },
14+
{ input: {a: 1, b: 2}, result: -1 },
15+
{ input: {a: 2, b: 1}, result: 1 },
16+
// Base cases for BN
17+
{ input: {a: new BN(1), b: new BN(1)}, result: 0 },
18+
{ input: {a: new BN(1), b: new BN(2)}, result: -1 },
19+
{ input: {a: new BN(2), b: new BN(1)}, result: 1 },
20+
// Base cases for numbers vs BN
21+
{ input: {a: new BN(1), b: 1}, result: 0 },
22+
{ input: {a: new BN(1), b: 2}, result: -1 },
23+
{ input: {a: new BN(2), b: 1}, result: 1 },
24+
// Base cases for strings (sanity)
25+
{ input: {a: genesis, b: earliest}, result: 0 },
26+
{ input: {a: genesis, b: 0}, result: 0 },
27+
{ input: {a: earliest, b: 0}, result: 0 },
28+
{ input: {a: latest, b: latest}, result: 0 },
29+
{ input: {a: pending, b: pending}, result: 0 },
30+
// Complex Strings
31+
// Genesis
32+
{ input: {a: earliest, b: 2}, result: -1 },
33+
{ input: {a: earliest, b: new BN(2)}, result: -1 },
34+
{ input: {a: earliest, b: latest}, result: -1 },
35+
{ input: {a: earliest, b: pending}, result: -1 },
36+
{ input: {a: genesis, b: 2}, result: -1 },
37+
{ input: {a: genesis, b: new BN(2)}, result: -1 },
38+
{ input: {a: genesis, b: latest}, result: -1 },
39+
{ input: {a: genesis, b: pending}, result: -1 },
40+
// latest
41+
{ input: {a: latest, b: 0}, result: 1 },
42+
{ input: {a: latest, b: new BN(1)}, result: 1 },
43+
{ input: {a: latest, b: pending}, result: -1 },
44+
// pending
45+
{ input: {a: pending, b: 0}, result: 1 },
46+
{ input: {a: pending, b: new BN(1)}, result: 1 },
47+
];
48+
49+
describe('formatters', function () {
50+
describe('compare blocknumbers', function () {
51+
tests.forEach(function(test){
52+
it('should return the correct value', function () {
53+
assert.deepEqual(formatters.compareBlockNumbers(test.input.a, test.input.b), test.result);
54+
});
55+
});
56+
});
57+
58+
});

0 commit comments

Comments
 (0)