Skip to content

Commit

Permalink
Merge branch '4.x' into 6393-web3validatorerror-error-value-at-0-must…
Browse files Browse the repository at this point in the history
…-pass-bytes-validation
  • Loading branch information
Muhammad-Altabba authored Oct 16, 2023
2 parents d110b4c + 42502b6 commit ae588a4
Show file tree
Hide file tree
Showing 17 changed files with 144 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ await web3.eth.getFeeHistory('0x1', 'latest', []);

#### sending

- In 1.x, the event listener would receive a `payload` object as an argument. In 4.x, just the sent transaction object is recieved
- In 1.x, the event listener would receive a `payload` object as an argument. In 4.x, just the sent transaction object is received

```typescript
// in 1.x
Expand Down Expand Up @@ -211,7 +211,7 @@ web3.eth.sendTransaction({ ... }).on('sending', (sendTransactionObject) => { ...

#### sent

- In 1.x, the event listener would receive a `payload` object as an argument. In 4.x just the sent transaction object is recieved
- In 1.x, the event listener would receive a `payload` object as an argument. In 4.x just the sent transaction object is received

```typescript
// in 1.x
Expand Down
2 changes: 1 addition & 1 deletion docs/src/theme/SearchBar/algolia.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
.algolia-docsearch-suggestion--highlight {
color: #3a33d1;
}
/* Highligted search terms in the main category headers */
/* Highlighted search terms in the main category headers */
.algolia-docsearch-suggestion--category-header
.algolia-docsearch-suggestion--highlight {
background-color: #4d47d5;
Expand Down
6 changes: 5 additions & 1 deletion packages/web3-eth-abi/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,8 @@ Documentation:

- Dependencies updated

## [Unreleased]
## [Unreleased]

### Fixed

- Fix issue with default config with babel (and React): "TypeError: Cannot convert a BigInt value to a number #6187" (#6506)
20 changes: 1 addition & 19 deletions packages/web3-eth-abi/src/coders/base/number.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { padLeft, toBigInt } from 'web3-utils';
import { utils } from 'web3-validator';
import { DecoderResult, EncoderResult } from '../types.js';
import { WORD_SIZE } from '../utils.js';
import { numberLimits } from './numbersLimits.js';

// eslint-disable-next-line no-bitwise
const mask = BigInt(1) << BigInt(256);
Expand All @@ -43,25 +44,6 @@ function uint8ArrayToBigInt(value: Uint8Array, max: bigint): bigint {
return result - mask;
}

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),
});
}

// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
numberLimits.set(`int`, numberLimits.get('int256')!);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
numberLimits.set(`uint`, numberLimits.get('uint256')!);

export function encodeNumber(param: AbiParameter, input: unknown): EncoderResult {
let value;
try {
Expand Down
39 changes: 39 additions & 0 deletions packages/web3-eth-abi/src/coders/base/numbersLimits.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
This file is part of web3.js.
web3.js is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
web3.js is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
*/

/*
* this variable contains the precalculated limits for all the numbers for uint and int types
*/
export const numberLimits = new Map<string, { min: bigint; max: bigint }>();

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

// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
numberLimits.set(`int`, numberLimits.get('int256')!);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
numberLimits.set(`uint`, numberLimits.get('uint256')!);
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ along with web3.js. If not, see <http://www.gnu.org/licenses/>.
import Web3 from 'web3';
// eslint-disable-next-line import/no-extraneous-dependencies
import { Web3Account } from 'web3-eth-accounts';
import { EventLog } from 'web3-types';
import { Contract } from '../../../src';
import { ERC721TokenAbi, ERC721TokenBytecode } from '../../shared_fixtures/build/ERC721Token';
import { getSystemTestProvider, createLocalAccount } from '../../fixtures/system_test_utils';
Expand Down Expand Up @@ -80,8 +79,7 @@ describe('contract', () => {
tempAccount.address.toLowerCase(),
);

const logs = await contractDeployed.getPastEvents('Transfer');
const tokenId = (logs[0] as EventLog)?.returnValues?.tokenId as string;
const tokenId = awardReceipt.events?.Transfer.returnValues?.tokenId as string;

expect(
toUpperCaseHex(
Expand Down Expand Up @@ -113,8 +111,7 @@ describe('contract', () => {
tempAccount.address.toLowerCase(),
);

const logs = await contractDeployed.getPastEvents('Transfer');
const tokenId = (logs[0] as EventLog)?.returnValues?.tokenId as string;
const tokenId = awardReceipt.events?.Transfer.returnValues?.tokenId as string;
const transferFromReceipt = await contractDeployed.methods
.transferFrom(tempAccount.address, toAccount.address, tokenId)
.send({
Expand Down Expand Up @@ -186,8 +183,7 @@ describe('contract', () => {
tempAccount.address.toLowerCase(),
);

const logs = await contractDeployed.getPastEvents('Transfer');
const tokenId = (logs[0] as EventLog)?.returnValues?.tokenId as string;
const tokenId = awardReceipt.events?.Transfer.returnValues?.tokenId as string;

const approveReceipt = await contractDeployed.methods
.approve(toAccount.address, tokenId)
Expand Down
1 change: 1 addition & 0 deletions packages/web3-eth/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ Documentation:
### Fixed

- Ensure provider.supportsSubscriptions exists before watching by subscription (#6440)
- Fixed param sent to `checkRevertBeforeSending` in `sendSignedTransaction`

### Added

Expand Down
5 changes: 4 additions & 1 deletion packages/web3-eth/src/rpc_method_wrappers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -627,8 +627,11 @@ export function sendSignedTransaction<
};

try {
const { v , r , s,
...txWithoutSigParams} = unSerializedTransactionWithFrom;

await sendTxHelper.checkRevertBeforeSending(
unSerializedTransactionWithFrom as TransactionCall,
txWithoutSigParams as TransactionCall,
);

sendTxHelper.emitSending(signedTransactionFormattedHex);
Expand Down
2 changes: 1 addition & 1 deletion packages/web3-eth/test/e2e/e2e_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { getSystemTestBackend } from '../fixtures/system_test_utils';
import secrets from '../../../../.secrets.json';

export const getSystemE2ETestProvider = (): string => {
if (process.env.WEB3_SYTEM_TEST_MODE === 'http') {
if (process.env.WEB3_SYSTEM_TEST_MODE === 'http') {
return getSystemTestBackend() === 'sepolia'
? process.env.INFURA_SEPOLIA_HTTP ?? secrets.SEPOLIA.HTTP
: process.env.INFURA_MAINNET_HTTP ?? secrets.MAINNET.HTTP;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
testData,
} from './fixtures/send_signed_transaction';
import { transactionReceiptSchema } from '../../../src/schemas';
import { SendTxHelper } from '../../../src/utils/send_tx_helper';

jest.mock('web3-rpc-methods');
jest.mock('../../../src/utils/wait_for_transaction_receipt');
Expand All @@ -45,6 +46,42 @@ describe('sendTransaction', () => {

afterEach(() => jest.resetAllMocks());

it.each(testData)(
`should remove signature part in transaction before checkRevertBeforeSending`,
async (_, inputSignedTransaction) => {
(
WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock
).mockResolvedValueOnce(expectedTransactionReceipt);

const checkRevertBeforeSendingSpy = jest.fn().mockImplementation((transaction) => {
expect(transaction).toBeDefined();

// verify signature part is removed before sending to revert check function
expect(transaction).not.toHaveProperty('v');
expect(transaction).not.toHaveProperty('r');
expect(transaction).not.toHaveProperty('s');
});

SendTxHelper.prototype.checkRevertBeforeSending = checkRevertBeforeSendingSpy;

const inputSignedTransactionFormatted = format(
{ format: 'bytes' },
inputSignedTransaction,
DEFAULT_RETURN_FORMAT,
);
await sendSignedTransaction(web3Context, inputSignedTransaction, DEFAULT_RETURN_FORMAT);

// verify original tx params are intact
expect(ethRpcMethods.sendRawTransaction).toHaveBeenCalledWith(
web3Context.requestManager,
inputSignedTransactionFormatted,
);

expect(checkRevertBeforeSendingSpy).toHaveBeenCalledTimes(1);

},
);

it.each(testData)(
`sending event should emit with inputSignedTransaction\n ${testMessage}`,
async (_, inputSignedTransaction) => {
Expand Down
3 changes: 2 additions & 1 deletion packages/web3-utils/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,4 +162,5 @@ Documentation:

### Added

- As a replacment of the node EventEmitter, a custom `EventEmitter` has been implemented and exported. (#6398)
- As a replacement of the node EventEmitter, a custom `EventEmitter` has been implemented and exported. (#6398)
- Fix issue with default config with babel (and React): "TypeError: Cannot convert a BigInt value to a number #6187" (#6506)
56 changes: 27 additions & 29 deletions packages/web3-utils/src/converters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,39 +39,37 @@ import {
} from 'web3-errors';
import { ensureIfUint8Array, isUint8Array } from './uint8array.js';

const base = BigInt(10);
const expo10 = (expo: number) => base ** BigInt(expo);

// Ref: https://ethdocs.org/en/latest/ether.html
// Note: this could be simplified using ** operator, but babel does not handle it well (https://github.com/babel/babel/issues/13109)
/** @internal */
export const ethUnitMap = {
noether: BigInt('0'),
noether: BigInt(0),
wei: BigInt(1),
kwei: expo10(3),
Kwei: expo10(3),
babbage: expo10(3),
femtoether: expo10(3),
mwei: expo10(6),
Mwei: expo10(6),
lovelace: expo10(6),
picoether: expo10(6),
gwei: expo10(9),
Gwei: expo10(9),
shannon: expo10(9),
nanoether: expo10(9),
nano: expo10(9),
szabo: expo10(12),
microether: expo10(12),
micro: expo10(12),
finney: expo10(15),
milliether: expo10(15),
milli: expo10(15),
ether: expo10(18),
kether: expo10(21),
grand: expo10(21),
mether: expo10(24),
gether: expo10(27),
tether: expo10(30),
kwei: BigInt(1000),
Kwei: BigInt(1000),
babbage: BigInt(1000),
femtoether: BigInt(1000),
mwei: BigInt(1000000),
Mwei: BigInt(1000000),
lovelace: BigInt(1000000),
picoether: BigInt(1000000),
gwei: BigInt(1000000000),
Gwei: BigInt(1000000000),
shannon: BigInt(1000000000),
nanoether: BigInt(1000000000),
nano: BigInt(1000000000),
szabo: BigInt(1000000000000),
microether: BigInt(1000000000000),
micro: BigInt(1000000000000),
finney: BigInt(1000000000000000),
milliether: BigInt(1000000000000000),
milli: BigInt(1000000000000000),
ether: BigInt('1000000000000000000'),
kether: BigInt('1000000000000000000000'),
grand: BigInt('1000000000000000000000'),
mether: BigInt('1000000000000000000000000'),
gether: BigInt('1000000000000000000000000000'),
tether: BigInt('1000000000000000000000000000000'),
};

export type EtherUnits = keyof typeof ethUnitMap;
Expand Down
6 changes: 3 additions & 3 deletions packages/web3-utils/src/string_manipulation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ along with web3.js. If not, see <http://www.gnu.org/licenses/>.

import { Numbers } from 'web3-types';
import { NibbleWidthError } from 'web3-errors';
import { isHexStrict, validator, utils as validatorUtils } from 'web3-validator';
import { isHexStrict, validator, utils as validatorUtils, bigintPower } from 'web3-validator';
import { numberToHex, toHex, toNumber } from './converters.js';

/**
Expand Down Expand Up @@ -115,7 +115,7 @@ export const toTwosComplement = (value: Numbers, nibbleWidth = 64): string => {

if (val >= 0) return padLeft(toHex(val), nibbleWidth);

const largestBit = BigInt(2) ** BigInt(nibbleWidth * 4);
const largestBit = bigintPower(BigInt(2), BigInt(nibbleWidth * 4));
if (-val >= largestBit) {
throw new NibbleWidthError(`value: ${value}, nibbleWidth: ${nibbleWidth}`);
}
Expand Down Expand Up @@ -156,7 +156,7 @@ export const fromTwosComplement = (value: Numbers, nibbleWidth = 64): number | b
// check the largest bit to see if negative
if (nibbleWidth * 4 !== largestBit) return val;

const complement = BigInt(2) ** (BigInt(nibbleWidth) * BigInt(4));
const complement = bigintPower(BigInt(2), BigInt(nibbleWidth) * BigInt(4));

return toNumber(BigInt(val) - complement);
};
3 changes: 2 additions & 1 deletion packages/web3-validator/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,5 @@ Documentation:

## Fixed

- Multi-dimensional arrays are now handled properly when parsing ABIs
- Multi-dimensional arrays are now handled properly when parsing ABIs (#6435)
- Fix issue with default config with babel (and React): "TypeError: Cannot convert a BigInt value to a number #6187" (#6506)
17 changes: 14 additions & 3 deletions packages/web3-validator/src/validation/numbers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,17 @@ import { isHexStrict } from './string.js';
*/
export const isBigInt = (value: ValidInputTypes): boolean => typeof value === 'bigint';

// Note: this could be simplified using ** operator, but babel does not handle it well
// you can find more at: https://github.com/babel/babel/issues/13109 and https://github.com/web3/web3.js/issues/6187
/** @internal */
export const bigintPower = (base: bigint, expo: bigint) => {
let res = base;
for (let index = 1; index < expo; index += 1) {
res *= base;
}
return res;
};

export const isUInt = (
value: ValidInputTypes,
options: { abiType: string; bitSize?: never } | { bitSize: number; abiType?: never } = {
Expand All @@ -49,7 +60,7 @@ export const isUInt = (
size = options.bitSize;
}

const maxSize = BigInt(2) ** BigInt(size ?? 256) - BigInt(1);
const maxSize = bigintPower(BigInt(2), BigInt(size ?? 256)) - BigInt(1);

try {
const valueToCheck =
Expand Down Expand Up @@ -94,8 +105,8 @@ export const isInt = (
size = options.bitSize;
}

const maxSize = BigInt(2) ** BigInt((size ?? 256) - 1);
const minSize = BigInt(-1) * BigInt(2) ** BigInt((size ?? 256) - 1);
const maxSize = bigintPower(BigInt(2), BigInt((size ?? 256) - 1));
const minSize = BigInt(-1) * bigintPower(BigInt(2), BigInt((size ?? 256) - 1));

try {
const valueToCheck =
Expand Down
2 changes: 1 addition & 1 deletion packages/web3/test/e2e/e2e_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { getSystemTestBackend } from '../shared_fixtures/system_tests_utils';
import secrets from '../../../../.secrets.json';

export const getSystemE2ETestProvider = (): string => {
if (process.env.WEB3_SYTEM_TEST_MODE === 'http') {
if (process.env.WEB3_SYSTEM_TEST_MODE === 'http') {
return getSystemTestBackend() === 'sepolia'
? process.env.INFURA_SEPOLIA_HTTP ?? secrets.SEPOLIA.HTTP
: process.env.INFURA_MAINNET_HTTP ?? secrets.MAINNET.HTTP;
Expand Down
2 changes: 1 addition & 1 deletion scripts/test-runner.sh
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ fi
echo "Node software used for tests: " $BACKEND
echo "Node running on: " "$MODE://127.0.0.1:$WEB3_SYSTEM_TEST_PORT"

export WEB3_SYTEM_TEST_MODE=$MODE
export WEB3_SYSTEM_TEST_MODE=$MODE
export WEB3_SYSTEM_TEST_PROVIDER="$MODE://127.0.0.1:$WEB3_SYSTEM_TEST_PORT"
export WEB3_SYSTEM_TEST_BACKEND=$BACKEND
export WEB3_SYSTEM_TEST_ENGINE=$ENGINE
Expand Down

0 comments on commit ae588a4

Please sign in to comment.