From 2395401a2b7caa60ea8d772d4591e281891a3b93 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 8 Jul 2020 16:24:13 +0200 Subject: [PATCH] Raw/Bytes isUtf8 & assert in toUtf8 (#2414) --- CHANGELOG.md | 2 +- packages/api-contract/package.json | 2 +- packages/api-derive/package.json | 6 +-- packages/api/package.json | 8 ++-- packages/metadata/package.json | 6 +-- packages/rpc-core/package.json | 4 +- packages/rpc-provider/package.json | 6 +-- packages/typegen/package.json | 2 +- packages/types-known/package.json | 2 +- packages/types/package.json | 6 +-- packages/types/src/codec/Raw.spec.ts | 6 +++ packages/types/src/codec/Raw.ts | 11 ++++- yarn.lock | 70 ++++++++++++++-------------- 13 files changed, 73 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffa11c623b..22daafb58e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 1.24.0-beta.x -- Added `isAscii` getter to `Bytes` & `Raw` types +- Added `isAscii` & `isUtf8` getters to `Bytes` & `Raw` types - Added `toUtf8()` helper to `Bytes` & `Raw` types - `@polkadot/util` 2.18 diff --git a/packages/api-contract/package.json b/packages/api-contract/package.json index ef4a96bba5..e3c953bfbc 100644 --- a/packages/api-contract/package.json +++ b/packages/api-contract/package.json @@ -30,7 +30,7 @@ "@polkadot/api": "1.24.0-beta.0", "@polkadot/rpc-core": "1.24.0-beta.0", "@polkadot/types": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", "bn.js": "^5.1.2", "rxjs": "^6.6.0" } diff --git a/packages/api-derive/package.json b/packages/api-derive/package.json index 62abdeb35b..cb89d6d902 100644 --- a/packages/api-derive/package.json +++ b/packages/api-derive/package.json @@ -32,13 +32,13 @@ "@polkadot/rpc-core": "1.24.0-beta.0", "@polkadot/rpc-provider": "1.24.0-beta.0", "@polkadot/types": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", - "@polkadot/util-crypto": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", + "@polkadot/util-crypto": "^2.18.0-beta.2", "bn.js": "^5.1.2", "memoizee": "^0.4.14", "rxjs": "^6.6.0" }, "devDependencies": { - "@polkadot/keyring": "^2.18.0-beta.1" + "@polkadot/keyring": "^2.18.0-beta.2" } } diff --git a/packages/api/package.json b/packages/api/package.json index 63bd307c70..c3ccaf67f7 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -28,19 +28,19 @@ "dependencies": { "@babel/runtime": "^7.10.4", "@polkadot/api-derive": "1.24.0-beta.0", - "@polkadot/keyring": "^2.18.0-beta.1", + "@polkadot/keyring": "^2.18.0-beta.2", "@polkadot/metadata": "1.24.0-beta.0", "@polkadot/rpc-core": "1.24.0-beta.0", "@polkadot/rpc-provider": "1.24.0-beta.0", "@polkadot/types": "1.24.0-beta.0", "@polkadot/types-known": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", - "@polkadot/util-crypto": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", + "@polkadot/util-crypto": "^2.18.0-beta.2", "bn.js": "^5.1.2", "eventemitter3": "^4.0.4", "rxjs": "^6.6.0" }, "devDependencies": { - "@polkadot/keyring": "^2.18.0-beta.1" + "@polkadot/keyring": "^2.18.0-beta.2" } } diff --git a/packages/metadata/package.json b/packages/metadata/package.json index aed79a4792..b8d587fade 100644 --- a/packages/metadata/package.json +++ b/packages/metadata/package.json @@ -29,11 +29,11 @@ "@babel/runtime": "^7.10.4", "@polkadot/types": "1.24.0-beta.0", "@polkadot/types-known": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", - "@polkadot/util-crypto": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", + "@polkadot/util-crypto": "^2.18.0-beta.2", "bn.js": "^5.1.2" }, "devDependencies": { - "@polkadot/keyring": "^2.18.0-beta.1" + "@polkadot/keyring": "^2.18.0-beta.2" } } diff --git a/packages/rpc-core/package.json b/packages/rpc-core/package.json index c48a8ba22d..57c9193315 100644 --- a/packages/rpc-core/package.json +++ b/packages/rpc-core/package.json @@ -30,11 +30,11 @@ "@polkadot/metadata": "1.24.0-beta.0", "@polkadot/rpc-provider": "1.24.0-beta.0", "@polkadot/types": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", "memoizee": "^0.4.14", "rxjs": "^6.6.0" }, "devDependencies": { - "@polkadot/keyring": "^2.18.0-beta.1" + "@polkadot/keyring": "^2.18.0-beta.2" } } diff --git a/packages/rpc-provider/package.json b/packages/rpc-provider/package.json index ab7612fc5e..d2e673b07e 100644 --- a/packages/rpc-provider/package.json +++ b/packages/rpc-provider/package.json @@ -29,15 +29,15 @@ "@babel/runtime": "^7.10.4", "@polkadot/metadata": "1.24.0-beta.0", "@polkadot/types": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", - "@polkadot/util-crypto": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", + "@polkadot/util-crypto": "^2.18.0-beta.2", "bn.js": "^5.1.2", "eventemitter3": "^4.0.4", "isomorphic-fetch": "^2.2.1", "websocket": "^1.0.31" }, "devDependencies": { - "@polkadot/keyring": "^2.18.0-beta.1", + "@polkadot/keyring": "^2.18.0-beta.2", "mock-socket": "^9.0.3", "nock": "^13.0.2" } diff --git a/packages/typegen/package.json b/packages/typegen/package.json index 2bdbe50971..188429fa24 100644 --- a/packages/typegen/package.json +++ b/packages/typegen/package.json @@ -40,7 +40,7 @@ "@polkadot/metadata": "1.24.0-beta.0", "@polkadot/rpc-provider": "1.24.0-beta.0", "@polkadot/types": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", "handlebars": "^4.7.6", "websocket": "^1.0.31", "yargs": "^15.4.0" diff --git a/packages/types-known/package.json b/packages/types-known/package.json index 9c9eab2b5c..49e095b9c4 100644 --- a/packages/types-known/package.json +++ b/packages/types-known/package.json @@ -28,7 +28,7 @@ "dependencies": { "@babel/runtime": "^7.10.4", "@polkadot/types": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", "bn.js": "^5.1.2" }, "devDependencies": { diff --git a/packages/types/package.json b/packages/types/package.json index 9a7b817a0b..e7fc75bb58 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -28,15 +28,15 @@ "dependencies": { "@babel/runtime": "^7.10.4", "@polkadot/metadata": "1.24.0-beta.0", - "@polkadot/util": "^2.18.0-beta.1", - "@polkadot/util-crypto": "^2.18.0-beta.1", + "@polkadot/util": "^2.18.0-beta.2", + "@polkadot/util-crypto": "^2.18.0-beta.2", "@types/bn.js": "^4.11.6", "bn.js": "^5.1.2", "memoizee": "^0.4.14", "rxjs": "^6.6.0" }, "devDependencies": { - "@polkadot/keyring": "^2.18.0-beta.1", + "@polkadot/keyring": "^2.18.0-beta.2", "@types/memoizee": "^0.4.4" } } diff --git a/packages/types/src/codec/Raw.spec.ts b/packages/types/src/codec/Raw.spec.ts index b69c3ce3a8..0a81d25466 100644 --- a/packages/types/src/codec/Raw.spec.ts +++ b/packages/types/src/codec/Raw.spec.ts @@ -84,5 +84,11 @@ describe('Raw', (): void => { expect(new Raw(registry, 'Приветствую, ми').toUtf8()).toEqual('Приветствую, ми'); expect(new Raw(registry, '0xe4bda0e5a5bd').toUtf8()).toEqual('你好'); }); + + it('throws on invalid utf8', (): void => { + expect( + () => new Raw(registry, '0x7f07b1f87709608bee603bbc79a0dfc29cd315c1351a83aa31adf7458d7d3003').toUtf8() + ).toThrow(/The character sequence is not a valid Utf8 string/); + }); }); }); diff --git a/packages/types/src/codec/Raw.ts b/packages/types/src/codec/Raw.ts index 59d1f05cc8..4ff56ce79a 100644 --- a/packages/types/src/codec/Raw.ts +++ b/packages/types/src/codec/Raw.ts @@ -5,7 +5,7 @@ import { H256 } from '../interfaces/runtime'; import { AnyJson, AnyU8a, IU8a, Registry } from '../types'; -import { isAscii, isU8a, isUndefined, u8aToHex, u8aToString, u8aToU8a } from '@polkadot/util'; +import { assert, isAscii, isU8a, isUndefined, isUtf8, u8aToHex, u8aToString, u8aToU8a } from '@polkadot/util'; import { blake2AsU8a } from '@polkadot/util-crypto'; /** @internal */ @@ -63,6 +63,13 @@ export default class Raw extends Uint8Array implements IU8a { return !this.length || isUndefined(this.find((value) => !!value)); } + /** + * @description Returns true if the wrapped value contains only utf8 characters + */ + public get isUtf8 (): boolean { + return isUtf8(this); + } + /** * @description The length of the value */ @@ -147,6 +154,8 @@ export default class Raw extends Uint8Array implements IU8a { * @description Returns the wrapped data as a UTF-8 string */ public toUtf8 (): string { + assert(this.isUtf8, 'The character sequence is not a valid Utf8 string'); + return u8aToString(this); } } diff --git a/yarn.lock b/yarn.lock index 9b3df46dc3..709264d3bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2672,7 +2672,7 @@ __metadata: "@polkadot/api": 1.24.0-beta.0 "@polkadot/rpc-core": 1.24.0-beta.0 "@polkadot/types": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 bn.js: ^5.1.2 rxjs: ^6.6.0 languageName: unknown @@ -2684,12 +2684,12 @@ __metadata: dependencies: "@babel/runtime": ^7.10.4 "@polkadot/api": 1.24.0-beta.0 - "@polkadot/keyring": ^2.18.0-beta.1 + "@polkadot/keyring": ^2.18.0-beta.2 "@polkadot/rpc-core": 1.24.0-beta.0 "@polkadot/rpc-provider": 1.24.0-beta.0 "@polkadot/types": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 - "@polkadot/util-crypto": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 + "@polkadot/util-crypto": ^2.18.0-beta.2 bn.js: ^5.1.2 memoizee: ^0.4.14 rxjs: ^6.6.0 @@ -2702,14 +2702,14 @@ __metadata: dependencies: "@babel/runtime": ^7.10.4 "@polkadot/api-derive": 1.24.0-beta.0 - "@polkadot/keyring": ^2.18.0-beta.1 + "@polkadot/keyring": ^2.18.0-beta.2 "@polkadot/metadata": 1.24.0-beta.0 "@polkadot/rpc-core": 1.24.0-beta.0 "@polkadot/rpc-provider": 1.24.0-beta.0 "@polkadot/types": 1.24.0-beta.0 "@polkadot/types-known": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 - "@polkadot/util-crypto": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 + "@polkadot/util-crypto": ^2.18.0-beta.2 bn.js: ^5.1.2 eventemitter3: ^4.0.4 rxjs: ^6.6.0 @@ -2805,14 +2805,14 @@ __metadata: languageName: node linkType: hard -"@polkadot/keyring@npm:^2.18.0-beta.1": - version: 2.18.0-beta.1 - resolution: "@polkadot/keyring@npm:2.18.0-beta.1" +"@polkadot/keyring@npm:^2.18.0-beta.2": + version: 2.18.0-beta.2 + resolution: "@polkadot/keyring@npm:2.18.0-beta.2" dependencies: "@babel/runtime": ^7.10.4 - "@polkadot/util": 2.18.0-beta.1 - "@polkadot/util-crypto": 2.18.0-beta.1 - checksum: 3/0711442b7d6169a4bb87adbc48b24519d99385de9680a9ff2e0179b6ec8e9cf874ff2d243b7e22d7b17e63285b913c91b2cb1f4e1e074af4bee2b3a633cbc46a + "@polkadot/util": 2.18.0-beta.2 + "@polkadot/util-crypto": 2.18.0-beta.2 + checksum: 3/ada1c1e6450f8194e9f02d7161286b31e7b2a0dc98aa20c1360aff3a09c12cb48aba7f4be558e1c67acdb118b62471ba746f2cff1e990f70470a8819b0b0c333 languageName: node linkType: hard @@ -2821,11 +2821,11 @@ __metadata: resolution: "@polkadot/metadata@workspace:packages/metadata" dependencies: "@babel/runtime": ^7.10.4 - "@polkadot/keyring": ^2.18.0-beta.1 + "@polkadot/keyring": ^2.18.0-beta.2 "@polkadot/types": 1.24.0-beta.0 "@polkadot/types-known": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 - "@polkadot/util-crypto": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 + "@polkadot/util-crypto": ^2.18.0-beta.2 bn.js: ^5.1.2 languageName: unknown linkType: soft @@ -2835,11 +2835,11 @@ __metadata: resolution: "@polkadot/rpc-core@workspace:packages/rpc-core" dependencies: "@babel/runtime": ^7.10.4 - "@polkadot/keyring": ^2.18.0-beta.1 + "@polkadot/keyring": ^2.18.0-beta.2 "@polkadot/metadata": 1.24.0-beta.0 "@polkadot/rpc-provider": 1.24.0-beta.0 "@polkadot/types": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 memoizee: ^0.4.14 rxjs: ^6.6.0 languageName: unknown @@ -2850,11 +2850,11 @@ __metadata: resolution: "@polkadot/rpc-provider@workspace:packages/rpc-provider" dependencies: "@babel/runtime": ^7.10.4 - "@polkadot/keyring": ^2.18.0-beta.1 + "@polkadot/keyring": ^2.18.0-beta.2 "@polkadot/metadata": 1.24.0-beta.0 "@polkadot/types": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 - "@polkadot/util-crypto": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 + "@polkadot/util-crypto": ^2.18.0-beta.2 bn.js: ^5.1.2 eventemitter3: ^4.0.4 isomorphic-fetch: ^2.2.1 @@ -2884,7 +2884,7 @@ __metadata: "@polkadot/metadata": 1.24.0-beta.0 "@polkadot/rpc-provider": 1.24.0-beta.0 "@polkadot/types": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 "@types/websocket": ^1.0.1 "@types/yargs": ^15.0.5 handlebars: ^4.7.6 @@ -2905,7 +2905,7 @@ __metadata: dependencies: "@babel/runtime": ^7.10.4 "@polkadot/types": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 "@types/bn.js": ^4.11.6 bn.js: ^5.1.2 languageName: unknown @@ -2916,10 +2916,10 @@ __metadata: resolution: "@polkadot/types@workspace:packages/types" dependencies: "@babel/runtime": ^7.10.4 - "@polkadot/keyring": ^2.18.0-beta.1 + "@polkadot/keyring": ^2.18.0-beta.2 "@polkadot/metadata": 1.24.0-beta.0 - "@polkadot/util": ^2.18.0-beta.1 - "@polkadot/util-crypto": ^2.18.0-beta.1 + "@polkadot/util": ^2.18.0-beta.2 + "@polkadot/util-crypto": ^2.18.0-beta.2 "@types/bn.js": ^4.11.6 "@types/memoizee": ^0.4.4 bn.js: ^5.1.2 @@ -2928,12 +2928,12 @@ __metadata: languageName: unknown linkType: soft -"@polkadot/util-crypto@npm:2.18.0-beta.1, @polkadot/util-crypto@npm:^2.18.0-beta.1": - version: 2.18.0-beta.1 - resolution: "@polkadot/util-crypto@npm:2.18.0-beta.1" +"@polkadot/util-crypto@npm:2.18.0-beta.2, @polkadot/util-crypto@npm:^2.18.0-beta.2": + version: 2.18.0-beta.2 + resolution: "@polkadot/util-crypto@npm:2.18.0-beta.2" dependencies: "@babel/runtime": ^7.10.4 - "@polkadot/util": 2.18.0-beta.1 + "@polkadot/util": 2.18.0-beta.2 "@polkadot/wasm-crypto": ^1.2.1 base-x: ^3.0.8 bip39: ^3.0.2 @@ -2944,13 +2944,13 @@ __metadata: pbkdf2: ^3.1.1 tweetnacl: ^1.0.3 xxhashjs: ^0.2.2 - checksum: 3/e22aafdcd1bdbb6aa209882c2186dcfbd256c91434cab443d2c2c4266138bc343c921c17f8a0575126db30f6367f29c1ab2c3505a81f7a4c44d1bf408de16d0c + checksum: 3/6a2109faddea7f15ecf708b1f1748d0e77961ba16f5f55c2d06298d08586a6ad1b13ae852556dba3485b32d46875d2294bb8cad7dc3b1a3639efd45fbd29d25f languageName: node linkType: hard -"@polkadot/util@npm:2.18.0-beta.1, @polkadot/util@npm:^2.18.0-beta.1": - version: 2.18.0-beta.1 - resolution: "@polkadot/util@npm:2.18.0-beta.1" +"@polkadot/util@npm:2.18.0-beta.2, @polkadot/util@npm:^2.18.0-beta.2": + version: 2.18.0-beta.2 + resolution: "@polkadot/util@npm:2.18.0-beta.2" dependencies: "@babel/runtime": ^7.10.4 "@types/bn.js": ^4.11.6 @@ -2958,7 +2958,7 @@ __metadata: camelcase: ^5.3.1 chalk: ^4.1.0 ip-regex: ^4.1.0 - checksum: 3/8ecd8e4c32433d5f6d7a3f482342d457a16fd92cbf4ac4a827d93cface5223fcb08551f77d18c94524ad217753c20c75cb9e2a939ea8985d923471c93179c8e4 + checksum: 3/d4031af560e87172dcce731231e5b256f286feb94bc1b33114ef427d4a3bab8b013e8f41bdfd89c4e6860ddff38de102bf5337eea2c0ac1aa847bb1540dbe3fc languageName: node linkType: hard