From 9595ebb712ac1b1325ddac2bfa766ed731c74105 Mon Sep 17 00:00:00 2001 From: Muhammad-Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 25 Nov 2022 12:35:43 +0100 Subject: [PATCH 1/7] fix- isHex and isHexStrict and modify test cases --- packages/web3-validator/src/validation/string.ts | 4 ++-- packages/web3-validator/test/fixtures/validation.ts | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/web3-validator/src/validation/string.ts b/packages/web3-validator/src/validation/string.ts index b932898de9a..e30bec2d854 100644 --- a/packages/web3-validator/src/validation/string.ts +++ b/packages/web3-validator/src/validation/string.ts @@ -23,12 +23,12 @@ import { ValidInputTypes } from '../types'; export const isString = (value: ValidInputTypes) => typeof value === 'string'; export const isHexStrict = (hex: ValidInputTypes) => - typeof hex === 'string' && /^(-)?0x[0-9a-f]*$/i.test(hex); + typeof hex === 'string' && /^(-)?0x[0-9a-f]+$/i.test(hex); export const isHex = (hex: ValidInputTypes): boolean => typeof hex === 'number' || typeof hex === 'bigint' || - (typeof hex === 'string' && /^(-0x|0x)?[0-9a-f]*$/i.test(hex)); + (typeof hex === 'string' && /^(-0x|0x|-)?[0-9a-f]+?$/i.test(hex)); export const isHexString8Bytes = (value: string, prefixed = true) => prefixed ? isHexStrict(value) && value.length === 18 : isHex(value) && value.length === 16; diff --git a/packages/web3-validator/test/fixtures/validation.ts b/packages/web3-validator/test/fixtures/validation.ts index 2e7dd416ca0..2897c389e38 100644 --- a/packages/web3-validator/test/fixtures/validation.ts +++ b/packages/web3-validator/test/fixtures/validation.ts @@ -136,7 +136,10 @@ export const validHexStrictData: any[] = [ export const invalidHexData: any[] = [ 'Heeäööä👅D34ɝɣ24Єͽ', - '-1000', + '', + '-', + '0x', + '-0x', '0xH', 'I have 100£', '\u0000', @@ -152,10 +155,12 @@ export const invalidHexData: any[] = [ export const invalidHexStrictData: any[] = [ ...invalidHexData, '45', + '-45', '', '0', 1, BigInt(12), + BigInt(''), BigInt(-255), -42, 4.2, @@ -164,7 +169,7 @@ export const invalidHexStrictData: any[] = [ export const validHexData: any[] = [ ...validHexStrictData, '45', - '', + '-45', '0', 1, BigInt(12), From e35205823224651a12a2d64d80a05bdbb7dd67b0 Mon Sep 17 00:00:00 2001 From: Muhammad-Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:28:36 +0100 Subject: [PATCH 2/7] accept `0x` for bytes --- packages/web3-validator/src/validation/bytes.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/web3-validator/src/validation/bytes.ts b/packages/web3-validator/src/validation/bytes.ts index 9ba3079beeb..ddce563cc88 100644 --- a/packages/web3-validator/src/validation/bytes.ts +++ b/packages/web3-validator/src/validation/bytes.ts @@ -30,6 +30,10 @@ export const isBytes = ( abiType: 'bytes', }, ) => { + if (value === '0x') { + return true; + } + if ( typeof value !== 'string' && !Buffer.isBuffer(value) && From 1d1a15dbf376641e037592a504841e6e0c396968 Mon Sep 17 00:00:00 2001 From: Muhammad-Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 28 Nov 2022 14:44:52 +0100 Subject: [PATCH 3/7] modify isHexStrict and isHex to accept '' and '0x' --- packages/web3-validator/src/validation/bytes.ts | 4 ---- packages/web3-validator/src/validation/string.ts | 4 ++-- packages/web3-validator/test/fixtures/validation.ts | 7 ++++--- packages/web3-validator/test/unit/utils.test.ts | 4 +++- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/web3-validator/src/validation/bytes.ts b/packages/web3-validator/src/validation/bytes.ts index ddce563cc88..9ba3079beeb 100644 --- a/packages/web3-validator/src/validation/bytes.ts +++ b/packages/web3-validator/src/validation/bytes.ts @@ -30,10 +30,6 @@ export const isBytes = ( abiType: 'bytes', }, ) => { - if (value === '0x') { - return true; - } - if ( typeof value !== 'string' && !Buffer.isBuffer(value) && diff --git a/packages/web3-validator/src/validation/string.ts b/packages/web3-validator/src/validation/string.ts index e30bec2d854..ba5fdc503c3 100644 --- a/packages/web3-validator/src/validation/string.ts +++ b/packages/web3-validator/src/validation/string.ts @@ -23,12 +23,12 @@ import { ValidInputTypes } from '../types'; export const isString = (value: ValidInputTypes) => typeof value === 'string'; export const isHexStrict = (hex: ValidInputTypes) => - typeof hex === 'string' && /^(-)?0x[0-9a-f]+$/i.test(hex); + typeof hex === 'string' && /^((-)?0x[0-9a-f]+|(0x)?)$/i.test(hex); export const isHex = (hex: ValidInputTypes): boolean => typeof hex === 'number' || typeof hex === 'bigint' || - (typeof hex === 'string' && /^(-0x|0x|-)?[0-9a-f]+?$/i.test(hex)); + (typeof hex === 'string' && /^((-0x|0x|-)?[0-9a-f]+|(0x)?)$/i.test(hex)); export const isHexString8Bytes = (value: string, prefixed = true) => prefixed ? isHexStrict(value) && value.length === 18 : isHex(value) && value.length === 16; diff --git a/packages/web3-validator/test/fixtures/validation.ts b/packages/web3-validator/test/fixtures/validation.ts index 2897c389e38..65ef6405932 100644 --- a/packages/web3-validator/test/fixtures/validation.ts +++ b/packages/web3-validator/test/fixtures/validation.ts @@ -132,14 +132,16 @@ export const validHexStrictDataWithNumber: [string, number | bigint][] = [ export const validHexStrictData: any[] = [ ...validHexStrictDataWithNumber.map(tuple => tuple[0]), '-0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + '0x', + '', ]; export const invalidHexData: any[] = [ 'Heeäööä👅D34ɝɣ24Єͽ', - '', '-', - '0x', '-0x', + 'x', + '0x0x', '0xH', 'I have 100£', '\u0000', @@ -156,7 +158,6 @@ export const invalidHexStrictData: any[] = [ ...invalidHexData, '45', '-45', - '', '0', 1, BigInt(12), diff --git a/packages/web3-validator/test/unit/utils.test.ts b/packages/web3-validator/test/unit/utils.test.ts index d25e8e803ea..b85c2444cab 100644 --- a/packages/web3-validator/test/unit/utils.test.ts +++ b/packages/web3-validator/test/unit/utils.test.ts @@ -92,7 +92,9 @@ describe('utils', () => { ); it.each(validHexStrictData)('valid hex strings', input => { - expect(numberToHex(input)).toEqual((input as string).toLowerCase()); + expect(numberToHex(input)).toEqual( + (input === '' ? '0x' : (input as string)).toLowerCase(), + ); }); it.each(validStringNumbersWithHex)('valid string numbers', (input, res) => { From c0eff625c5496add4a74edbed67084e4254b9bd5 Mon Sep 17 00:00:00 2001 From: Muhammad-Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:18:30 +0100 Subject: [PATCH 4/7] allow '' to pass hex check --- packages/web3-validator/src/validation/string.ts | 4 ++-- packages/web3-validator/test/fixtures/validation.ts | 2 +- packages/web3-validator/test/unit/utils.test.ts | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/web3-validator/src/validation/string.ts b/packages/web3-validator/src/validation/string.ts index ba5fdc503c3..eb07993c301 100644 --- a/packages/web3-validator/src/validation/string.ts +++ b/packages/web3-validator/src/validation/string.ts @@ -23,12 +23,12 @@ import { ValidInputTypes } from '../types'; export const isString = (value: ValidInputTypes) => typeof value === 'string'; export const isHexStrict = (hex: ValidInputTypes) => - typeof hex === 'string' && /^((-)?0x[0-9a-f]+|(0x)?)$/i.test(hex); + typeof hex === 'string' && /^((-)?0x[0-9a-f]+|(0x))$/i.test(hex); export const isHex = (hex: ValidInputTypes): boolean => typeof hex === 'number' || typeof hex === 'bigint' || - (typeof hex === 'string' && /^((-0x|0x|-)?[0-9a-f]+|(0x)?)$/i.test(hex)); + (typeof hex === 'string' && /^((-0x|0x|-)?[0-9a-f]+|(0x))$/i.test(hex)); export const isHexString8Bytes = (value: string, prefixed = true) => prefixed ? isHexStrict(value) && value.length === 18 : isHex(value) && value.length === 16; diff --git a/packages/web3-validator/test/fixtures/validation.ts b/packages/web3-validator/test/fixtures/validation.ts index 65ef6405932..d599d5e32d9 100644 --- a/packages/web3-validator/test/fixtures/validation.ts +++ b/packages/web3-validator/test/fixtures/validation.ts @@ -133,11 +133,11 @@ export const validHexStrictData: any[] = [ ...validHexStrictDataWithNumber.map(tuple => tuple[0]), '-0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', '0x', - '', ]; export const invalidHexData: any[] = [ 'Heeäööä👅D34ɝɣ24Єͽ', + '', '-', '-0x', 'x', diff --git a/packages/web3-validator/test/unit/utils.test.ts b/packages/web3-validator/test/unit/utils.test.ts index b85c2444cab..e3b667f905e 100644 --- a/packages/web3-validator/test/unit/utils.test.ts +++ b/packages/web3-validator/test/unit/utils.test.ts @@ -93,7 +93,8 @@ describe('utils', () => { it.each(validHexStrictData)('valid hex strings', input => { expect(numberToHex(input)).toEqual( - (input === '' ? '0x' : (input as string)).toLowerCase(), + // if input is '' then numberToHex would return "0x0" + (input === '' ? '0x0' : (input as string)).toLowerCase(), ); }); From 0dfd5ab091397038602f58baa4bf616a9c723324 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 28 Nov 2022 19:07:46 +0100 Subject: [PATCH 5/7] update CHANGELOG.md for #5373 --- CHANGELOG.md | 4 ++++ packages/web3-validator/CHANGELOG.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c133c7462d..10245617c76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -917,6 +917,10 @@ should use 4.0.1-alpha.0 for testing. - Use Uuid for the response id, to fix the issue "Responses get mixed up due to conflicting payload IDs" (#5373). +#### web3-validator + +- Fix `isHex`returning `false` for `-123`, fix `isHexStrict` returning `true` for `-0x`, and fix `isHex` returning `true` for empty strings `` (#5373). + ### Removed #### web3-eth-accounts diff --git a/packages/web3-validator/CHANGELOG.md b/packages/web3-validator/CHANGELOG.md index 2f9ef019bdb..519e85a0bc1 100644 --- a/packages/web3-validator/CHANGELOG.md +++ b/packages/web3-validator/CHANGELOG.md @@ -42,3 +42,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed direct function `toJSON()` in `Web3ValidatorError` class as its available via base class (#5435) ## [Unreleased] + +### Fixed + +- Fix `isHex`returning `false` for `-123`, fix `isHexStrict` returning `true` for `-0x`, and fix `isHex` returning `true` for empty strings `` (#5373). From 19eb749070d146a2850d23275e3ae2eb0c7889f5 Mon Sep 17 00:00:00 2001 From: Muhammad-Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 5 Dec 2022 11:53:21 +0100 Subject: [PATCH 6/7] add `isHex` and `isHexStrict` changes to the migration guide --- .../web3_utils_migration_guide.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/docs/guides/web3_migration_guide/web3_utils_migration_guide.md b/docs/docs/guides/web3_migration_guide/web3_utils_migration_guide.md index 21d2009b9b8..093eed34f4c 100644 --- a/docs/docs/guides/web3_migration_guide/web3_utils_migration_guide.md +++ b/docs/docs/guides/web3_migration_guide/web3_utils_migration_guide.md @@ -28,3 +28,37 @@ web3.utils.toWei('0.1'); // 4.x web3.utils.toWei('0.1', 'ether'); ``` + +## Validation functions + +Validation functions has been moved to the new package `web3-validator`. Actually, you can still import them from `web3-util`. But they are marked as "deprecated" and you are encouraged to import them from `web3-validator`. + +However, there are changes for the following: + +### `isHex` and `isHexStrict` validation functions + +There is a fix, and some edge-cases-changes for those 2 functions but the overall functionality stayed the same. And here is exactly whet changed: + +#### `isHex` now returns `true` for all negative numbers + +```ts +isHex('-123'); // in 1.x used to return `false`. But changed in 4.x to return `true` +// `true` +``` + +#### `isHex` now returns `false` for an empty string + +```ts +isHex(''); // in 1.x used to return `true`. But changed in 4.x to return `false` +// `false` +``` + +#### `isHex` and `isHexStrict` now returns `false` for `'-0x'` + +```ts +isHex('-0x'); // in 1.x used to return `true`. But changed in 4.x to return `false` +// `false` + +isHexStrict('-0x'); // in 1.x used to return `true`. But changed in 4.x to return `false` +// `false` +``` From b69122b43a5d47d6b34ec747e4cbde68efc14a5a Mon Sep 17 00:00:00 2001 From: Muhammad-Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 5 Dec 2022 11:55:21 +0100 Subject: [PATCH 7/7] add `0X` to the valid hex cases at tests --- packages/web3-validator/test/fixtures/validation.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/web3-validator/test/fixtures/validation.ts b/packages/web3-validator/test/fixtures/validation.ts index d599d5e32d9..39177e59e71 100644 --- a/packages/web3-validator/test/fixtures/validation.ts +++ b/packages/web3-validator/test/fixtures/validation.ts @@ -133,6 +133,7 @@ export const validHexStrictData: any[] = [ ...validHexStrictDataWithNumber.map(tuple => tuple[0]), '-0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', '0x', + '0X', ]; export const invalidHexData: any[] = [