Add types from latest metadata (#466)
* Update to latest metadata * Remove whitespaces * Fix ::Proposal * Add missing types * Allow Option<> in metadata * Empty typle * Remove useless indenetation * getTypeClass add Option * Add test with Option
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
// Copyright 2017-2018 @polkadot/types authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
import Tuple from './codec/Tuple';
|
||||
|
||||
/**
|
||||
* @name InherentOfflineReport
|
||||
* @description
|
||||
* Describes the offline-reporting extrinsic
|
||||
*/
|
||||
export default class InherentOfflineReport extends Tuple.with([]) {
|
||||
}
|
||||
@@ -137,6 +137,7 @@ export default class Metadata extends Struct {
|
||||
return decoded.type;
|
||||
|
||||
case TypeDefInfo.Compact:
|
||||
case TypeDefInfo.Option:
|
||||
case TypeDefInfo.Vector:
|
||||
return extractTypes([(decoded.sub as TypeDef).type]);
|
||||
|
||||
|
||||
@@ -298,7 +298,7 @@
|
||||
{
|
||||
"name": "NewAuthorities",
|
||||
"arguments": [
|
||||
"Vec<(SessionKey, u64)>"
|
||||
"Vec<(SessionKey,u64)>"
|
||||
],
|
||||
"documentation": [
|
||||
" New authority set has been applied."
|
||||
@@ -494,6 +494,17 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"prefix": "aura",
|
||||
"module": {
|
||||
"name": "Module",
|
||||
"call": {
|
||||
"name": "Call",
|
||||
"functions": []
|
||||
}
|
||||
},
|
||||
"storage": null
|
||||
},
|
||||
{
|
||||
"prefix": "timestamp",
|
||||
"module": {
|
||||
@@ -579,14 +590,12 @@
|
||||
"name": "note_offline",
|
||||
"arguments": [
|
||||
{
|
||||
"name": "offline_val_indices",
|
||||
"type": "Vec<u32>"
|
||||
"name": "offline",
|
||||
"type": "InherentOfflineReport"
|
||||
}
|
||||
],
|
||||
"documentation": [
|
||||
" Note the previous block's validator missed their opportunity to propose a block.",
|
||||
" This only comes in if 2/3+1 of the validators agree that no proposal was submitted.",
|
||||
" It's only relevant for the previous block."
|
||||
" Note the previous block's validator missed their opportunity to propose a block."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1251,7 +1260,7 @@
|
||||
{
|
||||
"name": "StakeRange",
|
||||
"modifier": 1,
|
||||
"type": "(Balance, Balance)",
|
||||
"type": "(Balance,Balance)",
|
||||
"documentation": [
|
||||
" The highest and lowest staked validator slashable balances."
|
||||
]
|
||||
@@ -1353,8 +1362,12 @@
|
||||
"type": "Proposal"
|
||||
},
|
||||
{
|
||||
"name": "vote_threshold",
|
||||
"name": "threshold",
|
||||
"type": "VoteThreshold"
|
||||
},
|
||||
{
|
||||
"name": "delay",
|
||||
"type": "BlockNumber"
|
||||
}
|
||||
],
|
||||
"documentation": [
|
||||
@@ -1373,6 +1386,23 @@
|
||||
"documentation": [
|
||||
" Remove a referendum."
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "cancel_queued",
|
||||
"arguments": [
|
||||
{
|
||||
"name": "when",
|
||||
"type": "BlockNumber"
|
||||
},
|
||||
{
|
||||
"name": "which",
|
||||
"type": "u32"
|
||||
}
|
||||
],
|
||||
"documentation": [
|
||||
" Cancel a proposal queued for enactment."
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1423,6 +1453,14 @@
|
||||
" The minimum amount to be used as a deposit for a public referendum proposal."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "PublicDelay",
|
||||
"modifier": 1,
|
||||
"type": "BlockNumber",
|
||||
"documentation": [
|
||||
" The delay before enactment for all public referenda."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "VotingPeriod",
|
||||
"modifier": 1,
|
||||
@@ -1452,12 +1490,34 @@
|
||||
"modifier": 0,
|
||||
"type": {
|
||||
"key": "ReferendumIndex",
|
||||
"value": "(BlockNumber,Proposal,VoteThreshold)"
|
||||
"value": "(ReferendumInfo)"
|
||||
},
|
||||
"documentation": [
|
||||
" Information concerning any given referendum."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DispatchQueue",
|
||||
"modifier": 1,
|
||||
"type": {
|
||||
"key": "BlockNumber",
|
||||
"value": "Vec<Option<(Proposal,ReferendumIndex)>>"
|
||||
},
|
||||
"documentation": [
|
||||
" Queue of successful referenda to be dispatched."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Bondage",
|
||||
"modifier": 1,
|
||||
"type": {
|
||||
"key": "AccountId",
|
||||
"value": "BlockNumber"
|
||||
},
|
||||
"documentation": [
|
||||
" The block at which the `who`'s funds become liquid."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "VotersFor",
|
||||
"modifier": 1,
|
||||
@@ -1473,7 +1533,7 @@
|
||||
"name": "VoteOf",
|
||||
"modifier": 0,
|
||||
"type": {
|
||||
"key": "( ReferendumIndex , AccountId )",
|
||||
"key": "(ReferendumIndex,AccountId)",
|
||||
"value": "bool"
|
||||
},
|
||||
"documentation": [
|
||||
@@ -1909,6 +1969,14 @@
|
||||
"type": "BlockNumber",
|
||||
"documentation": []
|
||||
},
|
||||
{
|
||||
"name": "EnactDelayPeriod",
|
||||
"modifier": 1,
|
||||
"type": "BlockNumber",
|
||||
"documentation": [
|
||||
" Number of blocks by which to delay enactment of successful, non-unanimous-council-instigated referendum proposals."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Proposals",
|
||||
"modifier": 1,
|
||||
@@ -1937,7 +2005,7 @@
|
||||
"name": "CouncilVoteOf",
|
||||
"modifier": 0,
|
||||
"type": {
|
||||
"key": "( Hash , AccountId )",
|
||||
"key": "(Hash,AccountId)",
|
||||
"value": "bool"
|
||||
},
|
||||
"documentation": []
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
// Copyright 2017-2018 @polkadot/types authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
import BlockNumber from './BlockNumber';
|
||||
import Struct from './codec/Struct';
|
||||
import Proposal from './Proposal';
|
||||
import VoteThreshold from './VoteThreshold';
|
||||
|
||||
type ReferendumInfoValue = {
|
||||
end?: BlockNumber,
|
||||
proposal?: Proposal,
|
||||
threshold?: VoteThreshold,
|
||||
delay?: BlockNumber
|
||||
};
|
||||
|
||||
/**
|
||||
* @name ReferendumInfo
|
||||
* @description
|
||||
* Info regarding an ongoing referendum
|
||||
*/
|
||||
export default class ReferendumInfo extends Struct {
|
||||
constructor (value?: ReferendumInfoValue | Uint8Array) {
|
||||
super({
|
||||
end: BlockNumber,
|
||||
proposal: Proposal,
|
||||
threshold: VoteThreshold,
|
||||
delay: BlockNumber
|
||||
}, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description When voting on this referendum will end
|
||||
*/
|
||||
get end (): BlockNumber {
|
||||
return this.get('end') as BlockNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description The proposal being voted on
|
||||
*/
|
||||
get proposal (): Proposal {
|
||||
return this.get('proposal') as Proposal;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description The thresholding mechanism to determine whether it passed
|
||||
*/
|
||||
get threshold (): VoteThreshold {
|
||||
return this.get('threshold') as VoteThreshold;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description The delay (in blocks) to wait after a successful referendum before deploying
|
||||
*/
|
||||
get delay (): BlockNumber {
|
||||
return this.get('delay') as BlockNumber;
|
||||
}
|
||||
}
|
||||
@@ -21,13 +21,13 @@ describe('Type', () => {
|
||||
it('handles nested types (embedded)', () => {
|
||||
expect(
|
||||
new Type('(u32, Box<Vec<AccountId>>)').toString()
|
||||
).toEqual('(u32, Vec<AccountId>)');
|
||||
).toEqual('(u32,Vec<AccountId>)');
|
||||
});
|
||||
|
||||
it('handles aliasses, multiples per line', () => {
|
||||
expect(
|
||||
new Type('(Vec<u8>, AccountId, Vec<u8>)').toString()
|
||||
).toEqual('(Bytes, AccountId, Bytes)');
|
||||
).toEqual('(Bytes,AccountId,Bytes)');
|
||||
});
|
||||
|
||||
it('removes whitespaces', () => {
|
||||
@@ -39,13 +39,13 @@ describe('Type', () => {
|
||||
it('changes PairOf<T> -> (T, T)', () => {
|
||||
expect(
|
||||
new Type('PairOf<T::Balance>').toString()
|
||||
).toEqual('(Balance, Balance)');
|
||||
).toEqual('(Balance,Balance)');
|
||||
});
|
||||
|
||||
it('changes PairOf<T> (embedded) -> (T, T)', () => {
|
||||
expect(
|
||||
new Type('(Vec<u8>, PairOf<T::Balance>, Vec<AccountId>)').toString()
|
||||
).toEqual('(Bytes, (Balance, Balance), Vec<AccountId>)');
|
||||
).toEqual('(Bytes,(Balance,Balance),Vec<AccountId>)');
|
||||
});
|
||||
|
||||
it('does not allow toU8a', () => {
|
||||
@@ -67,4 +67,10 @@ describe('Type', () => {
|
||||
new Type('<T::Balance as HasCompact>::Type').toString()
|
||||
).toEqual('Compact<Balance>');
|
||||
});
|
||||
|
||||
it('handles InherentOfflineReport', () => {
|
||||
expect(
|
||||
new Type('<T::InherentOfflineReport as InherentOfflineReport>::Inherent').toString()
|
||||
).toEqual('InherentOfflineReport');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -36,6 +36,8 @@ export default class Type extends Text {
|
||||
|
||||
private static decodeType (value: string): string {
|
||||
const mappings: Array<Mapper> = [
|
||||
// alias <T::InherentOfflineReport as InherentOfflineReport>::Inherent -> InherentOfflineReport
|
||||
Type._alias('<T::InherentOfflineReport as InherentOfflineReport>::Inherent', 'InherentOfflineReport'),
|
||||
// <T::Balance as HasCompact>
|
||||
Type._cleanupCompact(),
|
||||
// Remove all the trait prefixes
|
||||
@@ -160,7 +162,7 @@ export default class Type extends Text {
|
||||
const end = Type._findClosing(value, start);
|
||||
const type = value.substr(start, end - start);
|
||||
|
||||
value = `${value.substr(0, index)}(${type}, ${type})${value.substr(end + 1)}`;
|
||||
value = `${value.substr(0, index)}(${type},${type})${value.substr(end + 1)}`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,15 +174,13 @@ export default class Type extends Text {
|
||||
private static _removeTraits (): Mapper {
|
||||
return (value: string): string => {
|
||||
return value
|
||||
// `T :: AccountId` -> `T::AccountId` https://github.com/paritytech/substrate/issues/1244
|
||||
.replace(/\s+::\s+/g, '::')
|
||||
// remove all whitespaces
|
||||
.replace(/\s/g, '')
|
||||
// anything `T::<type>` to end up as `<type>`
|
||||
.replace(/T::/g, '')
|
||||
// `system::` with `` - basically we find `<T as system::Trait>`
|
||||
.replace(/system::/g, '')
|
||||
// replace `<T as Trait>::` (possibly sanitised just above)
|
||||
.replace(/<T as Trait>::/g, '')
|
||||
// `<TasTrait>::type` -> `type` https://github.com/paritytech/substrate/issues/1244
|
||||
// replace `<T as Trait>::` (whitespaces were removed above)
|
||||
.replace(/<TasTrait>::/g, '')
|
||||
// replace `<...>::Type`
|
||||
.replace(/::Type/g, '');
|
||||
|
||||
@@ -63,10 +63,10 @@ describe('getTypeValue', () => {
|
||||
|
||||
it('returns a type structure', () => {
|
||||
expect(
|
||||
getTypeDef('(u32, Compact<u32>, Vec<u64>, (Text, Vec<(Bool, u128)>))')
|
||||
getTypeDef('(u32, Compact<u32>, Vec<u64>, Option<u128>, (Text, Vec<(Bool, u128)>))')
|
||||
).toEqual({
|
||||
info: TypeDefInfo.Tuple,
|
||||
type: '(u32, Compact<u32>, Vec<u64>, (Text, Vec<(Bool, u128)>))',
|
||||
type: '(u32, Compact<u32>, Vec<u64>, Option<u128>, (Text, Vec<(Bool, u128)>))',
|
||||
sub: [
|
||||
{
|
||||
info: TypeDefInfo.Plain,
|
||||
@@ -88,6 +88,14 @@ describe('getTypeValue', () => {
|
||||
type: 'u64'
|
||||
}
|
||||
},
|
||||
{
|
||||
info: TypeDefInfo.Option,
|
||||
type: 'Option<u128>',
|
||||
sub: {
|
||||
info: TypeDefInfo.Plain,
|
||||
type: 'u128'
|
||||
}
|
||||
},
|
||||
{
|
||||
info: TypeDefInfo.Tuple,
|
||||
type: '(Text, Vec<(Bool, u128)>)',
|
||||
|
||||
@@ -7,6 +7,7 @@ import { assert } from '@polkadot/util';
|
||||
import { Codec, Constructor } from '../types';
|
||||
import Text from '../Text';
|
||||
import Compact from './Compact';
|
||||
import Option from './Option';
|
||||
import Tuple from './Tuple';
|
||||
import UInt from './UInt';
|
||||
import Vector from './Vector';
|
||||
@@ -14,6 +15,7 @@ import registry from './typeRegistry';
|
||||
|
||||
export enum TypeDefInfo {
|
||||
Compact,
|
||||
Option,
|
||||
Plain,
|
||||
Tuple,
|
||||
Vector
|
||||
@@ -94,6 +96,9 @@ export function getTypeDef (_type: Text | string): TypeDef {
|
||||
} else if (startingWith(type, 'Compact<', '>')) {
|
||||
value.info = TypeDefInfo.Compact;
|
||||
value.sub = getTypeDef(subType);
|
||||
} else if (startingWith(type, 'Option<', '>')) {
|
||||
value.info = TypeDefInfo.Option;
|
||||
value.sub = getTypeDef(subType);
|
||||
} else if (startingWith(type, 'Vec<', '>')) {
|
||||
value.info = TypeDefInfo.Vector;
|
||||
value.sub = getTypeDef(subType);
|
||||
@@ -116,6 +121,12 @@ export function getTypeClass (value: TypeDef): Constructor {
|
||||
return Compact.with(
|
||||
getTypeClass(value.sub as TypeDef) as Constructor<UInt>
|
||||
);
|
||||
} else if (value.info === TypeDefInfo.Option) {
|
||||
assert(value.sub && !Array.isArray(value.sub), 'Expected subtype for Option');
|
||||
|
||||
return Option.with(
|
||||
getTypeClass(value.sub as TypeDef)
|
||||
);
|
||||
} else if (value.info === TypeDefInfo.Vector) {
|
||||
assert(value.sub && !Array.isArray(value.sub), 'Expected subtype for Vector');
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ export { default as Gas } from './Gas';
|
||||
// export { default as H512 } from './H512';
|
||||
export { default as Hash } from './Hash';
|
||||
export { default as Header } from './Header';
|
||||
export { default as InherentOfflineReport } from './InherentOfflineReport';
|
||||
export { default as KeyValue } from './KeyValue';
|
||||
export { default as Metadata } from './Metadata';
|
||||
export { default as Method } from './Method';
|
||||
@@ -61,6 +62,7 @@ export { default as PropIndex } from './PropIndex';
|
||||
export { default as Proposal } from './Proposal';
|
||||
export { default as ProposalIndex } from './ProposalIndex';
|
||||
export { default as ReferendumIndex } from './ReferendumIndex';
|
||||
export { default as ReferendumInfo } from './ReferendumInfo';
|
||||
export { default as RuntimeVersion } from './RuntimeVersion';
|
||||
export { default as SessionKey } from './SessionKey';
|
||||
export { default as Signature } from './Signature';
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user