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

Avoid using ** with BigInt #6506

Merged

Conversation

Muhammad-Altabba
Copy link
Contributor

Description

Fixes #6187

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)

Checklist:

  • I have selected the correct base branch.
  • I have performed a self-review of my own code.
  • I have commented my code, particularly in hard-to-understand areas.
  • I have made corresponding changes to the documentation.
  • My changes generate no new warnings.
  • Any dependent changes have been merged and published in downstream modules.
  • I ran npm run lint with success and extended the tests and types if necessary.
  • I ran npm run test:unit with success.
  • I ran npm run test:coverage and my test cases cover all the lines and branches of the added code.
  • I ran npm run build and tested dist/web3.min.js in a browser.
  • I have tested my code on the live network.
  • I have checked the Deploy Preview and it looks correct.
  • I have updated the CHANGELOG.md file in the root folder.
  • I have linked Issue(s) with this PR in "Linked Issues" menu.

@github-actions
Copy link

github-actions bot commented Oct 12, 2023

Bundle Stats

Hey there, this message comes from a github action that helps you and reviewers to understand how these changes affect the size of this project's bundle.

As this PR is updated, I'll keep you updated on how the bundle size is impacted.

Total

Asset Old size New size Diff Diff %
Total 585 KB 586 KB 654 bytes 0.11%
View detailed bundle breakdown

Added

No assets were added

Removed

No assets were removed

Bigger

No assets were bigger

Smaller

No assets were smaller

Unchanged

Asset Old size New size Diff Diff %
web3.min.js 568 KB 568 KB 654 bytes 0.11%
../lib/commonjs/index.d.ts 8.56 KB 8.56 KB 0 0.00%
../lib/commonjs/accounts.d.ts 3.67 KB 3.67 KB 0 0.00%
../lib/commonjs/types.d.ts 2.45 KB 2.45 KB 0 0.00%
../lib/commonjs/web3.d.ts 1.14 KB 1.14 KB 0 0.00%
../lib/commonjs/abi.d.ts 1000 bytes 1000 bytes 0 0.00%
../lib/commonjs/eth.exports.d.ts 280 bytes 280 bytes 0 0.00%
../lib/commonjs/providers.exports.d.ts 148 bytes 148 bytes 0 0.00%
../lib/commonjs/version.d.ts 60 bytes 60 bytes 0 0.00%

@cloudflare-pages
Copy link

cloudflare-pages bot commented Oct 12, 2023

Deploying with  Cloudflare Pages  Cloudflare Pages

Latest commit: 628cacf
Status: ✅  Deploy successful!
Preview URL: https://5462bbbd.web3-js-docs.pages.dev
Branch Preview URL: https://6187-typeerror-cannot-conver.web3-js-docs.pages.dev

View logs

@codecov
Copy link

codecov bot commented Oct 12, 2023

Codecov Report

Merging #6506 (628cacf) into 4.x (e760667) will increase coverage by 0.00%.
The diff coverage is 100.00%.

Additional details and impacted files
@@           Coverage Diff           @@
##              4.x    #6506   +/-   ##
=======================================
  Coverage   89.65%   89.66%           
=======================================
  Files         213      214    +1     
  Lines        8200     8206    +6     
  Branches     2220     2220           
=======================================
+ Hits         7352     7358    +6     
  Misses        848      848           
Flag Coverage Δ
UnitTests 89.66% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
web3 ∅ <ø> (∅)
web3-core ∅ <ø> (∅)
web3-errors ∅ <ø> (∅)
web3-eth ∅ <ø> (∅)
web3-eth-abi ∅ <ø> (∅)
web3-eth-accounts ∅ <ø> (∅)
web3-eth-contract ∅ <ø> (∅)
web3-eth-ens ∅ <ø> (∅)
web3-eth-iban ∅ <ø> (∅)
web3-eth-personal ∅ <ø> (∅)
web3-net ∅ <ø> (∅)
web3-providers-http ∅ <ø> (∅)
web3-providers-ipc ∅ <ø> (∅)
web3-providers-ws ∅ <ø> (∅)
web3-rpc-methods ∅ <ø> (∅)
web3-utils ∅ <ø> (∅)
web3-validator ∅ <ø> (∅)

Comment on lines 35 to 47
export const numberLimits: Map<string, { min: bigint; max: bigint }> = new Map([
[
'uint8',
{
min: BigInt('0'),
max: BigInt('255'),
},
],
[
'int8',
{
min: BigInt('-128'),
max: BigInt('127'),
Copy link
Contributor

Choose a reason for hiding this comment

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

Instead of adding this large file , why not to use function that you added bigintPower in existing Map code .

const numberLimits = new Map<string, { min: bigint; max: bigint }>();

// precalculate all the limits
for (let i = 8; i <= 256; i += 8) {
	numberLimits.set(`uint${i}`, {
		min: BigInt(0),
		max: BigInt(2) ** BigInt(i) - BigInt(1),
	});
	numberLimits.set(`int${i}`, {
		min: -(BigInt(2) ** BigInt(i - 1)),
		max: BigInt(2) ** BigInt(i - 1) - BigInt(1),
	});
}

and see to save some lib size: as in this PR its

Total | 585 KB | 592 KB | 6.96 KB | 1.19%

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I though about reducing the execution time. But, sorry, I did not notice the size. I will modify to use the added bigintPower.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I changed it to use a loop with multiplication instead of power.

for (let i = 8; i <= 256; i += 8) {
numberLimits.set(`uint${i}`, {
min: BigInt(0),
max: BigInt(2) ** BigInt(i) - BigInt(1),
Copy link
Contributor

Choose a reason for hiding this comment

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

Exponentiation Operator usage issue was solved by specifying min browser versions in one of issue?
Its supported in ECMAScript 2016 and

Chrome 52 | Edge 14 | Firefox 52 | Safari 10.1 | Opera 39
Jul 2016 | Aug 2016 | Mar 2017 | Mar 2017 | Aug 2016

so react with older browsers is causing this problem only, and if some one specify min browsers list in react config and use on ECMAScript 2016 supporting browser there is no issue?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Unfortunately, the issue is present with the latest as well as any older version of React . And any other framework that uses babel (the latest version of babel and any older version as well).

And this is what happens:

  1. When building React app (to generate the build folder to be used for deployment), babel is used to tans-compile the code.
  2. Babel will convert every ** to Math.pow.
  3. When browsing the page, an exception will be thrown because Math.pow does not work with BigInt.

Currently, the only way to avoid this behavior is to add configuration to package.json as mentioned in: babel/babel#13109 (comment) and applied in #6187 (comment)

And this MR propose changes so the users do not need to add configurations to their package.json.

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 is better to have our own bigint pow function right now. and wait while Babel starts supporting it

Copy link
Contributor

@avkos avkos left a comment

Choose a reason for hiding this comment

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

Thanks for this fix

Copy link
Contributor

@jdevcs jdevcs left a comment

Choose a reason for hiding this comment

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

ok, Good, Thanks

@Muhammad-Altabba Muhammad-Altabba merged commit 42502b6 into 4.x Oct 16, 2023
62 of 65 checks passed
@Muhammad-Altabba Muhammad-Altabba deleted the 6187-typeerror-cannot-convert-a-bigint-value-to-a-number branch October 16, 2023 10:56
@jdevcs jdevcs mentioned this pull request Oct 18, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

TypeError: Cannot convert a BigInt value to a number
3 participants