UNPKG

@substrate/api-sidecar

Version:

REST service that makes it easy to interact with blockchain nodes built using Substrate's FRAME framework.

841 lines 48.3 kB
"use strict"; // Copyright 2017-2025 Parity Technologies (UK) Ltd. // This file is part of Substrate API Sidecar. // // Substrate API Sidecar is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program 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 General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const types_1 = require("@polkadot/types"); const types_codec_1 = require("@polkadot/types-codec"); const bn_js_1 = __importDefault(require("bn.js")); const constants_1 = require("../test-helpers/constants"); const registries_1 = require("../test-helpers/registries"); const mockData_1 = require("./mockData"); const sanitizeNumbers_1 = require("./sanitizeNumbers"); describe('sanitizeNumbers', () => { it('does not affect non-numbers', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)('Hello world')).toBe('Hello world'); }); it('does not convert plain hexadecimal', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)('40C0A7')).toBe('40C0A7'); expect((0, sanitizeNumbers_1.sanitizeNumbers)('0x40C0A7')).toBe('0x40C0A7'); }); describe('javscript native', () => { describe('javascript types it cannot handle properly', () => { it('does not handle WeakMap', () => { const compact = new (types_1.Compact.with(types_1.u128))(registries_1.kusamaRegistry, constants_1.MAX_U128); const map = new WeakMap().set({ x: 'x' }, compact).set({ y: 'y' }, registries_1.kusamaRegistry.createType('u128', constants_1.MAX_U128)); expect((0, sanitizeNumbers_1.sanitizeNumbers)(map)).toStrictEqual({}); }); it('does not handle WeakSet', () => { const negInt = new types_1.Int(registries_1.kusamaRegistry, constants_1.MIN_I32, 32); const maxInt = new types_1.Int(registries_1.kusamaRegistry, constants_1.MAX_I64, 64); const set = new WeakSet([maxInt, negInt]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(set)).toStrictEqual({}); }); it('does not handle Number', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(new Number(constants_1.MAX_U128))).toStrictEqual({}); }); it('handles BigInt but outputs to console.errors because not convert to AnyJson', () => { var _a; const temp = console.error; console.error = jest.fn(); expect((_a = (0, sanitizeNumbers_1.sanitizeNumbers)(BigInt(constants_1.MAX_U128))) === null || _a === void 0 ? void 0 : _a.toString()).toBe('340282366920938463463374607431768211455'); expect(console.error).toHaveBeenCalled(); console.error = temp; }); it('handles Symbol but outputs to console.error because does not convert to AnyJson', () => { var _a; const temp = console.error; console.error = jest.fn(); const s = Symbol('sym'); expect((_a = (0, sanitizeNumbers_1.sanitizeNumbers)(s)) === null || _a === void 0 ? void 0 : _a.toString()).toEqual('Symbol(sym)'); expect(console.error).toHaveBeenCalled(); console.error = temp; }); it('does not handle String', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(new String('abc'))).toStrictEqual({ 0: 'a', 1: 'b', 2: 'c', }); }); }); it('handles Date', () => { const date = new Date(); expect((0, sanitizeNumbers_1.sanitizeNumbers)(date)).toBe(date.toJSON()); }); it('converts Array', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)([registries_1.kusamaRegistry.createType('u128', constants_1.MAX_U128), registries_1.kusamaRegistry.createType('u64', constants_1.MAX_U64)])).toStrictEqual([constants_1.MAX_U128, constants_1.MAX_U64]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(new Array(2))).toStrictEqual(new Array(2)); }); it('converts nested POJO', () => { const pojo = { three: registries_1.kusamaRegistry.createType('u32', constants_1.MAX_U32), x: { six: registries_1.kusamaRegistry.createType('u64', constants_1.MAX_U64), x: { one: registries_1.kusamaRegistry.createType('u128', constants_1.MAX_U128), b: registries_1.kusamaRegistry.createType('Balance', constants_1.MAX_U128), }, }, }; expect((0, sanitizeNumbers_1.sanitizeNumbers)(pojo)).toStrictEqual({ three: constants_1.MAX_U32, x: { six: constants_1.MAX_U64, x: { one: constants_1.MAX_U128, b: constants_1.MAX_U128, }, }, }); }); it('handles undefined', () => { const arr = [undefined, undefined, undefined]; expect((0, sanitizeNumbers_1.sanitizeNumbers)(arr)).toStrictEqual(arr); const obj = { x: undefined, y: undefined, a: arr, }; expect((0, sanitizeNumbers_1.sanitizeNumbers)(obj)).toStrictEqual(obj); }); it('converts javascript Set', () => { const negInt = registries_1.kusamaRegistry.createType('i32', constants_1.MIN_I32); const maxInt = registries_1.kusamaRegistry.createType('i64', constants_1.MAX_I64); const struct = new types_1.Struct(registries_1.kusamaRegistry, { foo: types_1.Text, bar: 'u32', }, { foo: 'hi :)', bar: constants_1.MAX_U32 }); const set = new Set([struct, maxInt, negInt]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(set)).toStrictEqual([ { foo: 'hi :)', bar: constants_1.MAX_U32, }, constants_1.MAX_I64, constants_1.MIN_I32, ]); }); it('converts nested javascript Map', () => { const struct = new types_1.Struct(registries_1.kusamaRegistry, { foo: 'Text', bar: 'u32', }, { foo: 'hi :)', bar: constants_1.MAX_U32 }); const compact = new (types_1.Compact.with(types_1.u128))(registries_1.kusamaRegistry, constants_1.MAX_U128); const nest = new Map().set('s', struct).set('b', new bn_js_1.default(constants_1.MAX_U128)); const outer = new Map().set('c', compact).set('n', nest); expect((0, sanitizeNumbers_1.sanitizeNumbers)(outer)).toStrictEqual({ c: constants_1.MAX_U128, n: { s: { foo: 'hi :)', bar: constants_1.MAX_U32, }, b: constants_1.MAX_U128, }, }); }); }); describe('primitives and Codec base types', () => { // https://github.com/polkadot-js/api/tree/master/packages/types it('converts AnyStruct', () => { const struct = new types_1.Struct(registries_1.kusamaRegistry, { foo: 'Text', bar: 'u32', }, { foo: 'hi :)', bar: constants_1.MAX_U32 }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct)).toStrictEqual({ foo: 'hi :)', bar: constants_1.MAX_U32, }); const json = new types_1.Json(registries_1.kusamaRegistry, { b: registries_1.kusamaRegistry.createType('Bool', true), i: registries_1.kusamaRegistry.createType('i128', constants_1.MAX_I128), o: registries_1.kusamaRegistry.createType('Option<i128>', constants_1.MAX_I128), s: struct, }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(json)).toStrictEqual({ b: true, i: constants_1.MAX_I128, o: constants_1.MAX_I128, s: { foo: 'hi :)', bar: constants_1.MAX_U32, }, }); }); it('handles H512', () => { const h = registries_1.kusamaRegistry.createType('H512', constants_1.MAX_H512); expect((0, sanitizeNumbers_1.sanitizeNumbers)(h)).toBe('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'); }); it('handles H256', () => { const h = registries_1.kusamaRegistry.createType('H256', constants_1.MAX_H256); expect((0, sanitizeNumbers_1.sanitizeNumbers)(h)).toBe('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'); }); it('handles H160', () => { const h = registries_1.kusamaRegistry.createType('H160', constants_1.MAX_H160); expect((0, sanitizeNumbers_1.sanitizeNumbers)(h)).toBe('0xffffffffffffffffffffffffffffffffffffffff'); }); it('handles CodecDate', () => { const d = new types_codec_1.CodecDate(registries_1.kusamaRegistry, new Date(1594441868)); expect((0, sanitizeNumbers_1.sanitizeNumbers)(d)).toBe(1594442); }); it('handles Codec Bool', () => { const t = registries_1.kusamaRegistry.createType('Bool', true); expect((0, sanitizeNumbers_1.sanitizeNumbers)(t)).toBe(true); const f = registries_1.kusamaRegistry.createType('Bool', false); expect((0, sanitizeNumbers_1.sanitizeNumbers)(f)).toBe(false); }); it('handles Codec Bytes', () => { const code = new types_1.Bytes(registries_1.kusamaRegistry, ':code'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(code)).toBe('0x3a636f6465'); }); it('handles Codec Data', () => { const data = new types_1.Data(registries_1.kusamaRegistry, { Keccak256: '0x0102030405060708091011121314151617181920212223242526272829303132', }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(data)).toStrictEqual({ keccak256: '0x0102030405060708091011121314151617181920212223242526272829303132', }); }); it('handles Codec Null', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(new types_1.Null(registries_1.kusamaRegistry))).toBe(null); }); it('handles StorageKey', () => { const key = new types_1.StorageKey(registries_1.kusamaRegistry, '0x426e15054d267946093858132eb537f191ca57b0c4b20b29ae7e99d6201d680cc906f7710aa165d62c709012f807af8fc3f0d2abb0c51ca9a88d4ef24d1a092bf89dacf5ce63ea1d'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(key)).toStrictEqual('0x426e15054d267946093858132eb537f191ca57b0c4b20b29ae7e99d6201d680cc906f7710aa165d62c709012f807af8fc3f0d2abb0c51ca9a88d4ef24d1a092bf89dacf5ce63ea1d'); }); it('handles Text', () => { const notEnglish = registries_1.kusamaRegistry.createType('Text', '中文'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(notEnglish)).toBe('中文'); }); describe('number primitives', () => { it('converts u8', () => { const z = registries_1.kusamaRegistry.createType('u8', 0); expect((0, sanitizeNumbers_1.sanitizeNumbers)(z)).toBe('0'); const m = new types_1.u8(registries_1.kusamaRegistry, constants_1.MAX_U8); expect((0, sanitizeNumbers_1.sanitizeNumbers)(m)).toBe(constants_1.MAX_U8); }); it('converts i8', () => { const z = registries_1.kusamaRegistry.createType('i8', 0); expect((0, sanitizeNumbers_1.sanitizeNumbers)(z)).toBe('0'); const min = registries_1.kusamaRegistry.createType('i8', constants_1.MIN_I8); expect((0, sanitizeNumbers_1.sanitizeNumbers)(min)).toBe(constants_1.MIN_I8); const max = registries_1.kusamaRegistry.createType('i8', constants_1.MAX_I8); expect((0, sanitizeNumbers_1.sanitizeNumbers)(max)).toBe(constants_1.MAX_I8); }); it('converts u16', () => { const z = registries_1.kusamaRegistry.createType('u16', 0); expect((0, sanitizeNumbers_1.sanitizeNumbers)(z)).toBe('0'); const max = registries_1.kusamaRegistry.createType('u16', constants_1.MAX_U16); expect((0, sanitizeNumbers_1.sanitizeNumbers)(max)).toBe(constants_1.MAX_U16); }); it('converts i16', () => { const z = registries_1.kusamaRegistry.createType('i16', 0); expect((0, sanitizeNumbers_1.sanitizeNumbers)(z)).toBe('0'); const min = registries_1.kusamaRegistry.createType('i16', constants_1.MIN_I16); expect((0, sanitizeNumbers_1.sanitizeNumbers)(min)).toBe(constants_1.MIN_I16); const max = registries_1.kusamaRegistry.createType('i16', constants_1.MAX_I16); expect((0, sanitizeNumbers_1.sanitizeNumbers)(max)).toBe(constants_1.MAX_I16); }); it('converts Int', () => { const intTen = new types_1.Int(registries_1.kusamaRegistry, 10); expect((0, sanitizeNumbers_1.sanitizeNumbers)(intTen)).toBe('10'); const intPaddedHex = new types_1.Int(registries_1.kusamaRegistry, '0x000000000000000004fe9f24a6a9c00'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(intPaddedHex)).toBe('22493750000000000'); const maxInt = new types_1.Int(registries_1.kusamaRegistry, constants_1.MAX_I64, 64); expect((0, sanitizeNumbers_1.sanitizeNumbers)(maxInt)).toBe(constants_1.MAX_I64); const negInt = new types_1.Int(registries_1.kusamaRegistry, constants_1.MIN_I32, 32); expect((0, sanitizeNumbers_1.sanitizeNumbers)(negInt)).toBe(constants_1.MIN_I32); }); it('converts UInt', () => { const uIntTen = new types_codec_1.UInt(registries_1.kusamaRegistry, 10); expect((0, sanitizeNumbers_1.sanitizeNumbers)(uIntTen)).toBe('10'); const uIntPaddedHex = new types_codec_1.UInt(registries_1.kusamaRegistry, '0x000000000000000004fe9f24a6a9c00'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(uIntPaddedHex)).toBe('22493750000000000'); }); it('converts U32', () => { const u32Zero = registries_1.kusamaRegistry.createType('u32', '0x0'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u32Zero)).toBe('0'); const u32Max = registries_1.kusamaRegistry.createType('u32', constants_1.MAX_U32); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u32Max)).toBe(constants_1.MAX_U32); }); it('converts I32', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(registries_1.kusamaRegistry.createType('i32', constants_1.MIN_I32))).toBe(constants_1.MIN_I32); expect((0, sanitizeNumbers_1.sanitizeNumbers)(registries_1.kusamaRegistry.createType('i32', constants_1.MAX_I32))).toBe(constants_1.MAX_I32); }); it('converts U64', () => { const u64Zero = registries_1.kusamaRegistry.createType('u64', '0x0'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u64Zero)).toBe('0'); const u64Max = registries_1.kusamaRegistry.createType('u64', constants_1.MAX_U64); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u64Max)).toBe(constants_1.MAX_U64); }); it('converts I64', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(registries_1.kusamaRegistry.createType('i64', constants_1.MIN_I64))).toBe(constants_1.MIN_I64); expect((0, sanitizeNumbers_1.sanitizeNumbers)(registries_1.kusamaRegistry.createType('i64', constants_1.MAX_I64))).toBe(constants_1.MAX_I64); }); it('converts U128', () => { const u128Zero = registries_1.kusamaRegistry.createType('u128', '0x0'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u128Zero)).toBe('0'); const u128Max = registries_1.kusamaRegistry.createType('u128', constants_1.MAX_U128); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u128Max)).toBe(constants_1.MAX_U128); }); it('converts II28', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(registries_1.kusamaRegistry.createType('I128', constants_1.MAX_I128))).toBe(constants_1.MAX_I128); expect((0, sanitizeNumbers_1.sanitizeNumbers)(registries_1.kusamaRegistry.createType('I128', constants_1.MIN_I128))).toBe(constants_1.MIN_I128); }); }); describe('BTreeMap', () => { const mockU32TextMap = new Map() .set(registries_1.kusamaRegistry.createType('Text', 'u32Max'), registries_1.kusamaRegistry.createType('u32', '0xffffffff')) .set(registries_1.kusamaRegistry.createType('Text', 'zero'), registries_1.kusamaRegistry.createType('u32', 0)); const bTreeMapConstructor = types_1.BTreeMap.with('Text', 'u32'); it('converts BTreeMap and nested BTreeMap', () => { const sanitizedBTreeMap = { u32Max: constants_1.MAX_U32, zero: '0', }; expect((0, sanitizeNumbers_1.sanitizeNumbers)(new bTreeMapConstructor(registries_1.kusamaRegistry, mockU32TextMap))).toStrictEqual(sanitizedBTreeMap); }); it('converts a nested BTreeMap', () => { const structWithBTreeMap = new types_1.Struct(registries_1.kusamaRegistry, { foo: types_1.u32, value: 'BTreeMap<Text, u32>', }) .set('foo', registries_1.kusamaRegistry.createType('u32', 50)) .set('value', new bTreeMapConstructor(registries_1.kusamaRegistry, mockU32TextMap)); expect((0, sanitizeNumbers_1.sanitizeNumbers)(structWithBTreeMap)).toStrictEqual({ foo: '50', value: { u32Max: constants_1.MAX_U32, zero: '0', }, }); }); }); describe('BTreeSet', () => { const U64Set = new Set() .add(registries_1.kusamaRegistry.createType('u64', '0x0')) .add(registries_1.kusamaRegistry.createType('u64', '24')) .add(registries_1.kusamaRegistry.createType('u64', '30')) .add(registries_1.kusamaRegistry.createType('u64', constants_1.MAX_U64)); const sanitizedBTreeSet = ['0', '24', '30', constants_1.MAX_U64]; it('converts BTreeSet', () => { const bTreeSet = new types_1.BTreeSet(registries_1.kusamaRegistry, 'u64', U64Set); expect((0, sanitizeNumbers_1.sanitizeNumbers)(bTreeSet)).toStrictEqual(sanitizedBTreeSet); }); it('converts nested BTreeSet', () => { const structWithBTreeSet = new types_1.Struct(registries_1.kusamaRegistry, { foo: 'u64', value: types_1.BTreeSet.with('u64'), }) .set('foo', registries_1.kusamaRegistry.createType('u64', 50)) .set('value', new types_1.BTreeSet(registries_1.kusamaRegistry, 'u64', U64Set)); expect((0, sanitizeNumbers_1.sanitizeNumbers)(structWithBTreeSet)).toStrictEqual({ foo: '50', value: sanitizedBTreeSet, }); }); }); it('converts an assortment of Compact values', () => { const wednesday = registries_1.kusamaRegistry.createType('Moment', 1537968546); expect((0, sanitizeNumbers_1.sanitizeNumbers)(new (types_1.Compact.with('Moment'))(registries_1.kusamaRegistry, wednesday))).toBe('1537968546'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(new (types_1.Compact.with(types_1.u32))(registries_1.kusamaRegistry, constants_1.MAX_U32))).toBe(constants_1.MAX_U32); expect((0, sanitizeNumbers_1.sanitizeNumbers)(new (types_1.Compact.with('u128'))(registries_1.kusamaRegistry, constants_1.MAX_U128))).toBe(constants_1.MAX_U128); }); it('converts nested Enum', () => { const Nest = types_1.Enum.with({ C: 'u64', D: 'u64', }); const Test = types_1.Enum.with({ A: 'u64', B: Nest, }); const test = new Test(registries_1.kusamaRegistry, new Nest(registries_1.kusamaRegistry, '0xFFFFFFFFFFFFFFFF', 1), 1); expect((0, sanitizeNumbers_1.sanitizeNumbers)(test)).toStrictEqual({ b: { d: constants_1.MAX_U64, }, }); }); it('handles Linkage', () => { const linkage = registries_1.kusamaRegistry.createType('(ValidatorPrefs, Linkage<AccountId>)', '0x0284d7170001da30b68f54f686f586ddb29de12b682dd8bd1404566fb8a8db5dec20aa5b6b36'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(linkage)).toStrictEqual([ { commission: '100000000' }, { previous: null, next: '5GznmRvdi5htUJKnMSWJgJUzSJJXSvWuHRSEdyUbHJZDNcwU', }, ]); }); describe('Option', () => { it('converts None to null', () => { const none = registries_1.kusamaRegistry.createType('Option<Text>', null); expect((0, sanitizeNumbers_1.sanitizeNumbers)(none)).toBe(null); }); it('handles wrapped Some(Text)', () => { const hi = registries_1.kusamaRegistry.createType('Text', 'hi'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(hi)).toBe('hi'); }); it('converts Some(U128)', () => { const u128MaxOption = registries_1.kusamaRegistry.createType('Option<u128>', constants_1.MAX_U128); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u128MaxOption)).toBe(constants_1.MAX_U128); }); }); it('handles Raw', () => { const u8a = new types_1.Raw(registries_1.kusamaRegistry, [1, 2, 3, 4, 5]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u8a)).toBe('0x0102030405'); }); it('converts nested HashMap', () => { const outer = types_1.HashMap.with('Text', types_1.HashMap); const inner = types_1.HashMap.with('Text', 'U128'); const map = new outer(registries_1.kusamaRegistry, { nest: new inner(registries_1.kusamaRegistry, { n: constants_1.MAX_U128 }), }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(map)).toStrictEqual({ nest: { n: constants_1.MAX_U128 }, }); }); describe('Result', () => { const ResultConstructor = types_1.Result.with({ Err: 'Text', Ok: 'u128', }); const message = registries_1.kusamaRegistry.createType('Text', 'message'); const maxU128 = registries_1.kusamaRegistry.createType('u128', constants_1.MAX_U128); // it('handles Ok()', () => { // const ok = kusamaRegistry.createType('DispatchResult'); // expect(sanitizeNumbers(ok)).toStrictEqual([]); // }); it('handles Ok()', () => { const ok = registries_1.kusamaRegistry.createType('DispatchResult'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(ok)).toStrictEqual({ ok: [] }); }); // it('converts Error(u128)', () => { // const error = new ResultConstructor(kusamaRegistry, { // Error: maxU128, // }); // expect(sanitizeNumbers(error)).toBe(MAX_U128); // }); it('converts Error(u128)', () => { const error = new ResultConstructor(registries_1.kusamaRegistry, { Err: maxU128, }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(error)).toStrictEqual({ err: constants_1.MAX_U128, }); }); // it('handles Error(Text)', () => { // const error = new ResultConstructor(kusamaRegistry, { // Error: message, // }); // expect(sanitizeNumbers(error)).toBe(message.toString()); // }); it('handles Error(Text)', () => { const error = new ResultConstructor(registries_1.kusamaRegistry, { err: message, }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(error)).toStrictEqual({ err: message.toString(), }); }); // it('converts Ok(u128)', () => { // const ok = new ResultConstructor(kusamaRegistry, { // ok: maxU128, // }); // expect(sanitizeNumbers(ok)).toBe(MAX_U128); // }); it('converts Ok(u128)', () => { const ok = new ResultConstructor(registries_1.kusamaRegistry, { ok: maxU128, }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(ok)).toStrictEqual({ ok: constants_1.MAX_U128 }); }); // it('handles Ok(Text)', () => { // const R = Result.with({ Error: Text, Ok: Text }); // const ok = new R(kusamaRegistry, { // Ok: message, // }); // expect(sanitizeNumbers(ok)).toBe(message.toString()); // }); it('handles Ok(Text)', () => { const R = types_1.Result.with({ Err: 'Text', Ok: 'Text' }); const ok = new R(registries_1.kusamaRegistry, { ok: message, }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(ok)).toStrictEqual({ ok: message.toString(), }); }); }); it('converts CodecSet', () => { const setRoles = { full: 1, authority: 3, }; const set = new types_1.Set(registries_1.kusamaRegistry, setRoles, ['full', 'authority']); expect((0, sanitizeNumbers_1.sanitizeNumbers)(set)).toStrictEqual(['full', 'authority']); }); describe('Struct', () => { it('converts a simple Struct', () => { const struct = new types_1.Struct(registries_1.kusamaRegistry, { foo: 'Text', bar: 'u32', }, { foo: 'hi :)', bar: constants_1.MAX_U32 }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct)).toStrictEqual({ foo: 'hi :)', bar: constants_1.MAX_U32, }); }); it('converts a more complex Struct', () => { const struct = new types_1.Struct(registries_1.kusamaRegistry, { foo: types_1.Vec.with(types_1.Struct.with({ w: 'Text', bar: 'u32', })), }, { foo: [ { bar: constants_1.MAX_U32, w: 'x' }, { bar: '0', w: 'X' }, ], }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct)).toStrictEqual({ foo: [ { bar: constants_1.MAX_U32, w: 'x' }, { bar: '0', w: 'X' }, ], }); }); it('converts a five deep nested struct', () => { const content = { n: constants_1.MAX_U32, x: { n: constants_1.MAX_U32, x: { n: constants_1.MAX_U32, x: { n: constants_1.MAX_U32, x: { n: constants_1.MAX_U128, w: 'sorry', }, }, }, }, }; const struct = new types_1.Struct(registries_1.kusamaRegistry, { n: 'u32', x: types_1.Struct.with({ n: 'u32', x: types_1.Struct.with({ n: 'u32', x: types_1.Struct.with({ n: 'u32', x: types_1.Struct.with({ n: 'u128', w: 'Text', }), }), }), }), }, content); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct)).toStrictEqual(content); }); }); describe('Tuple', () => { it('converts a simple Tuple', () => { const tuple = new types_1.Tuple(registries_1.kusamaRegistry, ['Text', 'u128'], ['xX', constants_1.MAX_U128]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(tuple)).toStrictEqual(['xX', constants_1.MAX_U128]); }); it('converts a 3 deep nested Tuple', () => { const tuple = new types_1.Tuple(registries_1.kusamaRegistry, [types_1.Tuple.with([types_1.Tuple.with(['u32', 'u128']), 'u128']), 'u32'], [[0, 6074317682114550], 0]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(tuple)).toStrictEqual([[['0', '0'], '6074317682114550'], '0']); }); }); it('converts U8a fixed', () => { const u8a = new (types_1.U8aFixed.with(32))(registries_1.kusamaRegistry, [0x02, 0x03, 0x00, 0x00]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(u8a)).toStrictEqual('0x02030000'); }); it('converts Vec<U128>', () => { const vec = new (types_1.Vec.with('u128'))(registries_1.kusamaRegistry, ['0', '366920938463463374607431768211455', constants_1.MAX_U128]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(vec)).toStrictEqual(['0', '366920938463463374607431768211455', constants_1.MAX_U128]); }); it('converts VecFixed<U128>', () => { const vec = new (types_1.VecFixed.with('u128', 3))(registries_1.kusamaRegistry, ['0', '366920938463463374607431768211455', constants_1.MAX_U128]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(vec)).toStrictEqual(['0', '366920938463463374607431768211455', constants_1.MAX_U128]); }); }); describe('substrate specific types', () => { it('handles AccountId', () => { const id = registries_1.kusamaRegistry.createType('AccountId', '5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(id)).toBe('5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw'); }); it('handles AccountIndex', () => { const i = registries_1.kusamaRegistry.createType('AccountIndex', 256); expect((0, sanitizeNumbers_1.sanitizeNumbers)(i)).toBe('25GUyv'); }); it('handles Call', () => { const c = new types_1.GenericCall(registries_1.kusamaRegistry, { args: ['5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw', 100000], callIndex: [4, 0], // balances.transfer }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(c)).toStrictEqual({ args: { dest: '5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw', value: '100000', }, callIndex: '0x0400', }); }); it('handles Event', () => { const event = registries_1.kusamaRegistry.createType('Event', new Uint8Array([6, 0, 0])); expect((0, sanitizeNumbers_1.sanitizeNumbers)(event)).toStrictEqual({ data: [[]], index: '0x0600', }); }); it('handles EventRecord', () => { const eventRecord = registries_1.kusamaRegistry.createType('Vec<EventRecord>', '0x0800000000000000000001000000000000'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(eventRecord)).toStrictEqual([ { event: { data: [ { class: 'Normal', paysFee: 'Yes', weight: '65536', }, ], index: '0x0000', }, phase: { applyExtrinsic: '0' }, topics: [], }, { event: { data: null, index: '0x0000' }, phase: { applyExtrinsic: '0' }, topics: [], }, ]); }); it('handles Extrinsic', () => { const extrinsic = registries_1.polkadotRegistry.createType('Extrinsic', '0x250284d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d0182630bcec823e017e7ae576feda0dae3bf76f74049f3b8f72884dcb41169154bc7d179d47b50453f4f8865a5f3030c1e78ed8eff624765d0ff5eb0136a46538e1502000005008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4830'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(extrinsic)).toBe('0x250284d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d0182630bcec823e017e7ae576feda0dae3bf76f74049f3b8f72884dcb41169154bc7d179d47b50453f4f8865a5f3030c1e78ed8eff624765d0ff5eb0136a46538e1502000005008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4830'); }); it('handles ExtrinsicEra', () => { const extrinsicEra = registries_1.kusamaRegistry.createType('ExtrinsicEra', '0x6502'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(extrinsicEra)).toStrictEqual({ mortalEra: ['64', '38'], }); }); it('ExtrinsicPayload', () => { const load = { address: '5DTestUPts3kjeXSTMyerHihn1uwMfLj8vU8sqF7qYrFabHE', blockHash: '0xde8f69eeb5e065e18c6950ff708d7e551f68dc9bf59a07c52367c0280f805ec7', era: '0x0703', genesisHash: '0xdcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b', method: '0x0600ffd7568e5f0a7eda67a82691ff379ac4bba4f9c9b859fe779b5d46363b61ad2db9e56c', nonce: '0x00001234', specVersion: 123, tip: '0x00000000000000000000000000005678', }; const extrinsicPayload = registries_1.kusamaRegistry.createType('ExtrinsicPayload', load, { version: 4, }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(extrinsicPayload)).toBe('0x940600ffd7568e5f0a7eda67a82691ff379ac4bba4f9c9b859fe779b5d46363b61ad2db9e56c0703d148e25901007b00000000000000dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025bde8f69eeb5e065e18c6950ff708d7e551f68dc9bf59a07c52367c0280f805ec7'); }); it('handles Vote', () => { const aye = registries_1.kusamaRegistry.createType('Vote', { aye: true, conviction: 'Locked2x', }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(aye)).toBe('0x82'); const nay = registries_1.kusamaRegistry.createType('Vote', { aye: false, conviction: 'Locked2x', }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(nay)).toBe('0x02'); }); it('converts Moment', () => { const m = registries_1.kusamaRegistry.createType('Moment', constants_1.MAX_U64); expect((0, sanitizeNumbers_1.sanitizeNumbers)(m)).toBe(constants_1.MAX_U64); const z = registries_1.kusamaRegistry.createType('Moment', 0); expect((0, sanitizeNumbers_1.sanitizeNumbers)(z)).toBe('0'); }); it('converts Signature', () => { const s = registries_1.kusamaRegistry.createType('Signature', constants_1.MAX_H512); expect((0, sanitizeNumbers_1.sanitizeNumbers)(s)).toBe('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'); }); it('StorageData', () => { const d = registries_1.kusamaRegistry.createType('StorageData', '0x2082c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf54de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e758d67e0f9be62dce75adbb005e8097de5c45f32b1ba7264717df2db4ae9f276e8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081ca070532405ebf20fba389cbabfe1885cc134ee18028d488714eae621b47baf9d227cee94fa4e88d8d25abe706f15aca03b1d753d433f5ef9aa9ad1bcf5e5b81e040c8dc048a6d129803caa851c4c9633610068e4ef9eaa0bfbf40dfbfd43d9222347812ef77d9fd3cca1673e1b2bde54da96fddcf79d92832b1e2a819724f140'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(d)).toBe('0x2082c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf54de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e758d67e0f9be62dce75adbb005e8097de5c45f32b1ba7264717df2db4ae9f276e8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081ca070532405ebf20fba389cbabfe1885cc134ee18028d488714eae621b47baf9d227cee94fa4e88d8d25abe706f15aca03b1d753d433f5ef9aa9ad1bcf5e5b81e040c8dc048a6d129803caa851c4c9633610068e4ef9eaa0bfbf40dfbfd43d9222347812ef77d9fd3cca1673e1b2bde54da96fddcf79d92832b1e2a819724f140'); }); it('converts Balance', () => { const balanceZero = registries_1.kusamaRegistry.createType('Balance', '0x0'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(balanceZero)).toBe('0'); const balanceTen = registries_1.kusamaRegistry.createType('Balance', 10); expect((0, sanitizeNumbers_1.sanitizeNumbers)(balanceTen)).toBe('10'); const balancePaddedHex = registries_1.kusamaRegistry.createType('Balance', '0x000000000000000004fe9f24a6a9c00'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(balancePaddedHex)).toBe('22493750000000000'); const balanceMax = registries_1.kusamaRegistry.createType('Balance', constants_1.MAX_U128); expect((0, sanitizeNumbers_1.sanitizeNumbers)(balanceMax)).toBe(constants_1.MAX_U128); }); it('converts Compact<Balance>', () => { const compactBalanceZero = registries_1.kusamaRegistry.createType('Compact<Balance>', '0x0'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(compactBalanceZero)).toBe('0'); const compactBalancePaddedHex = registries_1.kusamaRegistry.createType('Compact<Balance>', '0x0000000000000000004fe9f24a6a9c00'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(compactBalancePaddedHex)).toBe('22493750000000000'); const compactBalancePaddedHex2 = registries_1.kusamaRegistry.createType('Compact<Balance>', '0x000000000000000000ff49f24a6a9c00'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(compactBalancePaddedHex2)).toBe('71857424040631296'); const compactBalanceMax = registries_1.kusamaRegistry.createType('Compact<Balance>', constants_1.MAX_U128); expect((0, sanitizeNumbers_1.sanitizeNumbers)(compactBalanceMax)).toBe(constants_1.MAX_U128); }); it('converts Index and Compact<Index>', () => { const IndexPadded = registries_1.kusamaRegistry.createType('Index', '0x00000384'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(IndexPadded)).toBe('900'); const IndexMax = registries_1.kusamaRegistry.createType('Index', '0x7FFFFFFF'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(IndexMax)).toBe('2147483647'); const CompactIndexPadded = registries_1.kusamaRegistry.createType('Compact<Index>', '0x00000384'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(CompactIndexPadded)).toBe('900'); const CompactIndexMax = registries_1.kusamaRegistry.createType('Compact<Index>', '0x7FFFFFFF'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(CompactIndexMax)).toBe('2147483647'); }); it('converts Compact<Balance> that are values in an object', () => { const totalBalance = registries_1.kusamaRegistry.createType('Compact<Balance>', constants_1.MAX_U128); const activeBalance = registries_1.kusamaRegistry.createType('Compact<Balance>', '0x0000000000000000ff49f24a6a9100'); const arbitraryObject = { total: totalBalance, active: activeBalance, }; const sanitizedArbitraryObject = { total: constants_1.MAX_U128, active: '71857424040628480', }; expect((0, sanitizeNumbers_1.sanitizeNumbers)(arbitraryObject)).toStrictEqual(sanitizedArbitraryObject); }); it('converts a staking response', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(mockData_1.PRE_SANITIZED_STAKING_RESPONSE)).toStrictEqual({ at: { hash: '0x5f2a8b33c24368148982c37aefe77d5724f5aca0bcae1a599e2a4634c1f0fab2', height: '2669784', }, staking: { active: '71857424040628480', claimedRewards: [], stash: '5DRihWfVSmhbk25D4VRSjacZTtrnv8w8qnGttLmfro5MCPgm', total: '71857424040631296', unlocking: [], }, }); }); it('converts Vec<BalanceLock>', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(mockData_1.PRE_SANITIZED_BALANCE_LOCK)).toStrictEqual([ { id: '0x3030303030303030', amount: '71857424040631296', reasons: 'Misc', }, ]); }); it('converts Option<VestingInfo>', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(mockData_1.PRE_SANITIZED_OPTION_VESTING_INFO)).toStrictEqual({ locked: '71857424040631296', perBlock: '71857424040628480', startingBlock: '299694200', }); }); it('converts RuntimeDispatchInfo', () => { expect((0, sanitizeNumbers_1.sanitizeNumbers)(mockData_1.PRE_SANITIZED_RUNTIME_DISPATCH_INFO)).toStrictEqual({ weight: constants_1.MAX_U64, class: 'Operational', partialFee: constants_1.MAX_U128, }); }); it('handles enum ElectionStatus', () => { const open = registries_1.kusamaRegistry.createType('ElectionStatus', { open: 420420, }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(open)).toStrictEqual({ open: '420420' }); const close = registries_1.kusamaRegistry.createType('ElectionStatus', 'close'); expect((0, sanitizeNumbers_1.sanitizeNumbers)(close)).toStrictEqual({ close: null }); }); }); it('handles Vec<AccountId>', () => { const vec = new types_1.Vec(registries_1.kusamaRegistry, 'AccountId', [ '5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw', '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty', '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', ]); expect((0, sanitizeNumbers_1.sanitizeNumbers)(vec)).toStrictEqual([ '5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw', '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty', '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', ]); }); describe('handles metadata v14 correctly', () => { const sanitizeOptions = { metadataOpts: { registry: registries_1.polkadotRegistryV9190, version: 14, }, }; it('handles unknown struct bytes correctly for Option<u128>', () => { const struct = new types_1.Struct(registries_1.polkadotRegistryV9190, { type: 'Text', value: 'Bytes' }, { type: '535', value: '0x01005039278c0400000000000000000000' }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct, sanitizeOptions)).toStrictEqual({ type: '535', value: '5000000000000', }); }); it('handles unknown struct bytes correctly for u128', () => { const struct = new types_1.Struct(registries_1.polkadotRegistryV9190, { type: 'Text', value: 'Bytes' }, { type: '6', value: '0x00e87648170000000000000000000000' }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct, sanitizeOptions)).toStrictEqual({ type: '6', value: '100000000000', }); }); it('handles unknown struct bytes correctly for u64', () => { const struct = new types_1.Struct(registries_1.polkadotRegistryV9190, { type: 'Text', value: 'Bytes' }, { type: '8', value: '0xc084666557010000' }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct, sanitizeOptions)).toStrictEqual({ type: '8', value: '1474875000000', }); }); it('handles unknown struct bytes correctly for u32', () => { const struct = new types_1.Struct(registries_1.polkadotRegistryV9190, { type: 'Text', value: 'Bytes' }, { type: '4', value: '0x00400000' }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct, sanitizeOptions)).toStrictEqual({ type: '4', value: '16384', }); }); it('handles unknown struct bytes correctly for u16', () => { const struct = new types_1.Struct(registries_1.polkadotRegistryV9190, { type: 'Text', value: 'Bytes' }, { type: '75', value: '0x0200' }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct, sanitizeOptions)).toStrictEqual({ type: '75', value: '2', }); }); it('handles unknown struct bytes correctly for u8', () => { const struct = new types_1.Struct(registries_1.polkadotRegistryV9190, { type: 'Text', value: 'Bytes' }, { type: '2', value: '0x05' }); expect((0, sanitizeNumbers_1.sanitizeNumbers)(struct, sanitizeOptions)).toStrictEqual({ type: '2', value: '5', }); }); }); }); //# sourceMappingURL=sanitizeNumbers.spec.js.map