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

Add optional param hex to getTransaction and getBlock. #5845

Merged
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
f3886dc
update `hexToNumber` to return big numbers as strings
Muhammad-Altabba Feb 16, 2023
c3c132a
update a typo and whitespaces
Muhammad-Altabba Feb 16, 2023
46f7a9d
allow `hexToNumber` to handle numbers smaller than `MIN_SAFE_INTEGER`
Muhammad-Altabba Feb 16, 2023
aa119ff
remove some newlines
Muhammad-Altabba Feb 16, 2023
33ec247
fix `toNumber` test-cases and modify its signature
Muhammad-Altabba Feb 16, 2023
bfa61d2
clean some code at test/utils.toNumber.js
Muhammad-Altabba Feb 16, 2023
4426daa
update CHANGELOG.md
Muhammad-Altabba Feb 17, 2023
dcec0ec
add `bigIntOnOverflow`optional param to `hexToNumber` and `toNumber`
Muhammad-Altabba Feb 20, 2023
29f968a
add optional `hexFormat` to `getTransaction` and `getBlock`
Muhammad-Altabba Feb 20, 2023
b4eef63
update CHANGELOG.md
Muhammad-Altabba Feb 20, 2023
9f7a030
update test cases for `utils.toNumber`
Muhammad-Altabba Feb 20, 2023
1c2925c
Merge branch 'fix/5761/enable-hexToNumber-to-handle-large-numbers' of…
Muhammad-Altabba Feb 20, 2023
32da100
fix accessing `this` if undefined at `formatOutput`
Muhammad-Altabba Feb 20, 2023
5e28472
revert changes at `dist` folder
Muhammad-Altabba Feb 21, 2023
893d266
update CHANGELOG.md
Muhammad-Altabba Feb 21, 2023
2ef010f
use `this?.hexFormat` at `formatOutput`
Muhammad-Altabba Feb 21, 2023
1ef98f6
updates `hexToNumber` documentation
Muhammad-Altabba Feb 21, 2023
8920dac
Merge branch 'fix/5761/enable-hexToNumber-to-handle-large-numbers' of…
Muhammad-Altabba Feb 21, 2023
a51abcc
defaults `bigIntOnOverflow` to `false` in `hexToNumber` and `toNumber`
Muhammad-Altabba Feb 23, 2023
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
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -646,3 +646,8 @@ Released with 1.0.0-beta.37 code base.

- Fixed skipped ws-ganache tests (#5759)
- Fixed "provider started to reconnect error" in web3-provider-ws (#5820)
- Fixed Error: Number can only safely store up to 53 bits (#5845)

### Changed

- utils.toNumber and utils.hexToNumber can now return the decimal number as a string when it is too large than the max safe number (#5845)
2 changes: 1 addition & 1 deletion dist/web3.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/web3.min.js.map

Large diffs are not rendered by default.

13 changes: 9 additions & 4 deletions packages/web3-utils/src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -218,11 +218,12 @@ var hexToUtf8 = function(hex) {


/**
* Converts value to it's number representation
* Converts value to it's number representation.
* However, if the value is larger than the maximum safe integer, returns the value as a string.
*
* @method hexToNumber
* @param {String|Number|BN} value
* @return {String}
* @return {Number|String}
*/
var hexToNumber = function (value) {
if (!value) {
Expand All @@ -233,7 +234,11 @@ var hexToNumber = function (value) {
throw new Error('Given value "'+value+'" is not a valid hex string.');
}

return toBN(value).toNumber();
const n = toBN(value);
if(n > Number.MAX_SAFE_INTEGER || n < Number.MIN_SAFE_INTEGER) {
return n.toString();
}
return n.toNumber();
};

/**
Expand Down Expand Up @@ -528,7 +533,7 @@ var sha3Raw = function(value) {
*
* @method toNumber
* @param {String|Number|BN} value
* @return {Number}
* @return {Number|String}
*/
var toNumber = function(value) {
return typeof value === 'number' ? value : hexToNumber(toHex(value));
Expand Down
8 changes: 4 additions & 4 deletions packages/web3-utils/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ export function fromDecimal(value: string | number): string;
export function fromUtf8(string: string): string;
export function fromWei(value: string | BN, unit?: Unit): string;
export function hexToBytes(hex: Hex): number[];
export function hexToNumber(hex: Hex): number;
export function hexToNumber(hex: Hex): number | string;
export function hexToNumberString(hex: Hex): string;
export function hexToString(hex: Hex): string;
export function hexToUtf8(string: string): string;
Expand Down Expand Up @@ -122,7 +122,7 @@ export function testAddress(bloom: string, address: string): boolean;
export function testTopic(bloom: string, topic: string): boolean;
export function getSignatureParameters(signature: string): {r: string; s: string; v: number};
export function stripHexPrefix(str: string): string;
export function toNumber(value: number | string | BN): number;
export function toNumber(value: number | string | BN): number | string;

// interfaces
export interface Utils {
Expand All @@ -144,7 +144,7 @@ export interface Utils {
fromUtf8(string: string): string;
fromWei(value: string | BN, unit?: Unit): string;
hexToBytes(hex: Hex): number[];
hexToNumber(hex: Hex): number;
hexToNumber(hex: Hex): number | string;
hexToNumberString(hex: Hex): string;
hexToString(hex: Hex): string;
hexToUtf8(string: string): string;
Expand Down Expand Up @@ -179,7 +179,7 @@ export interface Utils {
testTopic(bloom: string, topic: string): boolean;
getSignatureParameters(signature: string): {r: string; s: string; v: number};
stripHexPrefix(str: string): string;
toNumber(value: number | string | BN): number;
toNumber(value: number | string | BN): number | string;
}

export interface Units {
Expand Down
8 changes: 6 additions & 2 deletions packages/web3-utils/types/tests/hex-to-number-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,14 @@
import BN = require('bn.js');
import {hexToNumber} from 'web3-utils';

// $ExpectType number
// $ExpectType string | number
hexToNumber('232');
// $ExpectType number
// $ExpectType string | number
hexToNumber(232);
// $ExpectType string | number
hexToNumber('0x1fffffffffffff'); // the max safe number 2 ^ 53
// $ExpectType string | number
hexToNumber('0x20000000000000'); // larger than the 2 ^ 53 (unsafe)

// $ExpectError
hexToNumber(new BN(3));
Expand Down
10 changes: 7 additions & 3 deletions packages/web3-utils/types/tests/to-number-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,16 @@
import BN = require('bn.js');
import {toNumber} from 'web3-utils';

// $ExpectType number
// $ExpectType string | number
toNumber('234');
// $ExpectType number
// $ExpectType string | number
toNumber(234);
// $ExpectType number
// $ExpectType string | number
toNumber(new BN(3));
// $ExpectType string | number
toNumber('0x1fffffffffffff'); // the max safe number 2 ^ 53
// $ExpectType string | number
toNumber('0x20000000000000'); // larger than the 2 ^ 53 (unsafe)

// $ExpectError
toNumber(['string']);
Expand Down
21 changes: 11 additions & 10 deletions test/utils.toNumber.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,25 @@ var tests = [
{ value: '-0x1', expected: -1},
{ value: '-15', expected: -15},
{ value: '-0xf', expected: -15},
{ value: '0x657468657265756d', expected: '0x657468657265756d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '0x657468657265756d', expected: '7310582880049395053'},
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639933'},
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-115792089237316195423570985008687907853269984665640564039457584007913129639935'},
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-115792089237316195423570985008687907853269984665640564039457584007913129639933'},
{ value: 0, expected: 0},
{ value: '0', expected: 0},
{ value: '0x0', expected: 0},
{ value: -0, expected: -0},
{ value: '-0', expected: -0},
{ value: '-0x0', expected: -0},
{ value: [1,2,3,{test: 'data'}], expected: '0x5b312c322c332c7b2274657374223a2264617461227d5d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: {test: 'test'}, expected: '0x7b2274657374223a2274657374227d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '{"test": "test"}', expected: '0x7b2274657374223a202274657374227d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: 'myString', expected: '0x6d79537472696e67', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: 'myString 34534!', expected: '0x6d79537472696e6720333435333421', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: [1,2,3,{test: 'data'}], expected: '8734466057720693480455376997372198952121265679558147421'},
{ value: {test: 'test'}, expected: '639351337390720496868710369885168253'},
{ value: '{"test": "test"}', expected: '163673942372024447198222674986970391165'},
{ value: 'myString', expected: '7888427981916958311'},
{ value: 'myString 34534!', expected: '568421141118403315336782784712881185'},
{ value: new BN(15), expected: 15},
{ value: new BigNumber(15), expected: 15},
{ value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: '0x486565c3a4c3b6c3b6c3a4f09f9185443334c99dc9a33234d084cdbd2d2e2cc3a4c3bc2b232f', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: '9217089234592088086444699797948423596835884090143084093263839537376624562728728246738428719'},
{ value: 'Good', expected: 1198485348},
{ value: true, expected: 1},
{ value: false, expected: 0},
];
Expand Down