diff --git a/packages/web3-utils/CHANGELOG.md b/packages/web3-utils/CHANGELOG.md index 35301f35341..70e08ea813f 100644 --- a/packages/web3-utils/CHANGELOG.md +++ b/packages/web3-utils/CHANGELOG.md @@ -199,4 +199,9 @@ Documentation: - replaced our eventEmitter to EventEmitter3 to support react native builds (#6253) -## [Unreleased] \ No newline at end of file +## [Unreleased] + +### Fixed + +- fixed erroneous parsing of big numbers in the `fromWei(...)` function (#6880) + diff --git a/packages/web3-utils/src/converters.ts b/packages/web3-utils/src/converters.ts index 3d005ca3deb..862e9e31d53 100644 --- a/packages/web3-utils/src/converters.ts +++ b/packages/web3-utils/src/converters.ts @@ -411,6 +411,13 @@ export const toHex = ( */ export const toNumber = (value: Numbers): number | bigint => { if (typeof value === 'number') { + if (value > 1e+20) { + // JavaScript converts numbers >= 10^21 to scientific notation when coerced to strings, + // leading to potential parsing errors and incorrect representations. + // For instance, String(10000000000000000000000) yields '1e+22'. + // Using BigInt prevents this + return BigInt(value); + } return value; } diff --git a/packages/web3-utils/test/fixtures/converters.ts b/packages/web3-utils/test/fixtures/converters.ts index 464c196b32d..0161c86cd6d 100644 --- a/packages/web3-utils/test/fixtures/converters.ts +++ b/packages/web3-utils/test/fixtures/converters.ts @@ -279,7 +279,10 @@ const conversionBaseData: [[Numbers, EtherUnits], string][] = [ export const fromWeiValidData: [[Numbers, EtherUnits], string][] = [ ...conversionBaseData, - [['0xff', 'wei'], '255'], + [['0xff', 'wei'], '255'], + [[1e+22, 'ether'], '10000'], + [[19999999999999991611392, 'ether'], '19999.999999999991611392'], + [[1.9999999999999991611392e+22, 'ether'], '19999.999999999991611392'], ]; export const toWeiValidData: [[Numbers, EtherUnits], string][] = [