diff --git a/packages/types/src/augment/registry.ts b/packages/types/src/augment/registry.ts index 5cbbc478d1..b728543f76 100644 --- a/packages/types/src/augment/registry.ts +++ b/packages/types/src/augment/registry.ts @@ -25,7 +25,7 @@ import { CallMetadataV0, DoubleMapTypeLatest, DoubleMapTypeV10, DoubleMapTypeV11 import { Kind, OffenceDetails, Offender, OpaqueTimeSlot, ReportIdOf, Reporter } from '@polkadot/types/interfaces/offences'; import { AttestedCandidate, AuctionIndex, Bidder, CandidateReceipt, CollatorId, CollatorSignature, EgressQueueRoot, HeadData, IncomingParachain, IncomingParachainDeploy, IncomingParachainFixed, LeasePeriod, LeasePeriodOf, NewBidder, ParaId, ParaIdOf, ParaInfo, ParaScheduling, ParachainDispatchOrigin, Retriable, SlotRange, SubId, UpwardMessage, ValidityAttestation, WinningData, WinningDataEntry } from '@polkadot/types/interfaces/parachains'; import { ActiveRecovery, RecoveryConfig } from '@polkadot/types/interfaces/recovery'; -import { ApiId, BlockHash, ChainProperties, ExtrinsicOrHash, ExtrinsicStatus, Health, KeyValueOption, NetworkState, PeerInfo, RpcMethods, RuntimeDispatchInfo, RuntimeVersion, RuntimeVersionApi, StorageChangeSet } from '@polkadot/types/interfaces/rpc'; +import { ApiId, BlockHash, ChainProperties, ExtrinsicOrHash, ExtrinsicStatus, Health, KeyValueOption, NetworkState, NetworkStatePeerset, NetworkStatePeersetInfo, NotConnectedPeer, Peer, PeerEndpoint, PeerEndpointAddr, PeerInfo, PeerPing, RpcMethods, RuntimeDispatchInfo, RuntimeVersion, RuntimeVersionApi, StorageChangeSet } from '@polkadot/types/interfaces/rpc'; import { AccountId, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, Call, ChangesTrieConfiguration, Consensus, ConsensusEngineId, Digest, DigestItem, DispatchClass, DispatchInfo, DispatchInfoTo190, Fixed64, H160, H256, H512, Hash, Header, Index, Justification, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, Moment, Origin, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Seal, SealV0, SignedBlock, StorageData, ValidatorId, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime'; import { FullIdentification, IdentificationTuple, Keys, SessionIndex, SessionKeys1, SessionKeys2, SessionKeys3, SessionKeys4, SessionKeys5, SessionKeys6 } from '@polkadot/types/interfaces/session'; import { Bid, BidKind, BidKindVouch, SocietyJudgement, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces/society'; @@ -1523,6 +1523,27 @@ declare module '@polkadot/types/types/registry' { NetworkState: NetworkState; 'Option': Option; 'Vec': Vec; + Peer: Peer; + 'Option': Option; + 'Vec': Vec; + NotConnectedPeer: NotConnectedPeer; + 'Option': Option; + 'Vec': Vec; + PeerEndpoint: PeerEndpoint; + 'Option': Option; + 'Vec': Vec; + PeerEndpointAddr: PeerEndpointAddr; + 'Option': Option; + 'Vec': Vec; + PeerPing: PeerPing; + 'Option': Option; + 'Vec': Vec; + NetworkStatePeerset: NetworkStatePeerset; + 'Option': Option; + 'Vec': Vec; + NetworkStatePeersetInfo: NetworkStatePeersetInfo; + 'Option': Option; + 'Vec': Vec; PeerInfo: PeerInfo; 'Option': Option; 'Vec': Vec; diff --git a/packages/types/src/codec/BTreeMap.ts b/packages/types/src/codec/BTreeMap.ts index c8048b717d..e85c09cc1d 100644 --- a/packages/types/src/codec/BTreeMap.ts +++ b/packages/types/src/codec/BTreeMap.ts @@ -5,7 +5,7 @@ import { H256 } from '../interfaces/runtime'; import { AnyJson, Constructor, Codec, InterfaceTypes, Registry } from '../types'; -import { isHex, hexToU8a, isU8a, u8aConcat, u8aToHex, u8aToU8a } from '@polkadot/util'; +import { isHex, hexToU8a, isObject, isU8a, u8aConcat, u8aToHex, u8aToU8a } from '@polkadot/util'; import { blake2AsU8a } from '@polkadot/util-crypto'; import Compact from './Compact'; @@ -35,17 +35,21 @@ function decodeBTreeMapFromU8a function decodeBTreeMapFromMap (registry: Registry, KeyClass: Constructor, ValClass: Constructor, value: Map): Map { const output = new Map(); - value.forEach((v: any, k: any) => { - let key, val; + value.forEach((val: any, key: any) => { try { - key = (k instanceof KeyClass) ? k : new KeyClass(registry, k); - val = (v instanceof ValClass) ? v : new ValClass(registry, v); + output.set( + key instanceof KeyClass + ? key + : new KeyClass(registry, key), + val instanceof ValClass + ? val + : new ValClass(registry, val) + ); } catch (error) { console.error('Failed to decode BTreeMap key or value:', error.message); + throw error; } - - output.set(key, val); }); return output; @@ -78,6 +82,8 @@ function decodeBTreeMap (regis return decodeBTreeMapFromU8a(registry, KeyClass, ValClass, u8aToU8a(value)); } else if (value instanceof Map) { return decodeBTreeMapFromMap(registry, KeyClass, ValClass, value); + } else if (isObject(value)) { + return decodeBTreeMapFromMap(registry, KeyClass, ValClass, new Map(Object.entries(value))); } throw new Error('BTreeMap: cannot decode type'); diff --git a/packages/types/src/codec/Struct.ts b/packages/types/src/codec/Struct.ts index 7e8e7d366e..a7becbb57e 100644 --- a/packages/types/src/codec/Struct.ts +++ b/packages/types/src/codec/Struct.ts @@ -119,9 +119,9 @@ export default class Struct< this.#Types = mapToTypeMap(registry, Types); } - public static with (Types: S): Constructor> { + public static with (Types: S, jsonMap?: Map): Constructor> { return class extends Struct { - constructor (registry: Registry, value?: any, jsonMap?: Map) { + constructor (registry: Registry, value?: any) { super(registry, Types, value, jsonMap); (Object.keys(Types) as (keyof S)[]).forEach((key): void => { @@ -233,10 +233,9 @@ export default class Struct< */ public toHuman (isExtended?: boolean): AnyJson { return [...this.keys()].reduce((json, key): any => { - const jsonKey = this.#jsonMap.get(key) || key; const value = this.get(key); - json[jsonKey] = value && value.toHuman(isExtended); + json[key] = value && value.toHuman(isExtended); return json; }, {} as any); diff --git a/packages/types/src/create/createClass.ts b/packages/types/src/create/createClass.ts index 4ba6af583d..098dbed8a3 100644 --- a/packages/types/src/create/createClass.ts +++ b/packages/types/src/create/createClass.ts @@ -139,7 +139,7 @@ const infoMapping: Record C ); }, - [TypeDefInfo.Struct]: (registry: Registry, value: TypeDef): Constructor => Struct.with(getTypeClassMap(value)), + [TypeDefInfo.Struct]: (registry: Registry, value: TypeDef): Constructor => Struct.with(getTypeClassMap(value), value.alias), [TypeDefInfo.Tuple]: (registry: Registry, value: TypeDef): Constructor => Tuple.with(getTypeClassArray(value)), diff --git a/packages/types/src/create/getTypeDef.ts b/packages/types/src/create/getTypeDef.ts index abe9f3639e..aab974e178 100644 --- a/packages/types/src/create/getTypeDef.ts +++ b/packages/types/src/create/getTypeDef.ts @@ -60,7 +60,10 @@ function _decodeStruct (value: TypeDef, type: string, _: string): TypeDef { return _decodeSet(value, parsed[keys[0]]); } - value.sub = keys.map((name): TypeDef => + value.alias = parsed._alias + ? new Map(Object.entries(parsed._alias)) + : undefined; + value.sub = keys.filter((name) => !['_alias'].includes(name)).map((name): TypeDef => // eslint-disable-next-line @typescript-eslint/no-use-before-define getTypeDef(parsed[name], { name }) ); diff --git a/packages/types/src/create/sanitize.ts b/packages/types/src/create/sanitize.ts index eda010f2d4..7cf2c06573 100644 --- a/packages/types/src/create/sanitize.ts +++ b/packages/types/src/create/sanitize.ts @@ -62,7 +62,12 @@ function _findClosing (value: string, start: number): number { function _alias (src: string[], dest: string): Mapper { return (value: string): string => { return src.reduce((value, src): string => { - return value.replace(new RegExp(src, 'g'), dest); + // HACK... f-ing HACK. This needs a fix, so this is a HUGE FIXME + // ignore versionString, the replace just does global replace, check the box aliases + // (versionString from network alias definitions) + return value.includes('versionString') + ? value + : value.replace(new RegExp(src, 'g'), dest); }, value); }; } diff --git a/packages/types/src/create/types.ts b/packages/types/src/create/types.ts index 021f7d3625..d20a03bfb8 100644 --- a/packages/types/src/create/types.ts +++ b/packages/types/src/create/types.ts @@ -34,6 +34,7 @@ export interface TypeDefExtEnumDiscriminant { } export interface TypeDef { + alias?: Map; info: TypeDefInfo; index?: number; displayName?: string; diff --git a/packages/types/src/interfaces/rpc/definitions.ts b/packages/types/src/interfaces/rpc/definitions.ts index f8e720a8e9..f5ffde15bc 100644 --- a/packages/types/src/interfaces/rpc/definitions.ts +++ b/packages/types/src/interfaces/rpc/definitions.ts @@ -38,7 +38,52 @@ export default { }, KeyValueOption: '(StorageKey, Option)', NetworkState: { - peerId: 'Text' + peerId: 'Text', + listenedAddresses: 'Vec', + externalAddresses: 'Vec', + // FIXME These are HashMap + connectedPeers: 'BTreeMap', + notConnectedPeers: 'BTreeMap', + averageDownloadPerSec: 'u64', + averageUploadPerSec: 'u64', + peerset: 'NetworkStatePeerset' + }, + Peer: { + enabled: 'bool', + endpoint: 'PeerEndpoint', + knownAddresses: 'Vec', + latestPingTime: 'PeerPing', + open: 'bool', + versionString: 'Text' + }, + NotConnectedPeer: { + knownAddresses: 'Vec', + latestPingTime: 'Option', + versionString: 'Option' + }, + PeerEndpoint: { + listening: 'PeerEndpointAddr' + }, + PeerEndpointAddr: { + _alias: { + localAddr: 'local_addr', + sendBackAddr: 'send_back_addr' + }, + localAddr: 'Text', + sendBackAddr: 'Text' + }, + PeerPing: { + nanos: 'u64', + secs: 'u64' + }, + NetworkStatePeerset: { + messageQueue: 'u64', + // FIXME This is HashMap + nodes: 'BTreeMap' + }, + NetworkStatePeersetInfo: { + connected: 'bool', + reputation: 'u64' }, PeerInfo: { peerId: 'Text', diff --git a/packages/types/src/interfaces/rpc/types.ts b/packages/types/src/interfaces/rpc/types.ts index 3dacf842cb..daadadb54a 100644 --- a/packages/types/src/interfaces/rpc/types.ts +++ b/packages/types/src/interfaces/rpc/types.ts @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ import { ITuple } from '@polkadot/types/types'; -import { Enum, Option, Struct, U8aFixed, Vec } from '@polkadot/types/codec'; +import { BTreeMap, Enum, Option, Struct, U8aFixed, Vec } from '@polkadot/types/codec'; import { Bytes, StorageKey, Text, bool, u32, u64, u8 } from '@polkadot/types/primitive'; import { Balance, BlockNumber, DispatchClass, Hash, StorageData, Weight } from '@polkadot/types/interfaces/runtime'; @@ -60,6 +60,53 @@ export interface KeyValueOption extends ITuple<[StorageKey, Option] /** @name NetworkState */ export interface NetworkState extends Struct { readonly peerId: Text; + readonly listenedAddresses: Vec; + readonly externalAddresses: Vec; + readonly connectedPeers: BTreeMap; + readonly notConnectedPeers: BTreeMap; + readonly averageDownloadPerSec: u64; + readonly averageUploadPerSec: u64; + readonly peerset: NetworkStatePeerset; +} + +/** @name NetworkStatePeerset */ +export interface NetworkStatePeerset extends Struct { + readonly messageQueue: u64; + readonly nodes: BTreeMap; +} + +/** @name NetworkStatePeersetInfo */ +export interface NetworkStatePeersetInfo extends Struct { + readonly connected: bool; + readonly reputation: u64; +} + +/** @name NotConnectedPeer */ +export interface NotConnectedPeer extends Struct { + readonly knownAddresses: Vec; + readonly latestPingTime: Option; + readonly versionString: Option; +} + +/** @name Peer */ +export interface Peer extends Struct { + readonly enabled: bool; + readonly endpoint: PeerEndpoint; + readonly knownAddresses: Vec; + readonly latestPingTime: PeerPing; + readonly open: bool; + readonly versionString: Text; +} + +/** @name PeerEndpoint */ +export interface PeerEndpoint extends Struct { + readonly listening: PeerEndpointAddr; +} + +/** @name PeerEndpointAddr */ +export interface PeerEndpointAddr extends Struct { + readonly localAddr: Text; + readonly sendBackAddr: Text; } /** @name PeerInfo */ @@ -71,6 +118,12 @@ export interface PeerInfo extends Struct { readonly bestNumber: BlockNumber; } +/** @name PeerPing */ +export interface PeerPing extends Struct { + readonly nanos: u64; + readonly secs: u64; +} + /** @name RpcMethods */ export interface RpcMethods extends Struct { readonly version: u32;